Commit 855827cf6e1c835a1f2c22ef5ee2af4b1088c106

Authored by Adhidarma Hadiwinoto
1 parent 57711acc6a
Exists in master

insertTaskToMongoDb dan callbackReportWithPushToMongoDb

Showing 2 changed files with 139 additions and 125 deletions Side-by-side Diff

... ... @@ -21,6 +21,6 @@ var options = {
21 21  
22 22 var httpServer = HttpServer.start(config, options);
23 23  
24   -partner.start(config, aaa.callbackReport, options);
  24 +partner.start(options);
25 25 aaa.start(config, partner, options);
26 26 expresso.start(options);
... ... @@ -27,13 +27,13 @@ var sleep_before_retry = 30000;
27 27 var logTag = __filename.split('/').reverse()[0];
28 28  
29 29 function initMongoClient() {
30   - if (!config.mongodb || !config.mongodb.url) {
  30 + if (!config.mongodbstruk || !config.mongodbstruk.url) {
31 31 return;
32 32 }
33   -
  33 +
34 34 try {
35   - var url = config.mongodb.url;
36   -
  35 + var url = config.mongodbstruk.url;
  36 +
37 37 mongoClient.connect(url, function(err, db) {
38 38 if (err) {
39 39 logger.warn('Failed to connect to mongodb', {err: err});
... ... @@ -46,112 +46,112 @@ function initMongoClient() {
46 46 catch(err) {
47 47 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
48 48 }
49   -
  49 +
50 50 }
51 51  
52 52 function prepareResultData(result) {
53 53 var task;
54   -
  54 +
55 55 var data = {};
56 56 data.gateway = config.globals.gateway_name;
57   -
  57 +
58 58 try {
59 59 data.requestId = result.reffid[0].trim();
60   -
  60 +
61 61 var key = config.globals.gateway_name + '.rid:' + data.requestId;
62 62 task = tasks.get(key);
63 63 }
64 64 catch(err) { data.requestId = null; }
65   -
  65 +
66 66 try {
67 67 data.status = result.ResultCode[0].trim();
68 68 }
69 69 catch(err) { data.status = '68' }
70   -
  70 +
71 71 try {
72   - data.rcmessage = result.ErrorMsg[0].trim();
  72 + data.rcmessage = result.ErrorMsg[0].trim();
73 73 }
74 74 catch(err) { data.rcmessage = ''; }
75   -
  75 +
76 76 try {
77   - data.resptext = '';
  77 + data.resptext = '';
78 78 }
79 79 catch(err) { data.resptext = ''; }
80   -
  80 +
81 81 try {
82 82 var ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss')
83 83 data.dt = ts;
84 84 }
85   - catch(err) {
  85 + catch(err) {
86 86 logger.warn('Exception when getting timestamp data, using current timestamp', {err: err, result: result, task: task});
87   - data.dt = strftime('%Y-%m-%d %H:%M:%S', new Date());
  87 + data.dt = strftime('%Y-%m-%d %H:%M:%S', new Date());
88 88 }
89   -
  89 +
90 90 try {
91 91 data.namapel = result.nama_pel[0].trim();
92 92 }
93 93 catch(err) { data.namapel = 'UNKNOWN'; }
94   -
  94 +
95 95 try {
96 96 data.msn = result.nsm[0].trim();
97 97 }
98 98 catch(err) { data.msn = 'UNKNOWN'; }
99   -
  99 +
100 100 try {
101 101 data.idpel = result.idpel[0].trim();
102 102 }
103 103 catch(err) { data.idpel = 'UNKNOWN'; }
104   -
  104 +
105 105 try {
106 106 data.tarifdaya = result.tarif[0].trim();
107 107 }
108 108 catch(err) { data.tarifdaya = 'UNKNOWN'; }
109   -
  109 +
110 110 try {
111 111 data.admin = parseInt(result.adminfee[0].trim());
112 112 }
113 113 catch(err) { data.admin = 0; }
114   -
  114 +
115 115 try {
116 116 data.adm = parseInt(result.admin_fee[0].trim());
117 117 }
118 118 catch(err) { data.adm = 0; }
119   -
  119 +
120 120 try {
121 121 data.hargapelanggan = parseInt(result.amount_trx[0].trim());
122 122 }
123 123 catch(err) { data.hargapelanggan = 0; }
124   -
  124 +
125 125 try {
126 126 data.jumlahkwh = result.jml_daya[0].trim();
127 127 }
128 128 catch(err) { data.jumlahkwh = 0; }
129   -
  129 +
130 130 try {
131 131 data.token = result.token[0].trim();
132 132 }
133 133 catch(err) { data.token = 0; }
134   -
  134 +
135 135 try {
136 136 data.ppn = result.ppn_fee[0].trim();
137 137 }
138 138 catch(err) { data.ppn_fee = 0; }
139   -
  139 +
140 140 try {
141 141 data.ppj = result.ppj_fee[0].trim();
142 142 }
143 143 catch(err) { data.ppj = 0; }
144   -
  144 +
145 145 try {
146 146 data.angsuran = result.angsuran_fee[0].trim();
147 147 }
148 148 catch(err) { data.angsuran = 0; }
149   -
  149 +
150 150 try {
151 151 data.meterai = result.materai_fee[0].trim();
152 152 }
153 153 catch(err) { data.materai_fee = 0; }
154   -
  154 +
155 155 return data;
156 156 }
157 157  
... ... @@ -159,19 +159,19 @@ function saveTokenToMongoDb(result) {
159 159 if (!mongodb) {
160 160 return;
161 161 }
162   -
163   - if (!config.mongodb) {
  162 +
  163 + if (!config.mongodbstruk) {
164 164 return;
165 165 }
166   -
167   - if (!config.mongodb.collection) {
  166 +
  167 + if (!config.mongodbstruk.collection) {
168 168 return;
169 169 }
170   -
  170 +
171 171 data = prepareResultData(result);
172 172  
173 173 try {
174   - mongodb.collection(config.mongodb.collection).insertOne(data);
  174 + mongodb.collection(config.mongodbstruk.collection).insertOne(data);
175 175 }
176 176 catch(err) {
177 177 logger.warn('Error when inserting data to mongodb', {err: err, data: data});
... ... @@ -180,7 +180,7 @@ function saveTokenToMongoDb(result) {
180 180  
181 181 function putTaskToCache(task) {
182 182 var key = config.globals.gateway_name + '.rid:' + task.requestId;
183   -
  183 +
184 184 try {
185 185 tasks.set(key, task);
186 186 }
... ... @@ -190,16 +190,17 @@ function putTaskToCache(task) {
190 190 }
191 191  
192 192 function topupRequest(task) {
  193 + aaa.insertTaskToMongoDb(task);
193 194 putTaskToCache(task);
194   -
  195 +
195 196 var ts = strftime('%Y%m%d%H%M%S', new Date());
196   -
197   - var data =
198   - config.h2h_out.userid
199   - + '|' + config.h2h_out.password
200   - + '|' + task['remoteProduct']
  197 +
  198 + var data =
  199 + config.h2h_out.userid
  200 + + '|' + config.h2h_out.password
  201 + + '|' + task['remoteProduct']
201 202 + '|' + task['destination'] + '|0';
202   -
  203 +
203 204 var options = {
204 205 url: config.h2h_out.partner,
205 206 qs: {
... ... @@ -215,16 +216,16 @@ function topupRequest(task) {
215 216 var responseMessage = 'Gateway Error';
216 217  
217 218 if (error) {
218   -
  219 +
219 220 logger.warn('HTTP REQUEST ERROR', error);
220 221 callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')');
221   -
  222 +
222 223 } else if (response.statusCode != 200) {
223   -
  224 +
224 225 var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')';
225 226 logger.warn(error_message);
226 227 callbackReport(task['requestId'], '91', error_message);
227   -
  228 +
228 229 } else {
229 230  
230 231 logger.info('DIRECT RESPONSE', {body: body});
... ... @@ -235,9 +236,9 @@ function topupRequest(task) {
235 236 } else {
236 237 var directResponse = result;
237 238 logger.info(directResponse);
238   -
  239 +
239 240 saveTokenToMongoDb(directResponse.Result);
240   -
  241 +
241 242 try {
242 243 var result_price;
243 244 try {
... ... @@ -246,7 +247,7 @@ function topupRequest(task) {
246 247 catch(err) {
247 248 result_price = 0;
248 249 }
249   -
  250 +
250 251 var result_error_message;
251 252 try {
252 253 result_error_message = directResponse.Result.ErrorMsg[0].trim();
... ... @@ -254,10 +255,10 @@ function topupRequest(task) {
254 255 catch(err) {
255 256 result_error_message = '';
256 257 }
257   -
  258 +
258 259 var resultCode = directResponse.Result.ResultCode[0].trim();
259   -
260   - responseMessage =
  260 +
  261 + responseMessage =
261 262 'ResultCode: ' + resultCode
262 263 + ' | ErrorMsg: ' + result_error_message
263 264 + ' | DateTime: ' + directResponse.Result.DateTime[0].trim()
... ... @@ -272,49 +273,49 @@ function topupRequest(task) {
272 273 + ' | Price: ' + result_price
273 274 + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim()
274 275 ;
275   -
  276 +
276 277 logger.info('Response message: ' + responseMessage);
277   -
  278 +
278 279 if (aaa) {
279 280 // update balance
280 281 aaa.updateBalance(directResponse.Result.EndBalance[0]);
281 282 }
282   -
  283 +
283 284 if (resultCode == '0000') {
284 285 var nama_pelanggan = directResponse.Result.nama_pel[0].trim();
285 286 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-');
286 287 var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim();
287 288 sn = sn.replace(/\s/g, '-');
288   -
  289 +
289 290 responseMessage = 'SN=' + sn + '; ' + responseMessage;
290 291 logger.info('New response message: ' + responseMessage);
291 292 }
292   -
  293 +
293 294 var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096'];
294 295 if (pendingResultCode.indexOf(resultCode) != -1) {
295 296 callbackReport(task['requestId'], '68', responseMessage);
296   -
  297 +
297 298 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms');
298 299 setTimeout(function () {
299 300 cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport);
300 301 }, sleep_before_retry);
301   -
  302 +
302 303 return;
303 304 }
304   -
  305 +
305 306 responseCode = resultCode.replace(/^00/, "");
306   -
  307 +
307 308 if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') {
308 309 responseCode = '91';
309   - }
310   -
  310 + }
  311 +
311 312 }
312 313 catch(err) {
313 314 responseCode = '40';
314 315 responseMessage = 'Invalid response from gateway';
315 316 }
316 317 }
317   -
  318 +
318 319 callbackReport(task['requestId'], responseCode, responseMessage);
319 320 });
320 321 }
... ... @@ -328,181 +329,181 @@ function callbackFromWebReport(status) {
328 329 logger.warn('Advice from webreport return empty status');
329 330 return;
330 331 }
331   -
  332 +
332 333 logger.info('Got advice result from webreport', {status: status});
333   -
  334 +
334 335 var responseCode = '68';
335   -
  336 +
336 337 var result_price = 0;
337 338 try {
338 339 result_price = directResponse.Result.Price[0].trim();
339 340 }
340 341 catch(err) {}
341   -
  342 +
342 343 var errorMsg = '';
343 344 try {
344 345 errorMsg = status.response.errormsg[0];
345 346 }
346 347 catch(err) {}
347   -
  348 +
348 349 var responseMessage = '';
349 350 try {
350   - responseMessage =
  351 + responseMessage =
351 352 'Hasil advice dari webreport '
352 353 + 'ResultCode: ' + status.response.resultcode[0]
353 354 }
354 355 catch(err) {
355 356 logger.warn('Error parsing ResultCode from webreport advice.', {err: err});
356 357 }
357   -
  358 +
358 359 try {
359   - responseMessage =
  360 + responseMessage =
360 361 responseMessage
361 362 + ' | ErrorMsg: ' + errorMsg
362 363 }
363 364 catch(err) {
364 365 logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err});
365 366 }
366   -
  367 +
367 368 try {
368   - responseMessage =
  369 + responseMessage =
369 370 responseMessage
370 371 + ' | TrxDate: ' + status.trxDate;
371 372 }
372 373 catch(err) {
373 374 logger.warn('Error parsing TrxDate from webreport advice.', {err: err});
374 375 }
375   -
  376 +
376 377 try {
377   - responseMessage =
  378 + responseMessage =
378 379 responseMessage
379 380 + ' | UpdateDate: ' + status.updateDate;
380   -
  381 +
381 382 }
382 383 catch(err) {
383 384 logger.warn('Error parsing UpdateDate from webreport advice.', {err: err});
384 385 }
385   -
  386 +
386 387 try {
387   - responseMessage =
  388 + responseMessage =
388 389 responseMessage
389 390 + ' | nsm: ' + status.response.nsm[0];
390 391 }
391 392 catch(err) {
392 393 logger.warn('Error parsing nsm from webreport advice.', {err: err});
393 394 }
394   -
  395 +
395 396 try {
396   - responseMessage =
  397 + responseMessage =
397 398 responseMessage
398 399 + ' | idpel: ' + status.response.idpel[0];
399 400 }
400 401 catch(err) {
401 402 logger.warn('Error parsing idpel from webreport advice.', {err: err});
402 403 }
403   -
  404 +
404 405 try {
405   - responseMessage =
  406 + responseMessage =
406 407 responseMessage
407 408 + ' | reffid: ' + status.response.reffid[0].trim();
408 409 }
409 410 catch(err) {
410 411 logger.warn('Error parsing reffid from webreport advice.', {err: err});
411 412 }
412   -
  413 +
413 414 try {
414   - responseMessage =
  415 + responseMessage =
415 416 responseMessage
416 417 + ' | TransID: ' + status.response.transid[0].trim();
417 418 }
418 419 catch(err) {
419 420 logger.warn('Error parsing TransID from webreport advice.', {err: err});
420 421 }
421   -
  422 +
422 423 try {
423   - responseMessage =
  424 + responseMessage =
424 425 responseMessage
425 426 + ' | reff_switching: ' + status.response.reff_switching[0];
426 427 }
427 428 catch(err) {
428 429 logger.warn('Error parsing reff_switching from webreport advice.', {err: err});
429 430 }
430   -
  431 +
431 432 try {
432   - responseMessage =
  433 + responseMessage =
433 434 responseMessage
434 435 + ' | amount_trx: ' + status.response.amount_trx[0];
435 436 }
436 437 catch(err) {
437 438 logger.warn('Error parsing amount_trx from webreport advice.', {err: err});
438 439 }
439   -
  440 +
440 441 try {
441   - responseMessage =
  442 + responseMessage =
442 443 responseMessage
443 444 + ' | token: ' + status.response.token[0];
444 445 }
445 446 catch(err) {
446 447 logger.warn('Error parsing token from webreport advice.', {err: err});
447 448 }
448   -
  449 +
449 450 try {
450   - responseMessage =
  451 + responseMessage =
451 452 responseMessage
452 453 + ' | PrevBalance: ' + status.response.prevbalance[0];
453 454 }
454 455 catch(err) {
455 456 logger.warn('Error parsing PrevBalance from webreport advice.', {err: err});
456 457 }
457   -
  458 +
458 459 try {
459   - responseMessage =
  460 + responseMessage =
460 461 responseMessage
461 462 + ' | Price: ' + status.amount;
462 463 }
463 464 catch(err) {
464 465 logger.warn('Error parsing Price from webreport advice.', {err: err});
465 466 }
466   -
  467 +
467 468 try {
468   - responseMessage =
  469 + responseMessage =
469 470 responseMessage
470 471 + ' | EndBalance: ' + status.response.endbalance[0];
471 472 }
472 473 catch(err) {
473 474 logger.warn('Error parsing EndBalance from webreport advice.', {err: err});
474 475 }
475   -
476   -
  476 +
  477 +
477 478 if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) {
478 479 responseCode = '00';
479   -
  480 +
480 481 var nama_pelanggan = status.response.nama_pel[0] ;
481 482 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-');
482   -
  483 +
483 484 var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0];
484 485 responseMessage = 'SN=' + sn + '; ' + responseMessage;
485   -
  486 +
486 487 } else if ((status.status == 'P') || (status.status == 'W')) {
487   -
  488 +
488 489 callbackReport(status.response.reffid[0].trim(), '68', responseMessage);
489 490 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms');
490   -
  491 +
491 492 setTimeout(function () {
492   -
  493 +
493 494 cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport);
494   -
  495 +
495 496 }, sleep_before_retry);
496 497 return;
497   -
  498 +
498 499 } else {
499 500 responseCode = status.response.resultcode[0].replace(/^00/, "");
500 501 if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) {
501 502 responseCode = '40';
502 503 }
503 504 }
504   -
505   -
  505 +
  506 +
506 507 callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage);
507 508 }
508 509  
... ... @@ -510,37 +511,50 @@ function createHttpReportServer() {
510 511 var httpServer = http.createServer(function(request, response) {
511 512 var qs = url.parse(request.url, true).query;
512 513 var path = url.parse(request.url).pathname;
513   -
  514 +
514 515 logger.info('Got reverse report from partner', {path: path, qs: qs});
515 516 response.end('OK');
516   -
  517 +
517 518 var trxid;
518 519 try {
519 520 trxid = qs.transid;
520 521 }
521 522 catch(err) {
522 523 }
523   -
  524 +
524 525 if (trxid) {
525 526 logger.info('Requesting advice from webreport', {trxid: trxid})
526 527 cekstatus.advice({trxid: trxid}, callbackFromWebReport);
527 528 }
528   -
  529 +
529 530 });
530   -
  531 +
531 532 httpServer.listen(config.h2h_out.listen_port, function() {
532 533 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
533 534 });
534 535 }
535 536  
536   -function start(_config, _callbackReport, options) {
537   - config = _config;
538   - callbackReport = _callbackReport;
539   -
540   - if (options && options.aaa) {
541   - aaa = options.aaa;
  537 +function start(options) {
  538 + if (!options) {
  539 + console.log('Undefined options, terminating....');
  540 + process.exit(1);
  541 + }
  542 +
  543 + if (options.config) {
  544 + config = options.config;
  545 + } else {
  546 + console.log('Undefined options.config, terminating....')
  547 + process.exit(1);
  548 + }
  549 +
  550 + if (options.aaa) {
  551 + aaa = options.aaa;
  552 + callbackReport = options.aaa.callbackReportWithPushToMongoDb;
  553 + } else {
  554 + console.log('Undefined options.aaa, terminating....')
  555 + process.exit(1);
542 556 }
543   -
  557 +
544 558 if (options && options.logger) {
545 559 logger = options.logger;
546 560 } else {
... ... @@ -550,7 +564,7 @@ function start(_config, _callbackReport, options) {
550 564 ]
551 565 });
552 566 }
553   -
  567 +
554 568 createHttpReportServer();
555 569 initMongoClient();
556 570 }