Commit 29e67bd8ff4861abd926ca504dd3d1a88db7c91e

Authored by Adhidarma Hadiwinoto
1 parent f6b2494424
Exists in master

Use new axios calling

Showing 3 changed files with 6 additions and 3 deletions Inline Diff

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