UNPKG

4.14 kBtext/coffeescriptView Raw
1_ = require 'lodash'
2async = require 'async'
3debug = require('debug')('nanocyte-flow-deploy-service:iot-app-controller')
4MeshbluConfig = require 'meshblu-config'
5MeshbluHttp = require 'meshblu-http'
6
7mongojs = require 'mongojs'
8Datastore = require 'meshblu-core-datastore'
9
10ConfigurationGenerator = require 'nanocyte-configuration-generator'
11IotAppConfigurationSaver = require 'iot-app-configuration-saver'
12IotAppPublisher = require 'nanocyte-iot-app-publisher'
13
14class 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
116module.exports = IotAppController