From 1a0a4c0beeb0c27c36993f7be5b2a83ad44705ef Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <gua@adhisimon.org>
Date: Wed, 4 May 2016 12:12:04 +0700
Subject: [PATCH] mongodb

---
 package.json   |  2 ++
 partner-cjk.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 445981c..5d48337 100644
--- a/package.json
+++ b/package.json
@@ -21,8 +21,10 @@
   "dependencies": {
     "crypto": "0.0.3",
     "ini": "^1.3.4",
+    "mongodb": "^2.1.18",
     "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git",
     "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git",
+    "strftime": "^0.9.2",
     "winston": "^2.2.0",
     "xml": "^1.0.1",
     "xml2js": "^0.4.16"
diff --git a/partner-cjk.js b/partner-cjk.js
index 31965a1..5126f45 100644
--- a/partner-cjk.js
+++ b/partner-cjk.js
@@ -4,12 +4,37 @@ var xml = require('xml');
 var url = require('url');
 var http = require('http');
 var xml2js = require('xml2js').parseString;
+var mongoClient = require('mongodb').MongoClient;
+var strftime = require('strftime');
 
 var config;
 var callbackReport;
 var aaa;
 var logger;
 var options;
+var mongodb;
+
+function initMongoClient() {
+    if (!config.mongodb || !config.mongodb.url) {
+        return;
+    }
+    
+    try {
+        var url = config.mongodb.url;
+    
+        mongoClient.connect(url, function(err, db) {
+            if (err) {
+                logger.warn('Failed to connect to mongodb', {err: err});
+                return;
+            }
+            mongodb = db;
+            logger.info('MongoDB connected');
+        });
+    }
+    catch(err) {
+        logger.warn('Exception when connecting to mongodb', {err: err, url: url});
+    }    
+}
 
 var maxRetry = 10;
 var sleepBeforeRetry = 30;
@@ -31,6 +56,8 @@ function start(_config, _callbackReport, options) {
             ]
         });
     }
+    
+    initMongoClient();
 }
 
 function calculateSignature(params) {
@@ -65,6 +92,45 @@ function createXmlPayload(params) {
     return payload;
 }
 
+function insertTaskToMongoDb(task) {
+    if (!isMongoReady()) { return; }
+    
+    try {
+        mongodb.collection(config.mongodb.collection).insertOne(task);
+    }
+    catch(err) {
+        //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
+    }
+}
+
+function pushResponseToMongoDb(task, response) {
+    if (!isMongoReady()) { return; }
+    
+    try {
+        mongodb.collection(config.mongodb.collection).updateOne(
+            {requestId: task.requestId},
+            {$push: {responses: response}},
+            function(err, result) {
+                if (err) {
+                    logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
+                    return;
+                }
+            }
+        );
+    }
+    catch(err) {
+        logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
+    }
+}
+
+function isMongoReady() {
+    if (!config.mongodb) { return; }
+    if (!config.mongodb.collection) { return; }
+    if (!mongodb) { return; }
+    
+    return true;
+}
+
 function getSNFromMessage(message) {
     try {
         var sn_match = message.match(/SN: (\w+)/);
@@ -112,16 +178,24 @@ function getSNFromResponseObject(respObj) {
 }
 
 function topupResponseHandler(body, task) {
+    
     //logger.info('Got reply from partner', {body: body});
+    
     xml2js(body, function(err, result) {
+        var ts =  strftime('%Y-%m-%d %H:%M:%S', new Date());
+        pushResponseToMongoDb(task, {ts:  ts, raw: body});
+        
         if (err) {
             logger.warn('Got invalid XML from partner', {err: err, body: body, task: task});
+            callbackReport(task.requestId, '68', body);
+            return;
         }
         logger.info('XML message from partner', {result: result});
         
         var rc = '68';
         var message = result.ciwaru.msg[0];
         
+        /*
         var trxid = 0;
         try {
             trxid = result.ciwaru.reqnum[0];
@@ -129,6 +203,7 @@ function topupResponseHandler(body, task) {
         catch(err) {
             trxid = result.ciwaru.trxid[0];
         }
+        */
         
         if (message.toUpperCase().indexOf('PENDING') >= 0) {
             rc = '68';
@@ -150,7 +225,7 @@ function topupResponseHandler(body, task) {
         }
         
         if ((task.retry == maxRetry) || (rc != '68')) {
-            callbackReport(trxid, rc, message);
+            callbackReport(task.requestId, rc, message);
         } else {
             logger.info('Not reporting to AAA for duplicate 68', {task: task});
         }
@@ -174,8 +249,9 @@ function topupRequestRetry(task) {
 }
 
 function topupRequest(task, retry) {
-        
+    
     if (retry === undefined) {
+        insertTaskToMongoDb(task);
         retry = maxRetry;
     }
     
-- 
1.9.0