diff --git a/lib/plugins.js b/lib/plugins.js index b9923835..55859c4f 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -1,10 +1,8 @@ 'use strict'; var async = require('async'); - var logger = require('./logger'); - var SATOSHI_FACTOR = 1e8; var POLLING_RATE = 60 * 1000; // poll each minute var REAP_RATE = 5 * 1000; @@ -15,7 +13,6 @@ var MIN_CONFIDENCE = 0.7; var db = null; - var tickerPlugin = null; var traderPlugin = null; var walletPlugin = null; @@ -242,14 +239,10 @@ function reapTxs() { }); } +// TODO: Run these in parallel and return success exports.trade = function trade(deviceFingerprint, rawTrade, cb) { - var tx = { - txId: rawTrade.txId, - toAddress: rawTrade.toAddress, - currencyCode: rawTrade.currency - }; - db.addPendingTx(deviceFingerprint, tx); + // TODO: move this to DB, too // add bill to trader queue (if trader is enabled) if (traderPlugin) { tradesQueue.push({ @@ -258,8 +251,16 @@ exports.trade = function trade(deviceFingerprint, rawTrade, cb) { }); } - // record/log inserted bill - db.recordBill(deviceFingerprint, rawTrade, cb); + var tx = { + txId: rawTrade.txId, + toAddress: rawTrade.toAddress, + currencyCode: rawTrade.currency + }; + + async.parallel([ + async.apply(db.addPendingTx, deviceFingerprint, tx), + async.apply(db.recordBill, deviceFingerprint, rawTrade) + ], cb); }; exports.sendBitcoins = function sendBitcoins(deviceFingerprint, rawTx, cb) { diff --git a/lib/postgresql_interface.js b/lib/postgresql_interface.js index 67286bde..d0be0c88 100644 --- a/lib/postgresql_interface.js +++ b/lib/postgresql_interface.js @@ -75,25 +75,14 @@ exports.recordBill = function recordBill(deviceFingerprint, rec, cb) { rec.fiat ]; - if (rec.partialTx) { - values.push(rec.partialTx.satoshis, rec.partialTx.fiat); - fields.push('total_satoshis', 'total_fiat'); - } - - // NOTE: if is here to maintain compatibility with older machines - if (rec.uuid) { - values.push(rec.uuid); - fields.push('uuid'); - } - connect(function(err, client, done) { if (err) return cb(err); query(client, getInsertQuery('bills', fields), values, function(err) { done(); - if (err && PG_ERRORS[err.code] === 'uniqueViolation') - return cb(null, {code: 204}); - - cb(); // 201 => Accepted / saved + // TODO: Handle unique violations more cleanly for idempotency + // Now, it just returns an error, which should be fine, but a 204 status + // would be nicer. + cb(err); }); }); }; diff --git a/lib/routes.js b/lib/routes.js index 6b435795..7ca1dd20 100644 --- a/lib/routes.js +++ b/lib/routes.js @@ -81,9 +81,9 @@ function poll(req, res) { } function trade(req, res) { - plugins.trade(getFingerprint(req), req.body, function(err, data) { - var statusCode = data && data.code !== null ? data.code : 201; - res.json(statusCode, {err: null}); + plugins.trade(getFingerprint(req), req.body, function(err) { + var statusCode = err ? 500 : 201; + res.json(statusCode, {err: err}); }); }