Commit 732c359a73db49f1ca33fbc55cb2fcc276daee91
1 parent
c6a2bf27de
Exists in
master
and in
1 other branch
Partner listener dumper
Showing 5 changed files with 107 additions and 11 deletions Side-by-side Diff
lib/partner-listener/dumper/index.js
... | ... | @@ -0,0 +1,61 @@ |
1 | +const MODULE_NAME = 'PARTNER-LISTENER.DUMPER'; | |
2 | + | |
3 | +const fsPromise = require('fs').promises; | |
4 | +const path = require('path'); | |
5 | +const moment = require('moment'); | |
6 | +const config = require('komodo-sdk/config'); | |
7 | +const logger = require('komodo-sdk/logger'); | |
8 | + | |
9 | +const mkdirIfNotExists = require('../../utils/mkdir-if-not-exists'); | |
10 | + | |
11 | +const baseDumpDir = path.join('dump', 'partner-listener'); | |
12 | +const lastDumpFileName = path.join(baseDumpDir, 'last'); | |
13 | + | |
14 | +module.exports = async (xid, req, responseBody) => { | |
15 | + if ( | |
16 | + !config | |
17 | + || !config.listener | |
18 | + || !config.listener.partner | |
19 | + || !config.listener.partner.dump | |
20 | + ) return; | |
21 | + | |
22 | + const data = `-------- | |
23 | +XID: ${xid} | |
24 | +TS: ${moment().format('YYYY-MM-DD HH:mm:ss')} | |
25 | + | |
26 | +REQ FROM: ${req.ip} | |
27 | +REQ CONTENT-TYPE: ${req.get('content-type')} | |
28 | +REQ METHOD: ${req.method} | |
29 | +REQ URL: ${req.url} | |
30 | + | |
31 | +REQ QUERY-STRING: | |
32 | +${JSON.stringify(req.query, null, 2)} | |
33 | + | |
34 | +REQ BODY: | |
35 | +${typeof req.body === 'string' ? req.body : JSON.stringify(req.body, null, 2)} | |
36 | + | |
37 | +RES BODY: | |
38 | +${typeof responseBody === 'string' ? responseBody : JSON.stringify(responseBody, null, 2)} | |
39 | +`; | |
40 | + | |
41 | + const dumpFileName = path.join( | |
42 | + baseDumpDir, | |
43 | + moment().format('YYYY-MM-DD'), | |
44 | + [ | |
45 | + moment().format('YYMMDD_HHmmss_SSS'), | |
46 | + xid, | |
47 | + ].join('_'), | |
48 | + ); | |
49 | + | |
50 | + try { | |
51 | + await mkdirIfNotExists(xid, path.basename(dumpFileName)); | |
52 | + await fsPromise.writeFile(lastDumpFileName, data); | |
53 | + await fsPromise.writeFile(dumpFileName, data); | |
54 | + } catch (e) { | |
55 | + logger.warn(`${MODULE_NAME} FBC46420: Exception on dumping file`, { | |
56 | + xid, | |
57 | + eCode: e.code, | |
58 | + eMessage: e.eMessage, | |
59 | + }); | |
60 | + } | |
61 | +}; |
lib/partner-listener/routers/inquiry.js
... | ... | @@ -7,6 +7,7 @@ const logger = require('komodo-sdk/logger'); |
7 | 7 | |
8 | 8 | const getFromBodyQsParams = require('../../get-from-body-qs-params'); |
9 | 9 | const ipv6ToIpv4 = require('../../ipv6-to-ipv4'); |
10 | +const dumper = require('../dumper'); | |
10 | 11 | |
11 | 12 | const router = express.Router(); |
12 | 13 | module.exports = router; |
... | ... | @@ -25,7 +26,10 @@ const mainHandler = async (req, res) => { |
25 | 26 | const reverseUrl = getFromBodyQsParams(req, 'reverse_url'); |
26 | 27 | |
27 | 28 | if (!requestId || !terminalNameWithoutIp || !productName || !destination) { |
28 | - res.end('INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'); | |
29 | + const msg = 'INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'; | |
30 | + res.end(msg); | |
31 | + | |
32 | + dumper(xid, req, msg); | |
29 | 33 | return; |
30 | 34 | } |
31 | 35 | |
... | ... | @@ -83,6 +87,8 @@ const mainHandler = async (req, res) => { |
83 | 87 | }); |
84 | 88 | |
85 | 89 | res.json(resultForPartner); |
90 | + | |
91 | + dumper(xid, req, resultForPartner); | |
86 | 92 | } catch (e) { |
87 | 93 | logger.warn('EXCEPTION on forwarding INQUIRY request to CORE', { |
88 | 94 | xid, |
... | ... | @@ -90,7 +96,7 @@ const mainHandler = async (req, res) => { |
90 | 96 | errMessage: e.message, |
91 | 97 | }); |
92 | 98 | |
93 | - res.json({ | |
99 | + const resultForPartner = { | |
94 | 100 | httpgetx_xid: xid, |
95 | 101 | command: 'INQUIRY', |
96 | 102 | request_id: requestId, |
... | ... | @@ -99,7 +105,10 @@ const mainHandler = async (req, res) => { |
99 | 105 | destination, |
100 | 106 | rc: '68', |
101 | 107 | message: 'CORE tidak merespon dengan benar, tidak dapat mengetahui status request anda', |
102 | - }); | |
108 | + }; | |
109 | + | |
110 | + res.json(resultForPartner); | |
111 | + dumper(xid, req, resultForPartner); | |
103 | 112 | } |
104 | 113 | }; |
105 | 114 |
lib/partner-listener/routers/pay.js
... | ... | @@ -7,6 +7,7 @@ const logger = require('komodo-sdk/logger'); |
7 | 7 | |
8 | 8 | const getFromBodyQsParams = require('../../get-from-body-qs-params'); |
9 | 9 | const ipv6ToIpv4 = require('../../ipv6-to-ipv4'); |
10 | +const dumper = require('../dumper'); | |
10 | 11 | |
11 | 12 | const router = express.Router(); |
12 | 13 | module.exports = router; |
... | ... | @@ -25,7 +26,9 @@ const mainHandler = async (req, res) => { |
25 | 26 | const reverseUrl = getFromBodyQsParams(req, 'reverse_url'); |
26 | 27 | |
27 | 28 | if (!requestId || !terminalNameWithoutIp || !productName || !destination) { |
28 | - res.end('INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'); | |
29 | + const msg = 'INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'; | |
30 | + res.end(msg); | |
31 | + dumper(xid, req, msg); | |
29 | 32 | return; |
30 | 33 | } |
31 | 34 | |
... | ... | @@ -82,6 +85,7 @@ const mainHandler = async (req, res) => { |
82 | 85 | }); |
83 | 86 | |
84 | 87 | res.json(resultForPartner); |
88 | + dumper(xid, req, resultForPartner); | |
85 | 89 | } catch (e) { |
86 | 90 | logger.warn('EXCEPTION on forwarding PAY request to CORE', { |
87 | 91 | xid, |
... | ... | @@ -89,7 +93,7 @@ const mainHandler = async (req, res) => { |
89 | 93 | errMessage: e.message, |
90 | 94 | }); |
91 | 95 | |
92 | - res.json({ | |
96 | + const resultForPartner = { | |
93 | 97 | httpgetx_xid: xid, |
94 | 98 | command: 'PAY', |
95 | 99 | request_id: requestId, |
... | ... | @@ -98,7 +102,9 @@ const mainHandler = async (req, res) => { |
98 | 102 | destination, |
99 | 103 | rc: '68', |
100 | 104 | message: 'CORE tidak merespon dengan benar, tidak dapat mengetahui status request anda', |
101 | - }); | |
105 | + }; | |
106 | + | |
107 | + dumper(xid, req, resultForPartner); | |
102 | 108 | } |
103 | 109 | }; |
104 | 110 |
lib/partner-listener/routers/topup.js
... | ... | @@ -7,6 +7,7 @@ const logger = require('komodo-sdk/logger'); |
7 | 7 | const coreapi = require('komodo-sdk/coreapi'); |
8 | 8 | // const coreapi = require('../../coreapi'); |
9 | 9 | const matrix = require('../../matrix'); |
10 | +const dumper = require('../dumper'); | |
10 | 11 | |
11 | 12 | const router = express.Router(); |
12 | 13 | module.exports = router; |
... | ... | @@ -94,6 +95,8 @@ async function pageIndex(req, res) { |
94 | 95 | coreResponse, |
95 | 96 | }); |
96 | 97 | res.end('INVALID CORE RESPONSE'); |
98 | + | |
99 | + dumper(xid, req, 'INVALID CORE RESPONSE'); | |
97 | 100 | return; |
98 | 101 | } |
99 | 102 | |
... | ... | @@ -119,6 +122,7 @@ async function pageIndex(req, res) { |
119 | 122 | }; |
120 | 123 | |
121 | 124 | res.json(responseToPartner); |
125 | + dumper(xid, req, responseToPartner); | |
122 | 126 | } |
123 | 127 | |
124 | 128 | // router.all('/', (req, res) => { res.status(404).end('404: Not implemented yet'); }); |
lib/partner-listener/routers/trx-status.js
... | ... | @@ -6,6 +6,7 @@ const moment = require('moment'); |
6 | 6 | const logger = require('komodo-sdk/logger'); |
7 | 7 | |
8 | 8 | const coreapi = require('../../coreapi'); |
9 | +const dumper = require('../dumper'); | |
9 | 10 | |
10 | 11 | const router = express.Router(); |
11 | 12 | module.exports = router; |
... | ... | @@ -15,29 +16,38 @@ async function pageIndex(req, res) { |
15 | 16 | if (!req.body) req.body = {}; |
16 | 17 | |
17 | 18 | if (!req.body.terminal_name && !req.query.terminal_name) { |
19 | + const msg = 'Parameter terminal_name tidak terdefinisi'; | |
18 | 20 | res.json({ |
19 | 21 | httpgetx_xid: xid, |
20 | 22 | error: true, |
21 | - message: 'Parameter terminal_name tidak terdefinisi', | |
23 | + message: msg, | |
22 | 24 | }); |
25 | + | |
26 | + dumper(xid, req, msg); | |
23 | 27 | return; |
24 | 28 | } |
25 | 29 | |
26 | 30 | if (!req.body.password && !req.query.password) { |
31 | + const msg = 'Parameter password tidak terdefinisi'; | |
27 | 32 | res.json({ |
28 | 33 | httpgetx_xid: xid, |
29 | 34 | error: true, |
30 | - message: 'Parameter password tidak terdefinisi', | |
35 | + message: msg, | |
31 | 36 | }); |
37 | + | |
38 | + dumper(xid, req, msg); | |
32 | 39 | return; |
33 | 40 | } |
34 | 41 | |
35 | 42 | if (!req.body.request_id && !req.query.request_id) { |
43 | + const msg = 'Parameter request_id tidak terdefinisi'; | |
36 | 44 | res.json({ |
37 | 45 | httpgetx_xid: xid, |
38 | 46 | error: true, |
39 | - message: 'Parameter request_id tidak terdefinisi', | |
47 | + message: msg, | |
40 | 48 | }); |
49 | + | |
50 | + dumper(xid, req, msg); | |
41 | 51 | return; |
42 | 52 | } |
43 | 53 | |
... | ... | @@ -64,7 +74,7 @@ async function pageIndex(req, res) { |
64 | 74 | request_id: req.body.request_id || req.query.request_id, |
65 | 75 | }); |
66 | 76 | |
67 | - res.json({ | |
77 | + const responseBody = { | |
68 | 78 | httpgetx_xid: xid, |
69 | 79 | error: true, |
70 | 80 | from_ip: remoteIp, |
... | ... | @@ -72,7 +82,11 @@ async function pageIndex(req, res) { |
72 | 82 | full_terminal_name: askerTerminalName, |
73 | 83 | password: req.body.password || req.query.password, |
74 | 84 | message: msg, |
75 | - }); | |
85 | + }; | |
86 | + | |
87 | + res.json(responseBody); | |
88 | + dumper(xid, req, responseBody); | |
89 | + | |
76 | 90 | return; |
77 | 91 | } |
78 | 92 | |
... | ... | @@ -116,6 +130,8 @@ async function pageIndex(req, res) { |
116 | 130 | processing_time_in_ms: new Date() - res.locals.x_http_request_ts, |
117 | 131 | result, |
118 | 132 | }); |
133 | + | |
134 | + dumper(xid, req, result); | |
119 | 135 | } |
120 | 136 | |
121 | 137 | router.get('/', pageIndex); |