Commit d2a493f07b5d0e1cc7671014a19884c20b54e4c1

Authored by Adhidarma Hadiwinoto
1 parent 64bb83404f
Exists in master

pushResponseToMongoDb with st24 rc

Showing 1 changed file with 40 additions and 37 deletions Inline Diff

1 var winston = require('winston'); 1 var winston = require('winston');
2 var request = require('request'); 2 var request = require('request');
3 var xmlrpc = require('xmlrpc'); 3 var xmlrpc = require('xmlrpc');
4 var url = require('url'); 4 var url = require('url');
5 var http = require('http'); 5 var http = require('http');
6 var mongoClient = require('mongodb').MongoClient; 6 var mongoClient = require('mongodb').MongoClient;
7 var strftime = require('strftime'); 7 var strftime = require('strftime');
8 var moment = require('moment'); 8 var moment = require('moment');
9 9
10 var max_retry = 3; 10 var max_retry = 3;
11 var sleep_before_retry = 2000; 11 var sleep_before_retry = 2000;
12 12
13 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 13 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
14 14
15 var config; 15 var config;
16 var callbackReport; 16 var callbackReport;
17 var aaa; 17 var aaa;
18 var logger; 18 var logger;
19 var options; 19 var options;
20 var mongodb; 20 var mongodb;
21 21
22 function start(_config, _callbackReport, options) { 22 function start(_config, _callbackReport, options) {
23 config = _config; 23 config = _config;
24 callbackReport = _callbackReport 24 callbackReport = _callbackReport
25 25
26 if (options && options.aaa) { 26 if (options && options.aaa) {
27 aaa = options.aaa; 27 aaa = options.aaa;
28 } 28 }
29 29
30 if (options && options.logger) { 30 if (options && options.logger) {
31 logger = options.logger; 31 logger = options.logger;
32 } else { 32 } else {
33 logger = new winston.Logger({ 33 logger = new winston.Logger({
34 transports: [ 34 transports: [
35 new (winston.transports.Console)() 35 new (winston.transports.Console)()
36 ] 36 ]
37 }); 37 });
38 } 38 }
39 39
40 createXMLRPCServer(); 40 createXMLRPCServer();
41 initMongoClient(); 41 initMongoClient();
42 } 42 }
43 43
44 function createXMLRPCServer() { 44 function createXMLRPCServer() {
45 45
46 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 46 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
47 var serverOptions = { 47 var serverOptions = {
48 port: config.h2h_out.listen_port 48 port: config.h2h_out.listen_port
49 }; 49 };
50 50
51 var server = xmlrpc.createServer(serverOptions); 51 var server = xmlrpc.createServer(serverOptions);
52 52
53 server.on('NotFound', function (method, params) { 53 server.on('NotFound', function (method, params) {
54 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 54 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
55 }); 55 });
56 56
57 server.on('topUpReport', function (err, params, callback) { 57 server.on('topUpReport', function (err, params, callback) {
58 58
59 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 59 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
60 60
61 var paramscount = params.length; 61 var paramscount = params.length;
62 for (var i = 0; i < paramscount; i++) { 62 for (var i = 0; i < paramscount; i++) {
63 var value = params[i]; 63 var value = params[i];
64 64
65 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 65 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
66 var dummyTask = { requestId: value.REQUESTID }; 66 var dummyTask = { requestId: value.REQUESTID };
67 pushResponseToMongoDb(dummyTask, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}); 67
68
69 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 68 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
70 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 69 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
71 } 70 }
72 71
73 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') { 72 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
74 value['RESPONSECODE'] = '40'; 73 value['RESPONSECODE'] = '40';
75 } 74 }
76 75
76 pushResponseToMongoDb(dummyTask, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']);
77
77 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 78 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
78 } 79 }
79 80
80 callback(null, 'ACK REPORT OK'); 81 callback(null, 'ACK REPORT OK');
81 }) 82 })
82 } 83 }
83 84
84 function topupRequestHttpGet(task, retry) { 85 function topupRequestHttpGet(task, retry) {
85 86
86 var options = { 87 var options = {
87 method: 'GET', 88 method: 'GET',
88 url: config.h2h_out.partner, 89 url: config.h2h_out.partner,
89 qs: { 90 qs: {
90 id: config.h2h_out.userid, 91 id: config.h2h_out.userid,
91 pin: config.h2h_out.pin, 92 pin: config.h2h_out.pin,
92 user: config.h2h_out.user, 93 user: config.h2h_out.user,
93 pass: config.h2h_put.password, 94 pass: config.h2h_put.password,
94 kodeproduk: task.remoteProduct, 95 kodeproduk: task.remoteProduct,
95 tujuan: task.destination, 96 tujuan: task.destination,
96 idtrx: task.requestId 97 idtrx: task.requestId
97 } 98 }
98 } 99 }
99 100
100 request(options, function(err, res, body) { 101 request(options, function(err, res, body) {
101 }); 102 });
102 } 103 }
103 104
104 function topupRequestXMLRPC(task, retry) { 105 function topupRequestXMLRPC(task, retry) {
105 var partnerUrl = url.parse(config.h2h_out.partner); 106 var partnerUrl = url.parse(config.h2h_out.partner);
106 var clientOptions = { 107 var clientOptions = {
107 host: partnerUrl.hostname 108 host: partnerUrl.hostname
108 , port: partnerUrl.port 109 , port: partnerUrl.port
109 , path: partnerUrl.pathname 110 , path: partnerUrl.pathname
110 }; 111 };
111 logger.info('Preparing XMLRPC client options', {options: clientOptions}); 112 logger.info('Preparing XMLRPC client options', {options: clientOptions});
112 113
113 var client; 114 var client;
114 if (partnerUrl.protocol == 'https:') { 115 if (partnerUrl.protocol == 'https:') {
115 client = xmlrpc.createSecureClient(clientOptions); 116 client = xmlrpc.createSecureClient(clientOptions);
116 } else { 117 } else {
117 client = xmlrpc.createClient(clientOptions); 118 client = xmlrpc.createClient(clientOptions);
118 } 119 }
119 120
120 var params = { 121 var params = {
121 MSISDN: config.h2h_out.userid, 122 MSISDN: config.h2h_out.userid,
122 REQUESTID: task.requestId, 123 REQUESTID: task.requestId,
123 PIN: config.h2h_out.password, 124 PIN: config.h2h_out.password,
124 NOHP: task.destination, 125 NOHP: task.destination,
125 NOM: task.remoteProduct 126 NOM: task.remoteProduct
126 }; 127 };
127 128
128 var methodName = 'topUpRequest'; 129 var methodName = 'topUpRequest';
129 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params}); 130 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params});
130 131
131 client.methodCall(methodName, [ params ], function (error, value) { 132 client.methodCall(methodName, [ params ], function (error, value) {
132 // Results of the method response 133 // Results of the method response
133 if (error) { 134 if (error) {
134 135
135 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error}); 136 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error});
136 137
137 if (retry) { 138 if (retry) {
138 139
139 logger.info('Retrying topUpRequest (' + retry + ')'); 140 logger.info('Retrying topUpRequest (' + retry + ')');
140 setTimeout(function() { 141 setTimeout(function() {
141 topupRequest(task, retry - 1); 142 topupRequest(task, retry - 1);
142 }, sleep_before_retry); 143 }, sleep_before_retry);
143 144
144 } else { 145 } else {
145 callbackReport(task['requestId'], '68', 'Silahkan resend. Gangguan koneksi ke suplier: ' + error); 146 callbackReport(task['requestId'], '68', 'Silahkan resend. Gangguan koneksi ke suplier: ' + error);
146 } 147 }
147 return; 148 return;
148 } 149 }
149 150
150 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value}); 151 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value});
151 152
152 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 153 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
153 pushResponseToMongoDb(task, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}); 154
154
155 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 155 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
156 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 156 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
157 } 157 }
158 158
159 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') { 159 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
160 value['RESPONSECODE'] = '40'; 160 value['RESPONSECODE'] = '40';
161 } 161 }
162 162
163 pushResponseToMongoDb(task, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']);
164
163 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 165 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
164 }); 166 });
165 } 167 }
166 168
167 function topupRequest(task, retry) { 169 function topupRequest(task, retry) {
168 if (retry === undefined) { 170 if (retry === undefined) {
169 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss'); 171 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss');
170 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD'); 172 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD');
171 173
172 insertTaskToMongoDb(task); 174 insertTaskToMongoDb(task);
173 } 175 }
174 176
175 topupRequestXMLRPC(task, retry); 177 topupRequestXMLRPC(task, retry);
176 } 178 }
177 179
178 function initMongoClient() { 180 function initMongoClient() {
179 if (!config.mongodb || !config.mongodb.url) { 181 if (!config.mongodb || !config.mongodb.url) {
180 return; 182 return;
181 } 183 }
182 184
183 try { 185 try {
184 var url = config.mongodb.url; 186 var url = config.mongodb.url;
185 187
186 mongoClient.connect(url, function(err, db) { 188 mongoClient.connect(url, function(err, db) {
187 if (err) { 189 if (err) {
188 logger.warn('Failed to connect to mongodb', {err: err}); 190 logger.warn('Failed to connect to mongodb', {err: err});
189 return; 191 return;
190 } 192 }
191 mongodb = db; 193 mongodb = db;
192 logger.info('MongoDB connected'); 194 logger.info('MongoDB connected');
193 }); 195 });
194 } 196 }
195 catch(err) { 197 catch(err) {
196 logger.warn('Exception when connecting to mongodb', {err: err, url: url}); 198 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
197 } 199 }
198 } 200 }
199 201
200 function isMongoReady() { 202 function isMongoReady() {
201 if (!config.mongodb) { return; } 203 if (!config.mongodb) { return; }
202 if (!config.mongodb.collection) { return; } 204 if (!config.mongodb.collection) { return; }
203 if (!mongodb) { return; } 205 if (!mongodb) { return; }
204 206
205 return true; 207 return true;
206 } 208 }
207 209
208 function insertTaskToMongoDb(task) { 210 function insertTaskToMongoDb(task) {
209 if (!isMongoReady()) { return; } 211 if (!isMongoReady()) { return; }
210 212
211 task.supplier = config.globals.gateway_name; 213 task.supplier = config.globals.gateway_name;
212 214
213 try { 215 try {
214 mongodb.collection(config.mongodb.collection).insertOne(task); 216 mongodb.collection(config.mongodb.collection).insertOne(task);
215 } 217 }
216 catch(err) { 218 catch(err) {
217 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task}); 219 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
218 } 220 }
219 } 221 }
220 222
221 function pushResponseToMongoDb(task, response) { 223 function pushResponseToMongoDb(task, response, rc) {
222 if (!isMongoReady()) { return; } 224 if (!isMongoReady()) { return; }
223 225
224 try { 226 try {
225 mongodb.collection(config.mongodb.collection).updateOne( 227 mongodb.collection(config.mongodb.collection).updateOne(
226 {requestId: task.requestId}, 228 {requestId: task.requestId},
227 { 229 {
228 $set: { 230 $set: {
229 lastResponse: response, 231 lastResponse: response,
230 supplier: config.globals.gateway_name 232 supplier: config.globals.gateway_name,
233 rc: rc
231 }, 234 },
232 $push: { 235 $push: {
233 responses: response 236 responses: response
234 } 237 }
235 }, 238 },
236 function(err, result) { 239 function(err, result) {
237 if (err) { 240 if (err) {
238 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response}); 241 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
239 return; 242 return;
240 } 243 }
241 } 244 }
242 ); 245 );
243 } 246 }
244 catch(err) { 247 catch(err) {
245 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response}); 248 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
246 } 249 }
247 } 250 }
248 251
249 exports.start = start; 252 exports.start = start;