Feat: implement per operator settings cache

Fix: fix linter-found issues

Chore: move findOperatorId to own middleware file

Chore: delete old routes.js file and rename new-routes.js to routes.js

Fix: PR fixes
This commit is contained in:
Cesar 2021-01-13 19:04:40 +00:00 committed by Josh Harvey
parent 85235eaa13
commit 558317e9f3
30 changed files with 232 additions and 860 deletions

View file

@ -7,14 +7,7 @@ const compliance = require('../compliance')
const complianceTriggers = require('../compliance-triggers')
const configManager = require('../new-config-manager')
const customers = require('../customers')
function httpError (msg, code) {
const err = new Error(msg)
err.name = 'HTTPError'
err.code = code || 500
return err
}
const httpError = require('../route-helpers').httpError
function updateCustomer (req, res, next) {
const id = req.params.id
@ -54,10 +47,8 @@ function triggerSanctions (req, res, next) {
customers.getById(id)
.then(customer => {
if (!customer) { throw httpError('Not Found', 404) }
return compliance.validationPatch(req.deviceId, true, customer)
.then(patch => customers.update(id, patch))
})
.then(customer => res.status(200).json({ customer }))
.catch(next)
@ -81,7 +72,7 @@ function triggerSuspend (req, res, next) {
const days = triggerId === 'no-ff-camera' ? 1 : getSuspendDays(triggers)
const date = new Date()
date.setDate(date.getDate() + days);
date.setDate(date.getDate() + days)
customers.update(id, { suspendedUntil: date })
.then(customer => res.status(200).json({ customer }))
.catch(next)
@ -92,4 +83,4 @@ router.patch('/:id/sanctions', triggerSanctions)
router.patch('/:id/block', triggerBlock)
router.patch('/:id/suspend', triggerSuspend)
module.exports = router
module.exports = router

View file

@ -1,10 +1,6 @@
const express = require('express')
const router = express.Router()
const logger = require('../logger')
const newSettingsLoader = require('../new-settings-loader')
const poller = require('../poller')
const settingsCache = require('../middlewares/settingsCache')
const state = require('../middlewares/state')
router.get('/pid', (req, res) => {
@ -49,15 +45,4 @@ router.post('/restartServices', (req, res) => {
res.sendStatus(200)
})
router.post('/dbChange', (req, res, next) => {
settingsCache.clearCache()
return newSettingsLoader.loadLatest()
.then(poller.reload)
.then(() => logger.info('Config reloaded'))
.catch(err => {
logger.error(err)
res.sendStatus(500)
})
})
module.exports = router
module.exports = router

View file

@ -1,6 +1,5 @@
const express = require('express')
const router = express.Router()
const _ = require('lodash/fp')
const state = require('../middlewares/state')
const logs = require('../logs')
@ -32,4 +31,4 @@ function updateLogs (req, res, next) {
router.get('/', getLastSeen)
router.post('/', updateLogs)
module.exports = router
module.exports = router

View file

@ -1,11 +0,0 @@
const express = require('express')
const router = express.Router()
const ca = require('../middlewares/ca')
const pair = require('../middlewares/pair')
const populateDeviceId = require('../middlewares/populateDeviceId')
router.post('/pair', populateDeviceId, pair)
router.get('/ca', ca)
module.exports = router

View file

@ -7,6 +7,7 @@ const compliance = require('../compliance')
const complianceTriggers = require('../compliance-triggers')
const configManager = require('../new-config-manager')
const customers = require('../customers')
const httpError = require('../route-helpers').httpError
const plugins = require('../plugins')
const Tx = require('../tx')
@ -44,14 +45,6 @@ function addOrUpdateCustomer (req) {
})
}
function httpError (msg, code) {
const err = new Error(msg)
err.name = 'HTTPError'
err.code = code || 500
return err
}
function getCustomerWithPhoneCode (req, res, next) {
const pi = plugins(req.settings, req.deviceId)
const phone = req.body.phone
@ -70,4 +63,4 @@ function getCustomerWithPhoneCode (req, res, next) {
router.post('/', getCustomerWithPhoneCode)
module.exports = router
module.exports = router

View file

@ -1,7 +1,9 @@
const express = require('express')
const router = express.Router()
const nmd = require('nano-markdown')
const _ = require('lodash/fp')
const router = express.Router()
const complianceTriggers = require('../compliance-triggers')
const configManager = require('../new-config-manager')
const plugins = require('../plugins')
@ -13,17 +15,13 @@ function checkHasLightning (settings) {
return configManager.getWalletSettings('BTC', settings.config).layer2 !== 'no-layer2'
}
function createTerms (terms) {
if (!terms.active || !terms.text) return null
return {
active: terms.active,
title: terms.title,
text: nmd(terms.text),
accept: terms.acceptButtonText,
cancel: terms.cancelButtonText
}
}
const createTerms = terms => (terms.active && terms.text) ? ({
active: terms.active,
title: terms.title,
text: nmd(terms.text),
accept: terms.acceptButtonText,
cancel: terms.cancelButtonText
}) : null
function poll (req, res, next) {
const machineVersion = req.query.version
@ -109,4 +107,4 @@ function poll (req, res, next) {
router.get('/', poll)
module.exports = router
module.exports = router

25
lib/routes/rootRoutes.js Normal file
View file

@ -0,0 +1,25 @@
const express = require('express')
const router = express.Router()
const ca = require('../middlewares/ca')
const httpError = require('../route-helpers').httpError
const pairing = require('../pairing')
const populateDeviceId = require('../middlewares/populateDeviceId')
function pair (req, res, next) {
const token = req.query.token
const deviceId = req.deviceId
const model = req.query.model
return pairing.pair(token, deviceId, model)
.then(isValid => {
if (isValid) return res.json({ status: 'paired' })
throw httpError('Pairing failed')
})
.catch(next)
}
router.post('/pair', populateDeviceId, pair)
router.get('/ca', ca)
module.exports = router

View file

@ -11,4 +11,4 @@ function stateChange (req, res, next) {
router.post('/', stateChange)
module.exports = router
module.exports = router

View file

@ -1,20 +1,18 @@
const express = require('express')
const nmd = require('nano-markdown')
const router = express.Router()
const configManager = require('../new-config-manager')
const plugins = require('../plugins')
function createTerms (terms) {
if (!terms.active || !terms.text) return null
return {
active: terms.active,
title: terms.title,
text: nmd(terms.text),
accept: terms.acceptButtonText,
cancel: terms.cancelButtonText
}
}
const createTerms = terms => (terms.active && terms.text) ? ({
active: terms.active,
title: terms.title,
text: nmd(terms.text),
accept: terms.acceptButtonText,
cancel: terms.cancelButtonText
}) : null
function getTermsConditions (req, res, next) {
const deviceId = req.deviceId
@ -32,4 +30,4 @@ function getTermsConditions (req, res, next) {
router.get('/', getTermsConditions)
module.exports = router
module.exports = router

View file

@ -3,19 +3,13 @@ const router = express.Router()
const _ = require('lodash/fp')
const dbErrorCodes = require('../db-error-codes')
const E = require('../error')
const helpers = require('../route-helpers')
const httpError = require('../route-helpers').httpError
const logger = require('../logger')
const plugins = require('../plugins')
const Tx = require('../tx')
function httpError (msg, code) {
const err = new Error(msg)
err.name = 'HTTPError'
err.code = code || 500
return err
}
function postTx (req, res, next) {
const pi = plugins(req.settings, req.deviceId)
@ -67,4 +61,4 @@ router.post('/', postTx)
router.get('/:id', getTx)
router.get('/', getPhoneTx)
module.exports = router
module.exports = router

View file

@ -0,0 +1,49 @@
const express = require('express')
const router = express.Router()
const _ = require('lodash/fp')
const BN = require('../bn')
const commissionMath = require('../commission-math')
const configManager = require('../new-config-manager')
const notifier = require('../notifier')
const promoCodes = require('../promo-codes')
function respond (req, res, _body, _status) {
const status = _status || 200
const body = _body || {}
const customer = _.getOr({ sanctions: true }, ['customer'], body)
// sanctions can be null for new customers so we can't use falsy checks
if (customer.sanctions === false) {
notifier.notifyIfActive('compliance', 'sanctionsNotify', customer, req.body.phone)
}
return res.status(status).json(body)
}
function verifyPromoCode (req, res, next) {
promoCodes.getPromoCode(req.body.codeInput)
.then(promoCode => {
if (!promoCode) return next()
const transaction = req.body.tx
const commissions = configManager.getCommissions(transaction.cryptoCode, req.deviceId, req.settings.config)
const tickerRate = BN(transaction.rawTickerPrice)
const discount = commissionMath.getDiscountRate(promoCode.discount, commissions[transaction.direction])
const rates = {
[transaction.cryptoCode]: {
[transaction.direction]: (transaction.direction === 'cashIn')
? tickerRate.mul(discount).round(5)
: tickerRate.div(discount).round(5)
}
}
respond(req, res, {
promoCode: promoCode,
newRates: rates
})
})
.catch(next)
}
router.post('/', verifyPromoCode)
module.exports = router

View file

@ -12,4 +12,4 @@ function verifyTx (req, res, next) {
router.post('/', verifyTx)
module.exports = router
module.exports = router

View file

@ -12,4 +12,4 @@ function verifyUser (req, res, next) {
router.post('/', verifyUser)
module.exports = router
module.exports = router