1 | _ = require 'lodash'
|
2 | async = require 'async'
|
3 | debug = require('debug')('nanocyte-flow-deploy-service:iot-app-controller')
|
4 | MeshbluConfig = require 'meshblu-config'
|
5 | MeshbluHttp = require 'meshblu-http'
|
6 |
|
7 | mongojs = require 'mongojs'
|
8 | Datastore = require 'meshblu-core-datastore'
|
9 |
|
10 | ConfigurationGenerator = require 'nanocyte-configuration-generator'
|
11 | IotAppConfigurationSaver = require 'iot-app-configuration-saver'
|
12 | IotAppPublisher = require 'nanocyte-iot-app-publisher'
|
13 |
|
14 | class IotAppController
|
15 | constructor: (dependencies={}) ->
|
16 | {@NanocyteDeployer, @UUID, mongoDbUri, redisUri} = dependencies
|
17 | @meshbluConfig = new MeshbluConfig
|
18 | database = mongojs mongoDbUri
|
19 | @datastore = new Datastore
|
20 | database: database
|
21 | collection: 'instances'
|
22 |
|
23 | setInterval =>
|
24 | database.runCommand {ping: 1}, (error) =>
|
25 | if error?
|
26 | console.error 'MongoDB connection failed, exiting.'
|
27 | process.exit 1
|
28 | , 10 * 1000
|
29 |
|
30 | link: (req, res) =>
|
31 | {appId} = req.params
|
32 | config = req.body
|
33 | flowId = req.meshbluAuth.uuid
|
34 | meshbluHttp = @_createMeshbluHttp req.meshbluAuth
|
35 |
|
36 | version = 'versions-where-were-going-we-dont-need-versions'
|
37 |
|
38 | {instanceId, online} = config
|
39 | configSchema = config.schemas?.configure?.default
|
40 | return res.sendStatus(422) unless configSchema? and instanceId?
|
41 |
|
42 | if online == false
|
43 | return @_unlink {appId, flowId, instanceId, meshbluHttp}, (error) =>
|
44 | return res.status(error.code || 500).send({error}) if error?
|
45 | res.sendStatus 200
|
46 |
|
47 | configurationSaver = new IotAppConfigurationSaver {@datastore}
|
48 |
|
49 | stopMessage =
|
50 | devices: [flowId]
|
51 | metadata: to: nodeId: 'engine-stop'
|
52 |
|
53 | startMessage =
|
54 | devices: [flowId]
|
55 | metadata: to: nodeId: 'engine-start'
|
56 |
|
57 | steps = [
|
58 | async.apply configurationSaver.linkToBluprint, {appId, config, configSchema, flowId, instanceId, version}
|
59 | async.apply meshbluHttp.message, stopMessage
|
60 | async.apply meshbluHttp.message, startMessage
|
61 | ]
|
62 |
|
63 | async.series steps, (error) =>
|
64 | return res.status(error.code || 500).send({error}) if error?
|
65 | res.sendStatus 200
|
66 |
|
67 | _unlink: ({appId, flowId, instanceId, meshbluHttp}, callback) =>
|
68 | configurationSaver = new IotAppConfigurationSaver {@datastore}
|
69 |
|
70 | stopMessage =
|
71 | devices: [flowId]
|
72 | metadata: to: nodeId: 'engine-stop'
|
73 |
|
74 | steps = [
|
75 | async.apply meshbluHttp.message, stopMessage
|
76 | async.apply configurationSaver.stopIotApp, {appId, flowId, instanceId}
|
77 | ]
|
78 |
|
79 | async.series steps, callback
|
80 |
|
81 | publish: (req, res) =>
|
82 | {appId} = req.params
|
83 | {flowId} = req.body
|
84 | version = 'versions-where-were-going-we-dont-need-versions'
|
85 |
|
86 | debug("Publishing for AppId #{appId} Version: #{version}")
|
87 | meshbluHttp = @_createMeshbluHttp req.meshbluAuth
|
88 |
|
89 | meshbluHttp.generateAndStoreTokenWithOptions appId, {tag: 'nanocyte-flow-deploy-service'}, (error, {token}={}) =>
|
90 | debug("Error on generate and store token", error) if error?
|
91 | return res.status(error.code ? 403).send(error.message) if error?
|
92 |
|
93 | options = appId: appId, appToken: token, flowId: flowId, version: version
|
94 | iotAppPublisher = @_createIotAppPublisher options
|
95 |
|
96 | iotAppPublisher.publish (error) =>
|
97 | debug("Published the IoTApp and we got an error", error) if error?
|
98 | return res.status(error.code ? 422).send(error.message) if error?
|
99 | res.sendStatus 201
|
100 |
|
101 | _createIotAppPublisher: (options) =>
|
102 | { appId, appToken } = options
|
103 |
|
104 | meshbluJSON = _.defaults {uuid: appId, token: appToken}, new MeshbluConfig().toJSON()
|
105 |
|
106 | configurationSaver = new IotAppConfigurationSaver {@datastore}
|
107 | configurationGenerator = new ConfigurationGenerator {meshbluJSON}
|
108 |
|
109 | new IotAppPublisher options, {configurationSaver, configurationGenerator}
|
110 |
|
111 | _createMeshbluHttp: (options) =>
|
112 | meshbluJSON = _.assign {}, @meshbluConfig.toJSON(), options
|
113 | new MeshbluHttp meshbluJSON
|
114 |
|
115 |
|
116 | module.exports = IotAppController
|