diff --git a/lib/partner-listener/dumper/index.js b/lib/partner-listener/dumper/index.js new file mode 100644 index 0000000..85085a0 --- /dev/null +++ b/lib/partner-listener/dumper/index.js @@ -0,0 +1,61 @@ +const MODULE_NAME = 'PARTNER-LISTENER.DUMPER'; + +const fsPromise = require('fs').promises; +const path = require('path'); +const moment = require('moment'); +const config = require('komodo-sdk/config'); +const logger = require('komodo-sdk/logger'); + +const mkdirIfNotExists = require('../../utils/mkdir-if-not-exists'); + +const baseDumpDir = path.join('dump', 'partner-listener'); +const lastDumpFileName = path.join(baseDumpDir, 'last'); + +module.exports = async (xid, req, responseBody) => { + if ( + !config + || !config.listener + || !config.listener.partner + || !config.listener.partner.dump + ) return; + + const data = `-------- +XID: ${xid} +TS: ${moment().format('YYYY-MM-DD HH:mm:ss')} + +REQ FROM: ${req.ip} +REQ CONTENT-TYPE: ${req.get('content-type')} +REQ METHOD: ${req.method} +REQ URL: ${req.url} + +REQ QUERY-STRING: +${JSON.stringify(req.query, null, 2)} + +REQ BODY: +${typeof req.body === 'string' ? req.body : JSON.stringify(req.body, null, 2)} + +RES BODY: +${typeof responseBody === 'string' ? responseBody : JSON.stringify(responseBody, null, 2)} +`; + + const dumpFileName = path.join( + baseDumpDir, + moment().format('YYYY-MM-DD'), + [ + moment().format('YYMMDD_HHmmss_SSS'), + xid, + ].join('_'), + ); + + try { + await mkdirIfNotExists(xid, path.basename(dumpFileName)); + await fsPromise.writeFile(lastDumpFileName, data); + await fsPromise.writeFile(dumpFileName, data); + } catch (e) { + logger.warn(`${MODULE_NAME} FBC46420: Exception on dumping file`, { + xid, + eCode: e.code, + eMessage: e.eMessage, + }); + } +}; diff --git a/lib/partner-listener/routers/inquiry.js b/lib/partner-listener/routers/inquiry.js index b82341b..52bdfb4 100644 --- a/lib/partner-listener/routers/inquiry.js +++ b/lib/partner-listener/routers/inquiry.js @@ -7,6 +7,7 @@ const logger = require('komodo-sdk/logger'); const getFromBodyQsParams = require('../../get-from-body-qs-params'); const ipv6ToIpv4 = require('../../ipv6-to-ipv4'); +const dumper = require('../dumper'); const router = express.Router(); module.exports = router; @@ -25,7 +26,10 @@ const mainHandler = async (req, res) => { const reverseUrl = getFromBodyQsParams(req, 'reverse_url'); if (!requestId || !terminalNameWithoutIp || !productName || !destination) { - res.end('INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'); + const msg = 'INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'; + res.end(msg); + + dumper(xid, req, msg); return; } @@ -83,6 +87,8 @@ const mainHandler = async (req, res) => { }); res.json(resultForPartner); + + dumper(xid, req, resultForPartner); } catch (e) { logger.warn('EXCEPTION on forwarding INQUIRY request to CORE', { xid, @@ -90,7 +96,7 @@ const mainHandler = async (req, res) => { errMessage: e.message, }); - res.json({ + const resultForPartner = { httpgetx_xid: xid, command: 'INQUIRY', request_id: requestId, @@ -99,7 +105,10 @@ const mainHandler = async (req, res) => { destination, rc: '68', message: 'CORE tidak merespon dengan benar, tidak dapat mengetahui status request anda', - }); + }; + + res.json(resultForPartner); + dumper(xid, req, resultForPartner); } }; diff --git a/lib/partner-listener/routers/pay.js b/lib/partner-listener/routers/pay.js index 031f023..b61ed4e 100644 --- a/lib/partner-listener/routers/pay.js +++ b/lib/partner-listener/routers/pay.js @@ -7,6 +7,7 @@ const logger = require('komodo-sdk/logger'); const getFromBodyQsParams = require('../../get-from-body-qs-params'); const ipv6ToIpv4 = require('../../ipv6-to-ipv4'); +const dumper = require('../dumper'); const router = express.Router(); module.exports = router; @@ -25,7 +26,9 @@ const mainHandler = async (req, res) => { const reverseUrl = getFromBodyQsParams(req, 'reverse_url'); if (!requestId || !terminalNameWithoutIp || !productName || !destination) { - res.end('INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'); + const msg = 'INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'; + res.end(msg); + dumper(xid, req, msg); return; } @@ -82,6 +85,7 @@ const mainHandler = async (req, res) => { }); res.json(resultForPartner); + dumper(xid, req, resultForPartner); } catch (e) { logger.warn('EXCEPTION on forwarding PAY request to CORE', { xid, @@ -89,7 +93,7 @@ const mainHandler = async (req, res) => { errMessage: e.message, }); - res.json({ + const resultForPartner = { httpgetx_xid: xid, command: 'PAY', request_id: requestId, @@ -98,7 +102,9 @@ const mainHandler = async (req, res) => { destination, rc: '68', message: 'CORE tidak merespon dengan benar, tidak dapat mengetahui status request anda', - }); + }; + + dumper(xid, req, resultForPartner); } }; diff --git a/lib/partner-listener/routers/topup.js b/lib/partner-listener/routers/topup.js index 60b433f..9353a46 100644 --- a/lib/partner-listener/routers/topup.js +++ b/lib/partner-listener/routers/topup.js @@ -7,6 +7,7 @@ const logger = require('komodo-sdk/logger'); const coreapi = require('komodo-sdk/coreapi'); // const coreapi = require('../../coreapi'); const matrix = require('../../matrix'); +const dumper = require('../dumper'); const router = express.Router(); module.exports = router; @@ -94,6 +95,8 @@ async function pageIndex(req, res) { coreResponse, }); res.end('INVALID CORE RESPONSE'); + + dumper(xid, req, 'INVALID CORE RESPONSE'); return; } @@ -119,6 +122,7 @@ async function pageIndex(req, res) { }; res.json(responseToPartner); + dumper(xid, req, responseToPartner); } // router.all('/', (req, res) => { res.status(404).end('404: Not implemented yet'); }); diff --git a/lib/partner-listener/routers/trx-status.js b/lib/partner-listener/routers/trx-status.js index 4c530ab..4a8eac7 100644 --- a/lib/partner-listener/routers/trx-status.js +++ b/lib/partner-listener/routers/trx-status.js @@ -6,6 +6,7 @@ const moment = require('moment'); const logger = require('komodo-sdk/logger'); const coreapi = require('../../coreapi'); +const dumper = require('../dumper'); const router = express.Router(); module.exports = router; @@ -15,29 +16,38 @@ async function pageIndex(req, res) { if (!req.body) req.body = {}; if (!req.body.terminal_name && !req.query.terminal_name) { + const msg = 'Parameter terminal_name tidak terdefinisi'; res.json({ httpgetx_xid: xid, error: true, - message: 'Parameter terminal_name tidak terdefinisi', + message: msg, }); + + dumper(xid, req, msg); return; } if (!req.body.password && !req.query.password) { + const msg = 'Parameter password tidak terdefinisi'; res.json({ httpgetx_xid: xid, error: true, - message: 'Parameter password tidak terdefinisi', + message: msg, }); + + dumper(xid, req, msg); return; } if (!req.body.request_id && !req.query.request_id) { + const msg = 'Parameter request_id tidak terdefinisi'; res.json({ httpgetx_xid: xid, error: true, - message: 'Parameter request_id tidak terdefinisi', + message: msg, }); + + dumper(xid, req, msg); return; } @@ -64,7 +74,7 @@ async function pageIndex(req, res) { request_id: req.body.request_id || req.query.request_id, }); - res.json({ + const responseBody = { httpgetx_xid: xid, error: true, from_ip: remoteIp, @@ -72,7 +82,11 @@ async function pageIndex(req, res) { full_terminal_name: askerTerminalName, password: req.body.password || req.query.password, message: msg, - }); + }; + + res.json(responseBody); + dumper(xid, req, responseBody); + return; } @@ -116,6 +130,8 @@ async function pageIndex(req, res) { processing_time_in_ms: new Date() - res.locals.x_http_request_ts, result, }); + + dumper(xid, req, result); } router.get('/', pageIndex);