webapi-eca/js-coffee/module_manager.js
2013-12-11 12:49:36 +01:00

210 lines
5.9 KiB
JavaScript

/*
# Module Manager
> The module manager takes care of the module and rules loading in the initialization
> phase and on user request.
> Event and Action modules are loaded as strings and stored in the database,
> then compiled into node modules and rules
*/
'use strict';
var fs = require('fs'),
path = require('path'),
log = require('./logging'),
ml, db, funcLoadAction, funcLoadRule;
exports = module.exports = function(args) {
args = args || {};
log(args);
ml = require('./module_loader')(args);
return module.exports;
};
exports.addDBLink = function(db_link) {
db = db_link;
};
exports.storeEventModule = function (objUser, obj, answHandler) {
try {
// TODO in the future we might want to link the modules close to the user
// and allow for e.g. private modules
// we need a child process to run this code and kill it after invocation
var m = ml.requireFromString(obj.data, obj.id);
obj.methods = Object.keys(m);
answHandler.answerSuccess('Thank you for the event module!');
db.storeEventModule(obj.id, obj);
} catch (err) {
answHandler.answerError(err.message);
console.error(err);
}
};
exports.getAllEventModules = function ( objUser, obj, answHandler ) {
db.getEventModules(function(err, obj) {
if(err) answHandler.answerError('Failed fetching event modules: ' + err.message);
else answHandler.answerSuccess(obj);
});
};
exports.storeActionModule = function (objUser, obj, answHandler) {
var m = ml.requireFromString(obj.data, obj.id);
obj.methods = Object.keys(m);
answHandler.answerSuccess('Thank you for the action module!');
db.storeActionModule(obj.id, obj);
};
exports.getAllActionModules = function ( objUser, obj, answHandler ) {
db.getActionModules(function(err, obj) {
if(err) answHandler.answerError('Failed fetching action modules: ' + err.message);
else answHandler.answerSuccess(obj);
});
};
exports.storeRule = function (objUser, obj, answHandler) {
//TODO fix, twice same logic
var cbEventModule = function (lstParams) {
return function(err, data) {
if(err) {
err.addInfo = 'fetching event module';
log.error('MM', err);
}
if(!err && data) {
if(data.params) {
lstParams.eventmodules[data.id] = data.params;
}
}
if(--semaphore === 0) answHandler.answerSuccess(lstParams);
};
};
var cbActionModule = function (lstParams) {
return function(err, data) {
if(err) {
err.addInfo = 'fetching action module';
log.error('MM', err);
}
if(!err && data) {
if(data.params) {
lstParams.actionmodules[data.id] = data.params;
}
}
if(--semaphore === 0) answHandler.answerSuccess(lstParams);
};
};
var semaphore = 1;
var lst = {
eventmodules: {},
actionmodules: {}
};
try {
var objRule = JSON.parse(obj.data);
for(var i = 0; i < objRule.actions.length; i++) {
semaphore++;
db.getActionModule(objRule.actions[i].module.split('->')[0], cbActionModule(lst));
}
db.getEventModule(objRule.event.split('->')[0], cbEventModule(lst));
db.storeRule(objRule.id, objUser.username, obj.data);
} catch(err) {
answHandler.answerError(err.message);
log.error('MM', err);
}
};
// FIXME REMOVE
/*
* Legacy file system loaders
*/
/*
* Load Rules from fs
* ------------------
*/
exports.loadRulesFromFS = function(args, answHandler) {
if(!args) args = {};
if(!args.name) args.name = 'rules';
if(!funcLoadRule) log.error('ML', 'no rule loader function available');
else {
fs.readFile(path.resolve(__dirname, '..', 'rules', args.name + '.json'), 'utf8', function (err, data) {
if (err) {
log.error('ML', 'Loading rules file: ' + args.name + '.json');
return;
}
try {
var arr = JSON.parse(data), txt = '';
log.print('ML', 'Loading ' + arr.length + ' rules:');
for(var i = 0; i < arr.length; i++) {
txt += arr[i].id + ', ';
db.storeRule(arr[i].id, 'james-t', JSON.stringify(arr[i]));
// funcLoadRule(arr[i]);
}
answHandler.answerSuccess('Yep, loaded rules: ' + txt);
} catch (e) {
log.error('ML', 'rules file was corrupt! (' + args.name + '.json)');
}
});
}
};
/*
* Load Action Modules from fs
* ---------------------------
*/
/**
*
* @param {Object} name
* @param {Object} data
* @param {Object} mod
* @param {String} [auth] The string representation of the auth json
*/
function loadActionCallback(name, data, mod, auth) {
db.storeActionModule(name, data); // store module in db
// funcLoadAction(name, mod); // hand back compiled module
if(auth) db.storeActionModuleAuth(name, auth);
}
exports.loadActionModuleFromFS = function (args, answHandler) {
if(ml) {
if(args && args.name) {
answHandler.answerSuccess('Loading action module ' + args.name + '...');
ml.loadModule('mod_actions', args.name, loadActionCallback);
} else log.error('MM', 'Action Module name not provided!');
}
};
exports.loadActionModulesFromFS = function(args, answHandler) {
if(ml) {
answHandler.answerSuccess('Loading action modules...');
ml.loadModules('mod_actions', loadActionCallback);
}
};
/*
* Load Event Modules from fs
* --------------------------
*/
function loadEventCallback(name, data, mod, auth) {
if(db) {
db.storeEventModule(name, data); // store module in db
if(auth) db.storeEventModuleAuth(name, auth);
}
}
exports.loadEventModuleFromFS = function(args, answHandler) {
if(ml) {
if(args && args.name) {
answHandler.answerSuccess('Loading event module ' + args.name + '...');
ml.loadModule('mod_events', args.name, loadEventCallback);
} else log.error('MM', 'Event Module name not provided!');
}
};
exports.loadEventModulesFromFS = function(args, answHandler) {
answHandler.answerSuccess('Loading event moules...');
ml.loadModules('mod_actions', loadEventCallback);
};