Commit 18291ea80dae94e7e341cf638ec5e10fbae2e3c1
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 |