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