From 18deef115a582df863492af2272c4a0a24ff1656 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Mon, 17 Nov 2014 18:28:01 -0300 Subject: [PATCH] using paginated version of insight-api addrs/txs --- js/models/Insight.js | 7 +++++-- js/models/Wallet.js | 39 ++++++++++++++++++------------------ test/Wallet.js | 36 ++++++++++++++++++++++++++------- test/blockchain.Insight.js | 8 ++++---- test/mocks/FakeBlockchain.js | 4 ++-- 5 files changed, 60 insertions(+), 34 deletions(-) diff --git a/js/models/Insight.js b/js/models/Insight.js index ddf408ed0..2f3e8f90c 100644 --- a/js/models/Insight.js +++ b/js/models/Insight.js @@ -269,11 +269,14 @@ Insight.prototype.getTransaction = function(txid, cb) { }); }; -Insight.prototype.getTransactions = function (addresses, cb) { +Insight.prototype.getTransactions = function (addresses, from, to, cb) { preconditions.shouldBeArray(addresses); preconditions.shouldBeFunction(cb); - this.requestPost('/api/addrs/txs', { + var qs = '?from=' + (from || 0); + if (to) qs += '&to=' + to; + + this.requestPost('/api/addrs/txs' + qs, { addrs: addresses.join(',') }, function (err, res, txs) { if (err || res.statusCode != 200) return cb(err || res); diff --git a/js/models/Wallet.js b/js/models/Wallet.js index 22c98aa81..2edadc079 100644 --- a/js/models/Wallet.js +++ b/js/models/Wallet.js @@ -3029,38 +3029,39 @@ Wallet.prototype.getTransactionHistory = function(opts, cb) { } }; - function paginate(list, currentPage, itemsPerPage) { - var res = { - itemsPerPage: itemsPerPage || list.length, - currentPage: currentPage || 1, - nbItems: list.length, + function paginate(res, currentPage, itemsPerPage) { + if (!res) { + res = { + totalItems: 0, + items: [], + }; }; - res.nbPages = res.itemsPerPage != 0 ? Math.ceil(res.nbItems / res.itemsPerPage) : 1; - var from = (res.currentPage - 1) * res.itemsPerPage; - var to = Math.min(from + res.itemsPerPage, res.nbItems); - res.items = list.slice(from, to); - - return res; + var r = { + itemsPerPage: itemsPerPage || res.totalItems, + currentPage: currentPage || 1, + nbItems: res.totalItems, + items: res.items, + }; + r.nbPages = r.itemsPerPage != 0 ? Math.ceil(r.nbItems / r.itemsPerPage) : 1; + return r; }; if (addresses.length > 0) { var addressesStr = _.pluck(addresses, 'addressStr'); - self.blockchain.getTransactions(addressesStr, function(err, txs) { + var from = (opts.currentPage - 1) * opts.itemsPerPage; + var to = opts.currentPage * opts.itemsPerPage; + self.blockchain.getTransactions(addressesStr, from, to, function(err, res) { if (err) return cb(err); - var history = _.map(txs, function(tx) { + _.each(res.items, function(tx) { decorateTx(tx); - return tx; - }); - history.sort(function(a, b) { - return (b.sentTs || b.minedTs) - (a.sentTs || a.minedTs); }); - return cb(null, paginate(history, opts.currentPage, opts.itemsPerPage)); + return cb(null, paginate(res, opts.currentPage, opts.itemsPerPage)); }); } else { - return paginate([], opts.currentPage, opts.ItemsPerPage); + return cb(null, paginate(null, opts.currentPage, opts.itemsPerPage)); } }; diff --git a/test/Wallet.js b/test/Wallet.js index f0d3466b9..63665173c 100644 --- a/test/Wallet.js +++ b/test/Wallet.js @@ -1979,7 +1979,10 @@ describe('Wallet model', function() { fees: 0.00000100 }]; - w.blockchain.getTransactions = sinon.stub().yields(null, txs); + w.blockchain.getTransactions = sinon.stub().yields(null, { + items: txs, + totalItems: txs.length, + }); w.getAddressesInfo = sinon.stub().returns([{ addressStr: 'addr_in_1' }, { @@ -2045,7 +2048,10 @@ describe('Wallet model', function() { fees: 0.00000100 }]; - w.blockchain.getTransactions = sinon.stub().yields(null, txs); + w.blockchain.getTransactions = sinon.stub().yields(null, { + items: txs.slice(2,3), + totalItems: txs.length, + }); w.getAddressesInfo = sinon.stub().returns([{ addressStr: 'addr_in_1' }, { @@ -2068,7 +2074,11 @@ describe('Wallet model', function() { }); it('should paginate empty list', function(done) { var w = cachedCreateW2(); - w.blockchain.getTransactions = sinon.stub().yields(null, []); + var txs = []; + w.blockchain.getTransactions = sinon.stub().yields(null, { + items: txs, + totalItems: txs.length, + }); w.getAddressesInfo = sinon.stub().returns([{ addressStr: 'addr_in_1' }, { @@ -2111,7 +2121,10 @@ describe('Wallet model', function() { fees: 0.00000100 }]; - w.blockchain.getTransactions = sinon.stub().yields(null, txs); + w.blockchain.getTransactions = sinon.stub().yields(null, { + items: txs, + totalItems: txs.length, + }); w.getAddressesInfo = sinon.stub().returns([{ addressStr: 'addr_in_1' }, { @@ -2154,7 +2167,10 @@ describe('Wallet model', function() { fees: 0.00000100 }]; - w.blockchain.getTransactions = sinon.stub().yields(null, txs); + w.blockchain.getTransactions = sinon.stub().yields(null, { + items: txs, + totalItems: txs.length, + }); w.getAddressesInfo = sinon.stub().returns([{ addressStr: 'addr_1' }, { @@ -2197,7 +2213,10 @@ describe('Wallet model', function() { fees: 0.00000100 }]; - w.blockchain.getTransactions = sinon.stub().yields(null, txs); + w.blockchain.getTransactions = sinon.stub().yields(null, { + items: txs, + totalItems: txs.length, + }); w.getAddressesInfo = sinon.stub().returns([{ addressStr: 'addr_in_1' }, { @@ -2245,7 +2264,10 @@ describe('Wallet model', function() { fees: 0.00000100 }]; - w.blockchain.getTransactions = sinon.stub().yields(null, txs); + w.blockchain.getTransactions = sinon.stub().yields(null, { + items: txs, + totalItems: txs.length, + }); w.getAddressesInfo = sinon.stub().returns([{ addressStr: 'addr_in_1' }, { diff --git a/test/blockchain.Insight.js b/test/blockchain.Insight.js index 9c445e51f..fda233305 100644 --- a/test/blockchain.Insight.js +++ b/test/blockchain.Insight.js @@ -230,19 +230,19 @@ describe('Insight model', function() { var blockchain = new Insight(FAKE_OPTS); sinon.stub(blockchain, "requestPost", function(url, data, cb) { - url.should.be.equal('/api/addrs/txs'); + url.should.be.equal('/api/addrs/txs?from=0'); data.addrs.should.be.equal('2NATQJnaQe2CUKLyhL1zdNkttJM1dUH9HaM,2NE9hTCffeugo5gQtfB4owq98gyTeWC56yb'); setTimeout(function() { var res = {statusCode: 200}; - var body = [1, 2, 3]; + var body = { totalItems: 3, items: [1, 2, 3] }; cb(null, res, body); }, 0); }); var addresses = ['2NATQJnaQe2CUKLyhL1zdNkttJM1dUH9HaM', '2NE9hTCffeugo5gQtfB4owq98gyTeWC56yb']; - blockchain.getTransactions(addresses, function(err, txs) { + blockchain.getTransactions(addresses, null, null, function(err, res) { chai.expect(err).to.be.null; - txs.length.should.be.equal(3); + res.items.length.should.be.equal(3); done(); }); }); diff --git a/test/mocks/FakeBlockchain.js b/test/mocks/FakeBlockchain.js index 208688d62..6af0cc8e3 100644 --- a/test/mocks/FakeBlockchain.js +++ b/test/mocks/FakeBlockchain.js @@ -10,8 +10,8 @@ FakeBlockchain.prototype.getTransaction = function(txid, cb) { return cb(null, {txid: txid}); }; -FakeBlockchain.prototype.getTransactions = function(addresses, cb) { - cb(null, []); +FakeBlockchain.prototype.getTransactions = function(addresses, from, to, cb) { + cb(null, { totalItems: 0, items: [] }); }; FakeBlockchain.prototype.subscribe = function() {