req_partner_manager.js 6.94 KB
let _ = require('lodash')
module.exports = function(reqBody, partnerConfig) {
    this.reqBody = reqBody;
    this.partnerConfig = JSON.parse(JSON.stringify(partnerConfig));
    this.requestApi = function() {

        try {
            let body;
            let headers = getReqHeader(this.partnerConfig.request.header, this.reqBody);
            this.partnerConfig.request.header = headers

            if(this.partnerConfig.request.ContentType == 'application/json') {
                body = getReqBodyJson(this.partnerConfig.request.body, this.reqBody)
            } else if(this.partnerConfig.request.ContentType == 'text/xml'){
                body = getReqBodyXml(this.partnerConfig.request.body, this.reqBody)
            } else {
                throw {
                    status : 'unsupport',
                    cause : 'unsupport content-type ' + this.partnerConfig.request.ContentType
                }
            }
            // console.log('body', body)
            if(body) {
                this.partnerConfig.request.body = body
            }

            return this.partnerConfig.request;
        } catch (err) {
            console.log(err)
            return new Error(JSON.stringify(err));
        }
        
    }
}

function getReqHeader(headers, dataHeaders) {
    let headersObject = {};
    headers = replaceSpace(headers).split(',');

    //replce headers
    for(let headerIndex in headers) {
        let header = headers[headerIndex];
        let key = header.split('=')[0]
        if(header.indexOf('$') !== -1) {
            let keyValue = header.split('$')[1];
            headers[headerIndex] = header.replace('$'+keyValue,replaceValueMadatory(keyValue,dataHeaders));
        }
        headersObject[key] = headers[headerIndex].split('=')[1];
    }

    return headersObject;
}

function getReqBodyJson(bodyJson, dataBodyJson) {
    let bodyObject = {};
    bodyJson = replaceSpace(bodyJson).split(',')

    //replce body
    for(let bodyIndex in bodyJson) {
        let body = bodyJson[bodyIndex];
        let key = body.split('=')[0];
        let keyValue = bodyJson[bodyIndex].split('=')[1]
        let insertKeyFlag = true;
        if(key.indexOf('@') !== -1) { // case array
            insertKeyFlag = false
            // let tempObjectArray = {}
            let keyArray = searchKeyArray(key);
            let keyValueArray = searchKeyArray(keyValue);
            if(searchValueArray(keyValue, keyValueArray, dataBodyJson)) {
                let index = 0;
                let breakWhile = true;
                while(breakWhile) {
                    let findKey = keyValue.replace(keyValue,keyValueArray.substring(1) + '['+index+']');
                    let keyObject = keyArray.replace(keyArray,keyArray.substring(1) + '['+index+']');
                    if(_.has(dataBodyJson, findKey)) {
                        bodyObject[keyObject] = _.get(dataBodyJson, findKey)
                    } else {
                        breakWhile = false
                    }
                    // bodyObject[findKey] = bodyJson[bodyIndex].split('=')[1];
                    index++
                }
            } else {
                throw {
                    status : 'missing',
                    cause : 'missing parameter ' + key
                }
            }
        } else { // case object
            if(body.indexOf('$') !== -1) {
                let keyValue = body.split('$')[1];
                bodyJson[bodyIndex] = body.replace('$'+keyValue,replaceValueMadatory(keyValue,dataBodyJson));
            } else if(body.indexOf('?') !== -1) {
                let keyValue = body.split('?')[1];
                if(checkValueOptional(keyValue, dataBodyJson)) {
                    bodyJson[bodyIndex] = body.replace('?'+keyValue,replaceValueOptional(keyValue,dataBodyJson));
                } else {
                    insertKeyFlag = false;
                }
            }
        }

        if(insertKeyFlag) {
            bodyObject[key] = bodyJson[bodyIndex].split('=')[1];
        } else {
            insertKeyFlag = true;
        }
    }

    return buildDataToObject(bodyObject);

}

function getReqBodyXml(bodyXml, dataBodyXml) {

    let listKeyReplace = {};
    let tempXml = bodyXml;
    let index = 0;

    while (true) {
        index = tempXml.indexOf('>$')
        if(index === -1) {
            index = tempXml.indexOf('>?')
            if(index === -1) {
                break;
            }
        }
        let first = tempXml.substring(tempXml.substring(0, index).lastIndexOf('<'),index+1)
        let last = tempXml.substring(index+1).substring(0, tempXml.substring(index+1).indexOf('>')+1)
        let valueKey = last.substring(0, last.indexOf('<'));
        let fullKey = first + last;
        listKeyReplace[fullKey] = valueKey;
        tempXml = tempXml.substring(tempXml.indexOf(fullKey) + fullKey.length);
        // console.log(tempXml);
    }

    let valueXml = getValueXml(listKeyReplace, dataBodyXml)
    console.log(valueXml)

    for(let valueXmlKey in valueXml) {
        if(valueXml[valueXmlKey] === undefined) {
            bodyXml = bodyXml.replace(valueXmlKey, '')
        } else {
            bodyXml = bodyXml.replace(valueXmlKey, valueXml[valueXmlKey])
        }
    }
    
    return bodyXml
}

function getValueXml(listKeyXml, dataBodyXml) {

    for(let key in listKeyXml) {
        if(listKeyXml[key].startsWith('$')) {
            listKeyXml[key] = key.replace(listKeyXml[key], replaceValueMadatory(listKeyXml[key].substring(1), dataBodyXml))
        } else if(listKeyXml[key].startsWith('?')){
            if(checkValueOptional(listKeyXml[key].substring(1), dataBodyXml)) {
                listKeyXml[key] = key.replace(listKeyXml[key], replaceValueOptional(listKeyXml[key].substring(1), dataBodyXml))
            } else {
                listKeyXml[key] = ''
            }
        }
    }

    return listKeyXml;
}

function replaceSpace(data) {
    return data && typeof data == 'string' ? data.replace(/ /g, '') : data;
}

function replaceValueMadatory(key, value) {
    if(_.has(value, key)) {
        return _.get(value, key);
    } else {
        throw {
            status : 'missing',
            cause : 'missing parameter ' + key
        };
    }
}

function replaceValueOptional(key, value) {
    if(_.has(value, key)) {
        return _.get(value, key);
    } else {
        return;
    }
}

function checkValueOptional(key, value) {
    return _.has(value, key) ? true : false;
}

function buildDataToObject(dataObject) {
    let newObject = {}

    for(let key in dataObject) {
        _.set(newObject,key,dataObject[key]);
    }

    return newObject;
}

function searchKeyArray(key) {
    let indexArr = key.indexOf('@')
    let lastIndexArr = key.substring(indexArr).indexOf('.')
    let keyArray = key.substring(indexArr, lastIndexArr !== -1 ? lastIndexArr + indexArr : key.length)
    return keyArray;
}

function searchValueArray(key, idenKey, value) {
    let findKey = key.replace(key,idenKey.substring(1) + '[0]')
    console.log('findKeyArr', findKey)
    return _.has(value,findKey)
}