Log unsuccessful trade attempts in the db (#224)

* Save trade error in table trades

* Add one migration, Add error column to trades table

* changes in plugins.js file

* Apply standardjs to plugins.js file
This commit is contained in:
Davit Abulashvili 2018-11-28 22:24:48 +04:00 committed by Josh Harvey
parent 13040f41a1
commit 907cd08cf1
3 changed files with 103 additions and 41 deletions

View file

@ -21,7 +21,9 @@ const machineLoader = require('./machine-loader')
const customers = require('./customers')
const coinUtils = require('./coin-utils')
const mapValuesWithKey = _.mapValues.convert({cap: false})
const mapValuesWithKey = _.mapValues.convert({
cap: false
})
const TRADE_TTL = 2 * T.minutes
const STALE_TICKER = 3 * T.minutes
@ -133,7 +135,8 @@ function plugins (settings, deviceId) {
if (!config.cashOutEnabled) return Promise.resolve()
const denominations = [config.topCashOutDenomination,
config.bottomCashOutDenomination ]
config.bottomCashOutDenomination
]
const virtualCassettes = [config.virtualCashOutDenomination]
return Promise.all([dbm.cassetteCounts(deviceId), cashOutHelper.redeemableTxs(deviceId, excludeTxId)])
@ -162,7 +165,10 @@ function plugins (settings, deviceId) {
}
} catch (err) {
logger.error(err)
return {cassettes, virtualCassettes}
return {
cassettes,
virtualCassettes
}
}
})
}
@ -244,7 +250,9 @@ function plugins (settings, deviceId) {
return Promise.all([
db.none(`insert into machine_pings(device_id, device_time) values($1, $2)
ON CONFLICT (device_id) DO UPDATE SET device_time = $2`, [deviceId, deviceTime]),
db.none(pgp.helpers.update(devices, null, 'devices') + 'WHERE device_id = ${deviceId}', { deviceId })
db.none(pgp.helpers.update(devices, null, 'devices') + 'WHERE device_id = ${deviceId}', {
deviceId
})
])
}
@ -271,7 +279,8 @@ function plugins (settings, deviceId) {
function dispenseAck (tx) {
const config = configManager.machineScoped(deviceId, settings.config)
const cassettes = [config.topCashOutDenomination,
config.bottomCashOutDenomination ]
config.bottomCashOutDenomination
]
return dbm.addDispense(deviceId, tx, cassettes)
}
@ -300,7 +309,10 @@ function plugins (settings, deviceId) {
const shiftedRate = rate.shift(-unitScale)
const fiatTransferBalance = balance.mul(shiftedRate).div(lowBalanceMargin)
return {timestamp: balanceRec.timestamp, balance: fiatTransferBalance.truncated().toString()}
return {
timestamp: balanceRec.timestamp,
balance: fiatTransferBalance.truncated().toString()
}
})
}
@ -387,7 +399,10 @@ function plugins (settings, deviceId) {
sms: {
body: `${subject} - ${body}`
},
email: { subject, body }
email: {
subject,
body
}
}
return sendTransactionMessage(rec)
}
@ -489,7 +504,10 @@ function plugins (settings, deviceId) {
const fiatCode = config.fiatCurrency
const cryptoCodes = config.cryptoCurrencies
return cryptoCodes.map(cryptoCode => ({fiatCode, cryptoCode}))
return cryptoCodes.map(cryptoCode => ({
fiatCode,
cryptoCode
}))
})
const tradesPromises = _.uniq(_.flatten(lists))
@ -527,6 +545,12 @@ function plugins (settings, deviceId) {
return execute(settings, tradeEntry.cryptoAtoms, tradeEntry.fiatCode, tradeEntry.cryptoCode)
.then(() => recordTrade(tradeEntry))
.catch(err => {
return recordTrade(tradeEntry, err)
.then(() => {
throw err
})
})
}
function convertBigNumFields (obj) {
@ -541,14 +565,23 @@ function plugins (settings, deviceId) {
return _.mapKeys(convertKey, mapValuesWithKey(convert, obj))
}
function recordTrade (_tradeEntry) {
function mergeTradeEntryAndError (tradeEntry, error) {
if (error && error.message) {
return Object.assign({}, tradeEntry, {
error: error.message.slice(0, 200)
})
}
return tradeEntry
}
function recordTrade (_tradeEntry, error) {
const massage = _.flow(
_.pick(['cryptoCode', 'cryptoAtoms', 'fiatCode', 'type']),
mergeTradeEntryAndError,
_.pick(['cryptoCode', 'cryptoAtoms', 'fiatCode', 'type', 'error']),
convertBigNumFields,
_.mapKeys(_.snakeCase)
)
const tradeEntry = massage(_tradeEntry)
const tradeEntry = massage(_tradeEntry, error)
const sql = pgp.helpers.insert(tradeEntry, null, 'trades')
return db.none(sql)
}
@ -585,27 +618,36 @@ function plugins (settings, deviceId) {
const cashOutEnabled = config.cashOutEnabled
const cashInAlert = device.cashbox > config.cashInAlertThreshold
? {code: 'CASH_BOX_FULL', machineName, deviceId: device.deviceId, notes: device.cashbox}
? {
code: 'CASH_BOX_FULL',
machineName,
deviceId: device.deviceId,
notes: device.cashbox
}
: null
const cassette1Alert = cashOutEnabled && device.cassette1 < config.cashOutCassette1AlertThreshold
? {code: 'LOW_CASH_OUT',
? {
code: 'LOW_CASH_OUT',
cassette: 1,
machineName,
deviceId: device.deviceId,
notes: device.cassette1,
denomination: denomination1,
fiatCode}
fiatCode
}
: null
const cassette2Alert = cashOutEnabled && device.cassette2 < config.cashOutCassette2AlertThreshold
? {code: 'LOW_CASH_OUT',
? {
code: 'LOW_CASH_OUT',
cassette: 2,
machineName,
deviceId: device.deviceId,
notes: device.cassette2,
denomination: denomination2,
fiatCode}
fiatCode
}
: null
return _.compact([cashInAlert, cassette1Alert, cassette2Alert])
@ -636,7 +678,12 @@ function plugins (settings, deviceId) {
const cryptoAlertThreshold = config.cryptoAlertThreshold
return BN(fiatBalance.balance).lt(cryptoAlertThreshold)
? {code: 'LOW_CRYPTO_BALANCE', cryptoCode, fiatBalance, fiatCode}
? {
code: 'LOW_CRYPTO_BALANCE',
cryptoCode,
fiatBalance,
fiatCode
}
: null
}

View file

@ -0,0 +1,15 @@
var db = require('./db')
exports.up = function (next) {
const sql = [
'alter table trades add column error text',
]
db.multi(sql, next)
}
exports.down = function (next) {
const sql = ['alter table trades drop column error']
db.multi(sql, next)
}

2
package-lock.json generated
View file

@ -3281,7 +3281,7 @@
"dependencies": {
"doctrine": {
"version": "1.5.0",
"resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
"integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
"dev": true,
"requires": {