connection.js 9.35 KB
var env = process.env.NODE_ENV || 'development'; 
var cfg = require('../../config/config.js').get(env);
var stats = require('../helper/stats.js'); 
var request = require('request');
var messageSOAP = require('../helper/messageSOAP.js'); 
var log = require('../helper/log.js');

var connection = [];


connection.requestSoapToSACF = async function (soap,cmd,myMethod) {

    var params = {
        url                 : cfg.service.SACF[myMethod+"_"+cmd+"_URL"],
        body                : messageSOAP.objectToSOAP(soap,cmd),
        method              : myMethod,
        timeout             : cfg.service.SACF[myMethod+"_"+cmd+"_Timeout"]*1000
    }

    stats.sendSACFRequest(cfg.service.SACF.Name,cmd)
    log.logDetail.addOutput(cfg.service.SACF.Name,cmd,"Request",params.body,soap); 
    log.logDetail.write();

    return asyncRequest(params,cmd,cfg.service.SACF.Name);
};
connection.requestJsonToD01 = async function (obj,cmd,myMethod) {

    var service = cfg.service.D01;
    // JSON.stringify(json)
    var params = {
        url                 : service[myMethod+"_"+cmd+"_URL"],
        body                : obj,
        method              : myMethod,
        timeout             : service[myMethod+"_"+cmd+"_Timeout"]*1000
    }

    var result = {};
    result.response = {};
    result.response.resultData = [];

    if(params.method == "GET")
    {
        var genUrl = getUrl(params,service[myMethod+"_Limit"]);
        // genUrl.push(genUrl[0].replace("8080","8081"));        
        if(genUrl.length > 1)
        {
            // console.log("multi Send");
            var multiSend = [];
            for(var i=0;i<genUrl.length;i++)
                multiSend.push({url:genUrl[i],method:params.method});
        
            var parallelRes = await parallelRequest(multiSend,cmd,cfg.service.D01.Name); 

            var dataRes = {};
            for(var i=0;i<multiSend.length;i++)
            {
                // console.log("start loop");
                var loopRes = parallelRes[i];
                
                if(loopRes.response)
                {
                    var data = JSON.parse(loopRes.response.body);
                    dataRes[i] = {};

                    if(!data.resultCode)
                        dataRes[i].err = "Miss resultCode";

                    if(!data.resultDescription)
                        dataRes[i].err = "Miss resultDescription"

                    
                    dataRes[i].data = data.resultData;
                   
                }

            }

            for (var i = 0; i < multiSend.length; i++) {
                    
                result.response.resultData = result.response.resultData.concat(dataRes[i].data);
                if(dataRes[i].err)
                    result.err = dataRes[i].err;
            }

            if(!result.err)
            {
                result.response.resultCode = "20000";
                result.response.developerMessage = "Success";
            }

            
        }else
        {
            // console.log("single Send");
            params.url = genUrl[0];
            delete params.body;

            var result = await asyncRequest(params,cmd,service.Name);

            // console.log(result);
            if(result.response)
            {
                var data = JSON.parse(result.response.body);
                result.response = data;
               
            }
        }

        
    }else if(params.method == "POST")
    {
        params.body = JSON.stringify(params.body);

        var resultRes = await asyncRequest(params,cmd,service.Name);

        result.response = JSON.parse(resultRes.body);
   
    }

    // console.log(result);
    
    if(result.response)
    {
        if(!result.response.resultCode)
            result.err = "Miss resultCode";

        if(!result.response.resultDescription)
            result.err = "Miss resultDescription";
    }

    if(result.err)
    {
        result.response = {};
        result.response.resultCode = "50000";

        // stats.reciveResponse(service.Name,cmd,"Error");
    }
        

    return result;

    
};


async function parallelRequest(multiParams,cmd,node)
{
   
    var promises = [];

    for(var i=0;i<multiParams.length;i++)
        promises.push(asyncRequest (multiParams[i],cmd,node));

    var res = await Promise.all(promises);
    for(var i=0;i<res.length;i++)
    {
        if(!res[i].err)
            stats.reciveResponse(node,cmd,"Success");

    }


    return res;
}

function asyncRequest (params = {},cmd,node) {

    // console.log("Start : "+new Date().toISOString());
    return new Promise((resolve, reject) => {
        request(params, function (error, response, body) {

            if (error) {
                
                // console.log("End : "+new Date().toISOString());
                console.log(error.code);
                resolve({
                    'body'  : body,
                    'err'   : error
                });
            } else {
               
                // stats.reciveResponse(node,cmd,"Success");
                resolve({
                    'body'      : body,
                    'response'  : response
                });
            }
        });
    });
};

function getUrl(params,limit)
{
    var returnData = [];
    var url = params.url;
    var fields = "";
    var filter = {
        base : "",
        multi : []
    };
    
    
    // params.body = {};
    // params.body.a = "aaa";
    // params.body.b = "bbb";
    // params.body.papa = [];
    // params.body.papa.push("1");
    // params.body.papa.push("2");
    // params.body.commandId = [];
    // params.body.commandId.push("1");
    // params.body.commandId.push("2");
    // params.body.commandId.push("3");
    // params.body.commandId.push("4");
    // params.body.commandId.push("5");
    // params.body.commandId.push("6");
    // params.body.commandId.push("7");
    // params.body.commandId.push("8");    
    // params.body.c = "ccc";
    // params.body.fields = "a,b,c,d";
    // console.log(params.body);  
    if(params.body)
    {
        var first = true;
        for (key in params.body) {

            if(key == "fields")
                fields = getFields(params.body.fields,first);
            else
                filter = getfilter(filter,key,params.body[key]);

            first = false;
        }

        if(first)
            fields = "?limit="+limit;
        else
            fields = "&limit="+limit;
        
    }   

    if(filter.multi.length > 0)
    {
        //have multi

        var careData = filter.multi[0];
        // console.log(freeSpace);

        for(var i=0;i<filter.multi.length;i++)
        {
            if(filter.multi[i].length > careData.length)
            {
                filter.base = filter.base+"(|"+careData.data+")";
                careData = filter.multi[i];
                
            }
               

        }


        var myUrl = url+"?filter=("+filter.base+")"+fields;
        var freeSpace = cfg.Uri_length - myUrl.length;
        

        var arr = careData.data.split(")(");
            
        for(var j=0;j<arr.length;j++)
        {
            if(j==0)
                arr[j] = arr[j].substring(1);
            if(j==arr.length-1)
                arr[j] = arr[j].substring(0,arr[j].length-1);

            arr[j] = "("+arr[j]+")";
                // returnData.push(url+"?filter=("+newBasefilter+"(|"+arr[j]+")"+fields);
        }

        returnData = arrayUrl(returnData,url,filter.base,fields,freeSpace,arr);



    }else
    {
        var myUrl = url+"?filter=("+filter.base+")"+fields;
        returnData.push(myUrl);
    }

    // console.log(url);
    // console.log(filter);
    // console.log(fields);

    // console.log(returnData);

    return returnData;
}

function getFields(fields,first)
{
    var returnData;
    var prefix;
    if(first)
        prefix = "?fields=";
    else
        prefix = "&fields=";

    returnData = prefix+fields;

    return returnData;
}

function getfilter(filter,key,data)
{
   
    // console.log(key);
    // console.log(newfilter);
    if(!Array.isArray(data))
    {

        // var newfilter = {
        //     data : "("+key+"="+data+")",
        //     type : "single",
        //     length : ("("+key+"="+data+")").length
        // };

        if(filter.base != "")    
            filter.base = filter.base+"("+key+"="+data+")";
        else
            filter.base = "&"+filter.base+"("+key+"="+data+")";
    }else
    {
        var line = "";
        for(var i=0;i<data.length;i++)
        {
            line += "("+key+"="+data[i]+")";
        }

        var newfilter = {
            data : line,
            length : line.length
        };
    }

    if(newfilter)
        filter.multi.push(newfilter);
    return filter;
}

function arrayUrl(arrUrl,url,filter,fields,freeSpace,arrData)
{
    var loopUrl = "";
    var loopSpace = freeSpace;
    for(var i=0;i<arrData.length;i++)
    {
        if(loopSpace > (arrData[i].length+3))
        {
            loopUrl = loopUrl + arrData[i];
            loopSpace = loopSpace - arrData[i].length;
        }else
        {
            if(loopUrl != "")
            {
                arrUrl.push(url+"?filter=("+filter+"(|"+loopUrl+")"+fields);

                loopUrl = arrData[i];
                loopSpace = freeSpace - arrData[i].length;
            }
            
        }

    }

    if(loopUrl != "")
        arrUrl.push(url+"?filter=("+filter+"(|"+loopUrl+")"+fields);
    return arrUrl;
}

module.exports = connection;