improve incoming tx status updating

This commit is contained in:
Josh Harvey 2016-05-31 19:13:35 +03:00
parent 2dc332cf1a
commit 38e562bdd6
3 changed files with 49 additions and 17 deletions

View file

@ -1,3 +1,4 @@
// @flow weak
'use strict'
const BigNumber = require('bignumber.js')
@ -302,18 +303,51 @@ exports.fetchUnnotifiedTxs = function fetchUnnotifiedTxs (age, waitPeriod) {
.then(rows => normalizeTxs(rows))
}
exports.updateTxStatus = function updateTxStatus (tx, status, confirm) {
const sql = confirm
? 'UPDATE cash_out_txs SET status=$1, confirmation_time=now() WHERE session_id=$2'
: 'UPDATE cash_out_txs SET status=$1 WHERE session_id=$2'
function ratchetStatus (oldStatus, newStatus) {
const statusOrder = ['notSeen', 'published', 'rejected',
'authorized', 'instant', 'confirmed']
const values = [status, tx.sessionId]
if (oldStatus === newStatus) return oldStatus
if (newStatus === 'insufficientFunds') return newStatus
return db.none(sql, values)
.then(() => {
const sql2 = 'insert into cash_out_actions (session_id, action) values ($1, $2)'
return db.none(sql2, [tx.sessionId, status])
})
const idx = Math.max(statusOrder.indexOf(oldStatus), statusOrder.indexOf(newStatus))
return statusOrder[idx]
}
exports.updateTxStatus = function updateTxStatus (tx, status) {
const TransactionMode = pgp.txMode.TransactionMode
const isolationLevel = pgp.txMode.isolationLevel
const tmSRD = new TransactionMode({tiLevel: isolationLevel.serializable})
function transaction (t) {
const sql = 'select status, confirmation_time from cash_out_txs where session_id=$1'
return t.one(sql, [tx.sessionId])
.then(row => {
const newStatus = ratchetStatus(row.status, status)
if (row.status === newStatus) return
const setConfirmationTime = !row.confirmation_time &&
(newStatus === 'instant' || newStatus === 'confirmed')
const sql2 = setConfirmationTime
? 'UPDATE cash_out_txs SET status=$1, confirmation_time=now() WHERE session_id=$2'
: 'UPDATE cash_out_txs SET status=$1 WHERE session_id=$2'
const values2 = [newStatus, tx.sessionId]
return t.none(sql2, values2)
.then(() => {
const sql3 = 'insert into cash_out_actions (session_id, action) values ($1, $2)'
return t.none(sql3, [tx.sessionId, newStatus])
})
})
}
transaction.txMode = tmSRD
// Note: don't worry about retrying failed transaction here
// It will be tried again on the next status check
return db.tx(transaction)
}
exports.updateRedeem = function updateRedeem (session) {