UNPKG

rapnc

Version:

Node client for RAP 1.0

201 lines (179 loc) 6.72 kB
var helper = require('./helper'); var schema = require('../helpers/index').schema; var async = require('async'); var fs = require('fs'); var path = require('path'); var error = helper.error; var getSubParams = helper.getSubParams; var getIds = helper.getIds; var trim = helper.trim; function getActionJsonFromDB(projectId, pathname, url, callback) { async.auto({ getActionIds: function(next) { helper.sql( 'select d.action_id from tb_project a, tb_module b, tb_page c, tb_action_and_page d ' + ' where a.id = ' + projectId + ' and a.id = b.project_id ' + ' and b.id = c.module_id and c.id = d.page_id', next); }, getAction: ['getActionIds', function(next, results) { var actions = results.getActionIds; if (!actions || actions.length == 0) { callback(error(projectId, url)); return; } var ids = []; actions.forEach(function(a) { ids.push(a.action_id); }) helper.sql('select * from tb_action ' + 'where id in (' + ids.join(',') + ' ) ' + 'and (request_url = "' + trim(url) + '" or request_url = "/' + trim(url) + '" ' + ' or request_url like "%' + trim(pathname) + '%")', next) }], getRequestParams: ['getAction', function(next, results) { var action = results.getAction; if (!action || action.length == 0) { callback(error(projectId, url)); return; } action = action[0]; helper.sql('select * from tb_request_parameter_list_mapping a, tb_parameter b ' + ' where b.id = a.parameter_id and ' + ' a.action_id = ' + action.id, next) }], getResponseParams: ['getAction', function(next, results) { var action = results.getAction; if (!action || action.length == 0) { callback(error(projectId, url)); return; } action = action[0]; helper.sql('select * from tb_response_parameter_list_mapping a, tb_parameter b ' + ' where b.id = a.parameter_id and ' + ' a.action_id = ' + action.id, next) }], getComplexRequestParams: ['getRequestParams', function(next, results) { var params = results.getRequestParams; if (!params || params.length == 0) { return next(); } var ids = getIds(params); if (ids.length == 0) { return next(); } getSubParams(ids, [], function(err, list) { next(err, list); }); }], getComplexResponseParams: ['getResponseParams', function(next, results) { var params = results.getResponseParams; if (!params || params.length == 0) { return next(); } var ids = getIds(params); if (ids.length == 0) { return next(); } getSubParams(ids, [], function(err, list) { next(err, list); }); }] }, function(err, results) { if (err) { callback(err); return; } var actions = results.getAction; if (!actions || actions.length == 0) { callback('no action found'); return; } var requests = results.getRequestParams; var responses = results.getResponseParams; var complexRequest = results.getComplexRequestParams; var complexResponse = results.getComplexResponseParams; var paramsMapper = {}; requests && requests.forEach(function(r) { paramsMapper[r.id] = r; }); responses && responses.forEach(function(r) { paramsMapper[r.id] = r; }); complexRequest && complexRequest.forEach(function(r) { paramsMapper[r.id] = r; //delete r.id; }); complexResponse && complexResponse.forEach(function(r) { paramsMapper[r.id] = r; //delete r.id; }); complexRequest && complexRequest.forEach(function(r) { var id = r.complex_parameter_id; delete r.complex_parameter_id; var upper = paramsMapper[id]; if (!upper) { return; } upper.params = upper.params || []; upper.params.push(r); }); complexResponse && complexResponse.forEach(function(r) { var id = r.complex_parameter_id; delete r.complex_parameter_id; var upper = paramsMapper[id]; if (!upper) { return; } upper.params = upper.params || []; upper.params.push(r); }) actions[0].requestParams = requests; actions[0].responseParams = responses; schema.dbToSchema({ actions: actions }); callback(null, actions); }) } function getActionJsonFromLocal(projectId, pathname, url, callback) { var project = null; var modulePath = '../cache/projects/' + projectId + '.json'; if (!fs.existsSync(path.join(__dirname, modulePath))) { callback('Serve on ' + global.RAP_MODE.toUpperCase() + ' mode, no json data for project ' + projectId + ', please use `rapnc pull ' + projectId + '` download it firstly.'); return; } try { project = require(modulePath); } catch (e) { callback(e.toString()); return; } var actions = project.actions; for (var i = actions.length - 1; i >= 0; i--) { var action = actions[i]; var requestUrl = action.action; if (trim(requestUrl) == trim(pathname) || trim(requestUrl) == trim(url)) { //console.log('[RAP serve] Offline mode, load data from RAP/cache/projects/' + projectId + '.json'); callback(null, [action]); return; } }; callback(error(projectId, url)); } function getActionJson(projectId, pathname, url, callback) { if (!projectId || !url) { callback('missing params'); return; } if (!/^\d+$/.test(projectId)) { callback('projectId should be number'); return; } if (global.RAP_MODE == 'online') { getActionJsonFromDB(projectId, pathname, url, callback) } else { getActionJsonFromLocal(projectId, pathname, url, callback) } } module.exports = getActionJson;