partner-komodo.js 3.25 KB
"use strict";

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

const request = require('request');
const resendDelay = require('sate24/resend-delay')

var config;
var aaa;
var logger;

let komodoRc = {
    '03': '40',
    '13': '13',
    '14': '14',
    '30': '40',
    '68': '68',
    '55': '55',
    '91': '91',
    '92': '40',
    '96': '68'
}

function start(options) {
    if (!options) {
        console.log('Undefined options, terminating....');
        process.exit(1);
    }

    if (options.config) {
        config = options.config;
    } else {
        console.log('Undefined options.config, terminating....')
        process.exit(1);
    }

    if (options.aaa) {
        aaa = options.aaa;
    } else {
        console.log('Undefined options.aaa, terminating....')
        process.exit(1);
    }

    if (options && options.logger) {
        logger = options.logger;
    } else {
        console.log('Undefined options.logger, terminating....')
        process.exit(1);
    }

    resendDelay.init({config: config, logger: logger, topupRequest: topupAdvice});
}

function callbackReport(requestId, rc, message, options) {
    aaa.callbackReportWithPushToMongoDb(requestId, rc, message);

    if (!options.task) {
        return;
    }

    if (rc == '68') {
        resendDelay.register(options.task);
    } else {
        resendDelay.cancel(options.task)
    }

}

function topupRequest(task, pendingOnConnectError) {
    aaa.insertTaskToMongoDb(task);

    const requestOptions = {
        url: config.h2h_out.partner,
        qs: {
            terminal_name: config.h2h_out.username,
            password: config.h2h_out.password,
            product_name: task.remoteProduct,
            destination: task.destination,
            request_id: task.requestId
        }
    }

    request(requestOptions, function(err, response, body) {
        if (err) {
            logger.warn('Error requesting to partner', {err: err});

            let rc = '68';

            if (err.syscall == 'connect' && !pendingOnConnectError) {
                rc = '91';
            }
            callbackReport(task.requestId, rc, 'Error requesting to partner: ' + err);
            return;
        }

        if (response.statusCode != 200) {
            let rc = '68';

            callbackReport(task.requestId, rc, 'Partner returning HTTP status code ' + response.statusCode + ', not 200');
            return;
        }

        let result = parsePartnerMessage(body);
        if (!result) {
            callbackReport(task.requestId, '40', 'Error parsing response from partner. Partner response: ' + body);
            return;
        }

        let st24Rc = '68';

        if (komodoRc[result.rc]) {
            st24Rc = komodoRc[result.rc];
        }

        let st24Message = result.message;
        if (result.sn) {
            st24Message = 'SN=' + result.sn + '; ' + st24Message;
        }

        callbackReport(task.requestId, st24Rc, st24Message);
    })
}

function topupAdvice(task) {
    topupRequest(task, true);
}

function parsePartnerMessage(partner_message) {
    let result;
    try {
        result = JSON.parse(partner_message);

    }
    catch(e) {
        result = null;
    }

    return result;
}


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