chore: integrate new admin with l-s

This commit is contained in:
Taranto 2020-05-06 22:11:55 +01:00
parent 6b3db134e7
commit bf8f1d991c
72 changed files with 1493 additions and 1611 deletions

View file

@ -11,7 +11,7 @@ const db = require('./db')
const logger = require('./logger')
const logs = require('./logs')
const T = require('./time')
const configManager = require('./config-manager')
const configManager = require('./new-config-manager')
const ticker = require('./ticker')
const wallet = require('./wallet')
const exchange = require('./exchange')
@ -34,22 +34,22 @@ const tradesQueues = {}
function plugins (settings, deviceId) {
function buildRates (tickers) {
const config = configManager.machineScoped(deviceId, settings.config)
const cryptoCodes = config.cryptoCurrencies
const localeConfig = configManager.getLocale(deviceId, settings.config)
const cryptoCodes = localeConfig.cryptoCurrencies
const rates = {}
cryptoCodes.forEach((cryptoCode, i) => {
const cryptoConfig = configManager.scoped(cryptoCode, deviceId, settings.config)
const commissions = configManager.getCommissions(cryptoCode, deviceId, settings.config)
const rateRec = tickers[i]
if (!rateRec) return
const cashInCommission = BN(1).add(BN(cryptoConfig.cashInCommission).div(100))
const cashInCommission = BN(1).add(BN(commissions.cashIn).div(100))
const cashOutCommission = _.isNil(cryptoConfig.cashOutCommission)
const cashOutCommission = _.isNil(commissions.cashOut)
? undefined
: BN(1).add(BN(cryptoConfig.cashOutCommission).div(100))
: BN(1).add(BN(commissions.cashOut).div(100))
if (Date.now() - rateRec.timestamp > STALE_TICKER) return logger.warn('Stale rate for ' + cryptoCode)
const rate = rateRec.rates
@ -62,19 +62,13 @@ function plugins (settings, deviceId) {
return rates
}
function transactionNotificationsEnabled () {
const config = configManager.unscoped(settings.config)
return config.transactionNotificationsEnabled
}
function notificationsEnabled () {
const config = configManager.unscoped(settings.config)
return config.notificationsEnabled
function getNotificationConfig () {
return configManager.getGlobalNotifications(settings.config)
}
function buildBalances (balanceRecs) {
const config = configManager.machineScoped(deviceId, settings.config)
const cryptoCodes = config.cryptoCurrencies
const localeConfig = configManager.getLocale(deviceId, settings.config)
const cryptoCodes = localeConfig.cryptoCurrencies
const balances = {}
@ -90,8 +84,8 @@ function plugins (settings, deviceId) {
}
function isZeroConf (tx) {
const config = configManager.scoped(tx.cryptoCode, deviceId, settings.config)
const zeroConfLimit = config.zeroConfLimit
const cashOutConfig = configManager.getCashOut(deviceId, settings.config)
const zeroConfLimit = cashOutConfig.zeroConfLimit
return tx.fiat.lte(zeroConfLimit)
}
@ -131,14 +125,14 @@ function plugins (settings, deviceId) {
}
function buildAvailableCassettes (excludeTxId) {
const config = configManager.machineScoped(deviceId, settings.config)
const cashOutConfig = configManager.getCashOut(deviceId, settings.config)
if (!config.cashOutEnabled) return Promise.resolve()
if (!cashOutConfig.active) return Promise.resolve()
const denominations = [config.topCashOutDenomination,
config.bottomCashOutDenomination
]
const virtualCassettes = [config.virtualCashOutDenomination]
const denominations = [cashOutConfig.top, cashOutConfig.bottom]
// TODO new-admin: will this actually be calculated?
const virtualCassettes = [cashOutConfig.top + cashOutConfig.bottom]
return Promise.all([dbm.cassetteCounts(deviceId), cashOutHelper.redeemableTxs(deviceId, excludeTxId)])
.then(([rec, _redeemableTxs]) => {
@ -188,11 +182,11 @@ function plugins (settings, deviceId) {
function mapCoinSettings (coinParams) {
const cryptoCode = coinParams[0]
const cryptoNetwork = coinParams[1]
const config = configManager.scoped(cryptoCode, deviceId, settings.config)
const minimumTx = BN(config.minimumTx)
const cashInFee = BN(config.cashInFee)
const cashInCommission = BN(config.cashInCommission)
const cashOutCommission = _.isNumber(config.cashOutCommission) ? BN(config.cashOutCommission) : null
const commissions = configManager.getCommissions(cryptoCode, deviceId, settings.config)
const minimumTx = BN(commissions.minimumTx)
const cashInFee = BN(commissions.fixedFee)
const cashInCommission = BN(commissions.cashIn)
const cashOutCommission = _.isNumber(commissions.cashOut) ? BN(commissions.cashOut) : null
const cryptoRec = coinUtils.getCryptoCurrency(cryptoCode)
return {
@ -207,9 +201,10 @@ function plugins (settings, deviceId) {
}
function pollQueries (serialNumber, deviceTime, deviceRec) {
const config = configManager.machineScoped(deviceId, settings.config)
const fiatCode = config.fiatCurrency
const cryptoCodes = config.cryptoCurrencies
const localeConfig = configManager.getLocale(deviceId, settings.config)
const fiatCode = localeConfig.fiatCurrency
const cryptoCodes = localeConfig.cryptoCurrencies
const tickerPromises = cryptoCodes.map(c => ticker.getRates(settings, fiatCode, c))
const balancePromises = cryptoCodes.map(c => fiatBalance(fiatCode, c))
@ -283,16 +278,14 @@ function plugins (settings, deviceId) {
}
function dispenseAck (tx) {
const config = configManager.machineScoped(deviceId, settings.config)
const cassettes = [config.topCashOutDenomination,
config.bottomCashOutDenomination
]
const cashOutConfig = configManager.getCashOut(deviceId, settings.config)
const cassettes = [cashOutConfig.top, cashOutConfig.bottom]
return dbm.addDispense(deviceId, tx, cassettes)
}
function fiatBalance (fiatCode, cryptoCode) {
const config = configManager.scoped(cryptoCode, deviceId, settings.config)
const commissions = configManager.getCommissions(cryptoCode, deviceId, settings.config)
return Promise.all([
ticker.getRates(settings, fiatCode, cryptoCode),
wallet.balance(settings, cryptoCode)
@ -301,7 +294,7 @@ function plugins (settings, deviceId) {
if (!rates || !balanceRec) return null
const rawRate = rates.rates.ask
const cashInCommission = BN(1).minus(BN(config.cashInCommission).div(100))
const cashInCommission = BN(1).minus(BN(commissions.cashIn).div(100))
const balance = balanceRec.balance
if (!rawRate || !balance) return null
@ -344,7 +337,12 @@ function plugins (settings, deviceId) {
}
function notifyOperator (tx, rec) {
if (!transactionNotificationsEnabled()) return Promise.resolve()
const notifications = configManager.getGlobalNotifications(settings.config)
const notificationsEnabled = notifications.sms.transactions || notifications.email.transactions
const highValueTx = tx.fiat.gt(notifications.highValueTransaction)
if (!notificationsEnabled || !highValueTx) return Promise.resolve()
const isCashOut = tx.direction === 'cashOut'
const zeroConf = isCashOut && isZeroConf(tx)
@ -504,9 +502,9 @@ function plugins (settings, deviceId) {
.then(devices => {
const deviceIds = devices.map(device => device.deviceId)
const lists = deviceIds.map(deviceId => {
const config = configManager.machineScoped(deviceId, settings.config)
const fiatCode = config.fiatCurrency
const cryptoCodes = config.cryptoCurrencies
const localeConfig = configManager.getLocale(deviceId, settings.config)
const fiatCode = localeConfig.fiatCurrency
const cryptoCodes = localeConfig.cryptoCurrencies
return cryptoCodes.map(cryptoCode => ({
fiatCode,
@ -591,21 +589,25 @@ function plugins (settings, deviceId) {
}
function sendMessage (rec) {
const config = configManager.unscoped(settings.config)
const notifications = configManager.getGlobalNotifications(settings.config)
let promises = []
if (config.notificationsEmailEnabled) promises.push(email.sendMessage(settings, rec))
if (config.notificationsSMSEnabled) promises.push(sms.sendMessage(settings, rec))
if (notifications.email.active && rec.email) promises.push(email.sendMessage(settings, rec))
if (notifications.sms.active && rec.sms) promises.push(sms.sendMessage(settings, rec))
return Promise.all(promises)
}
function sendTransactionMessage (rec) {
const config = configManager.unscoped(settings.config)
const notifications = configManager.getGlobalNotifications(settings.config)
let promises = []
if (config.transactionNotificationsEmailEnabled) promises.push(email.sendMessage(settings, rec))
if (config.transactionNotificationsSMSEnabled) promises.push(sms.sendMessage(settings, rec))
const emailActive = notifications.email.active && notifications.email.transactions
if (emailActive) promises.push(email.sendMessage(settings, rec))
const smsActive = notifications.sms.active && notifications.sms.transactions
if (smsActive) promises.push(sms.sendMessage(settings, rec))
return Promise.all(promises)
}
@ -615,13 +617,16 @@ function plugins (settings, deviceId) {
}
function checkDeviceCashBalances (fiatCode, device) {
const config = configManager.machineScoped(device.deviceId, settings.config)
const denomination1 = config.topCashOutDenomination
const denomination2 = config.bottomCashOutDenomination
const machineName = config.machineName
const cashOutEnabled = config.cashOutEnabled
const cashOutConfig = configManager.getCashOut(device.deviceId, settings.config)
const denomination1 = cashOutConfig.top
const denomination2 = cashOutConfig.bottom
const cashOutEnabled = cashOutConfig.active
const cashInAlert = device.cashbox > config.cashInAlertThreshold
const notifications = configManager.getNotifications(null, device.deviceId, settings.config)
const machineName = device.machineName
const cashInAlert = device.cashbox > notifications.cashInAlertThreshold
? {
code: 'CASH_BOX_FULL',
machineName,
@ -630,7 +635,7 @@ function plugins (settings, deviceId) {
}
: null
const cassette1Alert = cashOutEnabled && device.cassette1 < config.cashOutCassette1AlertThreshold
const cassette1Alert = cashOutEnabled && device.cassette1 < notifications.fiatBalanceCassette1
? {
code: 'LOW_CASH_OUT',
cassette: 1,
@ -642,7 +647,7 @@ function plugins (settings, deviceId) {
}
: null
const cassette2Alert = cashOutEnabled && device.cassette2 < config.cashOutCassette2AlertThreshold
const cassette2Alert = cashOutEnabled && device.cassette2 < notifications.fiatBalanceCassette2
? {
code: 'LOW_CASH_OUT',
cassette: 2,
@ -661,8 +666,8 @@ function plugins (settings, deviceId) {
const fiatBalancePromises = cryptoCodes => _.map(c => fiatBalance(fiatCode, c), cryptoCodes)
const fetchCryptoCodes = _deviceId => {
const config = configManager.machineScoped(_deviceId, settings.config)
return config.cryptoCurrencies
const localeConfig = configManager.getLocale(_deviceId, settings.config)
return localeConfig.cryptoCurrencies
}
const union = _.flow(_.map(fetchCryptoCodes), _.flatten, _.uniq)
@ -678,22 +683,28 @@ function plugins (settings, deviceId) {
if (!fiatBalance) return null
const config = configManager.cryptoScoped(cryptoCode, settings.config)
const cryptoAlertThreshold = config.cryptoAlertThreshold
const notifications = configManager.getNotifications(cryptoCode, null, settings.config)
const lowAlertThreshold = notifications.cryptoLowBalance
const highAlertThreshold = notifications.cryptoHighBalance
return BN(fiatBalance.balance).lt(cryptoAlertThreshold)
? {
code: 'LOW_CRYPTO_BALANCE',
cryptoCode,
fiatBalance,
fiatCode
}
: null
const req = {
cryptoCode,
fiatBalance,
fiatCode,
}
if (BN(fiatBalance.balance).lt(lowAlertThreshold))
return _.set('code')('LOW_CRYPTO_BALANCE')(req)
if (BN(fiatBalance.balance).gt(highAlertThreshold))
return _.set('code')('HIGH_CRYPTO_BALANCE')(req)
return null
}
function checkBalances () {
const globalConfig = configManager.unscoped(settings.config)
const fiatCode = globalConfig.fiatCurrency
const localeConfig = configManager.getGlobalLocale(settings.config)
const fiatCode = localeConfig.fiatCurrency
return machineLoader.getMachines()
.then(devices => {
@ -756,9 +767,10 @@ function plugins (settings, deviceId) {
}
function getRawRates () {
const config = configManager.unscoped(settings.config)
const cryptoCodes = _.flatten(configManager.all('cryptoCurrencies', settings.config))
const fiatCode = config.fiatCurrency
const localeConfig = configManager.getGlobalLocale(settings.config)
const fiatCode = localeConfig.fiatCurrency
const cryptoCodes = configManager.getAllCryptoCurrencies(settings.config)
const tickerPromises = cryptoCodes.map(c => ticker.getRates(settings, fiatCode, c))
return Promise.all(tickerPromises)
@ -792,7 +804,7 @@ function plugins (settings, deviceId) {
buildAvailableCassettes,
buy,
sell,
notificationsEnabled,
getNotificationConfig,
notifyOperator,
fetchCurrentConfigVersion
}