Commit 12fefbf359d96e7747cf4598d54106a54e2dcd6a

Authored by Adhidarma Hadiwinoto
1 parent b16c1c9402
Exists in master

resendDelay pakai checkStatus

Showing 1 changed file with 2 additions and 3 deletions Inline Diff

1 "use strict"; 1 "use strict";
2 2
3 var request = require('request'); 3 var request = require('request');
4 var crypto = require('crypto'); 4 var crypto = require('crypto');
5 var url = require('url'); 5 var url = require('url');
6 var http = require('http'); 6 var http = require('http');
7 7
8 var resendDelay = require('sate24/resend-delay'); 8 var resendDelay = require('sate24/resend-delay');
9 var taskHistory = require('sate24/task-history'); 9 var taskHistory = require('sate24/task-history');
10 var antiSameDayDupe = require('sate24/anti-same-day-dupe'); 10 var antiSameDayDupe = require('sate24/anti-same-day-dupe');
11 11
12 var config; 12 var config;
13 var aaa; 13 var aaa;
14 var logger; 14 var logger;
15 15
16 16
17 function start(options) { 17 function start(options) {
18 if (!options) { 18 if (!options) {
19 console.log('Undefined options, terminating....'); 19 console.log('Undefined options, terminating....');
20 process.exit(1); 20 process.exit(1);
21 } 21 }
22 22
23 if (options.config) { 23 if (options.config) {
24 config = options.config; 24 config = options.config;
25 } else { 25 } else {
26 console.log('Undefined options.config, terminating....') 26 console.log('Undefined options.config, terminating....')
27 process.exit(1); 27 process.exit(1);
28 } 28 }
29 29
30 if (options.aaa) { 30 if (options.aaa) {
31 aaa = options.aaa; 31 aaa = options.aaa;
32 } else { 32 } else {
33 console.log('Undefined options.aaa, terminating....') 33 console.log('Undefined options.aaa, terminating....')
34 process.exit(1); 34 process.exit(1);
35 } 35 }
36 36
37 if (options && options.logger) { 37 if (options && options.logger) {
38 logger = options.logger; 38 logger = options.logger;
39 } else { 39 } else {
40 console.log('Undefined options.logger, terminating....') 40 console.log('Undefined options.logger, terminating....')
41 process.exit(1); 41 process.exit(1);
42 } 42 }
43 43
44 resendDelay.init({ 44 resendDelay.init({
45 config: config, 45 config: config,
46 topupRequest: topupRequest, 46 topupRequest: checkStatus,
47 logger: logger, 47 logger: logger
48 topupRequest: checkStatus
49 }); 48 });
50 49
51 taskHistory.init(options); 50 taskHistory.init(options);
52 antiSameDayDupe.init(options); 51 antiSameDayDupe.init(options);
53 52
54 createReverseHttpServer(); 53 createReverseHttpServer();
55 } 54 }
56 55
57 function callbackReport(requestId, rc, message) { 56 function callbackReport(requestId, rc, message) {
58 if (rc != '68') { 57 if (rc != '68') {
59 resendDelay.cancel(requestId); 58 resendDelay.cancel(requestId);
60 } else { 59 } else {
61 taskHistory.get(requestId, function(err, archivedTask) { 60 taskHistory.get(requestId, function(err, archivedTask) {
62 if (archivedTask) { 61 if (archivedTask) {
63 resendDelay.register(archivedTask); 62 resendDelay.register(archivedTask);
64 } else { 63 } else {
65 logger.warn('Can not find task from history', {request_id: requestId}); 64 logger.warn('Can not find task from history', {request_id: requestId});
66 } 65 }
67 }); 66 });
68 } 67 }
69 68
70 aaa.callbackReportWithPushToMongoDb(requestId, rc, message); 69 aaa.callbackReportWithPushToMongoDb(requestId, rc, message);
71 } 70 }
72 71
73 function topupRequest(task) { 72 function topupRequest(task) {
74 if (!aaa.isTodayTrx(task)) { 73 if (!aaa.isTodayTrx(task)) {
75 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); 74 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan');
76 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); 75 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan');
77 resendDelay.cancel(task); 76 resendDelay.cancel(task);
78 return; 77 return;
79 } 78 }
80 79
81 aaa.insertTaskToMongoDb(task); 80 aaa.insertTaskToMongoDb(task);
82 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, checkStatus); 81 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, checkStatus);
83 } 82 }
84 83
85 function _topupRequest(task) { 84 function _topupRequest(task) {
86 taskHistory.put(task, function() { 85 taskHistory.put(task, function() {
87 requestToPartner(task);; 86 requestToPartner(task);;
88 }); 87 });
89 } 88 }
90 89
91 function checkStatus(task) { 90 function checkStatus(task) {
92 taskHistory.put(task, function() { 91 taskHistory.put(task, function() {
93 requestToPartner(task, true); 92 requestToPartner(task, true);
94 }); 93 });
95 } 94 }
96 95
97 function requestToPartner(task, pendingOnErrorConnect) { 96 function requestToPartner(task, pendingOnErrorConnect) {
98 let requestOptions = createRequestOptions(task); 97 let requestOptions = createRequestOptions(task);
99 98
100 logger.info('Requesting to partner', {task: task, request_options: requestOptions}); 99 logger.info('Requesting to partner', {task: task, request_options: requestOptions});
101 100
102 request(requestOptions, function(error, response, body) { 101 request(requestOptions, function(error, response, body) {
103 if (error) { 102 if (error) {
104 let rc = '68'; 103 let rc = '68';
105 104
106 if (!pendingOnErrorConnect && (error.syscall == 'connect')) { 105 if (!pendingOnErrorConnect && (error.syscall == 'connect')) {
107 rc = '91'; 106 rc = '91';
108 } 107 }
109 108
110 logger.warn('Error requesting to partner', {task: task, rc: rc, error: error}); 109 logger.warn('Error requesting to partner', {task: task, rc: rc, error: error});
111 callbackReport(task.requestId, rc, 'Error requesting to partner. ' + error); 110 callbackReport(task.requestId, rc, 'Error requesting to partner. ' + error);
112 return; 111 return;
113 } 112 }
114 113
115 if (response.statusCode != 200) { 114 if (response.statusCode != 200) {
116 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); 115 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode});
117 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode); 116 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode);
118 return; 117 return;
119 } 118 }
120 119
121 logger.verbose('Got response from partner', {task: task, body: body}); 120 logger.verbose('Got response from partner', {task: task, body: body});
122 121
123 parseMessage(task, body); 122 parseMessage(task, body);
124 }); 123 });
125 } 124 }
126 125
127 function getRequestIdFromTask(task) { 126 function getRequestIdFromTask(task) {
128 if (typeof task == 'string') { 127 if (typeof task == 'string') {
129 return task; 128 return task;
130 } 129 }
131 130
132 try { 131 try {
133 let requestId = task.requestId; 132 let requestId = task.requestId;
134 return requestId; 133 return requestId;
135 } 134 }
136 catch(e) {return}; 135 catch(e) {return};
137 } 136 }
138 137
139 function parseMessage(task, message) { 138 function parseMessage(task, message) {
140 let requestId = getRequestIdFromTask(task); 139 let requestId = getRequestIdFromTask(task);
141 140
142 if (!requestId) { 141 if (!requestId) {
143 logger.warn('Invalid requestId on parseMessage', {task: task, message: message}); 142 logger.warn('Invalid requestId on parseMessage', {task: task, message: message});
144 return; 143 return;
145 } 144 }
146 145
147 let rc = '68'; 146 let rc = '68';
148 147
149 if (message.indexOf('SUKSES') >= 0) { 148 if (message.indexOf('SUKSES') >= 0) {
150 rc = '00'; 149 rc = '00';
151 } 150 }
152 else if (message.indexOf('GAGAL. Nomor tujuan salah') >= 0) { 151 else if (message.indexOf('GAGAL. Nomor tujuan salah') >= 0) {
153 rc = '14'; 152 rc = '14';
154 } 153 }
155 else if (message.indexOf('NO HP TIDAK TERDAFTAR ATAU BUKAN NOMOR PRA-BAYAR') >= 0) { 154 else if (message.indexOf('NO HP TIDAK TERDAFTAR ATAU BUKAN NOMOR PRA-BAYAR') >= 0) {
156 rc = '14'; 155 rc = '14';
157 } 156 }
158 else if (message.indexOf('Gagal.') >= 0) { 157 else if (message.indexOf('Gagal.') >= 0) {
159 rc = '40'; 158 rc = '40';
160 } 159 }
161 else if (message.indexOf('GAGAL') >= 0) { 160 else if (message.indexOf('GAGAL') >= 0) {
162 rc = '40'; 161 rc = '40';
163 } 162 }
164 else if (message.indexOf('gagal, dibatalkan SILAHKAN DICOBA KEMBALI') >= 0) { 163 else if (message.indexOf('gagal, dibatalkan SILAHKAN DICOBA KEMBALI') >= 0) {
165 rc = '40'; 164 rc = '40';
166 } 165 }
167 else if (message.indexOf('Invalid Signature') >= 0) { 166 else if (message.indexOf('Invalid Signature') >= 0) {
168 rc = '40'; 167 rc = '40';
169 } 168 }
170 169
171 if (rc == '00') { 170 if (rc == '00') {
172 let sn = parseSn(message, config.h2h_out.sn_pattern); 171 let sn = parseSn(message, config.h2h_out.sn_pattern);
173 if (sn) { 172 if (sn) {
174 message = "SN=" + sn + ";" + message; 173 message = "SN=" + sn + ";" + message;
175 } 174 }
176 } 175 }
177 176
178 callbackReport(requestId, rc, message); 177 callbackReport(requestId, rc, message);
179 } 178 }
180 179
181 function generateSign(userid, remoteProduct, destination, requestId, pin, password) { 180 function generateSign(userid, remoteProduct, destination, requestId, pin, password) {
182 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|"); 181 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|");
183 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex'); 182 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex');
184 //let buffer = new Buffer(sha1); 183 //let buffer = new Buffer(sha1);
185 let buffer = crypto.createHash('sha1').update(plain).digest(); 184 let buffer = crypto.createHash('sha1').update(plain).digest();
186 185
187 return buffer.toString('base64').replace(/\//g, '_').replace(/\+/g, '-'); 186 return buffer.toString('base64').replace(/\//g, '_').replace(/\+/g, '-');
188 } 187 }
189 188
190 function createRequestOptions(task) { 189 function createRequestOptions(task) {
191 return { 190 return {
192 url: config.h2h_out.partner, 191 url: config.h2h_out.partner,
193 qs: { 192 qs: {
194 memberID: config.h2h_out.userid, 193 memberID: config.h2h_out.userid,
195 product: task.remoteProduct, 194 product: task.remoteProduct,
196 dest: task.destination, 195 dest: task.destination,
197 refID: task.requestId, 196 refID: task.requestId,
198 sign: generateSign( 197 sign: generateSign(
199 config.h2h_out.userid, 198 config.h2h_out.userid,
200 task.remoteProduct, 199 task.remoteProduct,
201 task.destination, 200 task.destination,
202 task.requestId, 201 task.requestId,
203 config.h2h_out.pin, 202 config.h2h_out.pin,
204 config.h2h_out.password 203 config.h2h_out.password
205 ) 204 )
206 } 205 }
207 }; 206 };
208 } 207 }
209 208
210 function onSameDayDupe(task) { 209 function onSameDayDupe(task) {
211 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama'); 210 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama');
212 } 211 }
213 212
214 function reverseHttpServerServerHandler(request, response) { 213 function reverseHttpServerServerHandler(request, response) {
215 let qs = url.parse(request.url, true).query; 214 let qs = url.parse(request.url, true).query;
216 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs}); 215 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs});
217 216
218 parseMessage(qs.refid, qs.message); 217 parseMessage(qs.refid, qs.message);
219 } 218 }
220 219
221 function createReverseHttpServer() { 220 function createReverseHttpServer() {
222 var httpServer = http.createServer(reverseHttpServerServerHandler); 221 var httpServer = http.createServer(reverseHttpServerServerHandler);
223 222
224 httpServer.listen(config.h2h_out.listen_port, function() { 223 httpServer.listen(config.h2h_out.listen_port, function() {
225 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port); 224 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port);
226 }); 225 });
227 } 226 }
228 227
229 function parseSn(message, pattern) { 228 function parseSn(message, pattern) {
230 229
231 try { 230 try {
232 let sn_regex = new RegExp(pattern); 231 let sn_regex = new RegExp(pattern);
233 let sn_match = message.match(sn_regex); 232 let sn_match = message.match(sn_regex);
234 233
235 return sn_match[1].trim(); 234 return sn_match[1].trim();
236 } 235 }
237 catch(e) { 236 catch(e) {
238 return; 237 return;
239 } 238 }
240 239
241 } 240 }
242 241
243 exports.start = start; 242 exports.start = start;
244 exports.topupRequest = topupRequest; 243 exports.topupRequest = topupRequest;
245 exports.checkStatus = checkStatus; 244 exports.checkStatus = checkStatus;
246 exports.generateSign = generateSign; 245 exports.generateSign = generateSign;
247 exports.parseSn = parseSn; 246 exports.parseSn = parseSn;
248 247