-
Notifications
You must be signed in to change notification settings - Fork 68
/
accountStats.js
121 lines (99 loc) · 2.7 KB
/
accountStats.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
var Logger = require('../../lib/logger');
var log = new Logger({scope : 'Account Stats'});
var utils = require('../../lib/utils');
var smoment = require('../../lib/smoment');
var hbase = require('../../lib/hbase')
var families = ['transactions', 'value'];
/**
* Account Stats
*/
var AccountStats = function (req, res, next) {
var days;
var options = {
account: req.params.address,
family: req.params.family,
start: smoment(req.query.start || '2013-01-01'),
end: smoment(req.query.end),
limit: req.query.limit || 200,
marker: req.query.marker,
descending: (/true/i).test(req.query.descending) ? true : false,
format: (req.query.format || 'json').toLowerCase()
};
if (req.params.date) {
options.start = smoment(req.params.date);
options.end = smoment(req.params.date);
}
if (!options.start) {
errorResponse({error: 'invalid start date format', code: 400});
return;
} else if (!options.end) {
errorResponse({error: 'invalid end date format', code: 400});
return;
}
if (isNaN(options.limit)) {
options.limit = 200;
} else if (options.limit > 1000) {
options.limit = 1000;
}
days = options.end.moment.diff(options.start.moment, 'days');
if (!days) {
options.start.moment.startOf('day');
}
if (families.indexOf(options.family) === -1) {
errorResponse({error: 'invalid family', code: 400});
return;
}
log.info(options.family, options.account, options.start.format(), '-', options.end.format());
hbase.getAccountStats(options, function(err, resp) {
if (err) {
errorResponse(err);
} else {
successResponse(resp);
}
});
/**
* errorResponse
* return an error response
* @param {Object} err
*/
function errorResponse (err) {
log.error(err.error || err);
if (err.code && err.code.toString()[0] === '4') {
res.status(err.code).json({
result:'error',
message:err.error
});
} else {
res.status(500).json({
result:'error',
message:'unable to retrieve exchanges'
});
}
}
/**
* successResponse
* return a successful response
* @param {Object} payments
*/
function successResponse(resp) {
if (resp.marker) {
utils.addLinkHeader(req, res, resp.marker);
}
if (options.format === 'csv') {
var filename = options.account + ' - stats.' + options.family + '.csv';
var results = [];
resp.rows.forEach(function(r) {
results.push(utils.flattenJSON(r));
});
res.csv(results, filename);
} else {
res.json({
result: 'success',
count: resp.rows.length,
marker: resp.marker,
rows: resp.rows
});
}
}
};
module.exports = AccountStats