Skip to content

Commit 47da51a

Browse files
committed
add top markets, currencies endpoints
1 parent a01720b commit 47da51a

File tree

5 files changed

+256
-37
lines changed

5 files changed

+256
-37
lines changed

api/routesV2/network/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ module.exports = function(db) {
33
return {
44
exchangeVolume: getMetric.bind(undefined, 'trade_volume'),
55
paymentVolume: getMetric.bind(undefined, 'payment_volume'),
6-
issuedValue: getMetric.bind(undefined, 'issued_value')
6+
issuedValue: getMetric.bind(undefined, 'issued_value'),
7+
topMarkets: require('./topMarkets')(db),
8+
topCurrencies: require('./topCurrencies')(db)
79
}
810
};

api/routesV2/network/topCurrencies.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
'use strict';
2+
3+
var Logger = require('../../../lib/logger');
4+
var log = new Logger({scope: 'top currencies'});
5+
var smoment = require('../../../lib/smoment');
6+
var utils = require('../../../lib/utils');
7+
var hbase;
8+
9+
var getTopCurrencies = function(req, res) {
10+
var options = {
11+
date: req.params.date ? smoment(req.params.date) : undefined,
12+
format: (req.query.format || 'json').toLowerCase()
13+
};
14+
15+
if (req.params.date && !options.date) {
16+
errorResponse({
17+
error: 'invalid date format',
18+
code: 400
19+
});
20+
return;
21+
22+
} else if (options.date) {
23+
options.date.moment.startOf('day');
24+
}
25+
26+
hbase.getTopCurrencies(options, function(err, markets) {
27+
if (err) {
28+
errorResponse(err);
29+
} else {
30+
successResponse(markets, options);
31+
}
32+
});
33+
34+
35+
/**
36+
* errorResponse
37+
* return an error response
38+
* @param {Object} err
39+
*/
40+
41+
function errorResponse(err) {
42+
log.error(err.error || err);
43+
if (err.code && err.code.toString()[0] === '4') {
44+
res.status(err.code).json({
45+
result: 'error',
46+
message: err.error
47+
});
48+
} else {
49+
res.status(500).json({
50+
result: 'error',
51+
message: 'unable to retrieve top currencies'
52+
});
53+
}
54+
}
55+
56+
/**
57+
* successResponse
58+
* return a successful response
59+
* @param {Object} markets
60+
* @param {Object} options
61+
*/
62+
63+
function successResponse(markets, options) {
64+
var date = options.date ?
65+
options.date.format() : smoment().format();
66+
67+
if (options.format === 'csv') {
68+
filename = 'top currencies - ' + date + '.csv';
69+
res.csv(markets, filename);
70+
71+
} else {
72+
res.json({
73+
result: 'success',
74+
date: date,
75+
count: markets.length,
76+
markets: markets
77+
});
78+
}
79+
}
80+
};
81+
82+
module.exports = function(db) {
83+
hbase = db;
84+
return getTopCurrencies;
85+
};

api/routesV2/network/topMarkets.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
'use strict';
2+
3+
var Logger = require('../../../lib/logger');
4+
var log = new Logger({scope: 'top markets'});
5+
var smoment = require('../../../lib/smoment');
6+
var utils = require('../../../lib/utils');
7+
var hbase;
8+
9+
var getTopMarkets = function(req, res) {
10+
var options = {
11+
date: req.params.date ? smoment(req.params.date) : undefined,
12+
format: (req.query.format || 'json').toLowerCase()
13+
};
14+
15+
if (req.params.date && !options.date) {
16+
errorResponse({
17+
error: 'invalid date format',
18+
code: 400
19+
});
20+
return;
21+
22+
} else if (options.date) {
23+
options.date.moment.startOf('day');
24+
}
25+
26+
hbase.getTopMarkets(options, function(err, markets) {
27+
if (err) {
28+
errorResponse(err);
29+
} else {
30+
successResponse(markets, options);
31+
}
32+
});
33+
34+
35+
/**
36+
* errorResponse
37+
* return an error response
38+
* @param {Object} err
39+
*/
40+
41+
function errorResponse(err) {
42+
log.error(err.error || err);
43+
if (err.code && err.code.toString()[0] === '4') {
44+
res.status(err.code).json({
45+
result: 'error',
46+
message: err.error
47+
});
48+
} else {
49+
res.status(500).json({
50+
result: 'error',
51+
message: 'unable to retrieve top markets'
52+
});
53+
}
54+
}
55+
56+
/**
57+
* successResponse
58+
* return a successful response
59+
* @param {Object} markets
60+
* @param {Object} options
61+
*/
62+
63+
function successResponse(markets, options) {
64+
var date = options.date ?
65+
options.date.format() : smoment().format();
66+
var filename;
67+
68+
if (options.format === 'csv') {
69+
filename = 'top markets - ' + date + '.csv';
70+
res.csv(markets, filename);
71+
72+
} else {
73+
res.json({
74+
result: 'success',
75+
date: date,
76+
count: markets.length,
77+
markets: markets
78+
});
79+
}
80+
}
81+
};
82+
83+
module.exports = function(db) {
84+
hbase = db;
85+
return getTopMarkets;
86+
};

api/server.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ var Server = function (options) {
5555
app.get('/v2/network/exchange_volume', routesV2.network.exchangeVolume);
5656
app.get('/v2/network/payment_volume', routesV2.network.paymentVolume);
5757
app.get('/v2/network/issued_value', routesV2.network.issuedValue);
58-
//app.get('/v2/network/top_markets', routesV2.network.topMarkets);
59-
//app.get('/v2/network/top_currencies', routesV2.network.topCurrencies);
58+
app.get('/v2/network/top_markets/:date?', routesV2.network.topMarkets);
59+
app.get('/v2/network/top_currencies/:date?', routesV2.network.topCurrencies);
6060
app.get('/v2/last_validated', routesV2.getLastValidated);
6161
app.get('/v2/transactions/', routesV2.getTransactions);
6262
app.get('/v2/transactions/:tx_hash', routesV2.getTransactions);

lib/hbase/hbase-client.js

Lines changed: 80 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -790,52 +790,98 @@ HbaseClient.prototype.getCapitalization = function (options, callback) {
790790
}
791791
}
792792

793+
/**
794+
* getTopCurrencies
795+
*/
796+
797+
HbaseClient.prototype.getTopCurrencies = function(options, callback) {
798+
options.table = 'top_currencies';
799+
this.getTop(options, callback);
800+
};
801+
793802
/**
794803
* getTopMarkets
795804
*/
796805

797806
HbaseClient.prototype.getTopMarkets = function(options, callback) {
807+
options.table = 'top_markets';
808+
this.getTop(options, callback);
809+
};
810+
811+
/**
812+
* getTop
813+
*/
814+
815+
HbaseClient.prototype.getTop = function(options, callback) {
798816
var self = this;
799-
var date = options.date || smoment();
817+
var start;
818+
var end;
800819

801-
self.getScan({
802-
table: 'top_100_market',
803-
startRow: date.format('YYYYMMDD'),
804-
stopRow: date.moment.add(1, 'day').format('YYYYMMDD')
820+
if (options.table !== 'top_markets' &&
821+
options.table !== 'top_currencies') {
822+
callback('invalid table');
823+
return;
824+
}
805825

806-
}, function(err, resp) {
807-
if (resp && resp.length) {
808-
callback(null, formatMarkets(resp));
809-
} else {
810-
callback(err, resp);
811-
}
826+
if (options.date) {
827+
start = smoment(options.date);
828+
end = smoment(start);
829+
end.moment.add(1, 'day');
830+
getTopHelper(options.table, start, end);
812831

813-
function formatMarkets(list) {
814-
var markets = [];
815-
resp.forEach(function(market) {
816-
markets.push({
817-
base: {
818-
currency: market.base_currency,
819-
issuer: market.base_issuer
820-
},
821-
counter: {
822-
currency: market.counter_currency,
823-
issuer: market.counter_issuer
824-
},
825-
rank: Number(market.row_number),
826-
count: Number(market.number_txn),
827-
volume: market.xrp_value
828-
});
829-
});
832+
// get the latest in the table
833+
} else {
834+
start = smoment();
835+
end = smoment(0);
836+
837+
self.getScan({
838+
table: options.table,
839+
startRow: start.format('YYYYMMDD'),
840+
stopRow: end.format('YYYYMMDD'),
841+
descending: true,
842+
limit: 1
843+
}, function(err, resp) {
844+
console.log(err, resp);
845+
if (err || !resp.length) {
846+
callback(err || 'no markets found');
847+
} else {
848+
start = smoment(resp[0].date || resp[0].close_time_human);
849+
end = smoment(start);
850+
end.moment.add(1, 'day');
851+
getTopHelper(options.table, start, end);
852+
}
853+
});
854+
}
830855

831-
markets.sort(function(a, b) {
832-
return a.rank - b.rank;
833-
});
856+
function getTopHelper(table, start, end) {
857+
self.getScan({
858+
table: table,
859+
startRow: start.format('YYYYMMDD'),
860+
stopRow: end.format('YYYYMMDD')
861+
}, function(err, resp) {
862+
if (resp && resp.length) {
863+
callback(null, formatResults(resp));
864+
} else {
865+
callback(err, resp);
866+
}
834867

835-
return markets;
836-
}
837-
});
868+
function formatResults(list) {
869+
var results = [];
870+
list.forEach(function(d) {
871+
d.rank = Number(d.rank);
872+
d.distinct_counterparty_count = Number(d.counterparty_count);
873+
874+
delete d.rowkey;
875+
delete d.date;
876+
delete d.close_date_human;
877+
delete d.counterparty_count;
878+
results.push(d);
879+
});
838880

881+
return results;
882+
}
883+
});
884+
}
839885
};
840886

841887
/**

0 commit comments

Comments
 (0)