Commit b8d9df08791b881c5e7ee5d17d3b3bdb4ecfad16
1 parent
5b3574125b
Exists in
master
advice
Showing 1 changed file with 9 additions and 4 deletions Inline Diff
httppulsakita.js
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; |