partner-irs.js 4.09 KB
var winston = require('winston');
var request = require('request');
var xmlrpc = require('xmlrpc');
var url = require('url');

var max_retry = 3;
var sleep_before_retry = 2000;

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

var config;
var callbackReport;
var aaa;
var logger;
var options;

function start(_config, _callbackReport, options) {
    config = _config;
    callbackReport = _callbackReport
    
    if (options && options.aaa) {
            aaa = options.aaa;
    }
    
    if (options && options.logger) {
        logger = options.logger;
    } else {
        logger = new winston.Logger({
            transports: [
              new (winston.transports.Console)()
            ]
        });
    }
    
    createHttpReportServer();
}

function createHttpReportServer() {
    var httpServer = http.createServer(function(request, response) {
        var qs = url.parse(request.url, true).query;
        var path = url.parse(request.url).pathname;
        
        logger.info('Got reverse report from partner', {path: path, qs: qs});
        response.end('OK');
        
        /*
        var  trxid;
        try {
            trxid = qs.transid;
        }
        catch(err) {
        }
        
        if (trxid) {
            logger.info('Requesting advice from webreport', {trxid: trxid})
            cekstatus.advice({trxid: trxid}, callbackFromWebReport);
        }
        */
        
    });
    
    httpServer.listen(config.h2h_out.listen_port, function() {
        logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
    });
}

function topupRequestHttpGet(task, retry) {
    
    var options = {
        method: 'GET',
        url: config.h2h_out.partner,
        qs: {
            id: config.h2h_out.userid,
            pin: config.h2h_out.pin,
            user: config.h2h_out.user,
            pass: config.h2h_put.password,
            kodeproduk: task.remoteProduct,
            tujuan: task.destination,
            idtrx: task.requestId
        }
    }
    
    request(options, function(err, res, body) {
    });
}

function topupRequestXMLRPC(task, retry) {
    var partnerUrl = url.parse(config.h2h_out.partner);
    var clientOptions = {
        host: partnerUrl.hostname
        , port: partnerUrl.port
        , path: partnerUrl.pathname
    };
    logger.info('Preparing XMLRPC client options', {options: clientOptions});

    var client;
    if (partnerUrl.protocol == 'https:') {
        client = xmlrpc.createSecureClient(clientOptions);
    } else {
        client = xmlrpc.createClient(clientOptions);
    }
    
    var params = {
        MSISDN: config.h2h_out.userid,
        REQUESTID: task.requestId,
        PIN: config.h2h_out.password,
        NOHP: task.destination,
        NOM: task.remoteProduct
    };
    
    var methodName = 'topUpRequest';
    logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params});
    
    client.methodCall(methodName, [ params ], function (error, value) {
        // Results of the method response
        if (error) {
            
            logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error});
            
            if (retry) {
                
                logger.info('Retrying topUpRequest (' + retry + ')');
                setTimeout(function() {
                    topupRequest(task, retry - 1);
                }, sleep_before_retry);
                
            } else {
                callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier: ' + error);
            }
            return;
        }
        
        logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value});
        
        if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
            value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
        }
        
        callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
    });
}

function topupRequest(task, retry) {
    topupRequestXMLRPC(task, retry);
}

exports.start = start;
exports.topupRequest = topupRequest;