Commit 790e11bfdd066d40e1cd7bbe28eb715c0194dcd2

Authored by Adhidarma Hadiwinoto
1 parent 73b3251b53
Exists in master

_initSameDayDupe

Showing 1 changed file with 11 additions and 7 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 var http = require('http'); 6 var http = require('http');
7 7
8 var resendDelay = require('sate24/resend-delay'); 8 var resendDelay = require('sate24/resend-delay');
9 var taskHistory = require('sate24/task-history'); 9 var taskHistory = require('sate24/task-history');
10 var AntiSameDayDupe = require('sate24/anti-same-day-dupe-oo'); 10 var AntiSameDayDupe = require('sate24/anti-same-day-dupe-oo');
11 var antiSameDayDupe; 11 var antiSameDayDupe;
12 12
13 var config; 13 var config;
14 var aaa; 14 var aaa;
15 var logger; 15 var logger;
16 16
17 17
18 function start(options) { 18 function start(options) {
19 if (!options) { 19 if (!options) {
20 console.log('Undefined options, terminating....'); 20 console.log('Undefined options, terminating....');
21 process.exit(1); 21 process.exit(1);
22 } 22 }
23 23
24 if (options.config) { 24 if (options.config) {
25 config = options.config; 25 config = options.config;
26 } else { 26 } else {
27 console.log('Undefined options.config, terminating....') 27 console.log('Undefined options.config, terminating....')
28 process.exit(1); 28 process.exit(1);
29 } 29 }
30 30
31 if (options.aaa) { 31 if (options.aaa) {
32 aaa = options.aaa; 32 aaa = options.aaa;
33 } else { 33 } else {
34 console.log('Undefined options.aaa, terminating....') 34 console.log('Undefined options.aaa, terminating....')
35 process.exit(1); 35 process.exit(1);
36 } 36 }
37 37
38 if (options && options.logger) { 38 if (options && options.logger) {
39 logger = options.logger; 39 logger = options.logger;
40 } else { 40 } else {
41 console.log('Undefined options.logger, terminating....') 41 console.log('Undefined options.logger, terminating....')
42 process.exit(1); 42 process.exit(1);
43 } 43 }
44 44
45 resendDelay.init({ 45 resendDelay.init({
46 config: config, 46 config: config,
47 topupRequest: checkStatus, 47 topupRequest: checkStatus,
48 logger: logger 48 logger: logger
49 }); 49 });
50 50
51 taskHistory.init(options); 51 taskHistory.init(options);
52 antiSameDayDupe.init(options); 52 antiSameDayDupe.init(options);
53 53
54 createReverseHttpServer(); 54 createReverseHttpServer();
55 } 55 }
56 56
57 function callbackReport(requestId, rc, message) { 57 function callbackReport(requestId, rc, message) {
58 if (rc != '68') { 58 if (rc != '68') {
59 resendDelay.cancel(requestId); 59 resendDelay.cancel(requestId);
60 } else { 60 } else {
61 taskHistory.get(requestId, function(err, archivedTask) { 61 taskHistory.get(requestId, function(err, archivedTask) {
62 if (archivedTask) { 62 if (archivedTask) {
63 resendDelay.register(archivedTask); 63 resendDelay.register(archivedTask);
64 } else { 64 } else {
65 logger.warn('Can not find task from history', {request_id: requestId}); 65 logger.warn('Can not find task from history', {request_id: requestId});
66 } 66 }
67 }); 67 });
68 } 68 }
69 69
70 aaa.callbackReportWithPushToMongoDb(requestId, rc, message); 70 aaa.callbackReportWithPushToMongoDb(requestId, rc, message);
71 } 71 }
72 72
73 function _initSameDayDupe() {
74 logger.info('Initializing antiSameDayDupe');
75 antiSameDayDupe = new AntiSameDayDupe({
76 config: config,
77 logger: logger,
78 keyPrefix: 'otomax.',
79 redisClient: redisClient
80 });
81 }
82
73 function topupRequest(task) { 83 function topupRequest(task) {
74 if (!aaa.isTodayTrx(task)) { 84 if (!aaa.isTodayTrx(task)) {
75 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); 85 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan');
76 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); 86 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan');
77 resendDelay.cancel(task); 87 resendDelay.cancel(task);
78 return; 88 return;
79 } 89 }
80 90
81 aaa.insertTaskToMongoDb(task); 91 aaa.insertTaskToMongoDb(task);
82 92
83 if (!antiSameDayDupe) { 93 if (!antiSameDayDupe) {
84 logger.info('Initializing antiSameDayDupe'); 94 _initSameDayDupe();
85 antiSameDayDupe = new AntiSameDayDupe({
86 config: config,
87 logger: logger,
88 keyPrefix: 'otomax.',
89 redisClient: redisClient
90 });
91 } 95 }
92 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, checkStatus); 96 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, checkStatus);
93 } 97 }
94 98
95 function _topupRequest(task) { 99 function _topupRequest(task) {
96 taskHistory.put(task, function() { 100 taskHistory.put(task, function() {
97 requestToPartner(task);; 101 requestToPartner(task);;
98 }); 102 });
99 } 103 }
100 104
101 function checkStatus(task) { 105 function checkStatus(task) {
102 logger.verbose('Going to request checkStatus', {task: task}); 106 logger.verbose('Going to request checkStatus', {task: task});
103 taskHistory.put(task, function() { 107 taskHistory.put(task, function() {
104 requestToPartner(task, true); 108 requestToPartner(task, true);
105 }); 109 });
106 } 110 }
107 111
108 function requestToPartner(task, pendingOnErrorConnect) { 112 function requestToPartner(task, pendingOnErrorConnect) {
109 let requestOptions = createRequestOptions(task); 113 let requestOptions = createRequestOptions(task);
110 114
111 logger.info('Requesting to partner', {task: task, request_options: requestOptions}); 115 logger.info('Requesting to partner', {task: task, request_options: requestOptions});
112 116
113 request(requestOptions, function(error, response, body) { 117 request(requestOptions, function(error, response, body) {
114 if (error) { 118 if (error) {
115 let rc = '68'; 119 let rc = '68';
116 120
117 if (!pendingOnErrorConnect && (error.syscall == 'connect')) { 121 if (!pendingOnErrorConnect && (error.syscall == 'connect')) {
118 rc = '91'; 122 rc = '91';
119 } 123 }
120 124
121 logger.warn('Error requesting to partner', {task: task, rc: rc, error: error}); 125 logger.warn('Error requesting to partner', {task: task, rc: rc, error: error});
122 callbackReport(task.requestId, rc, 'Error requesting to partner. ' + error); 126 callbackReport(task.requestId, rc, 'Error requesting to partner. ' + error);
123 return; 127 return;
124 } 128 }
125 129
126 if (response.statusCode != 200) { 130 if (response.statusCode != 200) {
127 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); 131 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode});
128 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode); 132 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode);
129 return; 133 return;
130 } 134 }
131 135
132 logger.verbose('Got response from partner', {task: task, body: body}); 136 logger.verbose('Got response from partner', {task: task, body: body});
133 137
134 parseMessage(task, body); 138 parseMessage(task, body);
135 }); 139 });
136 } 140 }
137 141
138 function getRequestIdFromTask(task) { 142 function getRequestIdFromTask(task) {
139 if (typeof task == 'string') { 143 if (typeof task == 'string') {
140 return task; 144 return task;
141 } 145 }
142 146
143 try { 147 try {
144 let requestId = task.requestId; 148 let requestId = task.requestId;
145 return requestId; 149 return requestId;
146 } 150 }
147 catch(e) {return}; 151 catch(e) {return};
148 } 152 }
149 153
150 function parseMessage(task, message) { 154 function parseMessage(task, message) {
151 let requestId = getRequestIdFromTask(task); 155 let requestId = getRequestIdFromTask(task);
152 156
153 if (!requestId) { 157 if (!requestId) {
154 logger.warn('Invalid requestId on parseMessage', {task: task, message: message}); 158 logger.warn('Invalid requestId on parseMessage', {task: task, message: message});
155 return; 159 return;
156 } 160 }
157 161
158 let rc = '68'; 162 let rc = '68';
159 163
160 if (message.indexOf('SUKSES') >= 0) { 164 if (message.indexOf('SUKSES') >= 0) {
161 rc = '00'; 165 rc = '00';
162 } 166 }
163 else if (message.indexOf('GAGAL. Nomor tujuan salah') >= 0) { 167 else if (message.indexOf('GAGAL. Nomor tujuan salah') >= 0) {
164 rc = '14'; 168 rc = '14';
165 } 169 }
166 else if (message.indexOf('NO HP TIDAK TERDAFTAR ATAU BUKAN NOMOR PRA-BAYAR') >= 0) { 170 else if (message.indexOf('NO HP TIDAK TERDAFTAR ATAU BUKAN NOMOR PRA-BAYAR') >= 0) {
167 rc = '14'; 171 rc = '14';
168 } 172 }
169 else if (message.indexOf('Gagal.') >= 0) { 173 else if (message.indexOf('Gagal.') >= 0) {
170 rc = '40'; 174 rc = '40';
171 } 175 }
172 else if (message.indexOf('GAGAL') >= 0) { 176 else if (message.indexOf('GAGAL') >= 0) {
173 rc = '40'; 177 rc = '40';
174 } 178 }
175 else if (message.indexOf('gagal, dibatalkan SILAHKAN DICOBA KEMBALI') >= 0) { 179 else if (message.indexOf('gagal, dibatalkan SILAHKAN DICOBA KEMBALI') >= 0) {
176 rc = '40'; 180 rc = '40';
177 } 181 }
178 else if (message.indexOf('Invalid Signature') >= 0) { 182 else if (message.indexOf('Invalid Signature') >= 0) {
179 rc = '40'; 183 rc = '40';
180 } 184 }
181 185
182 if (rc == '00') { 186 if (rc == '00') {
183 let sn = parseSn(message, config.h2h_out.sn_pattern); 187 let sn = parseSn(message, config.h2h_out.sn_pattern);
184 if (sn) { 188 if (sn) {
185 message = "SN=" + sn + ";" + message; 189 message = "SN=" + sn + ";" + message;
186 } 190 }
187 } 191 }
188 192
189 callbackReport(requestId, rc, message); 193 callbackReport(requestId, rc, message);
190 } 194 }
191 195
192 function generateSign(userid, remoteProduct, destination, requestId, pin, password) { 196 function generateSign(userid, remoteProduct, destination, requestId, pin, password) {
193 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|"); 197 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|");
194 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex'); 198 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex');
195 //let buffer = new Buffer(sha1); 199 //let buffer = new Buffer(sha1);
196 let buffer = crypto.createHash('sha1').update(plain).digest(); 200 let buffer = crypto.createHash('sha1').update(plain).digest();
197 201
198 return buffer.toString('base64').replace(/\//g, '_').replace(/\+/g, '-'); 202 return buffer.toString('base64').replace(/\//g, '_').replace(/\+/g, '-');
199 } 203 }
200 204
201 function createRequestOptions(task) { 205 function createRequestOptions(task) {
202 return { 206 return {
203 url: config.h2h_out.partner, 207 url: config.h2h_out.partner,
204 qs: { 208 qs: {
205 memberID: config.h2h_out.userid, 209 memberID: config.h2h_out.userid,
206 product: task.remoteProduct, 210 product: task.remoteProduct,
207 dest: task.destination, 211 dest: task.destination,
208 refID: task.requestId, 212 refID: task.requestId,
209 sign: generateSign( 213 sign: generateSign(
210 config.h2h_out.userid, 214 config.h2h_out.userid,
211 task.remoteProduct, 215 task.remoteProduct,
212 task.destination, 216 task.destination,
213 task.requestId, 217 task.requestId,
214 config.h2h_out.pin, 218 config.h2h_out.pin,
215 config.h2h_out.password 219 config.h2h_out.password
216 ) 220 )
217 } 221 }
218 }; 222 };
219 } 223 }
220 224
221 function onSameDayDupe(task) { 225 function onSameDayDupe(task) {
222 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama'); 226 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama');
223 } 227 }
224 228
225 function reverseHttpServerServerHandler(request, response) { 229 function reverseHttpServerServerHandler(request, response) {
226 let qs = url.parse(request.url, true).query; 230 let qs = url.parse(request.url, true).query;
227 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs}); 231 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs});
228 232
229 parseMessage(qs.refid, qs.message); 233 parseMessage(qs.refid, qs.message);
230 } 234 }
231 235
232 function createReverseHttpServer() { 236 function createReverseHttpServer() {
233 var httpServer = http.createServer(reverseHttpServerServerHandler); 237 var httpServer = http.createServer(reverseHttpServerServerHandler);
234 238
235 httpServer.listen(config.h2h_out.listen_port, function() { 239 httpServer.listen(config.h2h_out.listen_port, function() {
236 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port); 240 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port);
237 }); 241 });
238 } 242 }
239 243
240 function parseSn(message, pattern) { 244 function parseSn(message, pattern) {
241 245
242 try { 246 try {
243 let sn_regex = new RegExp(pattern); 247 let sn_regex = new RegExp(pattern);
244 let sn_match = message.match(sn_regex); 248 let sn_match = message.match(sn_regex);
245 249
246 return sn_match[1].trim(); 250 return sn_match[1].trim();
247 } 251 }
248 catch(e) { 252 catch(e) {
249 return; 253 return;
250 } 254 }
251 255
252 } 256 }
253 257