improve incoming tx status updating
This commit is contained in:
parent
2dc332cf1a
commit
38e562bdd6
3 changed files with 49 additions and 17 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue