UNPKG

enhancer-data-bridge

Version:

A bridge between Enhancer Clould and user business datasource

371 lines (354 loc) 14.9 kB
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;