Commit 88bd9e5f661bdf97884ed9a233cee17427db9e37

Authored by Adhidarma Hadiwinoto
1 parent fd60275efa
Exists in master

initMongoClient

Showing 1 changed file with 25 additions and 0 deletions Inline Diff

1 var fs = require('fs'); 1 var fs = require('fs');
2 var https = require('https'); 2 var https = require('https');
3 var http = require('http'); 3 var http = require('http');
4 var url = require('url'); 4 var url = require('url');
5 var request = require('request'); 5 var request = require('request');
6 var xml2js = require('xml2js').parseString; 6 var xml2js = require('xml2js').parseString;
7 var strftime = require('strftime'); 7 var strftime = require('strftime');
8 var math = require('mathjs'); 8 var math = require('mathjs');
9 var winston = require('winston'); 9 var winston = require('winston');
10 var cekstatus = require('./cekstatus.js'); 10 var cekstatus = require('./cekstatus.js');
11 var mongoClient = require('mongodb').MongoClient;
12 var mongodb;
11 13
12 var config; 14 var config;
13 var httpServer; 15 var httpServer;
14 var aaa; 16 var aaa;
15 var logger; 17 var logger;
16 var callbackReport; 18 var callbackReport;
17 19
18 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 20 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
19 21
20 var sleep_before_retry = 30000; 22 var sleep_before_retry = 30000;
21 23
22 var logTag = __filename.split('/').reverse()[0]; 24 var logTag = __filename.split('/').reverse()[0];
23 25
26 unction initMongoClient() {
27 if (!config.mongodb || !config.mongodb.url) {
28 return;
29 }
30
31 try {
32 var url = config.mongodb.url;
33
34 mongoClient.connect(url, function(err, db) {
35 if (err) {
36 logger.warn('Failed to connect to mongodb', {err: err});
37 return;
38 }
39 mongodb = db;
40 logger.info('MongoDB connected');
41 });
42 }
43 catch(err) {
44 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
45 }
46
47 }
48
24 function topupRequest(task) { 49 function topupRequest(task) {
25 50
26 var ts = strftime('%Y%m%d%H%M%S', new Date()); 51 var ts = strftime('%Y%m%d%H%M%S', new Date());
27 52
28 var data = 53 var data =
29 config.h2h_out.userid 54 config.h2h_out.userid
30 + '|' + config.h2h_out.password 55 + '|' + config.h2h_out.password
31 + '|' + task['remoteProduct'] 56 + '|' + task['remoteProduct']
32 + '|' + task['destination'] + '|0'; 57 + '|' + task['destination'] + '|0';
33 58
34 var options = { 59 var options = {
35 url: config.h2h_out.partner, 60 url: config.h2h_out.partner,
36 qs: { 61 qs: {
37 ts: ts, 62 ts: ts,
38 data: data, 63 data: data,
39 reffid: task['requestId'] 64 reffid: task['requestId']
40 } 65 }
41 }; 66 };
42 logger.info('Creating http request', {options: options}); 67 logger.info('Creating http request', {options: options});
43 68
44 request(options, function (error, response, body) { 69 request(options, function (error, response, body) {
45 var responseCode = '40'; 70 var responseCode = '40';
46 var responseMessage = 'Gateway Error'; 71 var responseMessage = 'Gateway Error';
47 72
48 if (error) { 73 if (error) {
49 74
50 logger.warn('HTTP REQUEST ERROR', error); 75 logger.warn('HTTP REQUEST ERROR', error);
51 callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')'); 76 callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')');
52 77
53 } else if (response.statusCode != 200) { 78 } else if (response.statusCode != 200) {
54 79
55 var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')'; 80 var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')';
56 logger.warn(error_message); 81 logger.warn(error_message);
57 callbackReport(task['requestId'], '91', error_message); 82 callbackReport(task['requestId'], '91', error_message);
58 83
59 } else { 84 } else {
60 85
61 logger.info('DIRECT RESPONSE', {body: body}); 86 logger.info('DIRECT RESPONSE', {body: body});
62 87
63 xml2js(body, function (err, result) { 88 xml2js(body, function (err, result) {
64 if (err) { 89 if (err) {
65 callbackReport(task['requestId'], '40', body); 90 callbackReport(task['requestId'], '40', body);
66 } else { 91 } else {
67 var directResponse = result; 92 var directResponse = result;
68 logger.info(directResponse); 93 logger.info(directResponse);
69 94
70 try { 95 try {
71 var result_price; 96 var result_price;
72 try { 97 try {
73 result_price = directResponse.Result.Price[0].trim(); 98 result_price = directResponse.Result.Price[0].trim();
74 } 99 }
75 catch(err) { 100 catch(err) {
76 result_price = 0; 101 result_price = 0;
77 } 102 }
78 103
79 var result_error_message; 104 var result_error_message;
80 try { 105 try {
81 result_error_message = directResponse.Result.ErrorMsg[0].trim(); 106 result_error_message = directResponse.Result.ErrorMsg[0].trim();
82 } 107 }
83 catch(err) { 108 catch(err) {
84 result_error_message = ''; 109 result_error_message = '';
85 } 110 }
86 111
87 var resultCode = directResponse.Result.ResultCode[0].trim(); 112 var resultCode = directResponse.Result.ResultCode[0].trim();
88 113
89 responseMessage = 114 responseMessage =
90 'ResultCode: ' + resultCode 115 'ResultCode: ' + resultCode
91 + ' | ErrorMsg: ' + result_error_message 116 + ' | ErrorMsg: ' + result_error_message
92 + ' | DateTime: ' + directResponse.Result.DateTime[0].trim() 117 + ' | DateTime: ' + directResponse.Result.DateTime[0].trim()
93 + ' | nsm: ' + directResponse.Result.nsm[0].trim() 118 + ' | nsm: ' + directResponse.Result.nsm[0].trim()
94 + ' | idpel: ' + directResponse.Result.idpel[0].trim() 119 + ' | idpel: ' + directResponse.Result.idpel[0].trim()
95 + ' | reffid: ' + directResponse.Result.reffid[0].trim() 120 + ' | reffid: ' + directResponse.Result.reffid[0].trim()
96 + ' | TransID: ' + directResponse.Result.TransID[0].trim() 121 + ' | TransID: ' + directResponse.Result.TransID[0].trim()
97 + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim() 122 + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim()
98 + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim() 123 + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim()
99 + ' | token: ' + directResponse.Result.token[0].trim() 124 + ' | token: ' + directResponse.Result.token[0].trim()
100 + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim() 125 + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim()
101 + ' | Price: ' + result_price 126 + ' | Price: ' + result_price
102 + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim() 127 + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim()
103 ; 128 ;
104 129
105 logger.info('Response message: ' + responseMessage); 130 logger.info('Response message: ' + responseMessage);
106 131
107 if (aaa) { 132 if (aaa) {
108 // update balance 133 // update balance
109 aaa.updateBalance(directResponse.Result.EndBalance[0]); 134 aaa.updateBalance(directResponse.Result.EndBalance[0]);
110 } 135 }
111 136
112 if (resultCode == '0000') { 137 if (resultCode == '0000') {
113 var nama_pelanggan = directResponse.Result.nama_pel[0].trim(); 138 var nama_pelanggan = directResponse.Result.nama_pel[0].trim();
114 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); 139 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-');
115 var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim(); 140 var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim();
116 sn = sn.replace(/\s/g, '-'); 141 sn = sn.replace(/\s/g, '-');
117 142
118 responseMessage = 'SN=' + sn + '; ' + responseMessage; 143 responseMessage = 'SN=' + sn + '; ' + responseMessage;
119 logger.info('New response message: ' + responseMessage); 144 logger.info('New response message: ' + responseMessage);
120 } 145 }
121 146
122 var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096']; 147 var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096'];
123 if (pendingResultCode.indexOf(resultCode) != -1) { 148 if (pendingResultCode.indexOf(resultCode) != -1) {
124 callbackReport(task['requestId'], '68', responseMessage); 149 callbackReport(task['requestId'], '68', responseMessage);
125 150
126 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); 151 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms');
127 setTimeout(function () { 152 setTimeout(function () {
128 cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport); 153 cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport);
129 }, sleep_before_retry); 154 }, sleep_before_retry);
130 155
131 return; 156 return;
132 } 157 }
133 158
134 responseCode = resultCode.replace(/^00/, ""); 159 responseCode = resultCode.replace(/^00/, "");
135 160
136 if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') { 161 if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') {
137 responseCode = '91'; 162 responseCode = '91';
138 } 163 }
139 164
140 } 165 }
141 catch(err) { 166 catch(err) {
142 responseCode = '40'; 167 responseCode = '40';
143 responseMessage = 'Invalid response from gateway'; 168 responseMessage = 'Invalid response from gateway';
144 } 169 }
145 } 170 }
146 171
147 callbackReport(task['requestId'], responseCode, responseMessage); 172 callbackReport(task['requestId'], responseCode, responseMessage);
148 }); 173 });
149 } 174 }
150 175
151 //callbackReport(task['requestId'], responseCode, responseMessage); 176 //callbackReport(task['requestId'], responseCode, responseMessage);
152 }); 177 });
153 } 178 }
154 179
155 function callbackFromWebReport(status) { 180 function callbackFromWebReport(status) {
156 if (!status) { 181 if (!status) {
157 logger.warn('Advice from webreport return empty status'); 182 logger.warn('Advice from webreport return empty status');
158 return; 183 return;
159 } 184 }
160 185
161 logger.info('Got advice result from webreport', {status: status}); 186 logger.info('Got advice result from webreport', {status: status});
162 187
163 var responseCode = '68'; 188 var responseCode = '68';
164 189
165 var result_price = 0; 190 var result_price = 0;
166 try { 191 try {
167 result_price = directResponse.Result.Price[0].trim(); 192 result_price = directResponse.Result.Price[0].trim();
168 } 193 }
169 catch(err) {} 194 catch(err) {}
170 195
171 var errorMsg = ''; 196 var errorMsg = '';
172 try { 197 try {
173 errorMsg = status.response.errormsg[0]; 198 errorMsg = status.response.errormsg[0];
174 } 199 }
175 catch(err) {} 200 catch(err) {}
176 201
177 var responseMessage = ''; 202 var responseMessage = '';
178 try { 203 try {
179 responseMessage = 204 responseMessage =
180 'Hasil advice dari webreport ' 205 'Hasil advice dari webreport '
181 + 'ResultCode: ' + status.response.resultcode[0] 206 + 'ResultCode: ' + status.response.resultcode[0]
182 } 207 }
183 catch(err) { 208 catch(err) {
184 logger.warn('Error parsing ResultCode from webreport advice.', {err: err}); 209 logger.warn('Error parsing ResultCode from webreport advice.', {err: err});
185 } 210 }
186 211
187 try { 212 try {
188 responseMessage = 213 responseMessage =
189 responseMessage 214 responseMessage
190 + ' | ErrorMsg: ' + errorMsg 215 + ' | ErrorMsg: ' + errorMsg
191 } 216 }
192 catch(err) { 217 catch(err) {
193 logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err}); 218 logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err});
194 } 219 }
195 220
196 try { 221 try {
197 responseMessage = 222 responseMessage =
198 responseMessage 223 responseMessage
199 + ' | TrxDate: ' + status.trxDate; 224 + ' | TrxDate: ' + status.trxDate;
200 } 225 }
201 catch(err) { 226 catch(err) {
202 logger.warn('Error parsing TrxDate from webreport advice.', {err: err}); 227 logger.warn('Error parsing TrxDate from webreport advice.', {err: err});
203 } 228 }
204 229
205 try { 230 try {
206 responseMessage = 231 responseMessage =
207 responseMessage 232 responseMessage
208 + ' | UpdateDate: ' + status.updateDate; 233 + ' | UpdateDate: ' + status.updateDate;
209 234
210 } 235 }
211 catch(err) { 236 catch(err) {
212 logger.warn('Error parsing UpdateDate from webreport advice.', {err: err}); 237 logger.warn('Error parsing UpdateDate from webreport advice.', {err: err});
213 } 238 }
214 239
215 try { 240 try {
216 responseMessage = 241 responseMessage =
217 responseMessage 242 responseMessage
218 + ' | nsm: ' + status.response.nsm[0]; 243 + ' | nsm: ' + status.response.nsm[0];
219 } 244 }
220 catch(err) { 245 catch(err) {
221 logger.warn('Error parsing nsm from webreport advice.', {err: err}); 246 logger.warn('Error parsing nsm from webreport advice.', {err: err});
222 } 247 }
223 248
224 try { 249 try {
225 responseMessage = 250 responseMessage =
226 responseMessage 251 responseMessage
227 + ' | idpel: ' + status.response.idpel[0]; 252 + ' | idpel: ' + status.response.idpel[0];
228 } 253 }
229 catch(err) { 254 catch(err) {
230 logger.warn('Error parsing idpel from webreport advice.', {err: err}); 255 logger.warn('Error parsing idpel from webreport advice.', {err: err});
231 } 256 }
232 257
233 try { 258 try {
234 responseMessage = 259 responseMessage =
235 responseMessage 260 responseMessage
236 + ' | reffid: ' + status.response.reffid[0].trim(); 261 + ' | reffid: ' + status.response.reffid[0].trim();
237 } 262 }
238 catch(err) { 263 catch(err) {
239 logger.warn('Error parsing reffid from webreport advice.', {err: err}); 264 logger.warn('Error parsing reffid from webreport advice.', {err: err});
240 } 265 }
241 266
242 try { 267 try {
243 responseMessage = 268 responseMessage =
244 responseMessage 269 responseMessage
245 + ' | TransID: ' + status.response.transid[0].trim(); 270 + ' | TransID: ' + status.response.transid[0].trim();
246 } 271 }
247 catch(err) { 272 catch(err) {
248 logger.warn('Error parsing TransID from webreport advice.', {err: err}); 273 logger.warn('Error parsing TransID from webreport advice.', {err: err});
249 } 274 }
250 275
251 try { 276 try {
252 responseMessage = 277 responseMessage =
253 responseMessage 278 responseMessage
254 + ' | reff_switching: ' + status.response.reff_switching[0]; 279 + ' | reff_switching: ' + status.response.reff_switching[0];
255 } 280 }
256 catch(err) { 281 catch(err) {
257 logger.warn('Error parsing reff_switching from webreport advice.', {err: err}); 282 logger.warn('Error parsing reff_switching from webreport advice.', {err: err});
258 } 283 }
259 284
260 try { 285 try {
261 responseMessage = 286 responseMessage =
262 responseMessage 287 responseMessage
263 + ' | amount_trx: ' + status.response.amount_trx[0]; 288 + ' | amount_trx: ' + status.response.amount_trx[0];
264 } 289 }
265 catch(err) { 290 catch(err) {
266 logger.warn('Error parsing amount_trx from webreport advice.', {err: err}); 291 logger.warn('Error parsing amount_trx from webreport advice.', {err: err});
267 } 292 }
268 293
269 try { 294 try {
270 responseMessage = 295 responseMessage =
271 responseMessage 296 responseMessage
272 + ' | token: ' + status.response.token[0]; 297 + ' | token: ' + status.response.token[0];
273 } 298 }
274 catch(err) { 299 catch(err) {
275 logger.warn('Error parsing token from webreport advice.', {err: err}); 300 logger.warn('Error parsing token from webreport advice.', {err: err});
276 } 301 }
277 302
278 try { 303 try {
279 responseMessage = 304 responseMessage =
280 responseMessage 305 responseMessage
281 + ' | PrevBalance: ' + status.response.prevbalance[0]; 306 + ' | PrevBalance: ' + status.response.prevbalance[0];
282 } 307 }
283 catch(err) { 308 catch(err) {
284 logger.warn('Error parsing PrevBalance from webreport advice.', {err: err}); 309 logger.warn('Error parsing PrevBalance from webreport advice.', {err: err});
285 } 310 }
286 311
287 try { 312 try {
288 responseMessage = 313 responseMessage =
289 responseMessage 314 responseMessage
290 + ' | Price: ' + status.amount; 315 + ' | Price: ' + status.amount;
291 } 316 }
292 catch(err) { 317 catch(err) {
293 logger.warn('Error parsing Price from webreport advice.', {err: err}); 318 logger.warn('Error parsing Price from webreport advice.', {err: err});
294 } 319 }
295 320
296 try { 321 try {
297 responseMessage = 322 responseMessage =
298 responseMessage 323 responseMessage
299 + ' | EndBalance: ' + status.response.endbalance[0]; 324 + ' | EndBalance: ' + status.response.endbalance[0];
300 } 325 }
301 catch(err) { 326 catch(err) {
302 logger.warn('Error parsing EndBalance from webreport advice.', {err: err}); 327 logger.warn('Error parsing EndBalance from webreport advice.', {err: err});
303 } 328 }
304 329
305 330
306 if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) { 331 if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) {
307 responseCode = '00'; 332 responseCode = '00';
308 333
309 var nama_pelanggan = status.response.nama_pel[0] ; 334 var nama_pelanggan = status.response.nama_pel[0] ;
310 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); 335 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-');
311 336
312 var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0]; 337 var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0];
313 responseMessage = 'SN=' + sn + '; ' + responseMessage; 338 responseMessage = 'SN=' + sn + '; ' + responseMessage;
314 339
315 } else if ((status.status == 'P') || (status.status == 'W')) { 340 } else if ((status.status == 'P') || (status.status == 'W')) {
316 341
317 callbackReport(status.response.reffid[0].trim(), '68', responseMessage); 342 callbackReport(status.response.reffid[0].trim(), '68', responseMessage);
318 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); 343 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms');
319 344
320 setTimeout(function () { 345 setTimeout(function () {
321 346
322 cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport); 347 cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport);
323 348
324 }, sleep_before_retry); 349 }, sleep_before_retry);
325 return; 350 return;
326 351
327 } else { 352 } else {
328 responseCode = status.response.resultcode[0].replace(/^00/, ""); 353 responseCode = status.response.resultcode[0].replace(/^00/, "");
329 if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) { 354 if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) {
330 responseCode = '40'; 355 responseCode = '40';
331 } 356 }
332 } 357 }
333 358
334 359
335 callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage); 360 callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage);
336 } 361 }
337 362
338 function createHttpReportServer() { 363 function createHttpReportServer() {
339 var httpServer = http.createServer(function(request, response) { 364 var httpServer = http.createServer(function(request, response) {
340 var qs = url.parse(request.url, true).query; 365 var qs = url.parse(request.url, true).query;
341 var path = url.parse(request.url).pathname; 366 var path = url.parse(request.url).pathname;
342 367
343 logger.info('Got reverse report from partner', {path: path, qs: qs}); 368 logger.info('Got reverse report from partner', {path: path, qs: qs});
344 response.end('OK'); 369 response.end('OK');
345 370
346 var trxid; 371 var trxid;
347 try { 372 try {
348 trxid = qs.transid; 373 trxid = qs.transid;
349 } 374 }
350 catch(err) { 375 catch(err) {
351 } 376 }
352 377
353 if (trxid) { 378 if (trxid) {
354 logger.info('Requesting advice from webreport', {trxid: trxid}) 379 logger.info('Requesting advice from webreport', {trxid: trxid})
355 cekstatus.advice({trxid: trxid}, callbackFromWebReport); 380 cekstatus.advice({trxid: trxid}, callbackFromWebReport);
356 } 381 }
357 382
358 }); 383 });
359 384
360 httpServer.listen(config.h2h_out.listen_port, function() { 385 httpServer.listen(config.h2h_out.listen_port, function() {
361 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 386 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
362 }); 387 });
363 } 388 }
364 389
365 function start(_config, _callbackReport, options) { 390 function start(_config, _callbackReport, options) {
366 config = _config; 391 config = _config;
367 callbackReport = _callbackReport; 392 callbackReport = _callbackReport;
368 393
369 if (options && options.aaa) { 394 if (options && options.aaa) {
370 aaa = options.aaa; 395 aaa = options.aaa;
371 } 396 }
372 397
373 if (options && options.logger) { 398 if (options && options.logger) {
374 logger = options.logger; 399 logger = options.logger;
375 } else { 400 } else {
376 logger = new winston.Logger({ 401 logger = new winston.Logger({
377 transports: [ 402 transports: [
378 new (winston.transports.Console)() 403 new (winston.transports.Console)()
379 ] 404 ]
380 }); 405 });
381 } 406 }
382 407
383 createHttpReportServer(); 408 createHttpReportServer();
384 } 409 }
385 410
386 exports.start = start; 411 exports.start = start;
387 exports.topupRequest = topupRequest; 412 exports.topupRequest = topupRequest;
388 413