From aa26f84e6cca1f0baa0b21c71debf9985c726017 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <gua@adhisimon.org>
Date: Mon, 9 May 2016 22:07:51 +0700
Subject: [PATCH] log to mongo

---
 package.json   |  3 +++
 partner-irs.js | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 86 insertions(+), 1 deletion(-)

diff --git a/package.json b/package.json
index cb9e37c..3f9d367 100644
--- a/package.json
+++ b/package.json
@@ -21,9 +21,12 @@
   "license": "ISC",
   "dependencies": {
     "ini": "^1.3.4",
+    "moment": "^2.13.0",
+    "mongodb": "^2.1.18",
     "request": "^2.72.0",
     "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",
     "url": "^0.11.0",
     "winston": "^2.2.0",
     "xmlrpc": "^1.3.1"
diff --git a/partner-irs.js b/partner-irs.js
index 2362a28..4cc2194 100644
--- a/partner-irs.js
+++ b/partner-irs.js
@@ -3,6 +3,9 @@ var request = require('request');
 var xmlrpc = require('xmlrpc');
 var url = require('url');
 var http = require('http');
+var mongoClient = require('mongodb').MongoClient;
+var strftime = require('strftime');
+var moment = require('moment');
 
 var max_retry = 3;
 var sleep_before_retry = 2000;
@@ -14,6 +17,7 @@ var callbackReport;
 var aaa;
 var logger;
 var options;
+var mongodb;
 
 function start(_config, _callbackReport, options) {
     config = _config;
@@ -34,6 +38,7 @@ function start(_config, _callbackReport, options) {
     }
     
     createXMLRPCServer();
+    initMongoClient();
 }
 
 function createXMLRPCServer() {
@@ -57,6 +62,10 @@ function createXMLRPCServer() {
         for (var i = 0; i < paramscount; i++) {
             var value = params[i];
             
+            var responseTs =  strftime('%Y-%m-%d %H:%M:%S', new Date());
+            var dummyTask = { requestId: value.REQUESTID };
+            pushResponseToMongoDb(dummyTask, {ts:  responseTs, supplier: config.globals.gateway_name, parsed: value});
+            
             if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
                 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
             }
@@ -119,7 +128,7 @@ function topupRequestXMLRPC(task, retry) {
     var methodName = 'topUpRequest';
     logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params});
     
-    client.methodCall(methodName, [ params ], function (error, value) {
+    client.methodCall(methodName, [ params ], function (error, value) {        
         // Results of the method response
         if (error) {
             
@@ -140,6 +149,9 @@ function topupRequestXMLRPC(task, retry) {
         
         logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value});
         
+        var responseTs =  strftime('%Y-%m-%d %H:%M:%S', new Date());
+        pushResponseToMongoDb(task, {ts:  responseTs, supplier: config.globals.gateway_name, parsed: value});
+        
         if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
             value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
         }
@@ -153,8 +165,78 @@ function topupRequestXMLRPC(task, retry) {
 }
 
 function topupRequest(task, retry) {
+    if (retry === undefined) {
+        task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss');
+        task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD');
+        
+        insertTaskToMongoDb(task);
+    }
+    
     topupRequestXMLRPC(task, retry);
 }
 
+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});
+    }    
+}
+
+function insertTaskToMongoDb(task) {
+    if (!isMongoReady()) { return; }
+    
+    task.supplier = config.globals.gateway_name;
+    
+    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},
+            {
+                $set: {
+                    lastResponse: response,
+                    supplier: config.globals.gateway_name
+                },
+                $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});
+    }
+}
+
 exports.start = start;
 exports.topupRequest = topupRequest;
-- 
1.9.0