Merge pull request #1099 from chaotixkilla/fix-custom-sms
Get SMS notices closer to spec
This commit is contained in:
commit
26bf036553
19 changed files with 709 additions and 468 deletions
|
|
@ -20,6 +20,7 @@ const MANUAL = 'manual'
|
|||
|
||||
const CASH_OUT_DISPENSE_READY = 'cash_out_dispense_ready'
|
||||
const CONFIRMATION_CODE = 'sms_code'
|
||||
const RECEIPT = 'sms_receipt'
|
||||
|
||||
const WALLET_SCORE_THRESHOLD = 9
|
||||
|
||||
|
|
@ -37,5 +38,6 @@ module.exports = {
|
|||
CONFIRMATION_CODE,
|
||||
CASH_OUT_MINIMUM_AMOUNT_OF_CASSETTES,
|
||||
CASH_OUT_MAXIMUM_AMOUNT_OF_CASSETTES,
|
||||
WALLET_SCORE_THRESHOLD
|
||||
WALLET_SCORE_THRESHOLD,
|
||||
RECEIPT
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,41 +0,0 @@
|
|||
const _ = require('lodash/fp')
|
||||
const uuid = require('uuid')
|
||||
const db = require('./db')
|
||||
|
||||
const getCustomMessages = () => {
|
||||
const sql = `SELECT * FROM custom_messages ORDER BY created`
|
||||
return db.any(sql).then(res => _.map(
|
||||
it => ({
|
||||
id: it.id,
|
||||
event: _.camelCase(it.event),
|
||||
message: it.message
|
||||
}), res))
|
||||
}
|
||||
|
||||
const createCustomMessage = (event, message) => {
|
||||
const sql = `INSERT INTO custom_messages (id, event, message) VALUES ($1, $2, $3)`
|
||||
return db.none(sql, [uuid.v4(), _.snakeCase(event), message])
|
||||
}
|
||||
|
||||
const editCustomMessage = (id, event, message) => {
|
||||
const sql = `UPDATE custom_messages SET event=$2, message=$3 WHERE id=$1`
|
||||
return db.none(sql, [id, _.snakeCase(event), message])
|
||||
}
|
||||
|
||||
const deleteCustomMessage = id => {
|
||||
const sql = `DELETE FROM custom_messages WHERE id=$1`
|
||||
return db.none(sql, [id])
|
||||
}
|
||||
|
||||
const getCustomMessage = event => {
|
||||
const sql = `SELECT * FROM custom_messages WHERE event=$1 LIMIT 1`
|
||||
return db.oneOrNone(sql, [event])
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getCustomMessages,
|
||||
createCustomMessage,
|
||||
editCustomMessage,
|
||||
deleteCustomMessage,
|
||||
getCustomMessage
|
||||
}
|
||||
|
|
@ -1,13 +1,13 @@
|
|||
const customSms = require('../../../custom-sms')
|
||||
const smsNotices = require('../../../sms-notices')
|
||||
|
||||
const resolvers = {
|
||||
Query: {
|
||||
customMessages: () => customSms.getCustomMessages()
|
||||
SMSNotices: () => smsNotices.getSMSNotices()
|
||||
},
|
||||
Mutation: {
|
||||
createCustomMessage: (...[, { event, message }]) => customSms.createCustomMessage(event, message),
|
||||
editCustomMessage: (...[, { id, event, message }]) => customSms.editCustomMessage(id, event, message),
|
||||
deleteCustomMessage: (...[, { id }]) => customSms.deleteCustomMessage(id)
|
||||
editSMSNotice: (...[, { id, event, message }]) => smsNotices.editSMSNotice(id, event, message),
|
||||
enableSMSNotice: (...[, { id }]) => smsNotices.enableSMSNotice(id),
|
||||
disableSMSNotice: (...[, { id }]) => smsNotices.disableSMSNotice(id)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,25 +1,29 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
|
||||
const typeDef = gql`
|
||||
type CustomMessage {
|
||||
type SMSNotice {
|
||||
id: ID!
|
||||
event: CustomMessageEvent!
|
||||
event: SMSNoticeEvent!
|
||||
message: String!
|
||||
messageName: String!
|
||||
enabled: Boolean!
|
||||
allowToggle: Boolean!
|
||||
}
|
||||
|
||||
enum CustomMessageEvent {
|
||||
enum SMSNoticeEvent {
|
||||
smsCode
|
||||
cashOutDispenseReady
|
||||
smsReceipt
|
||||
}
|
||||
|
||||
type Query {
|
||||
customMessages: [CustomMessage] @auth
|
||||
SMSNotices: [SMSNotice] @auth
|
||||
}
|
||||
|
||||
type Mutation {
|
||||
createCustomMessage(event: CustomMessageEvent!, message: String!): CustomMessage @auth
|
||||
editCustomMessage(id: ID!, event: CustomMessageEvent!, message: String!): CustomMessage @auth
|
||||
deleteCustomMessage(id: ID!): CustomMessage @auth
|
||||
editSMSNotice(id: ID!, event: SMSNoticeEvent!, message: String!): SMSNotice @auth
|
||||
enableSMSNotice(id: ID!): SMSNotice @auth
|
||||
disableSMSNotice(id: ID!): SMSNotice @auth
|
||||
}
|
||||
`
|
||||
|
||||
|
|
|
|||
|
|
@ -772,7 +772,8 @@ function plugins (settings, deviceId) {
|
|||
? '123'
|
||||
: randomCode()
|
||||
|
||||
return sms.getSms(CONFIRMATION_CODE, phone, { code })
|
||||
const timestamp = dateFormat(new Date(), 'UTC:HH:MM Z')
|
||||
return sms.getSms(CONFIRMATION_CODE, phone, { code, timestamp })
|
||||
.then(smsObj => {
|
||||
const rec = {
|
||||
sms: smsObj
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ const NAME = 'FakeWallet'
|
|||
const SECONDS = 1000
|
||||
const PUBLISH_TIME = 3 * SECONDS
|
||||
const AUTHORIZE_TIME = PUBLISH_TIME + 5 * SECONDS
|
||||
const CONFIRM_TIME = AUTHORIZE_TIME + 120 * SECONDS
|
||||
const CONFIRM_TIME = AUTHORIZE_TIME + 10 * SECONDS
|
||||
|
||||
let t0
|
||||
|
||||
|
|
|
|||
|
|
@ -189,6 +189,6 @@ router.patch('/:id/block', triggerBlock)
|
|||
router.patch('/:id/suspend', triggerSuspend)
|
||||
router.patch('/:id/photos/idcarddata', updateIdCardData)
|
||||
router.patch('/:id/:txId/photos/customerphoto', updateTxCustomerPhoto)
|
||||
router.patch('/:id/smsreceipt', sendSmsReceipt)
|
||||
router.post('/:id/smsreceipt', sendSmsReceipt)
|
||||
|
||||
module.exports = router
|
||||
|
|
|
|||
56
lib/sms-notices.js
Normal file
56
lib/sms-notices.js
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
const _ = require('lodash/fp')
|
||||
const uuid = require('uuid')
|
||||
const db = require('./db')
|
||||
|
||||
const getSMSNotices = () => {
|
||||
const sql = `SELECT * FROM sms_notices ORDER BY created`
|
||||
return db.any(sql).then(res => _.map(
|
||||
it => ({
|
||||
id: it.id,
|
||||
event: _.camelCase(it.event),
|
||||
message: it.message,
|
||||
messageName: it.message_name,
|
||||
enabled: it.enabled,
|
||||
allowToggle: it.allow_toggle
|
||||
}), res))
|
||||
}
|
||||
|
||||
const createSMSNotice = (event, messageName, message, enabled, allowToggle) => {
|
||||
const sql = `INSERT INTO sms_notices (id, event, message_name, message${enabled ? `, enabled`: ``}${allowToggle ? `, allowToggle`: ``}) VALUES ($1, $2, $3, $4${enabled ? `, $5`: ``}${allowToggle ? `, $6`: ``})`
|
||||
return db.none(sql, [uuid.v4(), _.snakeCase(event), messageName, message, enabled, allowToggle])
|
||||
}
|
||||
|
||||
const editSMSNotice = (id, event, message) => {
|
||||
const sql = `UPDATE sms_notices SET event=$2, message=$3 WHERE id=$1`
|
||||
return db.none(sql, [id, _.snakeCase(event), message])
|
||||
}
|
||||
|
||||
const deleteSMSNotice = id => {
|
||||
const sql = `DELETE FROM sms_notices WHERE id=$1`
|
||||
return db.none(sql, [id])
|
||||
}
|
||||
|
||||
const getSMSNotice = event => {
|
||||
const sql = `SELECT * FROM sms_notices WHERE event=$1 LIMIT 1`
|
||||
return db.oneOrNone(sql, [event])
|
||||
}
|
||||
|
||||
const enableSMSNotice = id => {
|
||||
const sql = `UPDATE sms_notices SET enabled = true WHERE id=$1`
|
||||
return db.oneOrNone(sql, [id])
|
||||
}
|
||||
|
||||
const disableSMSNotice = id => {
|
||||
const sql = `UPDATE sms_notices SET enabled = false WHERE id=$1`
|
||||
return db.oneOrNone(sql, [id])
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getSMSNotices,
|
||||
createSMSNotice,
|
||||
editSMSNotice,
|
||||
deleteSMSNotice,
|
||||
getSMSNotice,
|
||||
enableSMSNotice,
|
||||
disableSMSNotice
|
||||
}
|
||||
35
lib/sms.js
35
lib/sms.js
|
|
@ -1,17 +1,16 @@
|
|||
|
||||
const dateFormat = require('dateformat')
|
||||
|
||||
const ph = require('./plugin-helper')
|
||||
const argv = require('minimist')(process.argv.slice(2))
|
||||
const { utils: coinUtils } = require('lamassu-coins')
|
||||
const _ = require('lodash/fp')
|
||||
|
||||
const customSms = require('./custom-sms')
|
||||
|
||||
const getDefaultMessageContent = content => ({
|
||||
smsCode: `Your cryptomat code: ${content.code}`,
|
||||
cashOutDispenseReady: `Your cash is waiting! Go to the Cryptomat and press Redeem within 24 hours. [${content.timestamp}]`
|
||||
})
|
||||
const smsNotices = require('./sms-notices')
|
||||
const { RECEIPT } = require('./constants')
|
||||
|
||||
function getSms (event, phone, content) {
|
||||
return customSms.getCustomMessage(event)
|
||||
return smsNotices.getSMSNotice(event)
|
||||
.then(msg => {
|
||||
if (!_.isNil(msg)) {
|
||||
var accMsg = msg.message
|
||||
|
|
@ -22,11 +21,6 @@ function getSms (event, phone, content) {
|
|||
body: messageContent
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
toNumber: phone,
|
||||
body: getDefaultMessageContent(content)[_.camelCase(event)]
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
|
@ -110,13 +104,16 @@ function formatSmsReceipt (data, options) {
|
|||
message = message.concat(`Address: ${data.address}\n`)
|
||||
}
|
||||
|
||||
const request = {
|
||||
sms: {
|
||||
toNumber: data.customerPhone,
|
||||
body: message
|
||||
}
|
||||
}
|
||||
return request
|
||||
const timestamp = dateFormat(new Date(), 'UTC:HH:MM Z')
|
||||
const postReceiptSmsPromise = getSms(RECEIPT, data.customerPhone, { timestamp })
|
||||
|
||||
return Promise.all([smsNotices.getSMSNotice(RECEIPT), postReceiptSmsPromise])
|
||||
.then(([res, postReceiptSms]) => ({
|
||||
sms: {
|
||||
toNumber: data.customerPhone,
|
||||
body: res.enabled ? message.concat('\n\n', postReceiptSms.body) : message
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue