Commit 92940f844e854b741aef41946ba8937da93d3f07
1 parent
fd23c5a272
Exists in
master
Postpaid ready to test
Showing 5 changed files with 181 additions and 11 deletions Inline Diff
lib/hit/postpaid-inquiry.js
1 | module.exports = () => { | File was deleted | |
2 | // | ||
3 | }; | ||
4 | 1 | module.exports = () => { |
lib/hit/postpaid.js
File was created | 1 | const MODULE_NAME = 'HIT.POSTPAID'; | |
2 | |||
3 | const axios = require('axios').default; | ||
4 | const urljoin = require('url-join'); | ||
5 | const uniqid = require('uniqid'); | ||
6 | |||
7 | const config = require('komodo-sdk/config'); | ||
8 | const logger = require('komodo-sdk/logger'); | ||
9 | |||
10 | const translateRc = require('../translate-rc'); | ||
11 | const composeCallbackUrl = require('./compose-callback-url'); | ||
12 | const dumpReqRes = require('./dump-req-res'); | ||
13 | const report = require('../report/postpaid'); | ||
14 | const axiosErrorIsSafe = require('./axios-error-is-safe'); | ||
15 | |||
16 | module.exports = async (task, isPay) => { | ||
17 | const xid = uniqid(); | ||
18 | const hitType = isPay ? 'PAY' : 'INQUIRY'; | ||
19 | |||
20 | logger.verbose(`${MODULE_NAME} 0EDCEB4F: Processing task`, { | ||
21 | xid, | ||
22 | hitType, | ||
23 | task, | ||
24 | }); | ||
25 | |||
26 | const params = { | ||
27 | request_id: task.trx_id, | ||
28 | terminal_name: config.partner.terminal_name, | ||
29 | password: config.partner.password, | ||
30 | destination: task.destination, | ||
31 | product_name: task.remote_product, | ||
32 | reverse_url: composeCallbackUrl(xid, true), | ||
33 | }; | ||
34 | |||
35 | const endpointUrl = urljoin( | ||
36 | config.partner.url, | ||
37 | isPay ? 'pay' : 'inquiry', | ||
38 | ); | ||
39 | |||
40 | let lastResponse = null; | ||
41 | |||
42 | try { | ||
43 | logger.verbose(`${MODULE_NAME} EFCF6C2A: Going to HIT POSTPAID endpoint`, { | ||
44 | xid, | ||
45 | endpointUrl, | ||
46 | params, | ||
47 | }); | ||
48 | |||
49 | const response = await axios.get(endpointUrl, { | ||
50 | headers: { | ||
51 | 'User-Agent': 'KOMODO-GW-HTTPGETX', | ||
52 | }, | ||
53 | timeout: config.partner.hit_timeout_ms || 30 * 1000, | ||
54 | params, | ||
55 | }); | ||
56 | |||
57 | if (!response) { | ||
58 | const e = new Error(`${MODULE_NAME} 364AB160: Empty response`); | ||
59 | e.rc = isPay ? '68' : '90'; | ||
60 | e.response = response; | ||
61 | throw e; | ||
62 | } | ||
63 | |||
64 | if (!response.data) { | ||
65 | const e = new Error(`${MODULE_NAME} E64BCD17: Empty response data`); | ||
66 | e.rc = isPay ? '68' : '90'; | ||
67 | e.response = response; | ||
68 | throw e; | ||
69 | } | ||
70 | |||
71 | if (typeof response.data !== 'object') { | ||
72 | const e = new Error(`${MODULE_NAME} E64BCD17: Response data is not a JSON`); | ||
73 | e.rc = isPay ? '68' : '90'; | ||
74 | e.response = response; | ||
75 | throw e; | ||
76 | } | ||
77 | |||
78 | lastResponse = response; | ||
79 | |||
80 | logger.verbose(`${MODULE_NAME} 924E4510: Got a direct response`, { | ||
81 | xid, | ||
82 | responseBody: response.data, | ||
83 | }); | ||
84 | |||
85 | report(xid, { | ||
86 | command: response.data.command || hitType, | ||
87 | trx_id: task.trx_id, | ||
88 | rc: response.data.rc ? translateRc[response.data.rc] || response.data.rc | ||
89 | : '68', | ||
90 | sn: response.data.sn || null, | ||
91 | amount: Number(response.data.amount) || undefined, | ||
92 | amount_to_charge: Number(response.data.amount_to_charge) || undefined, | ||
93 | balance: Number(response.data.ending_balance) | ||
94 | || Number(response.data.balance) | ||
95 | || undefined, | ||
96 | base_bill_amount: (response.data.base_bill_amount) || undefined, | ||
97 | bill_count: Number(response.data.bill_count) || undefined, | ||
98 | message: { | ||
99 | xid, | ||
100 | 'DIRECT-RESPONSE': response.data, | ||
101 | }, | ||
102 | info: response.data.info || undefined, | ||
103 | detail: response.data.detail || undefined, | ||
104 | data: response.data.data || undefined, | ||
105 | struk: response.data.struk || undefined, | ||
106 | }); | ||
107 | } catch (e) { | ||
108 | const rc = e.rc | ||
109 | || (axiosErrorIsSafe(e) && '91') | ||
110 | || (!isPay && '91') | ||
111 | || '68'; | ||
112 | |||
113 | logger.warn(`${MODULE_NAME} 57764852: Exception`, { | ||
114 | xid, | ||
115 | eCode: e.code, | ||
116 | eMessage: e.message, | ||
117 | eRc: e.rc, | ||
118 | rc, | ||
119 | responseHttpStatus: e.response && e.response.status, | ||
120 | responseBody: e.response && e.response.data, | ||
121 | }); | ||
122 | |||
123 | lastResponse = e.response; | ||
124 | |||
125 | report(xid, { | ||
126 | command: hitType, | ||
127 | trx_id: task.trx_id, | ||
128 | rc, | ||
129 | message: { | ||
130 | xid, | ||
131 | 'KOMODO-GW-ERROR': { | ||
132 | eCode: e.code, | ||
133 | eMessage: e.message, | ||
134 | responseHttpStatus: e.response && e.response.status, | ||
135 | responseBody: e.response && e.response.data, | ||
136 | }, | ||
137 | }, | ||
138 | }); | ||
139 | } finally { | ||
140 | dumpReqRes( | ||
141 | xid, | ||
142 | task, | ||
143 | 'GET', | ||
144 | endpointUrl, | ||
145 | params, | ||
146 | lastResponse && lastResponse.data, | ||
147 | lastResponse && lastResponse.status, | ||
148 | lastResponse, | ||
149 | false, | ||
150 | ); | ||
151 | } | ||
152 | }; | ||
153 |
lib/partner-postpaid.js
1 | const hitInquiry = require('./hit/postpaid-inquiry'); | 1 | const hit = require('./hit/postpaid'); |
2 | const hitPay = require('./hit/postpaid-pay'); | ||
3 | 2 | ||
4 | exports.inquiry = (task) => { | 3 | exports.inquiry = (task) => { |
5 | hitInquiry(task); | 4 | hit(task, false); |
6 | }; | 5 | }; |
7 | 6 | ||
8 | exports.pay = (task) => { | 7 | exports.pay = (task) => { |
9 | hitPay(task); | 8 | hit(task, true); |
10 | }; | 9 | }; |
11 | 10 |
lib/report/postpaid.js
File was created | 1 | const MODULE_NAME = 'REPORT.POSTPAID'; | |
2 | |||
3 | const stringify = require('json-stringify-pretty-compact'); | ||
4 | |||
5 | const logger = require('komodo-sdk/logger'); | ||
6 | const postpaidSdk = require('komodo-sdk-postpaid'); | ||
7 | |||
8 | module.exports = (xid, data) => { | ||
9 | if (!data) return; | ||
10 | |||
11 | logger.verbose(`${MODULE_NAME} 0682477A: Reporting to CORE`, { | ||
12 | xid, | ||
13 | data, | ||
14 | }); | ||
15 | |||
16 | const reportData = JSON.parse(JSON.stringify(data)); | ||
17 | if (typeof reportData.message !== 'string') { | ||
18 | reportData.message = stringify(reportData.message); | ||
19 | } | ||
20 | |||
21 | postpaidSdk.report(reportData, xid); | ||
22 | }; | ||
23 |
lib/report/prepaid.js
1 | const MODULE_NAME = 'REPORT.PREPAID'; | 1 | const MODULE_NAME = 'REPORT.PREPAID'; |
2 | 2 | ||
3 | const stringify = require('json-stringify-pretty-compact'); | 3 | const stringify = require('json-stringify-pretty-compact'); |
4 | 4 | ||
5 | const pull = require('komodo-sdk/gateway/pull'); | 5 | const pull = require('komodo-sdk/gateway/pull'); |
6 | const logger = require('komodo-sdk/logger'); | 6 | const logger = require('komodo-sdk/logger'); |
7 | 7 | ||
8 | module.exports = (xid, data) => { | 8 | module.exports = (xid, data) => { |
9 | if (!data) return; | 9 | if (!data) return; |
10 | 10 | ||
11 | logger.verbose(`${MODULE_NAME} 0FCACC40: Reporting to CORE`, { | 11 | logger.verbose(`${MODULE_NAME} 0FCACC40: Reporting to CORE`, { |
12 | xid, | 12 | xid, |
13 | data, | 13 | data, |
14 | }); | 14 | }); |
15 | 15 | ||
16 | const reportMsg = JSON.parse(JSON.stringify(data)); | 16 | const reportData = JSON.parse(JSON.stringify(data)); |
17 | if (typeof reportMsg.message !== 'string') { | 17 | if (typeof reportData.message !== 'string') { |
18 | reportMsg.message = stringify(reportMsg.message); | 18 | reportData.message = stringify(reportData.message); |
19 | } | 19 | } |
20 | 20 | ||
21 | pull.report(reportMsg); | 21 | pull.report(reportData); |
22 | }; | 22 | }; |
23 | 23 |