Commit fef3401d2029e19e0a2c70a4cbaf7f8224513d32

Authored by Adhidarma Hadiwinoto
1 parent 8b42400808
Exists in master

var redisClient

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