Commit 7f757cc71062ac64faf4c86f2076daf2748588c8

Authored by Adhidarma Hadiwinoto
1 parent 0a379e7599
Exists in master

Tambahan property modem.

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