const {text, json, createError} = require('micro') const {get, post, withNamespace} = require('microrouter') const fbParser = require('claudia-bot-builder/lib/facebook/parse') const fbReply = require('claudia-bot-builder/lib/facebook/reply') const fbValidate = require('claudia-bot-builder/lib/facebook/validate-integrity') const fbTemplate = require('claudia-bot-builder/lib/facebook/format-message') const verifyToken = req => { if (req.query['hub.verify_token'] === process.env.FB_VERIFY_TOKEN) { return req.query['hub.challenge'] } console.info( `Your Facebook Access Token (that Facebook will echo back to you as part of callback URL verification): ${ process.env.FB_VERIFY_TOKEN }` ) return 'INVALID TOKEN' } const fbMessage = async req => { req.env = {facebookAppSecret: process.env.FB_APP_SECRET} req.rawBody = await text(req) const data = await json(req) const [[message]] = data.entry.map(entry => entry.messaging.map(message => fbParser(message)) ) const isValid = fbValidate(req) && message.type === 'facebook' return isValid ? message : false } const respond = async (req, res) => { const message = await fbMessage(req) if (message) { const recipient = message.sender const replyMessage = new fbTemplate.Text( `You've said: "${message.text}"` ).get() await fbReply(recipient, replyMessage, process.env.FB_ACCESS_TOKEN) res.end() } else { throw createError(400, 'Invalid message signature.') } } const fbApi = withNamespace('/api/v1/facebook') module.exports = fbApi(get('/', verifyToken), post('/', respond))