Commit 1a0a4c0beeb0c27c36993f7be5b2a83ad44705ef

Authored by Adhidarma Hadiwinoto
1 parent 34c1fc6aa5
Exists in master

mongodb

Showing 2 changed files with 80 additions and 2 deletions Side-by-side Diff

... ... @@ -21,8 +21,10 @@
21 21 "dependencies": {
22 22 "crypto": "0.0.3",
23 23 "ini": "^1.3.4",
  24 + "mongodb": "^2.1.18",
24 25 "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git",
25 26 "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git",
  27 + "strftime": "^0.9.2",
26 28 "winston": "^2.2.0",
27 29 "xml": "^1.0.1",
28 30 "xml2js": "^0.4.16"
... ... @@ -4,12 +4,37 @@ var xml = require('xml');
4 4 var url = require('url');
5 5 var http = require('http');
6 6 var xml2js = require('xml2js').parseString;
  7 +var mongoClient = require('mongodb').MongoClient;
  8 +var strftime = require('strftime');
7 9  
8 10 var config;
9 11 var callbackReport;
10 12 var aaa;
11 13 var logger;
12 14 var options;
  15 +var mongodb;
  16 +
  17 +function initMongoClient() {
  18 + if (!config.mongodb || !config.mongodb.url) {
  19 + return;
  20 + }
  21 +
  22 + try {
  23 + var url = config.mongodb.url;
  24 +
  25 + mongoClient.connect(url, function(err, db) {
  26 + if (err) {
  27 + logger.warn('Failed to connect to mongodb', {err: err});
  28 + return;
  29 + }
  30 + mongodb = db;
  31 + logger.info('MongoDB connected');
  32 + });
  33 + }
  34 + catch(err) {
  35 + logger.warn('Exception when connecting to mongodb', {err: err, url: url});
  36 + }
  37 +}
13 38  
14 39 var maxRetry = 10;
15 40 var sleepBeforeRetry = 30;
... ... @@ -31,6 +56,8 @@ function start(_config, _callbackReport, options) {
31 56 ]
32 57 });
33 58 }
  59 +
  60 + initMongoClient();
34 61 }
35 62  
36 63 function calculateSignature(params) {
... ... @@ -65,6 +92,45 @@ function createXmlPayload(params) {
65 92 return payload;
66 93 }
67 94  
  95 +function insertTaskToMongoDb(task) {
  96 + if (!isMongoReady()) { return; }
  97 +
  98 + try {
  99 + mongodb.collection(config.mongodb.collection).insertOne(task);
  100 + }
  101 + catch(err) {
  102 + //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
  103 + }
  104 +}
  105 +
  106 +function pushResponseToMongoDb(task, response) {
  107 + if (!isMongoReady()) { return; }
  108 +
  109 + try {
  110 + mongodb.collection(config.mongodb.collection).updateOne(
  111 + {requestId: task.requestId},
  112 + {$push: {responses: response}},
  113 + function(err, result) {
  114 + if (err) {
  115 + logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
  116 + return;
  117 + }
  118 + }
  119 + );
  120 + }
  121 + catch(err) {
  122 + logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
  123 + }
  124 +}
  125 +
  126 +function isMongoReady() {
  127 + if (!config.mongodb) { return; }
  128 + if (!config.mongodb.collection) { return; }
  129 + if (!mongodb) { return; }
  130 +
  131 + return true;
  132 +}
  133 +
68 134 function getSNFromMessage(message) {
69 135 try {
70 136 var sn_match = message.match(/SN: (\w+)/);
... ... @@ -112,16 +178,24 @@ function getSNFromResponseObject(respObj) {
112 178 }
113 179  
114 180 function topupResponseHandler(body, task) {
  181 +
115 182 //logger.info('Got reply from partner', {body: body});
  183 +
116 184 xml2js(body, function(err, result) {
  185 + var ts = strftime('%Y-%m-%d %H:%M:%S', new Date());
  186 + pushResponseToMongoDb(task, {ts: ts, raw: body});
  187 +
117 188 if (err) {
118 189 logger.warn('Got invalid XML from partner', {err: err, body: body, task: task});
  190 + callbackReport(task.requestId, '68', body);
  191 + return;
119 192 }
120 193 logger.info('XML message from partner', {result: result});
121 194  
122 195 var rc = '68';
123 196 var message = result.ciwaru.msg[0];
124 197  
  198 + /*
125 199 var trxid = 0;
126 200 try {
127 201 trxid = result.ciwaru.reqnum[0];
... ... @@ -129,6 +203,7 @@ function topupResponseHandler(body, task) {
129 203 catch(err) {
130 204 trxid = result.ciwaru.trxid[0];
131 205 }
  206 + */
132 207  
133 208 if (message.toUpperCase().indexOf('PENDING') >= 0) {
134 209 rc = '68';
... ... @@ -150,7 +225,7 @@ function topupResponseHandler(body, task) {
150 225 }
151 226  
152 227 if ((task.retry == maxRetry) || (rc != '68')) {
153   - callbackReport(trxid, rc, message);
  228 + callbackReport(task.requestId, rc, message);
154 229 } else {
155 230 logger.info('Not reporting to AAA for duplicate 68', {task: task});
156 231 }
... ... @@ -174,8 +249,9 @@ function topupRequestRetry(task) {
174 249 }
175 250  
176 251 function topupRequest(task, retry) {
177   -
  252 +
178 253 if (retry === undefined) {
  254 + insertTaskToMongoDb(task);
179 255 retry = maxRetry;
180 256 }
181 257