Commit a5de2a87ff27f34e224c1dde061a9896f33cd676

Authored by Adhidarma Hadiwinoto
1 parent 28604420b4
Exists in master

callbackReport pakai task.requestId

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

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