From 732c359a73db49f1ca33fbc55cb2fcc276daee91 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <adhisimon@gmail.com>
Date: Mon, 14 Jun 2021 15:10:34 +0700
Subject: [PATCH] Partner listener dumper

---
 lib/partner-listener/dumper/index.js       | 61 ++++++++++++++++++++++++++++++
 lib/partner-listener/routers/inquiry.js    | 15 ++++++--
 lib/partner-listener/routers/pay.js        | 12 ++++--
 lib/partner-listener/routers/topup.js      |  4 ++
 lib/partner-listener/routers/trx-status.js | 26 ++++++++++---
 5 files changed, 107 insertions(+), 11 deletions(-)
 create mode 100644 lib/partner-listener/dumper/index.js

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