utils.js 6.71 KB

var parseFilter = require('ldapjs').parseFilter;
var constants = require('./cores/constants');

// //unit test
// var fileTempUnitTest = './unitTest/testCase.txt';
// const fs = require('fs');
// const path = require('path');

var unitTest = require('../unitTest/unitTest');
var utils = {};


utils.findQueryString = function(req)
{
    var keywords = ["filter","offset","orderby","limit","fields"];

    var baseUrl = decodeURIComponent(req.url);

    if(baseUrl && baseUrl.indexOf("filter=(") != -1)
    {
        baseUrl = "&"+baseUrl.split("?")[1];

        var indexList = [];
        var listData = {};
        for(var i=0;i<keywords.length;i++)
        {
            var foundIndex = baseUrl.indexOf("&"+keywords[i]+"=");
            if(foundIndex != -1)
            {
                listData[foundIndex] = keywords[i];
                indexList.push(foundIndex);
            }
            
        }
        indexList.sort(function(a, b){return a - b})        

        for(var i = 0;i<keywords.length;i++)
        {
            baseUrl = baseUrl.replace("&"+keywords[i]+"=","[split]")
        }
        var splitUrl = baseUrl.split("[split]");
        
        req.query = {};
        for(var i=0;i<indexList.length;i++)
            req.query[listData[indexList[i]]] = splitUrl[i+1];

    }
    return req;
}

utils.getUpdateFilter = function(obj)
{
    
    if(obj.filter)
    {

        var filter = findValueInBracket(obj.filter);
        obj = Object.assign(obj, filter);

        delete obj.filter;
    }


    return obj;
}

utils.getQueryFilter = async function(data)
{
    if(data)
    {
        var filter = parseFilter(data);
        return getQuery(filter);
    }else
        return {};
   
}

utils.undefinedToNull = function(data){
    if(!data){
        data = 'null';
    } else if(data.includes('undefined')){
        data = data.replace(/undefined/g,'null');
    } else {
        data = data;
    }

    return data;
}

utils.findCmdfromMethod = function (method)
{
    var cmd = "";
    switch (method) {
        case constants.METHOD.GET:
            cmd = 'QUERY';
            break;
        case constants.METHOD.POST:
            cmd = "INSERT"
            break;
        case constants.METHOD.PUT:
            cmd = 'UPDATE';
            break;
        case constants.METHOD.DELETE:
            cmd = 'DELETE';
            break;        
    }
    unitTest(arguments,cmd,method);
    return cmd;
}

utils.testUnit = function(testObj,testInt,testArray,testObj2)
{
    var returnData = 0;
    
    var keyObj = Object.keys(testObj);
    for(var i=0;i<keyObj.length;i++) 
        returnData += testObj[keyObj[i]];

    returnData += testInt;

    for(var i=0;i<testArray.length;i++) 
        returnData += testArray[i];

    returnData += testObj2.test.lv2;

    unitTest(arguments,returnData,"simpleTest");
    return returnData;
} 


utils.test = function(a,b){
    var returnData =  a+b;
    unitTest(arguments,returnData,'test');
    return returnData;
  }

function findValueInBracket(data)
{
    data = data.substring(1,data.length-1);
    var returnData = {};


    if(data.indexOf("&") == -1 && data.indexOf("|") == -1)
    {
        //single data
        var t = data.split("=");
        returnData[t[0]] = t[1];

    }else
    {
        //multi data
        var left = [];
        var splitData = data.split("");
        for(var i=0;i<splitData.length;i++)
        {
            if(splitData[i] === "(")
            {
                left.push(i);
            }
            else if(splitData[i] === ")")
            {
                var pop = left.pop();
                var rawdata = data.substring(pop+1,i);
                if(rawdata.indexOf("&") == -1 && rawdata.indexOf("|") == -1)
                {
                    var t = rawdata.split("=");

                    if(!returnData[t[0]])
                        returnData[t[0]] = [];
                        
                    returnData[t[0]].push(t[1]);
                }
                
                    
            }
        }
        
        var keylist = Object.keys(returnData)
        for(var i=0;i<keylist.length;i++)
        {
            
            if(returnData[keylist[i]].length == 1)
                returnData[keylist[i]] = returnData[keylist[i]][0];
        }
    }

    return returnData;

}

getQuery = async function(data,query){
    
    if(!query)
        var query = {};
    //type !(xx) connot be use
    var temFilter = data.filters;
    for(var i = 0; i < temFilter.length; i++){
        // console.log(temFilter[i].filters)
        if(temFilter[i].filters){
            query = getQuery(temFilter[i],query);
        } else {
            var operate = "";
            switch(temFilter[i].type){
                case 'equal': operate = '$eq'; break;
                case 'ge': operate = '$gte'; break;//>=
                case 'le': operate = '$lte'; break;//<=
                case 'approx' : operate = '$in'; break;
                default : operate = "$"+temFilter[i].type; break;
            }

            switch(operate){
                case '$present' :
                    break;
                case '$substring' : 
                    // if(temFilter[i].initial){
                    //     query += temFilter[i].attribute +" LIKE '"+ temFilter[i].initial + "%'"
                    // } else if(temFilter[i].final){
                    //     query += temFilter[i].attribute +" LIKE '%" + temFilter[i].final + "'"
                    // } else {
                    //     var any = "%";
                    //     for(var j = 0; j < temFilter[i].any.length; j++){
                    //         any += temFilter[i].any[j]+"%";
                    //     }
                    //     query += temFilter[i].attribute +" LIKE '" + any + "'"
                    // }
                    break;
                default : 
                    // query += temFilter[i].attribute +" "+ operate +" "+ temFilter[i].value;
                    var regexValue = temFilter[i].value;
                    if(data.type == 'or'){
                        var objOr = {}
                        var attribute = temFilter[i].attribute;
                        objOr[attribute] = regexValue
                        if(!query['$or'])
                            query['$or'] = []
                        query['$or'].push(objOr)
                    } else {
                        var attribute = temFilter[i].attribute;
                        query[attribute] = regexValue
                    }
                    // query = Object.assign(obj, obj)
                    break;
            }
            // query += temFilter[i].attribute +" "+ operate +" "+ temFilter[i].value;
        }
        // if(i != temFilter.length-1)
            // query += " "+data.type.toUpperCase()+" "
    }
    return query;
}



module.exports = utils;