Commit b7f5b23dc09c09c8ac41fd2c2c6864c931c811e0

Authored by Adhidarma Hadiwinoto
1 parent 28c20ce6e9
Exists in master

require http buat set global options

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

1 var http = require('http');
1 var xmlrpc = require('xmlrpc'); 2 var xmlrpc = require('xmlrpc');
2 var url = require('url'); 3 var url = require('url');
3 var math = require('mathjs'); 4 var math = require('mathjs');
4 var winston = require('winston'); 5 var winston = require('winston');
5 var redis = require('redis'); 6 var redis = require('redis');
6 var resendDelay = require('sate24/resend-delay.js'); 7 var resendDelay = require('sate24/resend-delay.js');
7 var LRU = require('lru-cache'); 8 var LRU = require('lru-cache');
8 9
9 var aaa; 10 var aaa;
10 var logger; 11 var logger;
11 var config; 12 var config;
12 var _callbackReport; 13 var _callbackReport;
13 var redisClient; 14 var redisClient;
14 15
15 var taskHistory = LRU({max: 500, maxAge: 1000 * 3600 * 2}); 16 var taskHistory = LRU({max: 500, maxAge: 1000 * 3600 * 2});
16 17
17 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 18 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
18 http.globalAgent.maxSockets = Infinity; 19 http.globalAgent.maxSockets = Infinity;
19 20
20 function callbackReport(requestId, responseCode, message, dontResendDelay, raw) { 21 function callbackReport(requestId, responseCode, message, dontResendDelay, raw) {
21 var responseToSave = { 22 var responseToSave = {
22 parsed: { 23 parsed: {
23 MESSAGE: message, 24 MESSAGE: message,
24 } 25 }
25 }; 26 };
26 27
27 if (raw) { 28 if (raw) {
28 responseToSave.raw = raw; 29 responseToSave.raw = raw;
29 } else { 30 } else {
30 responseToSave.raw = message; 31 responseToSave.raw = message;
31 } 32 }
32 33
33 if (responseCode != '68' || dontResendDelay) { 34 if (responseCode != '68' || dontResendDelay) {
34 resendDelay.cancel(requestId); 35 resendDelay.cancel(requestId);
35 } else { 36 } else {
36 getTaskFromHistory(requestId, function(err, archivedTask) { 37 getTaskFromHistory(requestId, function(err, archivedTask) {
37 if (archivedTask) { 38 if (archivedTask) {
38 logger.verbose('DEBUG', {archivedTask: archivedTask}); 39 logger.verbose('DEBUG', {archivedTask: archivedTask});
39 resendDelay.register(archivedTask); 40 resendDelay.register(archivedTask);
40 } 41 }
41 }); 42 });
42 } 43 }
43 44
44 _callbackReport(requestId, responseCode, message, null, responseToSave); 45 _callbackReport(requestId, responseCode, message, null, responseToSave);
45 } 46 }
46 47
47 function createRedisClient(host, port) { 48 function createRedisClient(host, port) {
48 if (!host && !port) { 49 if (!host && !port) {
49 logger.info('Not creating redis client because unspecified host or port'); 50 logger.info('Not creating redis client because unspecified host or port');
50 return; 51 return;
51 } 52 }
52 53
53 try { 54 try {
54 redisClient = redis.createClient(port, host); 55 redisClient = redis.createClient(port, host);
55 } catch(err) { 56 } catch(err) {
56 logger.warn("Error creating redis client to " + host + ':' + port); 57 logger.warn("Error creating redis client to " + host + ':' + port);
57 } 58 }
58 } 59 }
59 60
60 function topupRequest(task) { 61 function topupRequest(task) {
61 aaa.insertTaskToMongoDb(task); 62 aaa.insertTaskToMongoDb(task);
62 63
63 getTaskFromHistory(task, function(err, archivedTask) { 64 getTaskFromHistory(task, function(err, archivedTask) {
64 putTaskToHistory(task); 65 putTaskToHistory(task);
65 66
66 if (archivedTask) { 67 if (archivedTask) {
67 logger.info('Task has been executed before, going to checkStatus', {task: task, archivedTask: archivedTask}); 68 logger.info('Task has been executed before, going to checkStatus', {task: task, archivedTask: archivedTask});
68 checkStatus(task); 69 checkStatus(task);
69 } else { 70 } else {
70 _topupRequest(task); 71 _topupRequest(task);
71 } 72 }
72 }); 73 });
73 } 74 }
74 75
75 function _topupRequest(task, pendingOnConnectError) { 76 function _topupRequest(task, pendingOnConnectError) {
76 77
77 if (!aaa.isTodayTrx(task)) { 78 if (!aaa.isTodayTrx(task)) {
78 callbackReport(task.requestId, '68', 'Terdeteksi transaksi beda hari, batal kirim ke supplier. Silahkan cek webreport', true); 79 callbackReport(task.requestId, '68', 'Terdeteksi transaksi beda hari, batal kirim ke supplier. Silahkan cek webreport', true);
79 return; 80 return;
80 } 81 }
81 82
82 var partnerUrl = url.parse(config.h2h_out.partner); 83 var partnerUrl = url.parse(config.h2h_out.partner);
83 var clientOptions = { 84 var clientOptions = {
84 host: partnerUrl.hostname, 85 host: partnerUrl.hostname,
85 port: partnerUrl.port, 86 port: partnerUrl.port,
86 path: partnerUrl.pathname 87 path: partnerUrl.pathname
87 }; 88 };
88 89
89 var client; 90 var client;
90 if (partnerUrl.protocol == 'https:') { 91 if (partnerUrl.protocol == 'https:') {
91 client = xmlrpc.createSecureClient(clientOptions); 92 client = xmlrpc.createSecureClient(clientOptions);
92 } else { 93 } else {
93 client = xmlrpc.createClient(clientOptions); 94 client = xmlrpc.createClient(clientOptions);
94 } 95 }
95 96
96 var params = { 97 var params = {
97 MSISDN: config.h2h_out.userid, 98 MSISDN: config.h2h_out.userid,
98 REQUESTID: task['requestId'], 99 REQUESTID: task['requestId'],
99 PIN: config.h2h_out.password, 100 PIN: config.h2h_out.password,
100 NOHP: task['destination'], 101 NOHP: task['destination'],
101 NOM: task['remoteProduct'] 102 NOM: task['remoteProduct']
102 }; 103 };
103 104
104 var methodName = 'topUpRequest'; 105 var methodName = 'topUpRequest';
105 logger.info('Preparing XMLRPC request', {methodname: methodName, params: params, partnerUrl: partnerUrl.href}); 106 logger.info('Preparing XMLRPC request', {methodname: methodName, params: params, partnerUrl: partnerUrl.href});
106 107
107 client.methodCall(methodName, [ params ], function (error, value) { 108 client.methodCall(methodName, [ params ], function (error, value) {
108 109
109 // Results of the method response 110 // Results of the method response
110 111
111 if (error) { 112 if (error) {
112 var rc = '68'; 113 var rc = '68';
113 var msg = 'XMLRPC Client Error: ' + error; 114 var msg = 'XMLRPC Client Error: ' + error;
114 115
115 if (!pendingOnConnectError && (error.code == 'ECONNREFUSED' || error.code == 'EHOSTUNREACH')) { 116 if (!pendingOnConnectError && (error.code == 'ECONNREFUSED' || error.code == 'EHOSTUNREACH')) {
116 rc = '91'; 117 rc = '91';
117 msg = 'XMLRPC Client Error on connecting'; 118 msg = 'XMLRPC Client Error on connecting';
118 } else if (!pendingOnConnectError && error.code == 'ETIMEDOUT' && error.syscall == "connect") { 119 } else if (!pendingOnConnectError && error.code == 'ETIMEDOUT' && error.syscall == "connect") {
119 rc = '91'; 120 rc = '91';
120 msg = 'XMLRPC Client Error on connecting'; 121 msg = 'XMLRPC Client Error on connecting';
121 } 122 }
122 123
123 logger.warn('XMLRPC Client Error', {methodName: methodName, task: task, err:error}); 124 logger.warn('XMLRPC Client Error', {methodName: methodName, task: task, err:error});
124 125
125 callbackReport(task['requestId'], rc, msg, null, JSON.stringify({methodName: methodName, error: error.toString(), body: error.body})); 126 callbackReport(task['requestId'], rc, msg, null, JSON.stringify({methodName: methodName, error: error.toString(), body: error.body}));
126 return; 127 return;
127 } 128 }
128 129
129 logger.info('Got XMLRPC response from partner for', {methodName: methodName, response_message: value}); 130 logger.info('Got XMLRPC response from partner for', {methodName: methodName, response_message: value});
130 131
131 if (value['RESPONSECODE'] == '94') { 132 if (value['RESPONSECODE'] == '94') {
132 logger.info('Change RC 94 to 68'); 133 logger.info('Change RC 94 to 68');
133 value['RESPONSECODE'] = '68'; 134 value['RESPONSECODE'] = '68';
134 } 135 }
135 136
136 var msg = prefixMessageWithSN(value); 137 var msg = prefixMessageWithSN(value);
137 138
138 callbackReport( 139 callbackReport(
139 task.requestId, value['RESPONSECODE'], msg, null, JSON.stringify({methodName: methodName, response: value}) 140 task.requestId, value['RESPONSECODE'], msg, null, JSON.stringify({methodName: methodName, response: value})
140 ); 141 );
141 }); 142 });
142 } 143 }
143 144
144 function prefixMessageWithSN(data) { 145 function prefixMessageWithSN(data) {
145 146
146 if (data['RESPONSECODE'] != '00') { 147 if (data['RESPONSECODE'] != '00') {
147 return data['MESSAGE']; 148 return data['MESSAGE'];
148 } 149 }
149 150
150 if (data['MESSAGE'].search(/^SN=.+;/) == -1) { 151 if (data['MESSAGE'].search(/^SN=.+;/) == -1) {
151 if (data['SN'] && data['SN'].trim()) { 152 if (data['SN'] && data['SN'].trim()) {
152 return 'SN=' + data['SN'].trim() + '; ' + data['MESSAGE']; 153 return 'SN=' + data['SN'].trim() + '; ' + data['MESSAGE'];
153 } 154 }
154 else if (config.h2h_out.parse_sn == 'YES') { 155 else if (config.h2h_out.parse_sn == 'YES') {
155 return 'SN=' + parseSN(data['MESSAGE']) + '; ' + data['MESSAGE']; 156 return 'SN=' + parseSN(data['MESSAGE']) + '; ' + data['MESSAGE'];
156 } 157 }
157 } 158 }
158 159
159 return data['MESSAGE']; 160 return data['MESSAGE'];
160 } 161 }
161 162
162 function createServer() { 163 function createServer() {
163 164
164 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 165 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
165 var serverOptions = { 166 var serverOptions = {
166 port: config.h2h_out.listen_port 167 port: config.h2h_out.listen_port
167 }; 168 };
168 169
169 var server = xmlrpc.createServer(serverOptions); 170 var server = xmlrpc.createServer(serverOptions);
170 171
171 server.on('NotFound', function (method, params) { 172 server.on('NotFound', function (method, params) {
172 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 173 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
173 }); 174 });
174 175
175 server.on('topUpReport', function (err, params, callback) { 176 server.on('topUpReport', function (err, params, callback) {
176 177
177 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 178 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
178 179
179 var paramscount = params.length; 180 var paramscount = params.length;
180 for (var i = 0; i < paramscount; i++) { 181 for (var i = 0; i < paramscount; i++) {
181 var value = params[i]; 182 var value = params[i];
182 183
183 if (value['RESPONSECODE'] == '94') { 184 if (value['RESPONSECODE'] == '94') {
184 logger.info('Change RC 94 to 68'); 185 logger.info('Change RC 94 to 68');
185 value['RESPONSECODE'] = '68'; 186 value['RESPONSECODE'] = '68';
186 } 187 }
187 188
188 var msg = prefixMessageWithSN(value); 189 var msg = prefixMessageWithSN(value);
189 190
190 callbackReport( 191 callbackReport(
191 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value}) 192 value['REQUESTID'], value['RESPONSECODE'], msg, null, JSON.stringify({methodName: 'topUpReport', msg: value})
192 ); 193 );
193 } 194 }
194 195
195 callback(null, 'ACK REPORT OK'); 196 callback(null, 'ACK REPORT OK');
196 }) 197 })
197 198
198 } 199 }
199 200
200 function getBalanceFromMessage(message, balance_regex) { 201 function getBalanceFromMessage(message, balance_regex) {
201 if (!balance_regex) { 202 if (!balance_regex) {
202 if (config && config.globals && config.globals.balance_regex) { 203 if (config && config.globals && config.globals.balance_regex) {
203 balance_regex = config.globals.balance_regex; 204 balance_regex = config.globals.balance_regex;
204 } 205 }
205 } 206 }
206 207
207 if (!balance_regex) { 208 if (!balance_regex) {
208 return; 209 return;
209 } 210 }
210 211
211 try { 212 try {
212 var re = new RegExp(balance_regex); 213 var re = new RegExp(balance_regex);
213 var matches = message.match(re); 214 var matches = message.match(re);
214 215
215 var result = matches[1]; 216 var result = matches[1];
216 result = result.replace(/\./g, ''); 217 result = result.replace(/\./g, '');
217 result = result.replace(/,/g, ''); 218 result = result.replace(/,/g, '');
218 219
219 220
220 return Number(result); 221 return Number(result);
221 } 222 }
222 catch(err) { 223 catch(err) {
223 return; 224 return;
224 } 225 }
225 } 226 }
226 227
227 function updateBalance(message) { 228 function updateBalance(message) {
228 var balance = getBalanceFromMessage(message); 229 var balance = getBalanceFromMessage(message);
229 if (balance) { 230 if (balance) {
230 logger.info('Balance: ' + balance); 231 logger.info('Balance: ' + balance);
231 aaa.updateBalance(balance); 232 aaa.updateBalance(balance);
232 } 233 }
233 } 234 }
234 235
235 function checkStatus(task) { 236 function checkStatus(task) {
236 237
237 if (Number(config.globals.topup_request_on_check_status)) { 238 if (Number(config.globals.topup_request_on_check_status)) {
238 _topupRequest(task, true); 239 _topupRequest(task, true);
239 return; 240 return;
240 } 241 }
241 242
242 var partnerUrl = url.parse(config.h2h_out.partner); 243 var partnerUrl = url.parse(config.h2h_out.partner);
243 var clientOptions = { 244 var clientOptions = {
244 host: partnerUrl.hostname 245 host: partnerUrl.hostname
245 , port: partnerUrl.port 246 , port: partnerUrl.port
246 , path: partnerUrl.pathname 247 , path: partnerUrl.pathname
247 }; 248 };
248 logger.info('XMLRPC client options:'); 249 logger.info('XMLRPC client options:');
249 logger.info(clientOptions); 250 logger.info(clientOptions);
250 251
251 var client; 252 var client;
252 if (partnerUrl.protocol == 'https:') { 253 if (partnerUrl.protocol == 'https:') {
253 client = xmlrpc.createSecureClient(clientOptions); 254 client = xmlrpc.createSecureClient(clientOptions);
254 } else { 255 } else {
255 client = xmlrpc.createClient(clientOptions); 256 client = xmlrpc.createClient(clientOptions);
256 } 257 }
257 258
258 var methodName = 'topUpInquiry'; 259 var methodName = 'topUpInquiry';
259 260
260 var params = { 261 var params = {
261 REQUESTID: task['requestId'], 262 REQUESTID: task['requestId'],
262 MSISDN: config.h2h_out.userid, 263 MSISDN: config.h2h_out.userid,
263 PIN: config.h2h_out.password, 264 PIN: config.h2h_out.password,
264 NOHP: task['destination'] 265 NOHP: task['destination']
265 }; 266 };
266 267
267 logger.info('Requesting topUpInquiry', {params: params}); 268 logger.info('Requesting topUpInquiry', {params: params});
268 269
269 client.methodCall(methodName, [ params ], function (error, value) { 270 client.methodCall(methodName, [ params ], function (error, value) {
270 // Results of the method response 271 // Results of the method response
271 if (error) { 272 if (error) {
272 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params}); 273 logger.warn('Error requesting topUpInquiry: ', {err: error, params: params});
273 callbackReport( 274 callbackReport(
274 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error}) 275 task.requestId, '68', 'Error requesting topUpInquiry: ' + error, null, JSON.stringify({methodName: methodName, error: error})
275 ); 276 );
276 return; 277 return;
277 } 278 }
278 logger.info('Method response for \'' + methodName, {response: value}); 279 logger.info('Method response for \'' + methodName, {response: value});
279 280
280 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value})); 281 callbackReport(task.requestId, value['RESPONSECODE'], value['MESSAGE'], null, JSON.stringify({methodName: methodName, response: value}));
281 }); 282 });
282 } 283 }
283 284
284 function start(options) { 285 function start(options) {
285 if (!options) { 286 if (!options) {
286 console.log('Undefined options, terminating....'); 287 console.log('Undefined options, terminating....');
287 process.exit(1); 288 process.exit(1);
288 } 289 }
289 290
290 if (options.config) { 291 if (options.config) {
291 config = options.config; 292 config = options.config;
292 } else { 293 } else {
293 console.log('Undefined options.config, terminating....') 294 console.log('Undefined options.config, terminating....')
294 process.exit(1); 295 process.exit(1);
295 } 296 }
296 297
297 if (options.aaa) { 298 if (options.aaa) {
298 aaa = options.aaa; 299 aaa = options.aaa;
299 _callbackReport = options.aaa.callbackReportWithPushToMongoDb; 300 _callbackReport = options.aaa.callbackReportWithPushToMongoDb;
300 } else { 301 } else {
301 console.log('Undefined options.aaa, terminating....') 302 console.log('Undefined options.aaa, terminating....')
302 process.exit(1); 303 process.exit(1);
303 } 304 }
304 305
305 if (options && options.logger) { 306 if (options && options.logger) {
306 logger = options.logger; 307 logger = options.logger;
307 } else { 308 } else {
308 logger = new winston.Logger({ 309 logger = new winston.Logger({
309 transports: [ 310 transports: [
310 new (winston.transports.Console)() 311 new (winston.transports.Console)()
311 ] 312 ]
312 }); 313 });
313 } 314 }
314 315
315 createRedisClient(config.globals.redis_host, config.globals.redis_port); 316 createRedisClient(config.globals.redis_host, config.globals.redis_port);
316 createServer(); 317 createServer();
317 318
318 var resendDelayOptions = { 319 var resendDelayOptions = {
319 config: config, 320 config: config,
320 topupRequest: checkStatus, 321 topupRequest: checkStatus,
321 logger: logger 322 logger: logger
322 }; 323 };
323 324
324 if (Number(config.globals.topup_request_on_resend_delay)) { 325 if (Number(config.globals.topup_request_on_resend_delay)) {
325 resendDelayOptions.topupRequest = topupRequest; 326 resendDelayOptions.topupRequest = topupRequest;
326 } 327 }
327 328
328 resendDelay.init(resendDelayOptions); 329 resendDelay.init(resendDelayOptions);
329 } 330 }
330 331
331 function parseSN(message, _config) { 332 function parseSN(message, _config) {
332 333
333 if (!_config) { 334 if (!_config) {
334 _config = config; 335 _config = config;
335 } 336 }
336 337
337 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 338 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
338 var sn_match = message.match(sn_regex); 339 var sn_match = message.match(sn_regex);
339 340
340 if (sn_match <= 0) { 341 if (sn_match <= 0) {
341 logger.info('SN Not found: ' + message); 342 logger.info('SN Not found: ' + message);
342 return ''; 343 return '';
343 } 344 }
344 345
345 var match_index = 0; 346 var match_index = 0;
346 if (_config.h2h_out.sn_match_index) { 347 if (_config.h2h_out.sn_match_index) {
347 match_index = Number(_config.h2h_out.sn_match_index); 348 match_index = Number(_config.h2h_out.sn_match_index);
348 } 349 }
349 350
350 var sn = sn_match[match_index]; 351 var sn = sn_match[match_index];
351 352
352 if (_config.h2h_out.sn_remove_whitespace) { 353 if (_config.h2h_out.sn_remove_whitespace) {
353 sn = sn.replace(/\s/g, ''); 354 sn = sn.replace(/\s/g, '');
354 } 355 }
355 356
356 var sn_remove_patterns = []; 357 var sn_remove_patterns = [];
357 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) { 358 if (_config.h2h_out.sn_remove_patterns && _config.h2h_out.sn_remove_patterns_separator) {
358 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 359 sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
359 } 360 }
360 var count = sn_remove_patterns.length; 361 var count = sn_remove_patterns.length;
361 362
362 for(var i = 0; i < count; i++) { 363 for(var i = 0; i < count; i++) {
363 364
364 //sn = sn.replace(sn_remove_patterns[i], ''); 365 //sn = sn.replace(sn_remove_patterns[i], '');
365 366
366 var re = new RegExp(sn_remove_patterns[i], 'g'); 367 var re = new RegExp(sn_remove_patterns[i], 'g');
367 sn = sn.replace(re, ''); 368 sn = sn.replace(re, '');
368 } 369 }
369 370
370 //sn = paddingSN(sn, _config); 371 //sn = paddingSN(sn, _config);
371 372
372 return sn.trim(); 373 return sn.trim();
373 } 374 }
374 375
375 function getTaskKey(task, chipInfo) { 376 function getTaskKey(task, chipInfo) {
376 var requestId; 377 var requestId;
377 378
378 if (typeof task === 'string') { 379 if (typeof task === 'string') {
379 requestId = task; 380 requestId = task;
380 } else { 381 } else {
381 try { 382 try {
382 requestId = task.requestId; 383 requestId = task.requestId;
383 } 384 }
384 catch(e) { 385 catch(e) {
385 logger.warn('Something wrong', {task: task}); 386 logger.warn('Something wrong', {task: task});
386 console.trace('Cekidot'); 387 console.trace('Cekidot');
387 process.exit(1); 388 process.exit(1);
388 } 389 }
389 390
390 } 391 }
391 392
392 if (!chipInfo && config && config.globals && config.globals.gateway_name) { 393 if (!chipInfo && config && config.globals && config.globals.gateway_name) {
393 chipInfo = config.globals.gateway_name; 394 chipInfo = config.globals.gateway_name;
394 } 395 }
395 396
396 return chipInfo + '.hitachi.rid:' + requestId; 397 return chipInfo + '.hitachi.rid:' + requestId;
397 } 398 }
398 399
399 400
400 function putTaskToHistory(task, cb) { 401 function putTaskToHistory(task, cb) {
401 if (Number(config.globals.no_dupe_check)) { 402 if (Number(config.globals.no_dupe_check)) {
402 if (cb) { cb(); } 403 if (cb) { cb(); }
403 return; 404 return;
404 } 405 }
405 var key = getTaskKey(task, config.globals.gateway_name); 406 var key = getTaskKey(task, config.globals.gateway_name);
406 logger.verbose('Saving task to history LRU', {key: key, task: task}); 407 logger.verbose('Saving task to history LRU', {key: key, task: task});
407 408
408 try { 409 try {
409 taskHistory.set(key, JSON.parse(JSON.stringify(task))); 410 taskHistory.set(key, JSON.parse(JSON.stringify(task)));
410 } catch (e) { } 411 } catch (e) { }
411 412
412 putTaskToRedis(task, cb); 413 putTaskToRedis(task, cb);
413 } 414 }
414 415
415 function putTaskToRedis(task, cb) { 416 function putTaskToRedis(task, cb) {
416 if (!redisClient) { 417 if (!redisClient) {
417 logger.verbose('Not saving to redis because of undefined redisClient') 418 logger.verbose('Not saving to redis because of undefined redisClient')
418 if (cb) { cb(); } 419 if (cb) { cb(); }
419 return; 420 return;
420 } 421 }
421 422
422 var key = getTaskKey(task, config.globals.gateway_name); 423 var key = getTaskKey(task, config.globals.gateway_name);
423 logger.verbose('Saving task to redis', {key: key, task: task}); 424 logger.verbose('Saving task to redis', {key: key, task: task});
424 425
425 redisClient.set(key, JSON.stringify(task), function() { 426 redisClient.set(key, JSON.stringify(task), function() {
426 redisClient.expire(key, 3600*24*30); 427 redisClient.expire(key, 3600*24*30);
427 if (cb) { 428 if (cb) {
428 cb(); 429 cb();
429 } 430 }
430 }); 431 });
431 } 432 }
432 433
433 function getTaskFromHistory(task, cb) { 434 function getTaskFromHistory(task, cb) {
434 logger.verbose('Getting task from history', {task: task}); 435 logger.verbose('Getting task from history', {task: task});
435 var key = getTaskKey(task, config.globals.gateway_name); 436 var key = getTaskKey(task, config.globals.gateway_name);
436 var archive = taskHistory.get(key); 437 var archive = taskHistory.get(key);
437 438
438 if (archive) { 439 if (archive) {
439 if (cb) { cb(null, archive); } 440 if (cb) { cb(null, archive); }
440 } 441 }
441 else { 442 else {
442 getTaskFromRedis(task, cb); 443 getTaskFromRedis(task, cb);
443 } 444 }
444 } 445 }
445 446
446 function getTaskFromRedis(task, cb) { 447 function getTaskFromRedis(task, cb) {
447 if (!redisClient) { 448 if (!redisClient) {
448 if (cb) { cb(null, null); } 449 if (cb) { cb(null, null); }
449 return; 450 return;
450 } 451 }
451 452
452 var key = getTaskKey(task, config.globals.gateway_name); 453 var key = getTaskKey(task, config.globals.gateway_name);
453 redisClient.get(key, function(err, result) { 454 redisClient.get(key, function(err, result) {
454 if (err) { 455 if (err) {
455 logger.warn('Error retrieving task from redis', {err: err}); 456 logger.warn('Error retrieving task from redis', {err: err});
456 cb(err, null); 457 cb(err, null);
457 return; 458 return;
458 } 459 }
459 460
460 var task; 461 var task;
461 try { 462 try {
462 task = JSON.parse(result); 463 task = JSON.parse(result);
463 } 464 }
464 catch(e) { 465 catch(e) {
465 logger.warn('Exception on parsing redis result as a json', {err: e}); 466 logger.warn('Exception on parsing redis result as a json', {err: e});
466 } 467 }
467 468
468 cb(null, task); 469 cb(null, task);
469 }) 470 })
470 } 471 }
471 472
472 exports.start = start; 473 exports.start = start;
473 exports.topupRequest = topupRequest; 474 exports.topupRequest = topupRequest;
474 exports.getBalanceFromMessage = getBalanceFromMessage; 475 exports.getBalanceFromMessage = getBalanceFromMessage;
475 exports.checkStatus = checkStatus; 476 exports.checkStatus = checkStatus;
476 477