diff --git a/lib/services/wallet/index.js b/lib/services/wallet-api/index.js similarity index 71% rename from lib/services/wallet/index.js rename to lib/services/wallet-api/index.js index 590f9384..8885e7a1 100644 --- a/lib/services/wallet/index.js +++ b/lib/services/wallet-api/index.js @@ -14,6 +14,8 @@ var storage = multer.memoryStorage(); var upload = multer({ storage: storage }); var validators = require('./validators'); var utils = require('./utils'); +var _ = require('lodash'); +var bodyParser = require('body-parser'); var WalletService = function(options) { BaseService.call(this, options); @@ -50,11 +52,12 @@ WalletService.prototype._endpointUTXOs = function() { var self = this; return function(req, res) { var walletId = req.params.walletId; + var queryMempool = req.query.queryMempool === false ? false : true; //var tip = self.node.bitcoind.tip; // TODO: get the height of the tip //var height = tip; var height = null; - self._getUtxos(walletId, height, function(err, utxos) { + self._getUtxos(walletId, height, options, function(err, utxos) { if(err) { return utils.sendError(err); } @@ -70,11 +73,18 @@ WalletService.prototype._endpointGetBalance= function() { var self = this; return function(req, res) { var walletId = req.params.walletId; + var queryMempool = req.query.queryMempool === false ? false : true; + //var tip = self.node.bitcoind.tip; // TODO: get the height of the tip //var height = tip; var height = null; - self._getBalance(walletId, height, function(err, balance) { + + var options = { + queryMempool: queryMempool + }; + + self._getBalance(walletId, height, options, function(err, balance) { if(err) { return utils.sendError(err); } @@ -93,8 +103,13 @@ WalletService.prototype._endpointGetAddresses = function() { self._getAddresses(walletId, function(err, addresses) { if(err) { - return utils.sendError(err); + return utils.sendError(err, res); } + + if(!addresses) { + return res.status(404).send('Not found'); + } + res.status(200).jsonp({ addresses: addresses }); @@ -118,7 +133,45 @@ WalletService.prototype._endpointPostAddresses = function() { }; }; -WalletService.prototype._getUtxos = function(walletId, height, callback) { +WalletService.prototype._endpointPutAddresses = function() { + var self = this; + return function(req, res) { + var newAddresses = req.body; + + if(!Array.isArray(req.body)) { + return utils.sendError(new Error('Must PUT an array'), res); + } + + var walletId = req.params.walletId; + + self._getAddresses(walletId, function(err, oldAddresses) { + if(err) { + return utils.sendError(err, res); + } + + if(!oldAddresses) { + return res.status(404).send('Not found'); + } + + var allAddresses = _.union(oldAddresses, newAddresses); + + var amountAdded = allAddresses.length - oldAddresses.length; + + self._storeAddresses(walletId, allAddresses, function(err) { + if(err) { + return utils.sendError(err, res); + } + + res.status(200).jsonp({ + walletId: walletId, + amountAdded: amountAdded + }); + }); + }); + }; +}; + +WalletService.prototype._getUtxos = function(walletId, height, options, callback) { // TODO get the balance only to this height var self = this; self._getAddresses(walletId, function(err, addresses) { @@ -126,20 +179,20 @@ WalletService.prototype._getUtxos = function(walletId, height, callback) { return callback(err); } - self.node.services.bitcoind.getAddressUnspentOutputs(addresses, {queryMempool: false}, callback); + self.node.services.bitcoind.getAddressUnspentOutputs(addresses, options, callback); }); }; -WalletService.prototype._getBalance = function(walletId, height, callback) { +WalletService.prototype._getBalance = function(walletId, height, options, callback) { // TODO get the balance only to this height var self = this; self._getAddresses(walletId, function(err, addresses) { if(err) { return callback(err); } - self.node.services.bitcoind.getAddressUnspentOutputs(addresses, { - queryMempool: false - }, function(err, utxos) { + + + self.node.services.bitcoind.getAddressUnspentOutputs(addresses, options, function(err, utxos) { if(err) { return callback(err); } @@ -168,6 +221,9 @@ WalletService.prototype._endpointGetInfo = function() { WalletService.prototype.setupRoutes = function(app, express) { var s = this; var v = validators; + + app.use(bodyParser.json()); + app.get('/info', s._endpointGetInfo() ); @@ -180,15 +236,19 @@ WalletService.prototype.setupRoutes = function(app, express) { app.get('/wallets/:walletId', s._endpointGetAddresses() ); - app.post('/wallets/addresses', + app.put('/wallets/:walletId/addresses', + s._endpointPutAddresses() + ); + app.post('/wallets', upload.single('addresses'), v.checkAddresses, s._endpointPostAddresses() ); + }; WalletService.prototype.getRoutePrefix = function() { - return 'bws'; + return 'wallet-api'; }; module.exports = WalletService; diff --git a/lib/services/wallet/utils.js b/lib/services/wallet-api/utils.js similarity index 100% rename from lib/services/wallet/utils.js rename to lib/services/wallet-api/utils.js diff --git a/lib/services/wallet/validators.js b/lib/services/wallet-api/validators.js similarity index 99% rename from lib/services/wallet/validators.js rename to lib/services/wallet-api/validators.js index b2ef0bf1..3b3fdac7 100644 --- a/lib/services/wallet/validators.js +++ b/lib/services/wallet-api/validators.js @@ -147,6 +147,9 @@ exports.checkWalletId = function(req, res, next) { }; exports.checkAddresses = function(req, res, next) { + if(req.body) { + return next(); + } if (!req.file || !req.file.buffer) { generateError(406, 'Content-Type must be set to multipart/form' +