Commit 53aea5706ccad0c771e703b10cfeeb051122d34d

Authored by Adhidarma Hadiwinoto
1 parent ad94aae82d
Exists in master

require resend-delay

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

1 "use strict"; 1 "use strict";
2 2
3 var request = require('request'); 3 var request = require('request');
4 var crypto = require('crypto'); 4 var crypto = require('crypto');
5 var url = require('url'); 5 var url = require('url');
6 6
7 var resendDelay = require('sate24/resend-delay');
7 var taskHistory = require('sate24/task-history'); 8 var taskHistory = require('sate24/task-history');
8 var antiSameDayDupe = require('sate24/anti-same-day-dupe'); 9 var antiSameDayDupe = require('sate24/anti-same-day-dupe');
9 10
10 var config; 11 var config;
11 var aaa; 12 var aaa;
12 var logger; 13 var logger;
13 14
14 15
15 function start(options) { 16 function start(options) {
16 if (!options) { 17 if (!options) {
17 console.log('Undefined options, terminating....'); 18 console.log('Undefined options, terminating....');
18 process.exit(1); 19 process.exit(1);
19 } 20 }
20 21
21 if (options.config) { 22 if (options.config) {
22 config = options.config; 23 config = options.config;
23 } else { 24 } else {
24 console.log('Undefined options.config, terminating....') 25 console.log('Undefined options.config, terminating....')
25 process.exit(1); 26 process.exit(1);
26 } 27 }
27 28
28 if (options.aaa) { 29 if (options.aaa) {
29 aaa = options.aaa; 30 aaa = options.aaa;
30 } else { 31 } else {
31 console.log('Undefined options.aaa, terminating....') 32 console.log('Undefined options.aaa, terminating....')
32 process.exit(1); 33 process.exit(1);
33 } 34 }
34 35
35 if (options && options.logger) { 36 if (options && options.logger) {
36 logger = options.logger; 37 logger = options.logger;
37 } else { 38 } else {
38 console.log('Undefined options.logger, terminating....') 39 console.log('Undefined options.logger, terminating....')
39 process.exit(1); 40 process.exit(1);
40 } 41 }
41 42
42 resendDelay.init({ 43 resendDelay.init({
43 config: config, 44 config: config,
44 topupRequest: topupRequest, 45 topupRequest: topupRequest,
45 logger: logger 46 logger: logger
46 }); 47 });
47 48
48 taskHistory.init(options); 49 taskHistory.init(options);
49 antiSameDayDupe.init(options); 50 antiSameDayDupe.init(options);
50 51
51 createReverseHttpServer(); 52 createReverseHttpServer();
52 } 53 }
53 54
54 function callbackReport(requestId, rc, message) { 55 function callbackReport(requestId, rc, message) {
55 if (responseCode != '68' || dontResendDelay) { 56 if (responseCode != '68' || dontResendDelay) {
56 resendDelay.cancel(requestId); 57 resendDelay.cancel(requestId);
57 } else { 58 } else {
58 taskHistory.get(requestId, function(err, archivedTask) { 59 taskHistory.get(requestId, function(err, archivedTask) {
59 if (archivedTask) { 60 if (archivedTask) {
60 logger.verbose('DEBUG', {archivedTask: archivedTask}); 61 logger.verbose('DEBUG', {archivedTask: archivedTask});
61 resendDelay.register(archivedTask); 62 resendDelay.register(archivedTask);
62 } 63 }
63 }); 64 });
64 } 65 }
65 66
66 options.aaa.callbackReportWithPushToMongoDb(requestId, rc, message); 67 options.aaa.callbackReportWithPushToMongoDb(requestId, rc, message);
67 } 68 }
68 69
69 function topupRequest(task) { 70 function topupRequest(task) {
70 if (!aaa.isTodayTrx(task)) { 71 if (!aaa.isTodayTrx(task)) {
71 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); 72 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan');
72 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); 73 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan');
73 resendDelay.cancel(task); 74 resendDelay.cancel(task);
74 return; 75 return;
75 } 76 }
76 77
77 aaa.insertTaskToMongoDb(task); 78 aaa.insertTaskToMongoDb(task);
78 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, _topupRequest); 79 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, _topupRequest);
79 } 80 }
80 81
81 function _topupRequest(task) { 82 function _topupRequest(task) {
82 taskHistory.put(task, function() { 83 taskHistory.put(task, function() {
83 requestToPartner(task);; 84 requestToPartner(task);;
84 }); 85 });
85 } 86 }
86 87
87 function requestToPartner(task) { 88 function requestToPartner(task) {
88 let requestOptions = createRequestOptions(task); 89 let requestOptions = createRequestOptions(task);
89 90
90 request(requestOptions, function(error, response, body) { 91 request(requestOptions, function(error, response, body) {
91 if (error) { 92 if (error) {
92 logger.warn('Error requesting to partner', {task: task, error: error}); 93 logger.warn('Error requesting to partner', {task: task, error: error});
93 callbackReport(task.requestId, '68', 'Error requesting to partner. ' + error); 94 callbackReport(task.requestId, '68', 'Error requesting to partner. ' + error);
94 return; 95 return;
95 } 96 }
96 97
97 if (response.statusCode != 200) { 98 if (response.statusCode != 200) {
98 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); 99 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode});
99 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode); 100 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode);
100 return; 101 return;
101 } 102 }
102 103
103 parseMessage(task, message); 104 parseMessage(task, message);
104 }); 105 });
105 } 106 }
106 107
107 function parseMessage(task, message) { 108 function parseMessage(task, message) {
108 let rc = '68'; 109 let rc = '68';
109 110
110 if (message.indexOf('SUKSES') >= 0) { 111 if (message.indexOf('SUKSES') >= 0) {
111 rc = '00'; 112 rc = '00';
112 } 113 }
113 else if (message.indexOf('GAGAL') >= 0) { 114 else if (message.indexOf('GAGAL') >= 0) {
114 rc = '40'; 115 rc = '40';
115 } 116 }
116 117
117 callbackReport(task.requestId, rc, message); 118 callbackReport(task.requestId, rc, message);
118 } 119 }
119 120
120 function generateSign(userid, remoteProduct, destination, requestId, pin, password) { 121 function generateSign(userid, remoteProduct, destination, requestId, pin, password) {
121 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|"); 122 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|");
122 let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex'); 123 let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex');
123 let buffer = new Buffer(sha1); 124 let buffer = new Buffer(sha1);
124 125
125 return buffer.toString('base64'); 126 return buffer.toString('base64');
126 } 127 }
127 128
128 function createRequestOptions(task) { 129 function createRequestOptions(task) {
129 return requestOptions = { 130 return requestOptions = {
130 url: config.h2h_out.partner, 131 url: config.h2h_out.partner,
131 qs: { 132 qs: {
132 memberID: config.h2h_out.userid, 133 memberID: config.h2h_out.userid,
133 product: task.remoteProduct, 134 product: task.remoteProduct,
134 dest: task.destination, 135 dest: task.destination,
135 refID: task.requestId, 136 refID: task.requestId,
136 sign: generateSign( 137 sign: generateSign(
137 config.h2h_out.userid, 138 config.h2h_out.userid,
138 task.remoteProduct, 139 task.remoteProduct,
139 task.destination, 140 task.destination,
140 task.requestId, 141 task.requestId,
141 config.h2h_out.pin, 142 config.h2h_out.pin,
142 confg.h2h_out.password 143 confg.h2h_out.password
143 ) 144 )
144 } 145 }
145 }; 146 };
146 } 147 }
147 148
148 function onSameDayDupe(task) { 149 function onSameDayDupe(task) {
149 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama'); 150 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama');
150 } 151 }
151 152
152 function createReverseHttpServer() { 153 function createReverseHttpServer() {
153 var httpServer = http.createServer(function(request, response) { 154 var httpServer = http.createServer(function(request, response) {
154 let qs = url.parse(request.url, true).query; 155 let qs = url.parse(request.url, true).query;
155 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs}); 156 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs});
156 }); 157 });
157 158
158 httpServer.listen(config.h2h_out.listen_port, function() { 159 httpServer.listen(config.h2h_out.listen_port, function() {
159 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port); 160 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port);
160 }); 161 });
161 } 162 }
162 163
163 exports.start = start; 164 exports.start = start;
164 exports.topupRequest = topupRequest; 165 exports.topupRequest = topupRequest;
165 exports.generateSign = generateSign; 166 exports.generateSign = generateSign;
166 167