Commit 82812c09eef0affb51aa730bedb41f303cbe9ac6
1 parent
6108f1384b
Exists in
master
webhookSender before sending core response to callback
Showing 1 changed file with 12 additions and 12 deletions Inline Diff
lib/core-callback/sender.js
1 | const MODULE_NAME = 'CORE-CALLBACK.SENDER'; | 1 | const MODULE_NAME = 'CORE-CALLBACK.SENDER'; |
2 | 2 | ||
3 | const axios = require('axios'); | 3 | const axios = require('axios'); |
4 | const config = require('komodo-sdk/config'); | 4 | const config = require('komodo-sdk/config'); |
5 | const logger = require('tektrans-logger'); | 5 | const logger = require('tektrans-logger'); |
6 | 6 | ||
7 | const dumper = require('./dumper/sender'); | 7 | const dumper = require('./dumper/sender'); |
8 | const matrix = require('../matrix'); | 8 | const matrix = require('../matrix'); |
9 | 9 | ||
10 | const webhookSender = require('../webhook-sender'); | 10 | const webhookSender = require('../webhook-sender'); |
11 | 11 | ||
12 | const HTTP_TIMEOUT = Number( | 12 | const HTTP_TIMEOUT = Number( |
13 | config.callback_sender && config.callback_sender.http_timeout_ms, | 13 | config.callback_sender && config.callback_sender.http_timeout_ms, |
14 | ) || 30 * 1000; | 14 | ) || 30 * 1000; |
15 | 15 | ||
16 | const SLEEP_BEFORE_RETRY_MS = Number( | 16 | const SLEEP_BEFORE_RETRY_MS = Number( |
17 | config.callback_sender && config.callback_sender.sleep_before_retry_ms, | 17 | config.callback_sender && config.callback_sender.sleep_before_retry_ms, |
18 | ) || 10 * 1000; | 18 | ) || 10 * 1000; |
19 | 19 | ||
20 | const MAX_RETRY = Number( | 20 | const MAX_RETRY = Number( |
21 | config.callback_sender && config.callback_sender.max_retry, | 21 | config.callback_sender && config.callback_sender.max_retry, |
22 | ) || 10; | 22 | ) || 10; |
23 | 23 | ||
24 | logger.verbose(`${MODULE_NAME} 848B9104: Initialized`, { | 24 | logger.verbose(`${MODULE_NAME} 848B9104: Initialized`, { |
25 | HTTP_TIMEOUT, | 25 | HTTP_TIMEOUT, |
26 | SLEEP_BEFORE_RETRY_MS, | 26 | SLEEP_BEFORE_RETRY_MS, |
27 | MAX_RETRY, | 27 | MAX_RETRY, |
28 | }); | 28 | }); |
29 | 29 | ||
30 | const axiosHeaders = { | 30 | const axiosHeaders = { |
31 | 'Content-Type': 'application/json', | 31 | 'Content-Type': 'application/json', |
32 | 'User-Agent': 'KOMODO-HTTPGETX callback sender', | 32 | 'User-Agent': 'KOMODO-HTTPGETX callback sender', |
33 | }; | 33 | }; |
34 | 34 | ||
35 | const sleep = require('../sleep'); | 35 | const sleep = require('../sleep'); |
36 | const urlConcatQs = require('../url-concat-qs'); | 36 | const urlConcatQs = require('../url-concat-qs'); |
37 | 37 | ||
38 | const sender = async (data, xid, retry) => { | 38 | const sender = async (data, xid, retry) => { |
39 | if (!data.reverse_url) { | ||
40 | logger.verbose(`${MODULE_NAME} C4FF18FB: Ignoring missing reverse url`, { | ||
41 | xid, | ||
42 | dataFromCore: data, | ||
43 | }); | ||
44 | |||
45 | return; | ||
46 | } | ||
47 | |||
48 | const params = { | 39 | const params = { |
49 | httpgetx_xid: xid, | 40 | httpgetx_xid: xid, |
50 | command: data.command, | 41 | command: data.command, |
51 | 42 | ||
52 | request_id: data.request_id && data.request_id.toString(), | 43 | request_id: data.request_id && data.request_id.toString(), |
53 | transaction_id: data.transaction_id && data.transaction_id.toString(), | 44 | transaction_id: data.transaction_id && data.transaction_id.toString(), |
54 | transaction_date: data.transaction_date, | 45 | transaction_date: data.transaction_date, |
55 | 46 | ||
56 | store_name: data.store_name, | 47 | store_name: data.store_name, |
57 | terminal_name: data.terminal_name, | 48 | terminal_name: data.terminal_name, |
58 | 49 | ||
59 | product_name: data.product_name, | 50 | product_name: data.product_name, |
60 | destination: data.destination, | 51 | destination: data.destination, |
61 | 52 | ||
62 | rc: data.rc, | 53 | rc: data.rc, |
63 | sn: data.sn || undefined, | 54 | sn: data.sn || undefined, |
64 | amount: Number(data.amount) || undefined, | 55 | amount: Number(data.amount) || undefined, |
65 | ending_balance: Number(data.ending_balance) || undefined, | 56 | ending_balance: Number(data.ending_balance) || undefined, |
66 | 57 | ||
67 | message: data.message, | 58 | message: data.message, |
68 | 59 | ||
69 | bill_count: Number(data.bill_count) || undefined, | 60 | bill_count: Number(data.bill_count) || undefined, |
70 | bill_amount: Number(data.bill_amount) || undefined, | 61 | bill_amount: Number(data.bill_amount) || undefined, |
71 | fee_per_bill: Number(data.fee) || undefined, | 62 | fee_per_bill: Number(data.fee) || undefined, |
72 | fee_total: Number(data.fee_total) || undefined, | 63 | fee_total: Number(data.fee_total) || undefined, |
73 | 64 | ||
74 | bill_detail: data.bill_detail || undefined, | 65 | bill_detail: data.bill_detail || undefined, |
75 | struk: data.struk || undefined, | 66 | struk: data.struk || undefined, |
76 | }; | 67 | }; |
77 | 68 | ||
78 | if (data.command === 'INQUIRY' && data.amount_to_charge) { | 69 | if (data.command === 'INQUIRY' && data.amount_to_charge) { |
79 | params.amount_to_charge = data.amount_to_charge; | 70 | params.amount_to_charge = data.amount_to_charge; |
80 | } | 71 | } |
81 | 72 | ||
82 | const isPostpaid = ['INQUIRY', 'PAY'].indexOf(data.command) >= 0; | 73 | const isPostpaid = ['INQUIRY', 'PAY'].indexOf(data.command) >= 0; |
83 | const isHttpPost = isPostpaid; | 74 | const isHttpPost = isPostpaid; |
84 | 75 | ||
76 | const webhookType = 'KOMODO-CENTER-HTTPGETX.CORE-CALLBACK'; | ||
77 | webhookSender(xid, webhookType, params); | ||
78 | |||
79 | if (!data.reverse_url) { | ||
80 | logger.verbose(`${MODULE_NAME} C4FF18FB: Ignoring missing reverse url`, { | ||
81 | xid, | ||
82 | dataFromCore: data, | ||
83 | }); | ||
84 | |||
85 | return; | ||
86 | } | ||
87 | |||
85 | const endpointUrl = isHttpPost ? data.reverse_url : urlConcatQs(data.reverse_url, params); | 88 | const endpointUrl = isHttpPost ? data.reverse_url : urlConcatQs(data.reverse_url, params); |
86 | 89 | ||
87 | logger.info(`${MODULE_NAME} 8B6A4CEC: Sending to PARTNER`, { | 90 | logger.info(`${MODULE_NAME} 8B6A4CEC: Sending to PARTNER`, { |
88 | xid, | 91 | xid, |
89 | retry: retry || 0, | 92 | retry: retry || 0, |
90 | isPostpaid, | 93 | isPostpaid, |
91 | isHttpPost, | 94 | isHttpPost, |
92 | endpointUrl, | 95 | endpointUrl, |
93 | }); | 96 | }); |
94 | 97 | ||
95 | let responseToDump; | 98 | let responseToDump; |
96 | let errorResponseToDump; | 99 | let errorResponseToDump; |
97 | 100 | ||
98 | try { | 101 | try { |
99 | const response = isHttpPost | 102 | const response = isHttpPost |
100 | ? await axios.post(data.reverse_url, params, { | 103 | ? await axios.post(data.reverse_url, params, { |
101 | timeout: HTTP_TIMEOUT, | 104 | timeout: HTTP_TIMEOUT, |
102 | headers: axiosHeaders, | 105 | headers: axiosHeaders, |
103 | }) | 106 | }) |
104 | : await axios.get(data.reverse_url, { | 107 | : await axios.get(data.reverse_url, { |
105 | params, | 108 | params, |
106 | timeout: HTTP_TIMEOUT, | 109 | timeout: HTTP_TIMEOUT, |
107 | headers: axiosHeaders, | 110 | headers: axiosHeaders, |
108 | }); | 111 | }); |
109 | 112 | ||
110 | responseToDump = response; | 113 | responseToDump = response; |
111 | 114 | ||
112 | matrix.callback_sender.sent += 1; | 115 | matrix.callback_sender.sent += 1; |
113 | matrix.callback_sender.active_count += 1; | 116 | matrix.callback_sender.active_count += 1; |
114 | matrix.callback_sender.active_sending[xid] = { | 117 | matrix.callback_sender.active_sending[xid] = { |
115 | ts: new Date(), | 118 | ts: new Date(), |
116 | trxId: data.trx_id, | 119 | trxId: data.trx_id, |
117 | reverseUrl: data.reverse_url, | 120 | reverseUrl: data.reverse_url, |
118 | }; | 121 | }; |
119 | 122 | ||
120 | if (isPostpaid) { | 123 | if (isPostpaid) { |
121 | matrix.callback_sender.sent_using_post += 1; | 124 | matrix.callback_sender.sent_using_post += 1; |
122 | } else { | 125 | } else { |
123 | matrix.callback_sender.sent_using_get += 1; | 126 | matrix.callback_sender.sent_using_get += 1; |
124 | } | 127 | } |
125 | 128 | ||
126 | logger.info(`${MODULE_NAME} 3641FBD7: Has been sent to PARTNER successfully`, { | 129 | logger.info(`${MODULE_NAME} 3641FBD7: Has been sent to PARTNER successfully`, { |
127 | xid, | 130 | xid, |
128 | retry, | 131 | retry, |
129 | httpStatus: response.status, | 132 | httpStatus: response.status, |
130 | responseBody: response && response.data, | 133 | responseBody: response && response.data, |
131 | }); | 134 | }); |
132 | } catch (e) { | 135 | } catch (e) { |
133 | matrix.callback_sender.sent_failed += 1; | 136 | matrix.callback_sender.sent_failed += 1; |
134 | matrix.callback_sender.last_error = { | 137 | matrix.callback_sender.last_error = { |
135 | xid, | 138 | xid, |
136 | ts: new Date(), | 139 | ts: new Date(), |
137 | eCode: e.code, | 140 | eCode: e.code, |
138 | eMessage: e.message, | 141 | eMessage: e.message, |
139 | trxId: data.trx_id, | 142 | trxId: data.trx_id, |
140 | reverseUrl: data.reverse_url, | 143 | reverseUrl: data.reverse_url, |
141 | httpStatus: e.response && e.response.status, | 144 | httpStatus: e.response && e.response.status, |
142 | responseBody: e.response && e.response.data, | 145 | responseBody: e.response && e.response.data, |
143 | }; | 146 | }; |
144 | 147 | ||
145 | responseToDump = e.response && e.response.data; | 148 | responseToDump = e.response && e.response.data; |
146 | errorResponseToDump = e; | 149 | errorResponseToDump = e; |
147 | 150 | ||
148 | logger.warn(`${MODULE_NAME} A1EC9E70: Failed on sending to PARTNER`, { | 151 | logger.warn(`${MODULE_NAME} A1EC9E70: Failed on sending to PARTNER`, { |
149 | xid, | 152 | xid, |
150 | retry, | 153 | retry, |
151 | maxRetry: MAX_RETRY, | 154 | maxRetry: MAX_RETRY, |
152 | errCode: e.code, | 155 | errCode: e.code, |
153 | errMessage: e.message, | 156 | errMessage: e.message, |
154 | reverseUrl: data.reverse_url, | 157 | reverseUrl: data.reverse_url, |
155 | endpointUrl, | 158 | endpointUrl, |
156 | httpStatus: e.response && e.response.status, | 159 | httpStatus: e.response && e.response.status, |
157 | responseBody: e.response && e.response.data, | 160 | responseBody: e.response && e.response.data, |
158 | }); | 161 | }); |
159 | 162 | ||
160 | if (e.response && e.response.status) { | 163 | if (e.response && e.response.status) { |
161 | logger.verbose(`${MODULE_NAME} 10AE785C: Skip retry on http status presence`, { | 164 | logger.verbose(`${MODULE_NAME} 10AE785C: Skip retry on http status presence`, { |
162 | xid, | 165 | xid, |
163 | httpStatus: e.response && e.response.status, | 166 | httpStatus: e.response && e.response.status, |
164 | }); | 167 | }); |
165 | return; | 168 | return; |
166 | } | 169 | } |
167 | 170 | ||
168 | if ((retry || 0) < MAX_RETRY) { | 171 | if ((retry || 0) < MAX_RETRY) { |
169 | await sleep(SLEEP_BEFORE_RETRY_MS); | 172 | await sleep(SLEEP_BEFORE_RETRY_MS); |
170 | 173 | ||
171 | logger.verbose(`${MODULE_NAME} D8958695: Going to retry sending CORE-CALLBACK TO PARTNER`, { | 174 | logger.verbose(`${MODULE_NAME} D8958695: Going to retry sending CORE-CALLBACK TO PARTNER`, { |
172 | xid, | 175 | xid, |
173 | retried: retry, | 176 | retried: retry, |
174 | sleepTime: SLEEP_BEFORE_RETRY_MS, | 177 | sleepTime: SLEEP_BEFORE_RETRY_MS, |
175 | }); | 178 | }); |
176 | 179 | ||
177 | sender(data, xid, (retry || 0) + 1); | 180 | sender(data, xid, (retry || 0) + 1); |
178 | } | 181 | } |
179 | } finally { | 182 | } finally { |
180 | matrix.callback_sender.active_count -= 1; | 183 | matrix.callback_sender.active_count -= 1; |
181 | if (matrix.callback_sender.active_sending[xid]) { | 184 | if (matrix.callback_sender.active_sending[xid]) { |
182 | delete matrix.callback_sender.active_sending[xid]; | 185 | delete matrix.callback_sender.active_sending[xid]; |
183 | } | 186 | } |
184 | 187 | ||
185 | dumper( | 188 | dumper( |
186 | xid, | 189 | xid, |
187 | isHttpPost ? 'POST' : 'GET', | 190 | isHttpPost ? 'POST' : 'GET', |
188 | endpointUrl, | 191 | endpointUrl, |