diff --git a/lib/routes.js b/lib/routes.js index c9f0ba29..5d93604d 100644 --- a/lib/routes.js +++ b/lib/routes.js @@ -17,6 +17,8 @@ const settingsLoader = require('./settings-loader') const plugins = require('./plugins') const helpers = require('./route-helpers') const poller = require('./poller') +const Tx = require('./tx') + const argv = require('minimist')(process.argv.slice(2)) const CLOCK_SKEW = 60 * 1000 @@ -79,6 +81,12 @@ function poll (req, res, next) { .catch(next) } +function postTx (req, res, next) { + return Tx.post(req.body) + .then(tx => res.json(tx)) + .catch(next) +} + function trade (req, res, next) { const tx = req.body const pi = plugins(req.settings) @@ -359,22 +367,13 @@ app.use(filterOldRequests) app.post('*', cacheAction) app.get('/poll', poll) -app.post('/trade', trade) -app.post('/send', send) app.post('/state', stateChange) -app.post('/cash_out', cashOut) -app.post('/dispense_ack', dispenseAck) app.post('/event', deviceEvent) app.post('/verify_user', verifyUser) app.post('/verify_transaction', verifyTx) app.post('/phone_code', phoneCode) -app.post('/update_phone', updatePhone) -app.get('/phone_tx', fetchPhoneTx) -app.post('/register_redeem/:txId', registerRedeem) -app.get('/await_dispense/:txId', waitForDispense) -app.post('/dispense', dispense) app.use(errorHandler) app.use((req, res) => res.status(404).json({err: 'No such route'})) diff --git a/lib/tx.js b/lib/tx.js new file mode 100644 index 00000000..521bc9a3 --- /dev/null +++ b/lib/tx.js @@ -0,0 +1,36 @@ +const db = require('./db') +const pgp = require('pg-promise')() + +function postCashIn (tx) { + const TransactionMode = pgp.txMode.TransactionMode + const isolationLevel = pgp.txMode.isolationLevel + const tmSRD = new TransactionMode({tiLevel: isolationLevel.serializable}) + + function transaction (t) { + const sql = 'select * from cash_in_txs where id=$1' + return t.one(sql, [tx.id]) + .then(row => { + const newTx = executeTxChange(tx, row) + + if (row) return updateCashOutTx(newTx) + insertCashOutTx(newTx) + }) + } + + transaction.txMode = tmSRD + + return db.tx(transaction) + // retry failed +} + +function postCashOut (tx) { + +} + +function post (tx) { + if (tx.direction === 'cashIn') return postCashIn(tx) + if (tx.direction === 'cashOut') return postCashOut(tx) + throw new Error('No such tx direction: %s', tx.direction) +} + +module.exports = {post}