Commit 82812c09eef0affb51aa730bedb41f303cbe9ac6

Authored by Adhidarma Hadiwinoto
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,