1 | fs = require 'fs'
|
2 | http = require 'http'
|
3 | _ = require 'lodash'
|
4 | path = require 'path'
|
5 | glob = require 'glob'
|
6 |
|
7 | NOT_FOUND_RESPONSE = {metadata: {code: 404, status: http.STATUS_CODES[404]}}
|
8 |
|
9 | class MessageHandlers
|
10 | constructor: ({ @defaultJobType, @jobsPath }={})->
|
11 | throw new Error 'ConfigureHandler requires jobsPath' unless @jobsPath?
|
12 | @jobs = @_getJobs()
|
13 |
|
14 | onMessage: ({data, encrypted, metadata}, callback) =>
|
15 | job = @jobs[metadata?.jobType]
|
16 | job ?= @jobs[@defaultJobType] if @defaultJobType?
|
17 | return callback null, NOT_FOUND_RESPONSE unless job?
|
18 |
|
19 | job.action {encrypted}, {data, metadata}, (error, response) =>
|
20 | return callback error if error?
|
21 | return callback null, _.pick(response, 'data', 'metadata')
|
22 |
|
23 | formSchema: (callback) =>
|
24 | callback null, @_formSchemaFromJobs @jobs
|
25 |
|
26 | messageSchema: (callback) =>
|
27 | callback null, @_messageSchemaFromJobs @jobs
|
28 |
|
29 | responseSchema: (callback) =>
|
30 | callback null, @_responseSchemaFromJobs @jobs
|
31 |
|
32 | _formSchemaFromJobs: (jobs) =>
|
33 | return {
|
34 | message: _.mapValues jobs, 'form'
|
35 | }
|
36 |
|
37 | _generateMessageMetadata: (jobType) =>
|
38 | return {
|
39 | type: 'object'
|
40 | required: ['jobType']
|
41 | properties:
|
42 | jobType:
|
43 | type: 'string'
|
44 | enum: [jobType]
|
45 | default: jobType
|
46 | respondTo: {}
|
47 | }
|
48 |
|
49 | _generateResponseMetadata: =>
|
50 | return {
|
51 | type: 'object'
|
52 | required: ['status', 'code']
|
53 | properties:
|
54 | status:
|
55 | type: 'string'
|
56 | code:
|
57 | type: 'integer'
|
58 | }
|
59 |
|
60 | _getJobs: =>
|
61 | dirnames = glob.sync path.join(@jobsPath, '/*/')
|
62 | jobs = {}
|
63 | _.each dirnames, (dir) =>
|
64 | key = _.upperFirst _.camelCase path.basename dir
|
65 | try
|
66 | jobs[key] = require dir
|
67 | catch error
|
68 | console.error error.stack
|
69 |
|
70 | return jobs
|
71 |
|
72 | _messageSchemaFromJob: (job, key) =>
|
73 | message = _.cloneDeep job.message
|
74 | message ?= {}
|
75 | _.set message, 'x-form-schema.angular', "message.#{key}.angular"
|
76 | _.set message, 'x-response-schema', "#{key}"
|
77 | _.set message, 'properties.metadata', @_generateMessageMetadata(key)
|
78 | message.required = _.union ['metadata'], message.required
|
79 | return message
|
80 |
|
81 | _messageSchemaFromJobs: (jobs) =>
|
82 | _.mapValues jobs, @_messageSchemaFromJob
|
83 |
|
84 | _responseSchemaFromJob: (job) =>
|
85 | response = _.cloneDeep job.response
|
86 | _.set response, 'properties.metadata', @_generateResponseMetadata()
|
87 | return response
|
88 |
|
89 | _responseSchemaFromJobs: (jobs) =>
|
90 | _.mapValues jobs, @_responseSchemaFromJob
|
91 |
|
92 |
|
93 | module.exports = MessageHandlers
|