apinode
Version:
An API server that can greatly reduce the work needed to implment API services. It can also cooperate with other API node to make it a mesh of services.
136 lines (106 loc) • 2.91 kB
JavaScript
var soar = require('sql-soar'),
errUtil = require('../../../util/errUtil.js');
var millisADay = 24 * 60 * 60 * 1000;
var qLogExpr = soar.sql('coimLog.apiLog')
.column(['accTime'])
.filter(
soar.chainFilters('AND', [
{name: 'caID', op: '='},
{name: 'userID', op: '='},
{name: 'from', field: 'accTime', op:'>='},
{name: 'to', field: 'accTime', op:'<'}
])
)
.extra('ORDER BY accTime');
var logCmd = {op: 'list', expr: qLogExpr};
exports.run = function(rt, cb) {
var userID = rt.ep.id,
inData = rt.inData;
//console.log('inData is:\n' + JSON.stringify(inData, null, 4));
var fromDate = stringToDate(inData.from),
toDate = inData.to;
if (toDate)
toDate = stringToDate(toDate, 1);
else {
var d = new Date();
toDate = new Date(d.getFullYear(), d.getMonth(), d.getDate());
}
var query = {
caID: inData.caID,
userID: userID,
from: toyyyymmdd(fromDate),
to: toyyyymmdd(toDate)
};
soar.execute(logCmd, query, function(err, list) {
if (err)
return cb( errUtil.err(errUtil.DB_ERROR) );
var days = daysBetweenDate( fromDate, toDate ),
scaleInfo = toTimeSlot( days ),
scale = scaleInfo.scale,
columns = scaleInfo.columns,
distArray = Array.apply(null, Array(columns)).map(function() {return 0});
var result = {
scale: scale / 60000, // in minutes
};
if (list.length === 0) {
result.list = new Array();
return cb({code: 0, message: 'Ok', value: result});
}
//console.log('total API calls: ' + list.length);
var initTime = fromDate.getTime();
for (var i in list) {
var item = list[i],
idx = Math.floor( (item.accTime - initTime) / scale );
if (idx >= columns)
idx = columns - 1;
distArray[idx]++;
}
result.list = distArray;
cb({code: 0, message: 'Ok', value: result});
});
}
function toTimeSlot(days) {
var minutes;
if (days <= 4)
minutes = 30 * days;
else if (days <= 7)
minutes = 120;
else
minutes = days * 15;
var columns = days * 24 * 60 / minutes;
return {
scale: minutes * 60 * 1000,
columns: columns
};
}
/**
* How may days between from and to
*/
function daysBetweenDate(d1, d2) {
// at least 1 day long
return Math.max( Math.round( (d2.getTime() - d1.getTime()) / millisADay ), 1);
}
function stringToDate(s, d) {
var date;
if (s.indexOf('-')) {
var dp = s.split('-');
date = new Date(dp[0], dp[1]-1, dp[2]);
}
else {
var dp = s.split('/');
date = new Date(dp[2], dp[0] - 1, dp[1]);
}
if (d)
// make date adjustment
date.setDate(date.getDate() + d);
return date;
}
function toyyyymmdd(d) {
var y = d.getFullYear().toString(),
m = padZero(d.getMonth() + 1),
day = padZero(d.getDate());
return y + '-' + m + '-' + day;
}
function padZero(n) {
return n < 10 ? '0' + n : n.toString();
}