Commit 18291ea80dae94e7e341cf638ec5e10fbae2e3c1

Authored by Adhidarma Hadiwinoto
1 parent 1b27005777
Exists in master

Move xid generator on partner-prepaid

Showing 3 changed files with 7 additions and 10 deletions Inline Diff

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