Commit 6067d57a10ac264601063ccb85bec54058788b5e

Authored by Adhidarma Hadiwinoto
1 parent dc7544b9d9
Exists in master

perbaikan callbackReport

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