Commit 4fbfae95f1b9b58193c7c2eb1b31a7f293bbd04d
1 parent
e4139cb421
Exists in
master
Messages history
Showing 7 changed files with 122 additions and 66 deletions Side-by-side Diff
index.js
... | ... | @@ -10,4 +10,4 @@ process.title = `KOMODO-CENTER@${(config && typeof config.name === 'string') ? c |
10 | 10 | |
11 | 11 | |
12 | 12 | require('./lib/transport'); |
13 | -require('./lib/handler-callback-server'); | |
14 | 13 | \ No newline at end of file |
14 | +require('./lib/apiserver'); | |
15 | 15 | \ No newline at end of file |
lib/apiserver/index.js
... | ... | @@ -0,0 +1,81 @@ |
1 | +"use strict"; | |
2 | + | |
3 | +/** | |
4 | + * Modul untuk menerima callback dari modem handler jika ada SMS masuk. | |
5 | + */ | |
6 | + | |
7 | + | |
8 | +const express = require('express'); | |
9 | +const moment = require('moment'); | |
10 | + | |
11 | +const messagingService = require('komodo-center-messaging-client-lib'); | |
12 | + | |
13 | +const config = require('komodo-sdk/config'); | |
14 | +const logger = require('komodo-sdk/logger'); | |
15 | + | |
16 | +const transport = require('../transport'); | |
17 | +const partnerLastSeen = require('../partner-last-seen'); | |
18 | +const history = require('../history'); | |
19 | + | |
20 | +const app = express(); | |
21 | +messagingService.setTransport(transport); | |
22 | + | |
23 | +function apikeyChecker(req, res, next) { | |
24 | + res.locals.has_valid_apikey = req.params.apikey === config.handler_callback_server.apikey; | |
25 | + if (res.locals.has_valid_apikey) { | |
26 | + next(); | |
27 | + } | |
28 | + else { | |
29 | + res.end('APISERVER: Invalid apikey'); | |
30 | + } | |
31 | +} | |
32 | + | |
33 | +function onIncomingSms(req, res) { | |
34 | + res.end('OK'); | |
35 | + | |
36 | + if (!req.query.number) return; | |
37 | + if (req.query.number.indexOf('+') !== 0) return; | |
38 | + | |
39 | + const numberWithSuffix = req.query.number.replace(/^\+/, '') + (config.number_suffix || ''); | |
40 | + | |
41 | + partnerLastSeen.set(req.query.number, req.query.modem); | |
42 | + | |
43 | + history.push({ | |
44 | + ts: req.query.ts || moment().format('YYYY-MM-DD HH:mm:ss'), | |
45 | + modem: { | |
46 | + name: req.query.modem, | |
47 | + imsi: req.query.modem_imsi, | |
48 | + msisdn: req.query.modem_msisdn, | |
49 | + }, | |
50 | + direction: 'INCOMING', | |
51 | + partner: req.query.number, | |
52 | + message: req.query.msg, | |
53 | + }); | |
54 | + | |
55 | + logger.info('APISERVER: Incoming SMS', { modem: req.query.modem, from: req.query.number, from_with_suffix: numberWithSuffix, msg: req.query.msg }); | |
56 | + messagingService.onIncomingMessage({ | |
57 | + me: req.query.modem, | |
58 | + partner: numberWithSuffix, | |
59 | + msg: req.query.msg | |
60 | + }) | |
61 | +} | |
62 | + | |
63 | +function pageHistory(req, res) { | |
64 | + res.json((history.dump() || []).reverse()); | |
65 | +} | |
66 | + | |
67 | +app.use(function(req, res, next) { | |
68 | + logger.verbose('APISERVER: Incoming http request', { ip: req.ip, url: req.url }); | |
69 | + next(); | |
70 | +}) | |
71 | + | |
72 | +app.use('/apikey/:apikey', apikeyChecker); | |
73 | +app.get('/apikey/:apikey/on-sms', onIncomingSms); | |
74 | +app.get('/apikey/:apikey/inbox', onIncomingSms); | |
75 | +app.get('/apikey/:apikey/on-sms/inbox', onIncomingSms); | |
76 | +app.get('/apikey/:apikey/history', pageHistory); | |
77 | + | |
78 | +const listenPort = config && config.handler_callback_server ? config.handler_callback_server.listen_port : null; | |
79 | +listenPort && app.listen(listenPort, () => { | |
80 | + logger.info('HTTP Handler Callback server listening on port ' + listenPort); | |
81 | +}) | |
0 | 82 | \ No newline at end of file |
lib/handler-callback-server.js
... | ... | @@ -1,62 +0,0 @@ |
1 | -"use strict"; | |
2 | - | |
3 | -/** | |
4 | - * Modul untuk menerima callback dari modem handler jika ada SMS masuk. | |
5 | - */ | |
6 | - | |
7 | - | |
8 | -const express = require('express'); | |
9 | - | |
10 | -const messagingService = require('komodo-center-messaging-client-lib'); | |
11 | - | |
12 | -const config = require('komodo-sdk/config'); | |
13 | -const logger = require('komodo-sdk/logger'); | |
14 | - | |
15 | -const transport = require('./transport'); | |
16 | -const partnerLastSeen = require('./partner-last-seen'); | |
17 | - | |
18 | -const app = express(); | |
19 | -messagingService.setTransport(transport); | |
20 | - | |
21 | -function apikeyChecker(req, res, next) { | |
22 | - res.locals.has_valid_apikey = req.params.apikey === config.handler_callback_server.apikey; | |
23 | - if (res.locals.has_valid_apikey) { | |
24 | - next(); | |
25 | - } | |
26 | - else { | |
27 | - res.end('HANDLER-CALLBACK-SERVER: Invalid apikey'); | |
28 | - } | |
29 | -} | |
30 | - | |
31 | -function onIncomingSms(req, res) { | |
32 | - res.end('OK'); | |
33 | - | |
34 | - if (!req.query.number) return; | |
35 | - if (req.query.number.indexOf('+') !== 0) return; | |
36 | - | |
37 | - const numberWithSuffix = req.query.number + (config.number_suffix || ''); | |
38 | - | |
39 | - partnerLastSeen.set(req.query.number, req.query.modem); | |
40 | - | |
41 | - logger.info('HANDLER-CALLBACK-SERVER: Incoming SMS', { modem: req.query.modem, from: req.query.number, from_with_suffix: numberWithSuffix, msg: req.query.msg }); | |
42 | - messagingService.onIncomingMessage({ | |
43 | - me: req.query.modem, | |
44 | - partner: numberWithSuffix, | |
45 | - msg: req.query.msg | |
46 | - }) | |
47 | -} | |
48 | - | |
49 | -app.use(function(req, res, next) { | |
50 | - logger.verbose('HANDLER-CALLBACK-SERVER: Incoming http request', { ip: req.ip, url: req.url }); | |
51 | - next(); | |
52 | -}) | |
53 | - | |
54 | -app.use('/apikey/:apikey', apikeyChecker); | |
55 | -app.get('/apikey/:apikey/on-sms', onIncomingSms); | |
56 | -app.get('/apikey/:apikey/inbox', onIncomingSms); | |
57 | -app.get('/apikey/:apikey/on-sms/inbox', onIncomingSms); | |
58 | - | |
59 | -const listenPort = config && config.handler_callback_server ? config.handler_callback_server.listen_port : null; | |
60 | -listenPort && app.listen(listenPort, () => { | |
61 | - logger.info('HTTP Handler Callback server listening on port ' + listenPort); | |
62 | -}) | |
63 | 0 | \ No newline at end of file |
lib/history.js
... | ... | @@ -0,0 +1,15 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +const CircularBuffer = require("circular-buffer"); | |
4 | +const history = new CircularBuffer(200); | |
5 | + | |
6 | +function push(item) { | |
7 | + history.push(item); | |
8 | +} | |
9 | + | |
10 | +function dump() { | |
11 | + history.toarray(); | |
12 | +} | |
13 | + | |
14 | +exports.push = push; | |
15 | +exports.dump = dump; | |
0 | 16 | \ No newline at end of file |
lib/transport.js
... | ... | @@ -2,12 +2,14 @@ |
2 | 2 | |
3 | 3 | const request = require('request'); |
4 | 4 | const uuidv4 = require('uuid/v4'); |
5 | +const moment = require('moment'); | |
5 | 6 | |
6 | 7 | const config = require('komodo-sdk/config'); |
7 | 8 | const logger = require('komodo-sdk/logger'); |
8 | 9 | |
9 | 10 | const modems = require('./modems'); |
10 | 11 | const partnerLastSeen = require('./partner-last-seen'); |
12 | +const history = require('./history'); | |
11 | 13 | |
12 | 14 | async function _getApproriateHandlerByLastSeen(partnerNumber) { |
13 | 15 | logger.verbose('Looking for last seen on for partner number ' + partnerNumber); |
... | ... | @@ -84,6 +86,17 @@ function _send(destinationNumber, msg, handlerName) { |
84 | 86 | |
85 | 87 | const reqId = uuidv4(); |
86 | 88 | |
89 | + history.push({ | |
90 | + ts: moment().format('YYYY-MM-DD HH:mm:ss'), | |
91 | + modem: { | |
92 | + name: handlerName, | |
93 | + }, | |
94 | + direction: 'OUTGOING', | |
95 | + partner: destinationNumber, | |
96 | + message: msg, | |
97 | + }); | |
98 | + | |
99 | + | |
87 | 100 | const requestOptions = { |
88 | 101 | url: modem.url, |
89 | 102 | qs: { |
package-lock.json
... | ... | @@ -469,9 +469,9 @@ |
469 | 469 | } |
470 | 470 | }, |
471 | 471 | "circular-buffer": { |
472 | - "version": "0.0.6", | |
473 | - "resolved": "https://registry.npmjs.org/circular-buffer/-/circular-buffer-0.0.6.tgz", | |
474 | - "integrity": "sha1-6c+iujGdNw3idDtgCMpTnN3r9TY=" | |
472 | + "version": "1.0.2", | |
473 | + "resolved": "https://registry.npmjs.org/circular-buffer/-/circular-buffer-1.0.2.tgz", | |
474 | + "integrity": "sha1-+g4VLtYp92/iTd+J5y69AHhsWm4=" | |
475 | 475 | }, |
476 | 476 | "class-utils": { |
477 | 477 | "version": "0.3.6", |
... | ... | @@ -4421,6 +4421,13 @@ |
4421 | 4421 | "integrity": "sha1-6ZH3W5n/IFVR4O5HK3XSAdvT4ns=", |
4422 | 4422 | "requires": { |
4423 | 4423 | "circular-buffer": "0.0.6" |
4424 | + }, | |
4425 | + "dependencies": { | |
4426 | + "circular-buffer": { | |
4427 | + "version": "0.0.6", | |
4428 | + "resolved": "https://registry.npmjs.org/circular-buffer/-/circular-buffer-0.0.6.tgz", | |
4429 | + "integrity": "sha1-6c+iujGdNw3idDtgCMpTnN3r9TY=" | |
4430 | + } | |
4424 | 4431 | } |
4425 | 4432 | }, |
4426 | 4433 | "winston-daily-rotate-file": { |
package.json
... | ... | @@ -20,9 +20,11 @@ |
20 | 20 | "author": "Adhidarma Hadiwinoto <me@adhisimon.org>", |
21 | 21 | "license": "ISC", |
22 | 22 | "dependencies": { |
23 | + "circular-buffer": "^1.0.2", | |
23 | 24 | "express": "^4.17.1", |
24 | 25 | "komodo-center-messaging-client-lib": "git+http://gitlab.kodesumber.com/komodo/komodo-center-messaging-client-lib.git", |
25 | 26 | "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git", |
27 | + "moment": "^2.24.0", | |
26 | 28 | "redis": "^2.8.0", |
27 | 29 | "request": "^2.88.0", |
28 | 30 | "uuid": "^3.3.2" |