Commit aa26f84e6cca1f0baa0b21c71debf9985c726017

Authored by Adhidarma Hadiwinoto
1 parent 77d71adf18
Exists in master

log to mongo

Showing 2 changed files with 86 additions and 1 deletions Inline Diff

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