Commit d6bc9c5dc704d00b00dc7721a4f239c3fa9f6f98

Authored by Adhidarma Hadiwinoto
1 parent 7f973cb2b2
Exists in master

log on xmlrpc error

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