rapnc
Version:
Node client for RAP 1.0
201 lines (179 loc) • 6.72 kB
JavaScript
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;