Commit 385d8ff5945e244b3d4efaee1f68c8b54753cc7b
1 parent
d4661aa843
Exists in
master
PREPAID topup tested
Showing 7 changed files with 158 additions and 7 deletions Side-by-side Diff
lib/callback/dumper.js
... | ... | @@ -35,6 +35,7 @@ module.exports = async (req, res, next) => { |
35 | 35 | |
36 | 36 | const data = `-------- |
37 | 37 | XID: ${xid} |
38 | +PID: ${process.pid} | |
38 | 39 | DATE: ${moment().format('YYYY-MM-DD HH:mm:ss.SSS')} |
39 | 40 | REMOTE-ADDR: ${req.ip} |
40 | 41 | USER-AGENT: ${req.get('user-agent')} |
... | ... | @@ -73,7 +74,7 @@ ${(req.body && typeof req.body === 'object' && JSON.stringify(req.body, null, 2) |
73 | 74 | ); |
74 | 75 | |
75 | 76 | await fsPromise.writeFile( |
76 | - path.join(callbackDumpDir, 'last.trx'), | |
77 | + path.join(callbackDumpDir, 'last-callback'), | |
77 | 78 | data, |
78 | 79 | ); |
79 | 80 |
lib/callback/handler-prepaid.js
1 | +const MODULE_NAME = 'CALLBACK.HANDLER-PREPAID'; | |
2 | + | |
3 | +const logger = require('komodo-sdk/logger'); | |
4 | +const report = require('../report/prepaid'); | |
5 | +const getFromReq = require('../get-from-params-body-qs'); | |
6 | +const translateRc = require('../translate-rc'); | |
7 | + | |
1 | 8 | module.exports = (req, res) => { |
2 | 9 | const { xid } = res.locals; |
3 | 10 | res.json({ |
... | ... | @@ -6,4 +13,29 @@ module.exports = (req, res) => { |
6 | 13 | ts: new Date(), |
7 | 14 | xid, |
8 | 15 | }); |
16 | + | |
17 | + const rcFromRequest = getFromReq(req, 'rc'); | |
18 | + const translatedRc = rcFromRequest && (translateRc[rcFromRequest] || rcFromRequest); | |
19 | + logger.verbose(`${MODULE_NAME} 2B7BE44D: RC translated`, { | |
20 | + xid, | |
21 | + rcFromRequest, | |
22 | + translatedRc, | |
23 | + }); | |
24 | + | |
25 | + report(xid, { | |
26 | + trx_id: getFromReq(req, 'request_id'), | |
27 | + rc: translatedRc || '68', | |
28 | + sn: getFromReq(req, 'sn'), | |
29 | + amount: getFromReq(req, 'amount'), | |
30 | + balance: getFromReq(req, 'ending_balance'), | |
31 | + message: { | |
32 | + xid, | |
33 | + CALLBACK: { | |
34 | + ip: req.ip, | |
35 | + method: req.method, | |
36 | + body: req.body, | |
37 | + qs: req.query, | |
38 | + }, | |
39 | + }, | |
40 | + }); | |
9 | 41 | }; |
lib/get-from-params-body-qs.js
lib/hit/dump-req-res.js
... | ... | @@ -0,0 +1,87 @@ |
1 | +const MODULE_NAME = 'DUMP-REQ-RES'; | |
2 | + | |
3 | +const fs = require('fs'); | |
4 | +const path = require('path'); | |
5 | +const fsPromise = require('fs').promises; | |
6 | +const moment = require('moment'); | |
7 | + | |
8 | +const config = require('komodo-sdk/config'); | |
9 | +const logger = require('komodo-sdk/logger'); | |
10 | + | |
11 | +const baseDumpDir = 'dump'; | |
12 | +const requestDumpDir = path.join(baseDumpDir, 'request'); | |
13 | + | |
14 | +if (!fs.existsSync(baseDumpDir)) { | |
15 | + logger.verbose(`${MODULE_NAME} 51105314: Creating base dump dir`); | |
16 | + fs.mkdirSync(baseDumpDir); | |
17 | +} | |
18 | + | |
19 | +if (!fs.existsSync(requestDumpDir)) { | |
20 | + logger.verbose(`${MODULE_NAME} 8A52891B: Creating request dump dir`); | |
21 | + fs.mkdirSync(requestDumpDir); | |
22 | +} | |
23 | + | |
24 | +module.exports = async ( | |
25 | + xid, task, httpMethod, endpointUrl, params, responseBody, responseStatus, | |
26 | +) => { | |
27 | + if ( | |
28 | + !config | |
29 | + || !config.partner | |
30 | + || !config.partner.dump_request | |
31 | + ) { | |
32 | + return; | |
33 | + } | |
34 | + | |
35 | + const data = `-------- | |
36 | +XID: ${xid} | |
37 | +PID: ${process.pid} | |
38 | +DATE: ${moment().format('YYYY-MM-DD HH:mm:ss.SSS')} | |
39 | + | |
40 | +TASK: | |
41 | +${JSON.stringify(task, null, 2)} | |
42 | + | |
43 | + | |
44 | +HTTP-METHOD: ${httpMethod} | |
45 | +URL: ${endpointUrl} | |
46 | +PARAMS: | |
47 | +${ | |
48 | + params && ( | |
49 | + (typeof params === 'string' && params) | |
50 | + || JSON.stringify(params, null, 2) | |
51 | + ) | |
52 | +} | |
53 | + | |
54 | +RESPONSE-STATUS: ${responseStatus} | |
55 | +RESPONSE-BODY: | |
56 | +${ | |
57 | + responseBody && ( | |
58 | + (typeof responseBody === 'string' && responseBody) | |
59 | + || JSON.stringify(responseBody, null, 2) | |
60 | + ) | |
61 | +} | |
62 | +`; | |
63 | + | |
64 | + const dumpDir = path.join( | |
65 | + requestDumpDir, | |
66 | + moment().format('YYYY-MM-DD'), | |
67 | + ); | |
68 | + | |
69 | + try { | |
70 | + await fsPromise.stat(dumpDir); | |
71 | + } catch { | |
72 | + await fsPromise.mkdir(dumpDir, { recursive: true }); | |
73 | + } | |
74 | + | |
75 | + await fsPromise.writeFile( | |
76 | + path.join( | |
77 | + dumpDir, | |
78 | + `trx_${task.trx_id}`, | |
79 | + ), | |
80 | + data, | |
81 | + ); | |
82 | + | |
83 | + await fsPromise.writeFile( | |
84 | + path.join(dumpDir, 'last-trx'), | |
85 | + data, | |
86 | + ); | |
87 | +}; |
lib/hit/prepaid.js
... | ... | @@ -10,10 +10,17 @@ const logger = require('komodo-sdk/logger'); |
10 | 10 | const report = require('../report/prepaid'); |
11 | 11 | const translateRc = require('../translate-rc'); |
12 | 12 | const composeCallbackUrl = require('./compose-callback-url'); |
13 | +const dumpReqRes = require('./dump-req-res'); | |
13 | 14 | |
14 | 15 | module.exports = async (task, isAdvice) => { |
15 | 16 | const xid = uniqid(); |
16 | 17 | |
18 | + logger.verbose(`${MODULE_NAME} 2272F01F: Processing task`, { | |
19 | + xid, | |
20 | + isAdvice, | |
21 | + task, | |
22 | + }); | |
23 | + | |
17 | 24 | const params = { |
18 | 25 | request_id: task.trx_id, |
19 | 26 | terminal_name: config.partner.terminal_name, |
... | ... | @@ -27,10 +34,11 @@ module.exports = async (task, isAdvice) => { |
27 | 34 | ? urljoin(config.partner.url, '/trx-status') |
28 | 35 | : urljoin(config.partner.url, '/topup'); |
29 | 36 | |
37 | + let lastResponse = null; | |
38 | + | |
30 | 39 | try { |
31 | 40 | logger.verbose(`${MODULE_NAME} 4AAD4F99: Going to HIT prepaid endpoint`, { |
32 | 41 | xid, |
33 | - isAdvice, | |
34 | 42 | endpointUrl, |
35 | 43 | params, |
36 | 44 | }); |
... | ... | @@ -64,6 +72,8 @@ module.exports = async (task, isAdvice) => { |
64 | 72 | throw e; |
65 | 73 | } |
66 | 74 | |
75 | + lastResponse = response; | |
76 | + | |
67 | 77 | logger.verbose(`${MODULE_NAME} E51AFBBA: Got a direct response`, { |
68 | 78 | xid, |
69 | 79 | responseBody: response.data, |
... | ... | @@ -85,6 +95,8 @@ module.exports = async (task, isAdvice) => { |
85 | 95 | } catch (e) { |
86 | 96 | const rc = e.rc || '68'; |
87 | 97 | |
98 | + lastResponse = e.response; | |
99 | + | |
88 | 100 | report(xid, { |
89 | 101 | trx_id: task.trx_id, |
90 | 102 | rc, |
... | ... | @@ -99,5 +111,16 @@ module.exports = async (task, isAdvice) => { |
99 | 111 | 'IS-ADVICE': !!isAdvice, |
100 | 112 | }, |
101 | 113 | }); |
114 | + } finally { | |
115 | + dumpReqRes( | |
116 | + xid, | |
117 | + task, | |
118 | + 'GET', | |
119 | + endpointUrl, | |
120 | + params, | |
121 | + lastResponse && lastResponse.data, | |
122 | + lastResponse && lastResponse.status, | |
123 | + lastResponse, | |
124 | + ); | |
102 | 125 | } |
103 | 126 | }; |
lib/partner-prepaid.js