africastalking
Version:
Official AfricasTalking node.js API wrapper
66 lines (56 loc) • 1.77 kB
JavaScript
const Joi = require('joi')
const urlencoded = require('body-parser/urlencoded')
// as per specs http://docs.africastalking.com/ussd
const CONTENT_TYPE = 'text/plain'
const SESSION_CONTINUE = 'CON '
const SESSION_END = 'END '
const RESPONSE_CODE = 200
/**
*
* @param handler
* @returns {*[]} Connect/express middleware
* @constructor
*/
function ExpressHandler (handler) {
return [ // connect/express middleware
urlencoded({ extended: false }),
function (req, res, next) {
try {
const payload = req.body
handler(payload, (opts) => {
const schema = Joi.object({
response: Joi.string().required()
.messages({
'any.required': '"response" is required',
'string.base': '"response" must be a string'
}),
endSession: Joi.boolean().required()
.messages({
'any.required': '"endSession" is required',
'boolean.base': '"endSession" must be true or false'
})
})
const { error } = schema.validate(opts, { abortEarly: false })
// express uses next(err) to pass back errors
if (error) {
const messages = error.details.map(detail => detail.message)
return next(messages)
}
let response = opts.response
if (opts.endSession) {
response = SESSION_END + response
} else {
response = SESSION_CONTINUE + response
}
res.contentType(CONTENT_TYPE)
res.status(RESPONSE_CODE).send(response)
})
} catch (ex) {
next(ex)
}
}
]
}
// TODO: Helpers for other frameworks?
module.exports = ExpressHandler