Commit 2cb04dcb0a7e92477370e9b1c3f4aef06cd42c59

Authored by Adhidarma Hadiwinoto
1 parent 9a0187e488
Exists in master

detail logging

Showing 1 changed file with 3 additions and 1 deletions Inline Diff

1 var url = require('url'); 1 var url = require('url');
2 var math = require('mathjs'); 2 var math = require('mathjs');
3 var request = require('request'); 3 var request = require('request');
4 var xml = require("xml2js").parseString; 4 var xml = require("xml2js").parseString;
5 var winston = require('winston'); 5 var winston = require('winston');
6 6
7 var logger; 7 var logger;
8 var config; 8 var config;
9 var callbackReport; 9 var callbackReport;
10 var aaa; 10 var aaa;
11 11
12 var max_retry = 15; 12 var max_retry = 15;
13 var sleep_before_retry = 60 * 1000; 13 var sleep_before_retry = 60 * 1000;
14 14
15 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 15 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
16 16
17 function parseSN(message, _config) { 17 function parseSN(message, _config) {
18 18
19 if (!_config) { 19 if (!_config) {
20 _config = config; 20 _config = config;
21 } 21 }
22 22
23 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 23 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
24 var sn_match = message.match(sn_regex); 24 var sn_match = message.match(sn_regex);
25 25
26 if (sn_match <= 0) { 26 if (sn_match <= 0) {
27 logger.info('SN Not found: ' + message); 27 logger.info('SN Not found: ' + message);
28 return ''; 28 return '';
29 } 29 }
30 30
31 var sn = sn_match[0]; 31 var sn = sn_match[0];
32 var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 32 var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
33 33
34 var count = sn_remove_patterns.length; 34 var count = sn_remove_patterns.length;
35 35
36 for(var i = 0; i < count; i++) { 36 for(var i = 0; i < count; i++) {
37 sn = sn.replace(sn_remove_patterns[i], ''); 37 sn = sn.replace(sn_remove_patterns[i], '');
38 } 38 }
39 39
40 return sn.trim(); 40 return sn.trim();
41 } 41 }
42 42
43 function topupRequest(task, retry) { 43 function topupRequest(task, retry) {
44 /* 44 /*
45 if (config.globals.requests_count == undefined) { 45 if (config.globals.requests_count == undefined) {
46 config.globals.requests_count = 1; 46 config.globals.requests_count = 1;
47 } else { 47 } else {
48 config.globals.requests_count++; 48 config.globals.requests_count++;
49 } 49 }
50 50
51 if (config.globals.active_requests_count == undefined) { 51 if (config.globals.active_requests_count == undefined) {
52 config.globals.active_requests_count = 1; 52 config.globals.active_requests_count = 1;
53 } else { 53 } else {
54 config.globals.active_requests_count++; 54 config.globals.active_requests_count++;
55 } 55 }
56 56
57 if (config.globals.max_active_requests_count == undefined) { 57 if (config.globals.max_active_requests_count == undefined) {
58 config.globals.max_active_requests_count = config.globals.active_requests_count; 58 config.globals.max_active_requests_count = config.globals.active_requests_count;
59 } else { 59 } else {
60 config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); 60 config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count);
61 } 61 }
62 */ 62 */
63 63
64 64
65 if (retry === undefined) { 65 if (retry === undefined) {
66 retry = max_retry; 66 retry = max_retry;
67 } 67 }
68 68
69 var params = { 69 var params = {
70 userid: config.h2h_out.userid, 70 userid: config.h2h_out.userid,
71 pwd: config.h2h_out.password, 71 pwd: config.h2h_out.password,
72 memberreff: task['requestId'], 72 memberreff: task['requestId'],
73 produk: task['remoteProduct'], 73 produk: task['remoteProduct'],
74 tujuan: task['destination'] 74 tujuan: task['destination']
75 }; 75 };
76 logger.info('Creating http request to gateway', {params: params}); 76 logger.info('Creating http request to gateway', {params: params});
77 77
78 request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { 78 request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) {
79 79
80 /* 80 /*
81 config.globals.active_requests_count--; 81 config.globals.active_requests_count--;
82 */ 82 */
83 83
84 if (err) { 84 if (err) {
85 logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err); 85 logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err);
86 86
87 callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier. ' + err); 87 callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier. ' + err);
88 return; 88 return;
89 } 89 }
90 90
91 logger.info('Got response from gateway ', {response_body: httpResponseBody}); 91 logger.info('Got response from gateway ', {response_body: httpResponseBody});
92 92
93 if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { 93 if (httpResponseBody.indexOf('502 Proxy Error') >= 0) {
94 logger.warn('Proxy error', {task: task, params: params});
94 callbackReport(task['requestId'], '91', '502 Proxy error'); 95 callbackReport(task['requestId'], '91', '502 Proxy error');
95 return; 96 return;
96 } 97 }
97 98
98 xml(httpResponseBody, function(err, result) { 99 xml(httpResponseBody, function(err, result) {
99 if (err) { 100 if (err) {
100 logger.warn('Gagal parsing XML respon server'); 101 logger.warn('Gagal parsing XML respon server', {task: task, params: params});
101 //topupRequest(task, retry - 1); 102 //topupRequest(task, retry - 1);
102 callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); 103 callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server');
103 return; 104 return;
104 } 105 }
105 106
106 logger.info('Response Data:', {result: result}); 107 logger.info('Response Data:', {result: result});
107 108
108 var message = result.respon.pesan[0].replace(/\n/g, ' '); 109 var message = result.respon.pesan[0].replace(/\n/g, ' ');
109 var response_code = result.respon.rc[0].replace(/^00/, ''); 110 var response_code = result.respon.rc[0].replace(/^00/, '');
110 111
111 if (response_code == '54' || response_code == '68') { 112 if (response_code == '54' || response_code == '68') {
113 logger.info('Mendapat status pending /suspect', {task: task, params: params});
112 if (retry) { 114 if (retry) {
113 callbackReport(task['requestId'], '68', message + '. Sistem akan mengirim advise dalam waktu ' + sleep_before_retry + ' ms.'); 115 callbackReport(task['requestId'], '68', message + '. Sistem akan mengirim advise dalam waktu ' + sleep_before_retry + ' ms.');
114 116
115 setTimeout(function() { 117 setTimeout(function() {
116 118
117 logger.info('Sending advice', {task: task}); 119 logger.info('Sending advice', {task: task});
118 120
119 task['remoteProduct'] = 'ADVPLN'; 121 task['remoteProduct'] = 'ADVPLN';
120 topupRequest(task, retry - 1); 122 topupRequest(task, retry - 1);
121 123
122 }, sleep_before_retry); 124 }, sleep_before_retry);
123 125
124 } else { 126 } else {
125 logger.warn('Max retries exceeded', {task: task}); 127 logger.warn('Max retries exceeded', {task: task});
126 callbackReport(task['requestId'], '40', message + '. Max retries exceeded'); 128 callbackReport(task['requestId'], '40', message + '. Max retries exceeded');
127 } 129 }
128 return; 130 return;
129 } 131 }
130 132
131 var token = ''; 133 var token = '';
132 if (result.respon.token) { 134 if (result.respon.token) {
133 token = result.respon.token[0]; 135 token = result.respon.token[0];
134 } 136 }
135 137
136 var data_pelanggan = 'NO-DATA'; 138 var data_pelanggan = 'NO-DATA';
137 if (result.respon.data) { 139 if (result.respon.data) {
138 140
139 try { 141 try {
140 var _data_pelanggan = result.respon.data[0].replace(/ /g, '-'); 142 var _data_pelanggan = result.respon.data[0].replace(/ /g, '-');
141 var fields = _data_pelanggan.split('/'); 143 var fields = _data_pelanggan.split('/');
142 144
143 data_pelanggan = [ 145 data_pelanggan = [
144 fields[0], fields[1], fields[2], fields[3] 146 fields[0], fields[1], fields[2], fields[3]
145 ].join('/'); 147 ].join('/');
146 } 148 }
147 catch(err) { 149 catch(err) {
148 logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan}); 150 logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan});
149 } 151 }
150 152
151 153
152 } 154 }
153 155
154 if (response_code == '00') { 156 if (response_code == '00') {
155 157
156 var sn = ""; 158 var sn = "";
157 159
158 if (config.h2h_out.parse_sn == 'YES') { 160 if (config.h2h_out.parse_sn == 'YES') {
159 sn = parseSN(message); 161 sn = parseSN(message);
160 } else if (token && data_pelanggan) { 162 } else if (token && data_pelanggan) {
161 sn = token + '/' + data_pelanggan; 163 sn = token + '/' + data_pelanggan;
162 } 164 }
163 165
164 message = 'SN=' + sn + '; ' + message; 166 message = 'SN=' + sn + '; ' + message;
165 } 167 }
166 168
167 callbackReport(task['requestId'], response_code, message); 169 callbackReport(task['requestId'], response_code, message);
168 170
169 }); 171 });
170 }); 172 });
171 } 173 }
172 174
173 function start(_config, _callbackReport, options) { 175 function start(_config, _callbackReport, options) {
174 config = _config; 176 config = _config;
175 callbackReport = _callbackReport; 177 callbackReport = _callbackReport;
176 178
177 if (options && options.aaa) { 179 if (options && options.aaa) {
178 aaa = options.aaa; 180 aaa = options.aaa;
179 } 181 }
180 182
181 if (options && options.logger) { 183 if (options && options.logger) {
182 logger = options.logger; 184 logger = options.logger;
183 } else { 185 } else {
184 logger = new winston.Logger({ 186 logger = new winston.Logger({
185 transports: [ 187 transports: [
186 new (winston.transports.Console)() 188 new (winston.transports.Console)()
187 ] 189 ]
188 }); 190 });
189 } 191 }
190 } 192 }
191 193
192 function parseResult(message) { 194 function parseResult(message) {
193 var data; 195 var data;
194 xml(message, function(err, result) { 196 xml(message, function(err, result) {
195 data = result; 197 data = result;
196 }); 198 });
197 return data; 199 return data;
198 } 200 }
199 201
200 exports.start = start; 202 exports.start = start;
201 exports.topupRequest = topupRequest; 203 exports.topupRequest = topupRequest;
202 exports.parseResult = parseResult; 204 exports.parseResult = parseResult;
203 exports.parseSN = parseSN; 205 exports.parseSN = parseSN;
204 206