mirror of
https://github.com/Hopiu/webapi-eca.git
synced 2026-03-16 22:10:31 +00:00
178 lines
5.3 KiB
CoffeeScript
178 lines
5.3 KiB
CoffeeScript
###
|
|
|
|
Components Manager
|
|
==================
|
|
> The components manager takes care of the dynamic JS modules and the rules.
|
|
> Event Poller and Action Invoker modules are loaded as strings and stored in the database,
|
|
> then compiled into node modules and rules and used in the engine and event poller.
|
|
|
|
###
|
|
|
|
# **Loads Modules:**
|
|
|
|
# - [Persistence](persistence.html)
|
|
db = require './persistence'
|
|
# - [Dynamic Modules](dynamic-modules.html)
|
|
dynmod = require './dynamic-modules'
|
|
|
|
# - Node.js Modules: [fs](http://nodejs.org/api/fs.html),
|
|
# [vm](http://nodejs.org/api/vm.html) and
|
|
# [path](http://nodejs.org/api/path.html),
|
|
# [events](http://nodejs.org/api/events.html)
|
|
fs = require 'fs'
|
|
vm = require 'vm'
|
|
path = require 'path'
|
|
events = require 'events'
|
|
|
|
###
|
|
Module call
|
|
-----------
|
|
Initializes the HTTP listener and its request handler.
|
|
|
|
@param {Object} args
|
|
###
|
|
exports = module.exports = ( args ) =>
|
|
@log = args.logger
|
|
@ee = new events.EventEmitter()
|
|
db args
|
|
dynmod args
|
|
module.exports
|
|
|
|
exports.addListener = ( evt, eh ) =>
|
|
@ee.addListener evt, eh
|
|
db.getRules ( err, obj ) =>
|
|
@ee.emit 'init', rule for id, rule of obj
|
|
|
|
|
|
# cb ( obj ) where obj should contain at least the HTTP response code and a message
|
|
exports.processRequest = ( user, obj, cb ) =>
|
|
if commandFunctions[obj.command]
|
|
answ = commandFunctions[obj.command] user, obj, cb
|
|
else
|
|
cb
|
|
code: 404
|
|
message: 'Strange request!'
|
|
|
|
commandFunctions =
|
|
forge_event_poller: ( user, obj, cb ) =>
|
|
answ =
|
|
code: 200
|
|
|
|
db.getEventPoller obj.id, ( err, mod ) =>
|
|
if mod
|
|
answ.code = 409
|
|
answ.message = 'Event Poller module name already existing: ' + obj.id
|
|
|
|
else
|
|
src = obj.data
|
|
cm = dynmod.compileString src, obj.id, {}, obj.lang
|
|
answ = cm.answ
|
|
if answ.code is 200
|
|
events = []
|
|
events.push name for name, id of cm.module
|
|
@log.info "CM | Storing new eventpoller with events #{ events }"
|
|
answ.message =
|
|
"Event Poller module successfully stored! Found following event(s): #{ events }"
|
|
db.storeEventPoller obj.id, user.username,
|
|
code: obj.data
|
|
lang: obj.lang
|
|
params: obj.params
|
|
events: events
|
|
if obj.public is 'true'
|
|
db.publishEventPoller obj.id
|
|
cb answ
|
|
|
|
get_event_pollers: ( user, obj, cb ) ->
|
|
db.getAvailableEventPollerIds user.username, ( err, obj ) ->
|
|
oRes = {}
|
|
sem = obj.length
|
|
fGetEvents = ( id ) ->
|
|
db.getEventPoller id, ( err, obj ) ->
|
|
oRes[id] = obj.events
|
|
if --sem is 0
|
|
cb
|
|
code: 200
|
|
message: oRes
|
|
fGetEvents id for id in obj
|
|
|
|
get_event_poller_params: ( user, obj, cb ) ->
|
|
db.getEventPollerRequiredParams obj.id, ( err, obj ) ->
|
|
cb
|
|
code: 200
|
|
message: obj
|
|
|
|
get_action_invokers: ( user, obj, cb ) ->
|
|
db.getAvailableActionInvokerIds user.username, ( err, obj ) ->
|
|
oRes = {}
|
|
sem = obj.length
|
|
fGetActions = ( id ) ->
|
|
db.getActionInvoker id, ( err, obj ) ->
|
|
oRes[id] = obj.actions
|
|
if --sem is 0
|
|
cb
|
|
code: 200
|
|
message: oRes
|
|
fGetActions id for id in obj
|
|
|
|
get_action_invoker_params: ( user, obj, cb ) ->
|
|
db.getActionInvokerRequiredParams obj.id, ( err, obj ) ->
|
|
cb
|
|
code: 200
|
|
message: obj
|
|
|
|
forge_action_invoker: ( user, obj, cb ) =>
|
|
answ =
|
|
code: 200
|
|
|
|
db.getActionInvoker obj.id, ( err, mod ) =>
|
|
if mod
|
|
answ.code = 409
|
|
answ.message = 'Action Invoker module name already existing: ' + obj.id
|
|
|
|
else
|
|
src = obj.data
|
|
cm = dynmod.compileString src, obj.id, {}, obj.lang
|
|
answ = cm.answ
|
|
if answ.code is 200
|
|
actions = []
|
|
actions.push name for name, id of cm.module
|
|
@log.info "CM | Storing new eventpoller with actions #{ actions }"
|
|
answ.message =
|
|
"Action Invoker module successfully stored! Found following action(s): #{ actions }"
|
|
db.storeActionInvoker obj.id, user.username,
|
|
code: obj.data
|
|
lang: obj.lang
|
|
params: obj.params
|
|
actions: actions
|
|
if obj.public is 'true'
|
|
db.publishActionInvoker obj.id
|
|
cb answ
|
|
|
|
get_rules: ( user, obj, cb ) ->
|
|
console.log 'CM | Implement get_rules'
|
|
|
|
forge_rule: ( user, obj, cb ) =>
|
|
obj.event = JSON.parse obj.event
|
|
db.getRule obj.id, ( err, objRule ) =>
|
|
if objRule isnt null
|
|
answ =
|
|
code: 409
|
|
message: 'Rule name already existing!'
|
|
else
|
|
answ =
|
|
code: 200
|
|
message: 'Rule stored and activated!'
|
|
rule =
|
|
id: obj.id
|
|
# users: [ user.username ] # This should be fetched from the db in each listener
|
|
event: "#{ obj.event.module } -> #{ obj.event.function }"
|
|
conditions: JSON.parse obj.conditions
|
|
actions: JSON.parse obj.actions
|
|
modules = JSON.parse obj.action_params
|
|
db.storeRule rule.id, JSON.stringify rule
|
|
db.linkRule rule.id, user.username
|
|
db.activateRule rule.id, user.username
|
|
db.storeEventUserParams obj.event.module, user.username, obj.event_params
|
|
db.storeActionUserParams id, user.username, JSON.stringify params for id, params of modules
|
|
@ee.emit 'newRule', JSON.stringify rule
|
|
cb answ
|