Commit 527c38f99710f8eb446c5cfbff15d2567ed718a1

Authored by Adhidarma Hadiwinoto
1 parent 2f33e12d0e
Exists in master

ModemData._ts

Showing 2 changed files with 7 additions and 1 deletions Inline Diff

lib/apiserver/index.js
1 "use strict"; 1 "use strict";
2 2
3 /** 3 /**
4 * Modul untuk menerima callback dari modem handler jika ada SMS masuk. 4 * Modul untuk menerima callback dari modem handler jika ada SMS masuk.
5 */ 5 */
6 6
7 7
8 const express = require('express'); 8 const express = require('express');
9 const moment = require('moment'); 9 const moment = require('moment');
10 10
11 const messagingService = require('komodo-center-messaging-client-lib'); 11 const messagingService = require('komodo-center-messaging-client-lib');
12 12
13 const config = require('komodo-sdk/config'); 13 const config = require('komodo-sdk/config');
14 const logger = require('komodo-sdk/logger'); 14 const logger = require('komodo-sdk/logger');
15 15
16 const transport = require('../transport'); 16 const transport = require('../transport');
17 const partnerLastSeen = require('../partner-last-seen'); 17 const partnerLastSeen = require('../partner-last-seen');
18 const history = require('../history'); 18 const history = require('../history');
19 const modems = require('../modems2'); 19 const modems = require('../modems2');
20 20
21 const app = express(); 21 const app = express();
22 messagingService.setTransport(transport); 22 messagingService.setTransport(transport);
23 23
24 function apikeyChecker(req, res, next) { 24 function apikeyChecker(req, res, next) {
25 res.locals.has_valid_apikey = req.params.apikey === config.handler_callback_server.apikey; 25 res.locals.has_valid_apikey = req.params.apikey === config.handler_callback_server.apikey;
26 if (res.locals.has_valid_apikey) { 26 if (res.locals.has_valid_apikey) {
27 next(); 27 next();
28 } 28 }
29 else { 29 else {
30 res.end('APISERVER: Invalid apikey'); 30 res.end('APISERVER: Invalid apikey');
31 } 31 }
32 } 32 }
33 33
34 function onIncomingSms(req, res) { 34 function onIncomingSms(req, res) {
35 res.end('OK'); 35 res.end('OK');
36 36
37 if (!req.query.number) return; 37 if (!req.query.number) return;
38 if (req.query.number.indexOf('+') !== 0) return; 38 if (req.query.number.indexOf('+') !== 0) return;
39 39
40 const numberWithSuffix = req.query.number.replace(/^\+/, '') + (config.number_suffix || ''); 40 const numberWithSuffix = req.query.number.replace(/^\+/, '') + (config.number_suffix || '');
41 41
42 partnerLastSeen.set(req.query.number, req.query.modem); 42 partnerLastSeen.set(req.query.number, req.query.modem);
43 43
44 history.push({ 44 history.push({
45 ts: req.query.ts || moment().format('YYYY-MM-DD HH:mm:ss'), 45 ts: req.query.ts || moment().format('YYYY-MM-DD HH:mm:ss'),
46 modem: { 46 modem: {
47 name: req.query.modem, 47 name: req.query.modem,
48 imsi: req.query.modem_imsi, 48 imsi: req.query.modem_imsi,
49 msisdn: req.query.modem_msisdn, 49 msisdn: req.query.modem_msisdn,
50 }, 50 },
51 direction: 'INCOMING', 51 direction: 'INCOMING',
52 partner: req.query.number, 52 partner: req.query.number,
53 message: req.query.msg, 53 message: req.query.msg,
54 }); 54 });
55 55
56 modems.set({ 56 modems.set({
57 name: req.query.modem, 57 name: req.query.modem,
58 imsi: req.query.modem_imsi, 58 imsi: req.query.modem_imsi,
59 msisdn: req.query.modem_msisdn, 59 msisdn: req.query.modem_msisdn,
60 device: req.query.modem_device,
61 uptime: req.query.uptime,
60 reportIp: req.query.report_ip || req.ip, 62 reportIp: req.query.report_ip || req.ip,
61 reportPort: req.query.report_port, 63 reportPort: req.query.report_port,
62 reportApikey: req.query.report_apikey, 64 reportApikey: req.query.report_apikey,
63 reportPathSms: req.query.report_path_sms || '/sms', 65 reportPathSms: req.query.report_path_sms || '/sms',
64 }); 66 });
65 67
66 logger.info('APISERVER: Incoming SMS', { modem: req.query.modem, from: req.query.number, from_with_suffix: numberWithSuffix, msg: req.query.msg }); 68 logger.info('APISERVER: Incoming SMS', { modem: req.query.modem, from: req.query.number, from_with_suffix: numberWithSuffix, msg: req.query.msg });
67 messagingService.onIncomingMessage({ 69 messagingService.onIncomingMessage({
68 me: req.query.modem, 70 me: req.query.modem,
69 partner: numberWithSuffix, 71 partner: numberWithSuffix,
70 msg: req.query.msg 72 msg: req.query.msg
71 }) 73 })
72 } 74 }
73 75
74 async function pageHistory(req, res) { 76 async function pageHistory(req, res) {
75 res.json(await history.dump()); 77 res.json(await history.dump());
76 } 78 }
77 79
78 app.use(function(req, res, next) { 80 app.use(function(req, res, next) {
79 logger.verbose('APISERVER: Incoming http request', { ip: req.ip, url: req.url }); 81 logger.verbose('APISERVER: Incoming http request', { ip: req.ip, url: req.url });
80 next(); 82 next();
81 }) 83 })
82 84
83 app.use('/apikey/:apikey', apikeyChecker); 85 app.use('/apikey/:apikey', apikeyChecker);
84 app.get('/apikey/:apikey/on-sms', onIncomingSms); 86 app.get('/apikey/:apikey/on-sms', onIncomingSms);
85 app.get('/apikey/:apikey/inbox', onIncomingSms); 87 app.get('/apikey/:apikey/inbox', onIncomingSms);
86 app.get('/apikey/:apikey/on-sms/inbox', onIncomingSms); 88 app.get('/apikey/:apikey/on-sms/inbox', onIncomingSms);
87 app.get('/apikey/:apikey/history', pageHistory); 89 app.get('/apikey/:apikey/history', pageHistory);
88 90
89 const listenPort = config && config.handler_callback_server ? config.handler_callback_server.listen_port : null; 91 const listenPort = config && config.handler_callback_server ? config.handler_callback_server.listen_port : null;
90 listenPort && app.listen(listenPort, () => { 92 listenPort && app.listen(listenPort, () => {
91 logger.info('HTTP Handler Callback server listening on port ' + listenPort); 93 logger.info('HTTP Handler Callback server listening on port ' + listenPort);
92 }) 94 })
1 'use strict'; 1 'use strict';
2 2
3 const modemList = { 3 const modemList = {
4 by_name: {}, 4 by_name: {},
5 by_imsi: {}, 5 by_imsi: {},
6 by_msisdn: {}, 6 by_msisdn: {},
7 }; 7 };
8 8
9 /** 9 /**
10 * Objek data sebuah modem. 10 * Objek data sebuah modem.
11 * 11 *
12 * @typedef {Object} ModemData 12 * @typedef {Object} ModemData
13 * @property {string} name - nama modem 13 * @property {string} name - nama modem
14 * @property {string} imsi - IMSI modem 14 * @property {string} imsi - IMSI modem
15 * @property {string} msisdn - MSISDN modem 15 * @property {string} msisdn - MSISDN modem
16 * @property {number} uptime - modem uptime in seconds
17 * @property {string} device - modem device path
16 * @property {string} reportIp - IP modem 18 * @property {string} reportIp - IP modem
17 * @property {number} reportPort - TCP port modem 19 * @property {number} reportPort - TCP port modem
18 * @property {string} reportApikey - APIKEY modem 20 * @property {string} reportApikey - APIKEY modem
19 * @property {string} reportPathSms - url path untuk pengiriman SMS 21 * @property {string} reportPathSms - url path untuk pengiriman SMS
20 */ 22 */
21 23
22 /** 24 /**
23 * Update data sebuah modem berdasarkan nama modem. 25 * Update data sebuah modem berdasarkan nama modem.
24 * 26 *
25 * @param {ModemData} val - objek data modem 27 * @param {ModemData} val - objek data modem
26 */ 28 */
27 function touchByName(val) { 29 function touchByName(val) {
28 if (!val || !val.name) return; 30 if (!val || !val.name) return;
29 if (typeof val.name !== 'string') return; 31 if (typeof val.name !== 'string') return;
30 if (!val.name.trim()) return; 32 if (!val.name.trim()) return;
31 33
32 modemList.by_name[val.name] = val; 34 modemList.by_name[val.name] = val;
33 } 35 }
34 /** 36 /**
35 * Update data sebuah modem berdasarkan IMSI. 37 * Update data sebuah modem berdasarkan IMSI.
36 * 38 *
37 * @param {ModemData} val - objek data modem 39 * @param {ModemData} val - objek data modem
38 */ 40 */
39 function touchByIMSI(val) { 41 function touchByIMSI(val) {
40 if (!val || !val.imsi) return; 42 if (!val || !val.imsi) return;
41 if (typeof val.imsi !== 'string') return; 43 if (typeof val.imsi !== 'string') return;
42 if (!val.imsi.trim()) return; 44 if (!val.imsi.trim()) return;
43 45
44 modemList.by_imsi[val.imsi] = val; 46 modemList.by_imsi[val.imsi] = val;
45 } 47 }
46 48
47 /** 49 /**
48 * Update data sebuah modem berdasarkan MSISDN. 50 * Update data sebuah modem berdasarkan MSISDN.
49 * 51 *
50 * @param {ModemData} val - objek data modem 52 * @param {ModemData} val - objek data modem
51 */ 53 */
52 function touchByMSISDN(val) { 54 function touchByMSISDN(val) {
53 if (!val || !val.msisdn) return; 55 if (!val || !val.msisdn) return;
54 if (typeof val.msisdn !== 'string') return; 56 if (typeof val.msisdn !== 'string') return;
55 if (!val.msisdn.trim()) return; 57 if (!val.msisdn.trim()) return;
56 58
57 modemList.by_msisdn[val.msisdn] = val; 59 modemList.by_msisdn[val.msisdn] = val;
58 } 60 }
59 61
60 /** 62 /**
61 * Update data sebuah modem. 63 * Update data sebuah modem.
62 * 64 *
63 * @param {ModemData} val - objek data modem 65 * @param {ModemData} val - objek data modem
64 * @see ModemData 66 * @see ModemData
65 */ 67 */
66 function touch(val) { 68 function touch(val) {
67 if (!val) return; 69 if (!val || typeof val !== 'object') return;
70
71 val._ts = new Date();
68 72
69 if (!val.reportIp) { 73 if (!val.reportIp) {
70 val.reportIp = '127.0.0.1'; 74 val.reportIp = '127.0.0.1';
71 } 75 }
72 76
73 touchByName(val); 77 touchByName(val);
74 touchByIMSI(val); 78 touchByIMSI(val);
75 touchByMSISDN(val); 79 touchByMSISDN(val);
76 } 80 }
77 /** 81 /**
78 * Ambil data sebuah modem. 82 * Ambil data sebuah modem.
79 * 83 *
80 * @param {string} selector - selector pencarian, valid jika bernilai salah satu dari: name, imsi, msisdn 84 * @param {string} selector - selector pencarian, valid jika bernilai salah satu dari: name, imsi, msisdn
81 * @param {string} keyword - kata kunci modem yang ingin diambil 85 * @param {string} keyword - kata kunci modem yang ingin diambil
82 * @returns {ModemData} data modem terkait 86 * @returns {ModemData} data modem terkait
83 */ 87 */
84 function get(selector, keyword) { 88 function get(selector, keyword) {
85 if (!selector || !keyword) return null; 89 if (!selector || !keyword) return null;
86 90
87 return modemList[`by_${selector}`] ? modemList[`by_${selector}`][keyword] : null; 91 return modemList[`by_${selector}`] ? modemList[`by_${selector}`][keyword] : null;
88 } 92 }
89 93
90 exports.touch = touch; 94 exports.touch = touch;
91 exports.set = touch; 95 exports.set = touch;
92 exports.get = get; 96 exports.get = get;