enhancer-data-bridge
Version:
A bridge between Enhancer Clould and user business datasource
371 lines (354 loc) • 14.9 kB
JavaScript
var path = require('path');
var os = require('os');
var fs = require('fs');
var config = require('../config');
var isOfficialEnv = config.isOfficialEnv;
var menu_node_json = JSON.parse(fs.readFileSync(path.resolve(__dirname, './menu_node.json')) + '');
var role_json = JSON.parse(fs.readFileSync(path.resolve(__dirname, './role.json')) + '');
var role_page_json = JSON.parse(fs.readFileSync(path.resolve(__dirname, './role_page.json')) + '')
var DatabaseService = require('../database-service');
var customModuleBase = path.resolve(__dirname, '../repository/project/custom-module');
if (os.platform() === 'win32') {
customModuleBase = customModuleBase.replace(/\\/g, '/') + '/';
} else {
customModuleBase = customModuleBase + '/';
}
var requireNocache = require('require-nocache')(module);
var log4js = require('log4js');
var logger = log4js.getLogger('bridge');
var mockUser = require('./mockuser');
var systemServerVars = {};
var Mocker = {
mockUser: function(id, pwd) {
return mockUser(id, pwd);
},
mockEnhancer: function(databaseConfiguration, serverVars, req, res) {
return {
isProduction: function() {
return false;
},
getHomeDir: function() {
return path.resolve(__dirname, '../');
},
getDatabaseService: function() {
return new DatabaseService(databaseConfiguration);
},
getDatabaseConfig: function() {
return databaseConfiguration;
},
getVariable: function(name) {
name = name.toUpperCase();
return serverVars[name] || systemServerVars[name];
},
getLogger: function() {
return logger
},
setSessionVariable: function(name, value) {
if (!req.session._variables) {
req.session._variables = {};
}
req.session._variables[name.toUpperCase()] = value;
},
getSessionVariable: function(name) {
if (!name) {
return
}
return (req.session._variables || {})[name.toUpperCase()];
},
getContextRequest: function() {
return req;
},
getContextResponse: function() {
return res;
},
getCurrentUser: function() {
var u = mockUser();
u._id = serverVars['USER_ID'];
u._name = serverVars['USER_NAME'];
u._roles = serverVars['ROLES'];
u._variables = serverVars;
return u;
},
setData: function(key, value, expires, callback) {
if (!key || typeof key !== 'string') {
throw new Error('The key must be a non-empty string.');
}
if (!this.data) {
this.data = {};
}
req.session['_mock_' + key] = value;
callback && callback();
},
getData: function(key, callback) {
if (!key || typeof key !== 'string') {
throw new Error('The key must be a non-empty string.');
}
if (typeof callback !== 'function') {
throw new Error('Can not get data whithout callback function');
}
callback(null, req.session['_mock_' + key]);
},
getUserFileDir: function() {
var platform = os.platform();
return platform === 'win32'
? path.join(os.homedir(), 'enhancer\\data')
: path.join(os.homedir(), 'enhancer/data');
},
resolveUserFilePath: function(url) {
if (!url || typeof url !== 'string') {
return null;
}
var p = url.split(/\/file\//)[1];
if (!p) {
return null;
}
p = decodeURIComponent(p);
var fp = this.getUserFileDir() + '/' + p;
return os.platform() === 'win32' ? fp.replace(/\//g, '\\') : fp;
},
// access_token is existed in the cookie of access_token after user login.
// eg: 'eTA_l4IAyUgfwLYIc5HvAXjGmY_4DBGe'
isUserLoggedIn: function(access_token, callback) {
if (!access_token) {
callback(new Error('Access token can not be null'));
return
}
callback(null, {isLoggedIn:true, userInfo:{USER_ID: 1, USER_NAME: 'Test'}, message: '此为测试环境下模拟返回结果。'});
},
isUserIdLoggedIn: function(user_id, callback) {
var that = this;
if (!user_id) {
callback(new Error('User id can not be null'));
return
}
callback(null, {isLoggedIn:true, userInfo:{USER_ID: user_id, USER_NAME: 'Test'}, message: '此为测试环境下模拟返回结果。'});
},
// Mock Role Manager
getMenuNodeList: function() {
if (isOfficialEnv) {
return menu_node_json;
}
return JSON.parse(fs.readFileSync(path.resolve(__dirname, './menu_node.json')) + '');
},
getRoleList: function() {
if (isOfficialEnv) {
return role_json;
}
return JSON.parse(fs.readFileSync(path.resolve(__dirname, './role.json')) + '');
},
getRolePageList: function(role_id) {
if (!role_id) {
return null
}
var list = isOfficialEnv ? role_page_json
: JSON.parse(fs.readFileSync(path.resolve(__dirname, './role_page.json')) + '');
var pageList = [];
for (var i = 0; i < list.length; i++) {
if (list[i].role_id == role_id) {
pageList.push(list[i].page_id);
}
}
return pageList;
},
setRole: function(role_id, name, des, home_page, callback) {
if (!role_id || !name) {
return callback(null, {success: false, message: 'Role id and name can not be null!'});
}
if (isOfficialEnv) {
return callback(null, {success: true, message: 'ok'});
}
var role_path = path.resolve(__dirname, './role.json');
var data = fs.readFileSync(role_path);
var role = JSON.parse(data);
var updated = false;
var now = new Date().toISOString();
for (var i = 0; i < role.length; i++) {
if (role[i].id == role_id) {
role[i].display_name = name;
role[i].description = des;
role[i].home_page = home_page;
role[i].time_modified = now;
updated = true;
}
}
if (!updated) {
role.push({
id: role_id,
display_name: name,
description: des,
home_page: home_page,
time_created: now,
time_modified: null
});
}
fs.writeFileSync(role_path, JSON.stringify(role, null, 2));
callback(null, {success: true, message: 'ok'});
},
removeRole: function(role_id, callback) {
if (!role_id) {
return callback(null, {success: false, message: 'Can not remove null!'});
}
if (isOfficialEnv) {
return callback(null, {success: true, message: 'ok'});
}
var role_path = path.resolve(__dirname, './role.json');
fs.readFile(role_path, function(err, data) {
if (err) {
return callback(err);
}
var role = JSON.parse(data);
var role2 = [];
for (var i = 0; i < role.length; i++) {
if (role[i].id == role_id) {
continue;
}
role2.push(role[i]);
}
fs.writeFile(role_path, JSON.stringify(role2, null, 2), function(err) {
if (err) {
return callback(err);
}
callback(null, {success: true, message: 'ok'});
});
});
},
setRolePage: function(role_id, page_id, callback) {
if (!role_id || !page_id) {
return callback(null, {success: false, message: 'Can not set role page with null!'});
}
if (isOfficialEnv) {
return callback(null, {success: true, message: 'ok'});
}
var role_page_path = path.resolve(__dirname, './role_page.json');
fs.readFile(role_page_path, function(err, data) {
if (err) {
return callback(err);
}
var role_page = JSON.parse(data);
for (var i = 0; i < role_page.length; i++) {
var rp = role_page[i];
if (rp.role_id == role_id && rp.page_id == page_id) {
callback(null, {success: true, message: 'ok'});
return;
}
}
role_page.push({
role_id: role_id,
page_id: page_id,
time_created: new Date().toISOString()
});
fs.writeFile(role_page_path, JSON.stringify(role_page, null, 2), function(err) {
if (err) {
return callback(err);
}
callback(null, {success: true, message: 'ok'});
});
});
},
removeRolePage: function(role_id, page_id, callback) {
if (!role_id || !page_id) {
return callback(null, {success: false, message: 'Role id and page id must be specified'});
}
if (isOfficialEnv) {
return callback(null, {success: true, message: 'ok'});
}
var role_page_path = path.resolve(__dirname, './role_page.json');
fs.readFile(role_page_path, function(err, data) {
if (err) {
return callback(err);
}
var role_page = JSON.parse(data);
var role_page2 = [];
for (var i = 0; i < role_page.length; i++) {
if (role_page[i].role_id == role_id && role_page[i].page_id == page_id) {
continue;
}
role_page2.push(role_page[i]);
}
fs.writeFile(role_page_path, JSON.stringify(role_page2, null, 2), function(err) {
if (err) {
return callback(err);
}
callback(null, {success: true, message: 'ok'});
});
});
},
logoutUser: function(id, callback) {
if (!id) {
callback( new Error('The user to be logged out can not be null!') );
return
}
callback(null, 1);
},
getSessionNumber: function(callback) {
callback && callback(null, {
num: 1,
logged: 1
});
},
getUserLoginSettings: function() {
return {
settings: {},
authen: {}
};
},
getSystemConfig: function() {
return {};
},
now: function() {
var now = new Date().getTime() - new Date().getTimezoneOffset()*60*1000;
return new Date(now);
}
};
},
mockSystemStart: function(req, res) {
var dbConfiguration;
try {
dbConfiguration = JSON.parse(req.query._d_b_ || '{"default":"","connections":{}}');
} catch (e) {
return res.send({
success: false,
message: 'Invalid database setting for preview.'
});
}
var serverVars = {};
var enhancer = Mocker.mockEnhancer(dbConfiguration, serverVars, req, res);
enhancer.setVariable = function(name, value) {
systemServerVars[name.toUpperCase()] = value;
};
var startFunc;
try {
startFunc = eval('('
+ req.body.startFunc.replace(/require\(\s*\'@custom\//g, 'requireNocache(\'' + customModuleBase)
+')');
} catch(e) {
res.send({
success: false,
message: 'The function has syntax error: ' + e.message.replace(customModuleBase, '@custom/')});
return;
}
try {
startFunc(enhancer, function(err) {
if (err) {
logger.error(err);
res.send({
success: false,
message: 'Error occurred when executing system start function. Reason: ' + err.message
});
return
}
res.send({success: true, message: 'ok'});
});
} catch(ex) {
if (ex) {
logger.error(ex);
res.send({
success: false,
message: 'Error occurred when executing system start function. Reason: ' + ex.message.replace(customModuleBase, '@custom/')
});
return
}
}
}
};
module.exports = Mocker;