aaa.js 4.38 KB
var request = require('request');
var strftime = require('strftime');

var max_retry = 10;
var sleep_before_retry = 3000;

var config;
var partner;

var available_products = [];

function unaliasResponseCode(response_code, config_responsecode_alias) {
    if (config_responsecode_alias == undefined && config && config.h2h_out && config.h2h_out.responsecode_alias) {
        config_responsecode_alias = config.h2h_out.responsecode_alias;
    }
    
    if (!config_responsecode_alias) {
        return response_code;
    }
    
    items = config_responsecode_alias.split(',');
    items_count = items.length;
    
    for (var i=0; i < items_count; i++) {
        codes = items[i].split(':');
        
        if (codes.length <= 0) { continue; }
        
        if (response_code == codes[0]) {
            console.log('Change response code from ' + codes[0] + ' to ' + codes[1]);
            return codes[1];
        }
    }
    
    return response_code;
}

function pullCity() {
    var url = config.globals.aaa_host + '/pull_city';
    console.log('Pull cities from AAA - ' + url);
    request(url, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            //console.log('city=' + body);
        } else {
            console.log('Error in pull city');
        }
    });
}

function pullProduct() {
    var url = config.globals.aaa_host + '/pull_product?opr_name=' + config.globals.operators;
    console.log('Pull products from AAA - ' + url);

    request(url, function (error, response, body) {
        if (error || response.statusCode != 200) {
            console.log('Error in pull products');
            return;
        }

        var productsAndOperators = body.split(';');
        var productsCount = productsAndOperators.length;

        for (var i=0; i < productsCount; i++) {
            var product = productsAndOperators[i].split(',', 1)[0];
            available_products.push(product);
        }
        //console.log(available_products);
    });
}

function pull() {
    var url = config.globals.aaa_host
        + '/pull?city=ALL&nom=' + config.globals.products
        + '&chip_info=' + config.globals.gateway_name;

    //console.log('AAA PULL - ' + url);
    request(url, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            if (body == 'NONE') {
                return;
            }
            console.log(body);

            var result = body.split(';');
            if (result[0] != 'OK') {
                return;
            }

            var task = [];
            task['requestId'] = result[1];
            task['timestamp'] = result[3];
            task['destination'] = result[4];
            task['product'] = result[7];

            if (config.products[task['product']] !== undefined) {
                task['remoteProduct'] = config.products[task['product']];
            } else {
                task['remoteProduct'] = task['product'];
            }

            partner.topupRequest(task);

        } else {
            console.log('Error in pull task');
            return;
        }
    });
}

function pullLoop() {
    if (!config.globals.pause) {
        pull();
    }
    
    setTimeout(pullLoop, config.globals.interval);
}

function callbackReport(requestId, responseCode, message, retry) {
    if (retry === undefined) {
        retry = max_retry;
    }
    
    responseCode = unaliasResponseCode(responseCode);
    
    timestamp = strftime('%Y%m%d%H%M%S');
    var url = config.globals.aaa_host
        + '/topup?trans_id=' + requestId
        + '&trans_date' + timestamp
        + '&trans_date=' + timestamp
        + '&resp_code=' + responseCode
        + '&ussd_msg=' + config.globals.gateway_name
        + '$' + encodeURIComponent(message);

    console.log('Report to AAA - ' + url);
    request(url, function (error, response, body) {
        if (error || response.statusCode != 200) {
            console.log('Error report to AAA');
            
            if (retry) {
                console.log('Retrying to report to AAA (' + retry + ')');
                callbackReport(requestId, responseCode, message, retry - 1);
            }
        }
    });
}

function start(_config, _partner) {
    config = _config;
    partner = _partner;

    pullCity();
    pullProduct();

    setTimeout(pullLoop, 10 * 1000);
}

exports.start = start;
exports.callbackReport = callbackReport;
exports.unaliasResponseCode = unaliasResponseCode;