Commit b8d9df08791b881c5e7ee5d17d3b3bdb4ecfad16

Authored by Adhidarma Hadiwinoto
1 parent 5b3574125b
Exists in master

advice

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

1 var url = require('url'); 1 var url = require('url');
2 var math = require('mathjs'); 2 var math = require('mathjs');
3 var request = require('request'); 3 var request = require('request');
4 var xml = require("xml2js").parseString; 4 var xml = require("xml2js").parseString;
5 var winston = require('winston'); 5 var winston = require('winston');
6 6
7 var logger; 7 var logger;
8 var config; 8 var config;
9 var callbackReport; 9 var callbackReport;
10 10
11 var max_retry = 15; 11 var max_retry = 15;
12 var sleep_before_retry = 3000; 12 var sleep_before_retry = 60 * 1000;
13 13
14 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 14 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
15 15
16 function parseSN(message, _config) { 16 function parseSN(message, _config) {
17 17
18 if (!_config) { 18 if (!_config) {
19 _config = config; 19 _config = config;
20 } 20 }
21 21
22 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 22 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
23 var sn_match = message.match(sn_regex); 23 var sn_match = message.match(sn_regex);
24 24
25 if (sn_match <= 0) { 25 if (sn_match <= 0) {
26 logger.info('SN Not found: ' + message); 26 logger.info('SN Not found: ' + message);
27 return ''; 27 return '';
28 } 28 }
29 29
30 var sn = sn_match[0]; 30 var sn = sn_match[0];
31 var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 31 var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
32 32
33 var count = sn_remove_patterns.length; 33 var count = sn_remove_patterns.length;
34 34
35 for(var i = 0; i < count; i++) { 35 for(var i = 0; i < count; i++) {
36 sn = sn.replace(sn_remove_patterns[i], ''); 36 sn = sn.replace(sn_remove_patterns[i], '');
37 } 37 }
38 38
39 return sn.trim(); 39 return sn.trim();
40 } 40 }
41 41
42
43 function topupRequest(task, retry) { 42 function topupRequest(task, retry) {
44 /* 43 /*
45 if (config.globals.requests_count == undefined) { 44 if (config.globals.requests_count == undefined) {
46 config.globals.requests_count = 1; 45 config.globals.requests_count = 1;
47 } else { 46 } else {
48 config.globals.requests_count++; 47 config.globals.requests_count++;
49 } 48 }
50 49
51 if (config.globals.active_requests_count == undefined) { 50 if (config.globals.active_requests_count == undefined) {
52 config.globals.active_requests_count = 1; 51 config.globals.active_requests_count = 1;
53 } else { 52 } else {
54 config.globals.active_requests_count++; 53 config.globals.active_requests_count++;
55 } 54 }
56 55
57 if (config.globals.max_active_requests_count == undefined) { 56 if (config.globals.max_active_requests_count == undefined) {
58 config.globals.max_active_requests_count = config.globals.active_requests_count; 57 config.globals.max_active_requests_count = config.globals.active_requests_count;
59 } else { 58 } else {
60 config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); 59 config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count);
61 } 60 }
62 */ 61 */
63 62
64 63
65 if (retry === undefined) { 64 if (retry === undefined) {
66 retry = max_retry; 65 retry = max_retry;
67 } 66 }
68 67
69 var params = { 68 var params = {
70 userid: config.h2h_out.userid, 69 userid: config.h2h_out.userid,
71 pwd: config.h2h_out.password, 70 pwd: config.h2h_out.password,
72 memberreff: task['requestId'], 71 memberreff: task['requestId'],
73 produk: task['remoteProduct'], 72 produk: task['remoteProduct'],
74 tujuan: task['destination'] 73 tujuan: task['destination']
75 }; 74 };
76 logger.info('Creating http request to gateway', {params: params}); 75 logger.info('Creating http request to gateway', {params: params});
77 76
78 request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { 77 request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) {
79 78
80 /* 79 /*
81 config.globals.active_requests_count--; 80 config.globals.active_requests_count--;
82 */ 81 */
83 82
84 if (err) { 83 if (err) {
85 logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err); 84 logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err);
86 85
87 callbackReport(task['requestId'], '89', 'Gangguan koneksi ke suplier'); 86 callbackReport(task['requestId'], '89', 'Gangguan koneksi ke suplier');
88 return; 87 return;
89 } 88 }
90 89
91 logger.info('Got response from gateway ', {response_body: httpResponseBody}); 90 logger.info('Got response from gateway ', {response_body: httpResponseBody});
92 91
93 if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { 92 if (httpResponseBody.indexOf('502 Proxy Error') >= 0) {
94 callbackReport(task['requestId'], '91', '502 Proxy error'); 93 callbackReport(task['requestId'], '91', '502 Proxy error');
95 return; 94 return;
96 } 95 }
97 96
98 xml(httpResponseBody, function(err, result) { 97 xml(httpResponseBody, function(err, result) {
99 if (err) { 98 if (err) {
100 logger.warn('Gagal parsing XML respon server'); 99 logger.warn('Gagal parsing XML respon server');
101 //topupRequest(task, retry - 1); 100 //topupRequest(task, retry - 1);
102 callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); 101 callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server');
103 return; 102 return;
104 } 103 }
105 104
106 logger.info('Response Data:', {result: result}); 105 logger.info('Response Data:', {result: result});
107 106
108 var response_code = result.respon.rc[0].replace(/^00/, ''); 107 var response_code = result.respon.rc[0].replace(/^00/, '');
109 if (response_code == '54' || response_code == '68') { 108 if (response_code == '54' || response_code == '68') {
110 if (retry) { 109 if (retry) {
111 setTimeout(function() { 110 setTimeout(function() {
111
112 logger.info('Sending advice', {task: task});
113
114 task['remoteProduct'] = 'ADVPLN';
112 topupRequest(task, retry - 1); 115 topupRequest(task, retry - 1);
113 }, 60000); 116
117 }, sleep_before_retry);
114 118
115 } else { 119 } else {
116 callbackReport(task['requestId'], '68', message); 120 logger.warn('Max retries exceeded', {task: task});
121 callbackReport(task['requestId'], '68', message + '. Max retries exceeded');
117 } 122 }
118 return; 123 return;
119 } 124 }
120 125
121 var token = ''; 126 var token = '';
122 if (result.respon.token) { 127 if (result.respon.token) {
123 token = result.respon.token[0]; 128 token = result.respon.token[0];
124 } 129 }
125 130
126 var data_pelanggan = 'NO-DATA'; 131 var data_pelanggan = 'NO-DATA';
127 if (result.respon.data) { 132 if (result.respon.data) {
128 data_pelanggan = result.respon.data[0].replace(/ /g, '-'); 133 data_pelanggan = result.respon.data[0].replace(/ /g, '-');
129 } 134 }
130 135
131 var message = result.respon.pesan[0].replace(/\n/g, ' '); 136 var message = result.respon.pesan[0].replace(/\n/g, ' ');
132 137
133 138
134 if (response_code == '00') { 139 if (response_code == '00') {
135 140
136 var sn = ""; 141 var sn = "";
137 142
138 if (config.h2h_out.parse_sn == 'YES') { 143 if (config.h2h_out.parse_sn == 'YES') {
139 sn = parseSN(message); 144 sn = parseSN(message);
140 } else if (token && data_pelanggan) { 145 } else if (token && data_pelanggan) {
141 sn = token + '/' + data_pelanggan; 146 sn = token + '/' + data_pelanggan;
142 } 147 }
143 148
144 message = 'SN=' + sn + '; ' + message; 149 message = 'SN=' + sn + '; ' + message;
145 } 150 }
146 151
147 callbackReport(task['requestId'], response_code, message); 152 callbackReport(task['requestId'], response_code, message);
148 153
149 }); 154 });
150 }); 155 });
151 } 156 }
152 157
153 function start(_config, _callbackReport, options) { 158 function start(_config, _callbackReport, options) {
154 config = _config; 159 config = _config;
155 callbackReport = _callbackReport 160 callbackReport = _callbackReport
156 161
157 if (options && options.logger) { 162 if (options && options.logger) {
158 logger = options.logger; 163 logger = options.logger;
159 } else { 164 } else {
160 logger = new winston.Logger({ 165 logger = new winston.Logger({
161 transports: [ 166 transports: [
162 new (winston.transports.Console)() 167 new (winston.transports.Console)()
163 ] 168 ]
164 }); 169 });
165 } 170 }
166 } 171 }
167 172
168 function parseResult(message) { 173 function parseResult(message) {
169 var data; 174 var data;
170 xml(message, function(err, result) { 175 xml(message, function(err, result) {
171 data = result; 176 data = result;
172 }); 177 });
173 return data; 178 return data;
174 } 179 }
175 180
176 exports.start = start; 181 exports.start = start;
177 exports.topupRequest = topupRequest; 182 exports.topupRequest = topupRequest;
178 exports.parseResult = parseResult; 183 exports.parseResult = parseResult;
179 exports.parseSN = parseSN; 184 exports.parseSN = parseSN;