diff --git a/lib/services/wallet-api/index.js b/lib/services/wallet-api/index.js index 8885e7a1..1f4a3c34 100644 --- a/lib/services/wallet-api/index.js +++ b/lib/services/wallet-api/index.js @@ -1,5 +1,6 @@ 'use strict'; +var async = require('async'); var BaseService = require('../../service'); var inherits = require('util').inherits; var index = require('../../'); @@ -133,6 +134,29 @@ WalletService.prototype._endpointPostAddresses = function() { }; }; +WalletService.prototype._endpointGetTransactions = function() { + var self = this; + return function(req, res) { + req.setTimeout(600000); + var walletId = req.params.walletId; + var options = { + start: req.query.start, + end : req.query.end, + from: req.query.from, + to: req.query.to + }; + self._getTransactions(walletId, options, function(err, transactions, totalCount) { + if(err) { + return utils.sendError(err, res); + } + res.status(200).jsonp({ + transactions: transactions, + totalCount: totalCount + }); + }); + }; +}; + WalletService.prototype._endpointPutAddresses = function() { var self = this; return function(req, res) { @@ -205,6 +229,45 @@ WalletService.prototype._getBalance = function(walletId, height, options, callba }); }; +WalletService.prototype._chunkAdresses = function(addresses) { + var maxLength = this.node.services.bitcoind.maxAddressesQuery; + var groups = []; + var groupsCount = Math.ceil(addresses.length / maxLength); + for(var i = 0; i < groupsCount; i++) { + groups.push(addresses.slice(i * maxLength, Math.min(maxLength * (i + 1), addresses.length))); + } + return groups; +}; + +WalletService.prototype._getTransactions = function(walletId, options, callback) { + var self = this; + self._getAddresses(walletId, function(err, addresses) { + if(err) { + return callback(err); + } + if (!addresses) { + return callback(new Error('wallet not found')); + } + var addressGroups = self._chunkAdresses(addresses); + var transactions = []; + async.eachSeries(addressGroups, function(addresses, next) { + self.node.services.bitcoind.getAddressHistory(addresses, options, function(err, history) { + if(err) { + return callback(err); + } + var groupTransactions = history.items.map(function(item) { + return item.tx; + }); + transactions = _.union(transactions, groupTransactions); + next(); + }); + + }, function(err) { + callback(null, transactions, transactions.length); + }); + }); +}; + WalletService.prototype._getAddresses = function(walletId, callback) { this._db.get(walletId, callback); }; @@ -239,6 +302,9 @@ WalletService.prototype.setupRoutes = function(app, express) { app.put('/wallets/:walletId/addresses', s._endpointPutAddresses() ); + app.get('/wallets/:walletId/transactions', + s._endpointGetTransactions() + ); app.post('/wallets', upload.single('addresses'), v.checkAddresses, diff --git a/lib/services/wallet-api/validators.js b/lib/services/wallet-api/validators.js index 3b3fdac7..2377ee87 100644 --- a/lib/services/wallet-api/validators.js +++ b/lib/services/wallet-api/validators.js @@ -147,7 +147,9 @@ exports.checkWalletId = function(req, res, next) { }; exports.checkAddresses = function(req, res, next) { - if(req.body) { + + if (!req.file && req.body) { + req.addresses = req.body; return next(); }