Commit cf07389090209ed6495478773c8e744c9b9de679

Authored by Adhidarma Hadiwinoto
1 parent 16d8ec8bba
Exists in master

simplifikasi topupRequest error

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