"use strict"; const express = require('express'); const bodyParser = require('body-parser'); const ipfilter = require('express-ipfilter').IpFilter const config = require('komodo-sdk/config'); const logger = require('komodo-sdk/logger'); const commandHandler = require('./command-handler'); const messagesArchive = require('./messages-archive'); const app = express(); const port = config && config.listener && config.listener.http && config.listener.http.port ? config.listener.http.port : 32979; /** * Handler utama. * * @param {object} req - Express request object * @param {object} req.query - Express query string object * @param {string} [req.query.partner] - Partner (pengirim atau penerima) * @param {string} [req.query.from] - Pengirim, OBSOLETED: gunakan parameter partner * @param {string} [req.query.from_raw] - Pengirim tanpa suffix (raw), OBSOLETED: gunakan parameter partner_raw * @param {string} [req.query.to] - Tujuan, jika is_outgoing, OBSOLETED: gunakan parameter partner * @param {string} req.query.msg - Isi pesan * @param {string} req.query.origin - Nama origin * @param {string} [req.query.origin_label] - Nama origin untuk ditulis di histori pesan * @param {string} [req.query.do_not_forward_to_core] - Apakah teruskan pesan ke CORE * @param {string} [req.query.is_outgoing] - Apakah pesan keluar * @param {object} res - Express response object */ function mainHandler(req, res) { if (!req.body) req.body = {}; if ( ( !req.body.partner && !req.query.partner ) && ( ( (!req.query.is_outgoing && !req.body.is_outgoing) && (!req.query.from && !req.body.from) ) || ( (req.query.is_outgoing || req.body.is_outgoing) && (!req.query.to && !req.body.to) ) ) ) { logger.warn('Undefined parameter partner or from or to. #D254B7B454DB', { partner: req.body.partner || req.query.partner, is_outgoing: req.body.is_outgoing || req.query.is_outgoing, from: req.body.from || req.query.from, to: req.body.to || req.query.to, }); res.end('ERROR. Undefined parameter: partner or from or to'); return; } if (!req.query.msg && !req.body.msg) { logger.warn('Undefined parameter msg. #92996A497D12') res.end('ERROR. Undefined parameter: msg'); return; } logger.verbose( `Saving ${req.body.is_outgoing || req.query.is_outgoing ? 'outgoing' : 'incoming' } message history`, { transport: req.body.origin_transport || req.query.origin_transport, partner: req.body.partner || req.query.partner || req.body.from || req.query.from || req.body.to || req.query.to, msg: req.body.msg || req.query.msg, } ); messagesArchive.insert( { origin_label: req.body.origin_label || req.query.origin_label || req.body.origin || req.query.origin, origin_transport: req.body.origin_transport || req.query.origin_transport, partner: req.body.partner_raw || req.query.partner_raw || req.body.from_raw || req.query.from_raw || req.body.from || req.query.from || req.body.to || req.query.to || req.body.partner || req.query.partner, msg: req.body.msg || req.query.msg, }, ( req.body.is_outgoing || req.query.is_outgoing ) ? messagesArchive.DIRECTION_OUTGOING : messagesArchive.DIRECTION_INCOMING ); if ( req.body.do_not_forward_to_core || req.query.do_not_forward_to_core || req.body.is_outgoing || req.query.is_outgoing ) { logger.verbose( 'Ignoring message', { from: req.body.from || req.query.from, msg: req.body.msg || req.query.msg, do_not_forward_to_core: req.body.do_not_forward_to_core || req.query.do_not_forward_to_core }); res.end('OK'); return; } if (!req.query.report_port && !req.body.report_port) { res.end('ERROR. Undefined parameter: report_port'); return; } const params = { origin: req.body.origin || req.query.origin || 'MESSAGING', origin_transport: req.body.origin_transport || req.query.origin_transport, report_ip: req.body.report_ip || req.query.report_ip || req.ip, report_port: req.body.report_port || req.query.report_port, from: req.body.partner || req.query.partner || req.body.from || req.query.from, msg: req.body.msg || req.query.msg } commandHandler(req.body.msg || req.query.msg, params, function(err, coreResponseObject, responseParams) { if (err) { res.end('ERROR. ' + err); } else if (coreResponseObject) { res.json(coreResponseObject); } else { res.end(responseParams.body); } }) } config.ip_whitelist && config.ip_whitelist.length && app.use(ipfilter(config.ip_whitelist, {mode: 'allow', log: false})); app.get('/', mainHandler); app.post('/', bodyParser.urlencoded({extended: true}), mainHandler); app.listen(port, function() { logger.info('HTTP-LISTENER: started', {port: port, app_env: app.get('env')}); });