testing/fixing
This commit is contained in:
parent
59e93445ec
commit
1df6fe6ed1
5 changed files with 77 additions and 67 deletions
|
|
@ -338,9 +338,8 @@ function reapTxs () {
|
||||||
|
|
||||||
// NOTE: No harm in processing old pending tx, we don't need to wait for
|
// NOTE: No harm in processing old pending tx, we don't need to wait for
|
||||||
// removeOldPending to complete.
|
// removeOldPending to complete.
|
||||||
db.pendingTxs(PENDING_TIMEOUT, function (err, results) {
|
db.pendingTxs(PENDING_TIMEOUT, function (err, rows) {
|
||||||
if (err) return logger.warn(err)
|
if (err) return logger.warn(err)
|
||||||
var rows = results.rows
|
|
||||||
var rowCount = rows.length
|
var rowCount = rows.length
|
||||||
for (var i = 0; i < rowCount; i++) {
|
for (var i = 0; i < rowCount; i++) {
|
||||||
var row = rows[i]
|
var row = rows[i]
|
||||||
|
|
@ -446,8 +445,11 @@ function processTxStatus (tx) {
|
||||||
const cryptoCode = tx.cryptoCode
|
const cryptoCode = tx.cryptoCode
|
||||||
const walletPlugin = walletPlugins[cryptoCode]
|
const walletPlugin = walletPlugins[cryptoCode]
|
||||||
|
|
||||||
walletPlugin.getStatus(tx, function (err, status) {
|
walletPlugin.getStatus(tx.toAddress, tx.cryptoAtoms, function (err, res) {
|
||||||
if (err) return logger.error(err)
|
if (err) return logger.error(err)
|
||||||
|
console.log('DEBUG5')
|
||||||
|
console.log(res)
|
||||||
|
var status = res.status
|
||||||
if (tx.status === status) return
|
if (tx.status === status) return
|
||||||
db.updateTxStatus(tx, status, function (_err) {
|
db.updateTxStatus(tx, status, function (_err) {
|
||||||
if (_err) return logger.error(err)
|
if (_err) return logger.error(err)
|
||||||
|
|
@ -464,7 +466,7 @@ function monitorLiveIncoming () {
|
||||||
}
|
}
|
||||||
|
|
||||||
function monitorIncoming () {
|
function monitorIncoming () {
|
||||||
const statuses = ['notSeen', 'published', 'zeroConf', 'authorized', 'rejected']
|
const statuses = ['notSeen', 'published', 'authorized', 'instant', 'rejected']
|
||||||
db.fetchOpenTxs(statuses, STALE_INCOMING_TX_AGE, function (err, txs) {
|
db.fetchOpenTxs(statuses, STALE_INCOMING_TX_AGE, function (err, txs) {
|
||||||
if (err) return
|
if (err) return
|
||||||
txs.forEach(processTxStatus)
|
txs.forEach(processTxStatus)
|
||||||
|
|
@ -758,10 +760,7 @@ exports.getPhoneCode = function getPhoneCode (phone) {
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.updatePhone = function updatePhone (session, tx) {
|
exports.updatePhone = function updatePhone (session, tx) {
|
||||||
db.addIncomingPhone(session, tx, err => {
|
return db.addIncomingPhone(session, tx)
|
||||||
if (err) return Promise.reject(err)
|
|
||||||
return Promise.resolve()
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.fetchPhoneTx = function fetchPhoneTx (phone) {
|
exports.fetchPhoneTx = function fetchPhoneTx (phone) {
|
||||||
|
|
@ -781,16 +780,8 @@ exports.fetchPhoneTx = function fetchPhoneTx (phone) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.fetchTx = function fetchTx (session, status) {
|
exports.fetchTx = function fetchTx (session) {
|
||||||
return db.fetchTx(session)
|
return db.fetchTx(session)
|
||||||
.then(txRecs => {
|
|
||||||
const deposits = txRecs.filter(t => t.stage === 'deposit')
|
|
||||||
const deposit = R.last(deposits)
|
|
||||||
const status = deposit ? deposit.authority : 'notSeen'
|
|
||||||
const tx = txRecs.find(t => t.stage === 'initial_request')
|
|
||||||
if (!tx) return null
|
|
||||||
return R.assoc('status', status, tx)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.requestDispense = function requestDispense (session, tx) {
|
exports.requestDispense = function requestDispense (session, tx) {
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ exports.recordBill = function recordBill (session, rec, cb) {
|
||||||
rec.toAddress,
|
rec.toAddress,
|
||||||
session.id,
|
session.id,
|
||||||
rec.deviceTime,
|
rec.deviceTime,
|
||||||
rec.cryptoAtoms,
|
rec.cryptoAtoms.toString(),
|
||||||
rec.fiat
|
rec.fiat
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -227,7 +227,7 @@ exports.pendingTxs = function pendingTxs (timeoutMS, cb) {
|
||||||
var values = [timeoutS]
|
var values = [timeoutS]
|
||||||
query(client, sql, values, function (err, results) {
|
query(client, sql, values, function (err, results) {
|
||||||
done()
|
done()
|
||||||
cb(err, normalizeTxs(results))
|
cb(err, normalizeTxs(results.rows))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -299,7 +299,7 @@ function insertTx (client, session, incoming, tx, cryptoAtoms, fiat, stage,
|
||||||
incoming,
|
incoming,
|
||||||
session.fingerprint,
|
session.fingerprint,
|
||||||
tx.toAddress,
|
tx.toAddress,
|
||||||
cryptoAtoms,
|
cryptoAtoms.toString(),
|
||||||
tx.currencyCode,
|
tx.currencyCode,
|
||||||
tx.cryptoCode,
|
tx.cryptoCode,
|
||||||
fiat,
|
fiat,
|
||||||
|
|
@ -490,12 +490,16 @@ function insertDispense (client, session, tx, cartridges, transactionId, cb) {
|
||||||
exports.addIncomingPhone = function addIncomingPhone (session, tx, cb) {
|
exports.addIncomingPhone = function addIncomingPhone (session, tx, cb) {
|
||||||
var sql = 'UPDATE transactions SET phone=$1 ' +
|
var sql = 'UPDATE transactions SET phone=$1 ' +
|
||||||
'WHERE incoming=$2 AND device_fingerprint=$3 AND session_id=$4'
|
'WHERE incoming=$2 AND device_fingerprint=$3 AND session_id=$4'
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
connect(function (cerr, client, done) {
|
connect(function (cerr, client, done) {
|
||||||
if (cerr) return cb(cerr)
|
if (cerr) return reject(cerr)
|
||||||
var values = [tx.phone, true, session.fingerprint, session.id]
|
var values = [tx.phone, true, session.fingerprint, session.id]
|
||||||
query(client, sql, values, function (err) {
|
query(client, sql, values, function (err) {
|
||||||
done(err)
|
done(err)
|
||||||
cb(err)
|
if (err) return reject(err)
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -518,56 +522,64 @@ function normalizeTxs (txs) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.fetchPhoneTxs = function fetchPhoneTxs (phone, dispenseTimeout, cb) {
|
exports.fetchPhoneTxs = function fetchPhoneTxs (phone, dispenseTimeout) {
|
||||||
var sql = 'SELECT * FROM transactions ' +
|
var sql = 'SELECT * FROM transactions ' +
|
||||||
'WHERE phone=$1 AND dispensed=$2 ' +
|
'WHERE phone=$1 AND dispensed=$2 ' +
|
||||||
'AND (EXTRACT(EPOCH FROM (now() - created))) * 1000 < $1'
|
'AND (EXTRACT(EPOCH FROM (now() - created))) * 1000 < $1'
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
connect(function (cerr, client, done) {
|
connect(function (cerr, client, done) {
|
||||||
if (cerr) return cb(cerr)
|
if (cerr) return reject(cerr)
|
||||||
query(client, sql, [phone, false, dispenseTimeout], function (err, results) {
|
query(client, sql, [phone, false, dispenseTimeout], function (err, results) {
|
||||||
done()
|
done()
|
||||||
if (err) return cb(err)
|
if (err) return reject(err)
|
||||||
cb(null, normalizeTxs(results.rows))
|
resolve(normalizeTxs(results.rows))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.fetchTx = function fetchTx (session, cb) {
|
exports.fetchTx = function fetchTx (session) {
|
||||||
var sql = 'SELECT * FROM transactions ' +
|
var sql = 'SELECT * FROM transactions ' +
|
||||||
'WHERE device_fingerprint=$1 AND session_id=$2 ' +
|
'WHERE device_fingerprint=$1 AND session_id=$2 ' +
|
||||||
'ORDER BY created'
|
'AND stage=$3 AND authority=$4'
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
connect(function (cerr, client, done) {
|
connect(function (cerr, client, done) {
|
||||||
if (cerr) return cb(cerr)
|
if (cerr) return reject(cerr)
|
||||||
query(client, sql, [session.fingerprint, session.id], function (err, results) {
|
var values = [session.fingerprint, session.id, 'initial_request', 'pending']
|
||||||
|
query(client, sql, values, function (err, results) {
|
||||||
done()
|
done()
|
||||||
if (err) return cb(err)
|
if (err) return reject(err)
|
||||||
cb(null, normalizeTxs(results.rows))
|
resolve(normalizeTxs(results.rows)[0])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.addDispenseRequest = function addDispenseRequest (session, tx, cb) {
|
exports.addDispenseRequest = function addDispenseRequest (session, tx) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
connect(function (cerr, client, done) {
|
connect(function (cerr, client, done) {
|
||||||
if (cerr) return
|
if (cerr) return reject(cerr)
|
||||||
|
|
||||||
const originalSession = {id: tx.sessionId, fingerprint: session.fingerprint}
|
const originalSession = {id: tx.sessionId, fingerprint: session.fingerprint}
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
async.apply(updateDispense, client, true),
|
async.apply(updateDispense, client, originalSession, true),
|
||||||
async.apply(insertIncoming, client, originalSession, tx, 0, tx.fiat,
|
async.apply(insertIncoming, client, originalSession, tx, 0, tx.fiat,
|
||||||
'dispense', 'pending')
|
'dispense', 'pending')
|
||||||
], function (err) {
|
], function (err) {
|
||||||
done()
|
done()
|
||||||
if (err) logger.error(err)
|
if (err) return reject(err)
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateDispense (client, session, dispensed, cb) {
|
function updateDispense (client, session, dispensed, cb) {
|
||||||
var sql = 'UPDATE transactions SET dispense=$1 ' +
|
var sql = 'UPDATE transactions SET dispensed=$1 ' +
|
||||||
'WHERE stage=$2 AND authority=$3 AND device_fingerprint=$4 AND session_id=$5'
|
'WHERE stage=$2 AND authority=$3 AND device_fingerprint=$4 AND session_id=$5'
|
||||||
var values = [dispensed, 'initial_request', 'deposit', session.fingerprint, session.id]
|
var values = [dispensed, 'initial_request', 'pending', session.fingerprint, session.id]
|
||||||
query(client, sql, values, function (err) {
|
query(client, sql, values, function (err) {
|
||||||
cb(err)
|
cb(err)
|
||||||
})
|
})
|
||||||
|
|
@ -652,18 +664,24 @@ exports.machineEvents = function machineEvents (cb) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function singleQuotify (item) { return '\'' + item + '\'' }
|
||||||
|
|
||||||
exports.fetchOpenTxs = function fetchOpenTxs (statuses, age, cb) {
|
exports.fetchOpenTxs = function fetchOpenTxs (statuses, age, cb) {
|
||||||
var sql = 'SELECT *, (EXTRACT(EPOCH FROM (now() - created))) * 1000 AS age ' +
|
var _statuses = '(' + statuses.map(singleQuotify).join(',') + ')'
|
||||||
|
|
||||||
|
var sql = 'SELECT * ' +
|
||||||
'FROM transactions ' +
|
'FROM transactions ' +
|
||||||
'WHERE incoming=$1 age<$2 AND status IN $3'
|
'WHERE incoming=$1 AND ((EXTRACT(EPOCH FROM (now() - created))) * 1000)<$2 ' +
|
||||||
|
'AND stage=$3 AND authority=$4 ' +
|
||||||
|
'AND status IN ' + _statuses
|
||||||
|
|
||||||
connect(function (cerr, client, done) {
|
connect(function (cerr, client, done) {
|
||||||
if (cerr) return cb(cerr)
|
if (cerr) return cb(cerr)
|
||||||
|
|
||||||
query(client, sql, [true, age, statuses], function (err, results) {
|
query(client, sql, [true, age, 'initial_request', 'pending'], function (err, results) {
|
||||||
done()
|
done()
|
||||||
if (err) return cb(err)
|
if (err) return cb(err)
|
||||||
cb(null, normalizeTxs(results))
|
cb(null, normalizeTxs(results.rows))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -224,7 +224,7 @@ function phoneCode (req, res) {
|
||||||
|
|
||||||
function updatePhone (req, res) {
|
function updatePhone (req, res) {
|
||||||
return plugins.updatePhone(session(req), req.body.phone)
|
return plugins.updatePhone(session(req), req.body.phone)
|
||||||
.then(code => res.send(200))
|
.then(code => res.json(200))
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
logger.error(err)
|
logger.error(err)
|
||||||
res.send(500)
|
res.send(500)
|
||||||
|
|
@ -241,11 +241,12 @@ function fetchPhoneTx (req, res) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function waitForDispense (req, res) {
|
function waitForDispense (req, res) {
|
||||||
return plugins.fetchTx(session(req), req.query.status)
|
return plugins.fetchTx(session(req))
|
||||||
.then(r => {
|
.then(tx => {
|
||||||
if (!r) return res.send(404)
|
console.log('%j', tx)
|
||||||
if (r.status === req.query.status) return res.send(304)
|
if (!tx) return res.send(404)
|
||||||
res.json(r)
|
if (tx.status === req.query.status) return res.send(304)
|
||||||
|
res.json({tx: tx})
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
logger.error(err)
|
logger.error(err)
|
||||||
|
|
@ -256,7 +257,7 @@ function waitForDispense (req, res) {
|
||||||
function dispense (req, res) {
|
function dispense (req, res) {
|
||||||
const tx = req.body.tx
|
const tx = req.body.tx
|
||||||
return plugins.requestDispense(session(req), tx)
|
return plugins.requestDispense(session(req), tx)
|
||||||
.then(() => res.send(200))
|
.then(() => res.json(200))
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
logger.error(err)
|
logger.error(err)
|
||||||
res.send(500)
|
res.send(500)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,8 @@ var db = require('./db')
|
||||||
function singleQuotify (item) { return '\'' + item + '\'' }
|
function singleQuotify (item) { return '\'' + item + '\'' }
|
||||||
|
|
||||||
exports.up = function (next) {
|
exports.up = function (next) {
|
||||||
var statuses = ['notSeen', 'published', 'zeroConf', 'authorized', 'confirmed', 'rejected']
|
var statuses = ['notSeen', 'published', 'authorized', 'instant',
|
||||||
|
'confirmed', 'rejected', 'insufficientFunds']
|
||||||
.map(singleQuotify).join(',')
|
.map(singleQuotify).join(',')
|
||||||
|
|
||||||
var sql = [
|
var sql = [
|
||||||
|
|
|
||||||
1
todo.txt
1
todo.txt
|
|
@ -1,3 +1,2 @@
|
||||||
- change satoshis to crypto_atoms in db (ask neal about this)
|
- change satoshis to crypto_atoms in db (ask neal about this)
|
||||||
- test bitgo
|
|
||||||
- start testing
|
- start testing
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue