From 4fbfae95f1b9b58193c7c2eb1b31a7f293bbd04d Mon Sep 17 00:00:00 2001 From: Adhidarma Hadiwinoto <me@adhisimon.org> Date: Tue, 30 Jul 2019 19:49:03 +0700 Subject: [PATCH] Messages history --- index.js | 2 +- lib/apiserver/index.js | 81 ++++++++++++++++++++++++++++++++++++++++++ lib/handler-callback-server.js | 62 -------------------------------- lib/history.js | 15 ++++++++ lib/transport.js | 13 +++++++ package-lock.json | 13 +++++-- package.json | 2 ++ 7 files changed, 122 insertions(+), 66 deletions(-) create mode 100644 lib/apiserver/index.js delete mode 100644 lib/handler-callback-server.js create mode 100644 lib/history.js diff --git a/index.js b/index.js index 16dd229..0ead7cb 100644 --- a/index.js +++ b/index.js @@ -10,4 +10,4 @@ process.title = `KOMODO-CENTER@${(config && typeof config.name === 'string') ? c require('./lib/transport'); -require('./lib/handler-callback-server'); \ No newline at end of file +require('./lib/apiserver'); \ No newline at end of file diff --git a/lib/apiserver/index.js b/lib/apiserver/index.js new file mode 100644 index 0000000..432a024 --- /dev/null +++ b/lib/apiserver/index.js @@ -0,0 +1,81 @@ +"use strict"; + +/** + * Modul untuk menerima callback dari modem handler jika ada SMS masuk. + */ + + +const express = require('express'); +const moment = require('moment'); + +const messagingService = require('komodo-center-messaging-client-lib'); + +const config = require('komodo-sdk/config'); +const logger = require('komodo-sdk/logger'); + +const transport = require('../transport'); +const partnerLastSeen = require('../partner-last-seen'); +const history = require('../history'); + +const app = express(); +messagingService.setTransport(transport); + +function apikeyChecker(req, res, next) { + res.locals.has_valid_apikey = req.params.apikey === config.handler_callback_server.apikey; + if (res.locals.has_valid_apikey) { + next(); + } + else { + res.end('APISERVER: Invalid apikey'); + } +} + +function onIncomingSms(req, res) { + res.end('OK'); + + if (!req.query.number) return; + if (req.query.number.indexOf('+') !== 0) return; + + const numberWithSuffix = req.query.number.replace(/^\+/, '') + (config.number_suffix || ''); + + partnerLastSeen.set(req.query.number, req.query.modem); + + history.push({ + ts: req.query.ts || moment().format('YYYY-MM-DD HH:mm:ss'), + modem: { + name: req.query.modem, + imsi: req.query.modem_imsi, + msisdn: req.query.modem_msisdn, + }, + direction: 'INCOMING', + partner: req.query.number, + message: req.query.msg, + }); + + logger.info('APISERVER: Incoming SMS', { modem: req.query.modem, from: req.query.number, from_with_suffix: numberWithSuffix, msg: req.query.msg }); + messagingService.onIncomingMessage({ + me: req.query.modem, + partner: numberWithSuffix, + msg: req.query.msg + }) +} + +function pageHistory(req, res) { + res.json((history.dump() || []).reverse()); +} + +app.use(function(req, res, next) { + logger.verbose('APISERVER: Incoming http request', { ip: req.ip, url: req.url }); + next(); +}) + +app.use('/apikey/:apikey', apikeyChecker); +app.get('/apikey/:apikey/on-sms', onIncomingSms); +app.get('/apikey/:apikey/inbox', onIncomingSms); +app.get('/apikey/:apikey/on-sms/inbox', onIncomingSms); +app.get('/apikey/:apikey/history', pageHistory); + +const listenPort = config && config.handler_callback_server ? config.handler_callback_server.listen_port : null; +listenPort && app.listen(listenPort, () => { + logger.info('HTTP Handler Callback server listening on port ' + listenPort); +}) \ No newline at end of file diff --git a/lib/handler-callback-server.js b/lib/handler-callback-server.js deleted file mode 100644 index 0688c58..0000000 --- a/lib/handler-callback-server.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; - -/** - * Modul untuk menerima callback dari modem handler jika ada SMS masuk. - */ - - -const express = require('express'); - -const messagingService = require('komodo-center-messaging-client-lib'); - -const config = require('komodo-sdk/config'); -const logger = require('komodo-sdk/logger'); - -const transport = require('./transport'); -const partnerLastSeen = require('./partner-last-seen'); - -const app = express(); -messagingService.setTransport(transport); - -function apikeyChecker(req, res, next) { - res.locals.has_valid_apikey = req.params.apikey === config.handler_callback_server.apikey; - if (res.locals.has_valid_apikey) { - next(); - } - else { - res.end('HANDLER-CALLBACK-SERVER: Invalid apikey'); - } -} - -function onIncomingSms(req, res) { - res.end('OK'); - - if (!req.query.number) return; - if (req.query.number.indexOf('+') !== 0) return; - - const numberWithSuffix = req.query.number + (config.number_suffix || ''); - - partnerLastSeen.set(req.query.number, req.query.modem); - - logger.info('HANDLER-CALLBACK-SERVER: Incoming SMS', { modem: req.query.modem, from: req.query.number, from_with_suffix: numberWithSuffix, msg: req.query.msg }); - messagingService.onIncomingMessage({ - me: req.query.modem, - partner: numberWithSuffix, - msg: req.query.msg - }) -} - -app.use(function(req, res, next) { - logger.verbose('HANDLER-CALLBACK-SERVER: Incoming http request', { ip: req.ip, url: req.url }); - next(); -}) - -app.use('/apikey/:apikey', apikeyChecker); -app.get('/apikey/:apikey/on-sms', onIncomingSms); -app.get('/apikey/:apikey/inbox', onIncomingSms); -app.get('/apikey/:apikey/on-sms/inbox', onIncomingSms); - -const listenPort = config && config.handler_callback_server ? config.handler_callback_server.listen_port : null; -listenPort && app.listen(listenPort, () => { - logger.info('HTTP Handler Callback server listening on port ' + listenPort); -}) \ No newline at end of file diff --git a/lib/history.js b/lib/history.js new file mode 100644 index 0000000..a62bad1 --- /dev/null +++ b/lib/history.js @@ -0,0 +1,15 @@ +'use strict'; + +const CircularBuffer = require("circular-buffer"); +const history = new CircularBuffer(200); + +function push(item) { + history.push(item); +} + +function dump() { + history.toarray(); +} + +exports.push = push; +exports.dump = dump; \ No newline at end of file diff --git a/lib/transport.js b/lib/transport.js index 6c73b02..6f6fc91 100644 --- a/lib/transport.js +++ b/lib/transport.js @@ -2,12 +2,14 @@ const request = require('request'); const uuidv4 = require('uuid/v4'); +const moment = require('moment'); const config = require('komodo-sdk/config'); const logger = require('komodo-sdk/logger'); const modems = require('./modems'); const partnerLastSeen = require('./partner-last-seen'); +const history = require('./history'); async function _getApproriateHandlerByLastSeen(partnerNumber) { logger.verbose('Looking for last seen on for partner number ' + partnerNumber); @@ -84,6 +86,17 @@ function _send(destinationNumber, msg, handlerName) { const reqId = uuidv4(); + history.push({ + ts: moment().format('YYYY-MM-DD HH:mm:ss'), + modem: { + name: handlerName, + }, + direction: 'OUTGOING', + partner: destinationNumber, + message: msg, + }); + + const requestOptions = { url: modem.url, qs: { diff --git a/package-lock.json b/package-lock.json index 28d4023..a7ef354 100644 --- a/package-lock.json +++ b/package-lock.json @@ -469,9 +469,9 @@ } }, "circular-buffer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/circular-buffer/-/circular-buffer-0.0.6.tgz", - "integrity": "sha1-6c+iujGdNw3idDtgCMpTnN3r9TY=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/circular-buffer/-/circular-buffer-1.0.2.tgz", + "integrity": "sha1-+g4VLtYp92/iTd+J5y69AHhsWm4=" }, "class-utils": { "version": "0.3.6", @@ -4421,6 +4421,13 @@ "integrity": "sha1-6ZH3W5n/IFVR4O5HK3XSAdvT4ns=", "requires": { "circular-buffer": "0.0.6" + }, + "dependencies": { + "circular-buffer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/circular-buffer/-/circular-buffer-0.0.6.tgz", + "integrity": "sha1-6c+iujGdNw3idDtgCMpTnN3r9TY=" + } } }, "winston-daily-rotate-file": { diff --git a/package.json b/package.json index 11b3d9c..ee74892 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,11 @@ "author": "Adhidarma Hadiwinoto <me@adhisimon.org>", "license": "ISC", "dependencies": { + "circular-buffer": "^1.0.2", "express": "^4.17.1", "komodo-center-messaging-client-lib": "git+http://gitlab.kodesumber.com/komodo/komodo-center-messaging-client-lib.git", "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git", + "moment": "^2.24.0", "redis": "^2.8.0", "request": "^2.88.0", "uuid": "^3.3.2" -- 1.9.0