Commit 73b3251b53d02dc17d6e41e4c191c25cb52ff9a6

Authored by Adhidarma Hadiwinoto
1 parent b7086545bf
Exists in master

gunakan anti-same-day-dupe-oo

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