index.js 2.82 KB
"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 modems = require('../modems2');

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,
    });

    modems.set({
        name: req.query.modem,
        imsi: req.query.modem_imsi,
        msisdn: req.query.modem_msisdn,
        device: req.query.modem_device,
        uptime: req.query.uptime,
        reportIp: req.query.report_ip || req.ip,
        reportPort: req.query.report_port,
        reportApikey: req.query.report_apikey,
        reportPathSms: req.query.report_path_sms || '/sms',
    });

    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
    })
}

async function pageHistory(req, res) {
    res.json(await history.dump());
}

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);
})