rapnc
Version:
Node client for RAP 1.0
170 lines (163 loc) • 4.34 kB
JavaScript
var dao = require('../dao');
var helper = require('../helpers');
var isArray = helper.types.isArray;
var isObject = helper.types.isObject;
var detect = helper.types.detect;
/*
data : {
a: 1,
b: 2
}
params: [
{
identifier: 'a',
data_type: 'number',
remark: ''
},
{
identifier: 'b',
data_type: 'number',
remark: ''
}
]
*/
function checkDataByParams(data, params) {
var id, dataType, realType, param, i, l;
for(i = 0, l = params.length; i < l; i++) {
param = params[i];
id = param.identifier;
dataType = param.data_type;
var mockId = null;
if (id.indexOf('|') != -1) {
mockId = id.split('|')[0];
}
if (mockId) {
if (!(mockId in data)) {
return 'missing property: ' + mockId ;
}
} else if (!(id in data)) {
return 'missing property: ' + id;
}
realType = detect(data[id]);
if (dataType.indexOf('array') == -1) {
if (realType != dataType) {
return 'data type of [' + id + '] error: expected: ' + dataType + ', actural: ' + realType;
}
} else {
if (realType != 'array') {
return 'data type of [' + id + '] error: expected: ' + dataType + ', actural: ' + realType;
}
//checkDataByParams(data[id], param)
}
if (dataType == 'object') {
var msg = checkDataByParams(data[id], param.params);
if (msg) {
return msg;
}
}
if (dataType.indexOf('array') != -1) {
var arrayType = /array<(\w+)>/.exec(dataType)[1];
if (arrayType == 'object') {
for(var j = 0; j < data[id].length; j++) {
var msg = checkDataByParams(data[id][j], param.params)
if (msg) {
return msg;
}
}
} else {
for(var j = 0; j < data[id].length; j++) {
var detected = detect(data[id][j]);
if (detected != arrayType) {
return 'array<' + arrayType + '> [' + id + '] contains ' + detected;
}
}
}
}
}
}
// msg = checkDataByParams({
// a: [1, 2, 3],
// b: 2,
// c: [{
// d: 1,
// e: 1
// },
// {
// d: 1,
// e: 1
// }],
// f: {
// g: 1,
// h: 1
// }
// }, [
// {
// identifier: 'a',
// data_type: 'array<boolean>',
// remark: ''
// },
// {
// identifier: 'c',
// data_type: 'array<object>',
// remark: '',
// params: [
// {
// identifier: 'd',
// data_type: 'number',
// remark: ''
// },
// {
// identifier: 'e',
// data_type: 'number',
// remark: ''
// }
// ]
// },
// {
// identifier: 'b',
// data_type: 'number',
// remark: ''
// },
// {
// identifier: 'f',
// data_type: 'object',
// remark: '',
// params: [
// {
// identifier: 'g',
// data_type: 'number',
// remark: ''
// },
// {
// identifier: 'h',
// data_type: 'number',
// remark: ''
// }
// ]
// }
// ])
// console.log(msg);
function doCheck(pid, url, pathname, params, response, callback) {
// 找到Action
// 转换成object模式
// 匹配两者
dao.getActionJson(pid, url, pathname, function(err, data) {
if (err) {
callback(-1, err);
return;
}
data = data[0];
var params = data.responseParams;
if (!params) {
callback(-1, 'no response defined');
return;
}
var result = checkDataByParams(response, params);
if (result) {
callback(500, result);
} else {
callback(200);
}
})
}
exports.doCheck = doCheck;