Merge pull request #365 from pnagurny/enhance/history-pagination

address history pagination
This commit is contained in:
Braydon Fuller 2015-09-16 14:02:55 -04:00
commit 83c8f9c5ac
4 changed files with 122 additions and 109 deletions

View File

@ -48,12 +48,12 @@ AddressController.prototype.addressHistorySubQuery = function(req, res, param) {
AddressController.prototype.getAddressHistory = function(address, callback) { AddressController.prototype.getAddressHistory = function(address, callback) {
var self = this; var self = this;
this.node.getAddressHistory(address, true, function(err, txinfos) { this.node.getAddressHistory(address, {}, function(err, result) {
if(err) { if(err) {
return callback(err); return callback(err);
} }
callback(null, self.transformAddressHistory(txinfos, address)); callback(null, self.transformAddressHistory(result.items, address));
}); });
}; };
@ -184,12 +184,23 @@ AddressController.prototype.transformUtxo = function(utxo) {
AddressController.prototype.multitxs = function(req, res, next) { AddressController.prototype.multitxs = function(req, res, next) {
var self = this; var self = this;
this.node.getAddressHistory(req.addrs, true, function(err, txinfos) { var options = {
from: req.query.from || req.body.from || 0
};
options.to = req.query.to || req.body.to || options.from + 10;
self.node.getAddressHistory(req.addrs, options, function(err, result) {
if(err) { if(err) {
return common.handleErrors(err, res); return common.handleErrors(err, res);
} }
res.jsonp(self.transformAddressHistoryForMultiTxs(txinfos)); res.jsonp({
totalItems: result.totalCount,
from: options.from,
to: Math.min(options.to, result.totalCount),
items: self.transformAddressHistoryForMultiTxs(result.items)
});
}); });
}; };
@ -202,16 +213,9 @@ AddressController.prototype.transformAddressHistoryForMultiTxs = function(txinfo
return self.indexOf(value) === index; return self.indexOf(value) === index;
}).map(function(tx) { }).map(function(tx) {
return self.txController.transformTransaction(tx); return self.txController.transformTransaction(tx);
}).reverse(); });
var transformed = { return items;
totalItems: items.length,
from: 0,
to: items.length,
items: items
};
return transformed;
}; };

View File

@ -190,7 +190,7 @@ TxController.prototype.list = function(req, res) {
var blockHash = req.query.block; var blockHash = req.query.block;
var address = req.query.address; var address = req.query.address;
var page = req.query.pageNum; var page = parseInt(req.query.pageNum) || 0;
var pageLength = 10; var pageLength = 10;
var pagesTotal = 1; var pagesTotal = 1;
@ -235,28 +235,27 @@ TxController.prototype.list = function(req, res) {
}); });
}); });
} else if(address) { } else if(address) {
self.node.getAddressHistory(address, true, function(err, txinfos) { var options = {
from: page * pageLength,
to: (page + 1) * pageLength
};
self.node.getAddressHistory(address, options, function(err, result) {
if(err) { if(err) {
return common.handleErrors(err, res); return common.handleErrors(err, res);
} }
var txs = txinfos.map(function(info) { var txs = result.items.map(function(info) {
return info.tx; return info.tx;
}).filter(function(value, index, self) { }).filter(function(value, index, self) {
return self.indexOf(value) === index; return self.indexOf(value) === index;
}); });
var totalTxs = txs.length;
if(page) {
txs = txs.splice(page * pageLength, pageLength);
pagesTotal = Math.ceil(totalTxs / pageLength);
}
var transformed = txs.map(self.transformTransaction.bind(self)); var transformed = txs.map(self.transformTransaction.bind(self));
res.jsonp({ res.jsonp({
pagesTotal: pagesTotal, pagesTotal: Math.ceil(result.totalCount / pageLength),
txs: transformed txs: transformed
}); });
}); });

View File

@ -5,7 +5,9 @@ var AddressController = require('../lib/addresses');
var _ = require('lodash'); var _ = require('lodash');
var bitcore = require('bitcore'); var bitcore = require('bitcore');
var txinfos = [ var txinfos = {
totalCount: 2,
items: [
{ {
"address": "mkPvAKZ2rar6qeG3KjBtJHHMSP1wFZH7Er", "address": "mkPvAKZ2rar6qeG3KjBtJHHMSP1wFZH7Er",
"satoshis": 2782729129, "satoshis": 2782729129,
@ -86,7 +88,8 @@ var txinfos = [
"nLockTime": 534099 "nLockTime": 534099
} }
} }
]; ]
};
var tx = bitcore.Transaction().fromObject({ var tx = bitcore.Transaction().fromObject({
"hash": "63b68becb0e514b32317f4b29a5cf0627d4087e54ac17f686fcb1d9a27680f73", "hash": "63b68becb0e514b32317f4b29a5cf0627d4087e54ac17f686fcb1d9a27680f73",
@ -135,14 +138,14 @@ var tx = bitcore.Transaction().fromObject({
tx.__height = 534181; tx.__height = 534181;
tx.__timestamp = 1441116143; tx.__timestamp = 1441116143;
tx.__blockHash = '0000000000000041ddc94ecf4f86a456a83b2e320c36c6f0c13ff92c7e75f013'; tx.__blockHash = '0000000000000041ddc94ecf4f86a456a83b2e320c36c6f0c13ff92c7e75f013';
var txinfos2 = [ var txinfos2 = {
{ totalCount: 1,
tx: tx items: [
},
{ {
tx: tx tx: tx
} }
]; ]
};
var utxos = [ var utxos = [
{ {
@ -512,7 +515,9 @@ describe('Addresses', function() {
var addresses = new AddressController(node); var addresses = new AddressController(node);
var req = { var req = {
addrs: 'mzkD4nmQ8ixqxySdBgsXTpgvAMK5iRZpNK,moZY18rGNmh4YCPeugtGW46AkkWMQttBUD' addrs: 'mzkD4nmQ8ixqxySdBgsXTpgvAMK5iRZpNK,moZY18rGNmh4YCPeugtGW46AkkWMQttBUD',
query: {},
body: {}
}; };
var res = { var res = {

View File

@ -613,6 +613,11 @@ describe('Transactions', function() {
} }
]; ];
var historyResult = {
totalCount: txinfos.length,
items: txinfos
};
txinfos[0].tx.__blockHash = '00000000000001001aba15de213648f370607fb048288dd27b96f7e833a73520'; txinfos[0].tx.__blockHash = '00000000000001001aba15de213648f370607fb048288dd27b96f7e833a73520';
txinfos[0].tx.__timestamp = 1441068774; txinfos[0].tx.__timestamp = 1441068774;
txinfos[0].tx.__height = 534105; txinfos[0].tx.__height = 534105;
@ -622,7 +627,7 @@ describe('Transactions', function() {
txinfos[1].tx.__height = 534110; txinfos[1].tx.__height = 534110;
var node = { var node = {
getAddressHistory: sinon.stub().callsArgWith(2, null, txinfos), getAddressHistory: sinon.stub().callsArgWith(2, null, historyResult),
services: { services: {
db: { db: {
tip: { tip: {