parameter.js 2.65 KB
/**
 * 静态化路由参数处理
 * @author: yyq<yanqing.yang@yoho.cn>
 * @date: 2017/11/24
 */

'use strict';

const _ = require('lodash');
const logger = global.yoho.logger;
const queryString = require('querystring');

const minToFullMap = {
    ag: 'age_level',
    cn: 'channel',
    gd: 'gender',
    sn: 'sort_name',
    pa: 'phrase',
    ci: 'category_id',
    so: 'sort',
    ms: 'msort',
    mi: 'misort',
    tp: 'type',
    sz: 'size',
    cl: 'color',
    pc: 'price',
    bd: 'brand',
    qr: 'query',
    lt: 'limit',
    ld: 'limited',
    od: 'order',
    nw: 'new',
    pg: 'page',
    st: 'style',
    sd: 'standard',
    si: 'specialsale_id',
    sf: 'specialoffer'
};

const fullToMinMap = _.transform(minToFullMap, (result, value, key) => {
    result[value] = key;
}, {});

const transformKey = (params, isFull) => {
    if (_.isEmpty(params)) {
        return params;
    }

    let matchParams = {},
        extraParams = {};
    let map = isFull ? fullToMinMap : minToFullMap;

    _.forEach(params, (value, key) => {
        let name = map[key];

        if (name) {
            matchParams[name] = value;
        } else {
            extraParams[key] = value;
            logger.info(`list parameter [${key}] map value not found`);
        }
    });

    return {
        matchParams,
        extraParams
    };
};

const minPathToFullParam = (path) => {
    let obj = {};

    _.forEach(_.split(path, '-'), splitValue => {
        if (!splitValue) {
            return;
        }

        let minKey = splitValue.substr(0, 2);
        let fullKey = minToFullMap[minKey];

        if (fullKey) {
            obj[fullKey] = _.replace(_.replace(splitValue, minKey, ''), '__', '-'); // 替换value中__
        }
    });

    return obj;
};

/**
 * 筛选参数
 * @param originParam 当前 URL 中的参数
 * @param newParam 要拼接的 参数
 * @returns {string}
 */
const fullParamToMinPath = (uri, params, newObj, delObj = {}) => {
    let obj = _.assign({}, params, newObj);
    let pathArr = [];
    let extraQs = '';

    Object.assign(delObj, {uid: true});

    _.forEach(delObj, (value, key) => {
        _.has(obj, key) && _.unset(obj, key);
    });

    let transParams = transformKey(obj, true);

    _.forEach(transParams.matchParams, (value, key) => {
        if (value) {
            pathArr.push(`${key}${_.replace(value, '-', '__')}`); // 替换value中-
        }
    });

    if (!_.isEmpty(transParams.extraParams)) {
        extraQs = '?' + queryString.stringify(transParams.extraParams)
    }

    return _.trimEnd(uri, '/') + '/' + _.sortBy(pathArr).join('-') + extraQs;
};


module.exports = {
    transformKey,
    fullParamToMinPath,
    minPathToFullParam
};