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

'use strict';

const _ = require('lodash');

// const logger = global.yoho.logger;

const minToFullMap = {
    ag: 'age_level',
    bd: 'brand',
    cc: 'coupon_code',
    cd: 'coupon_id',
    ci: 'category_id',
    cl: 'color',
    cn: 'channel',
    fp: 'filter_poolId',
    gd: 'gender',
    id: 'id',
    ld: 'limited',
    lt: 'limit',
    mi: 'misort',
    ms: 'msort',
    nb: 'navBar',
    nw: 'new',
    od: 'order',
    ol: 'outlets',
    pc: 'price',
    pd: 'p_d',
    pg: 'page',
    pm: 'promotion',
    pp: 'productPool',
    sd: 'standard',
    se: 'shelveTime',
    sf: 'specialoffer',
    sh: 'shop_id',
    si: 'specialsale_id',
    so: 'sort',
    sp: 'saleType',
    st: 'style',
    sz: 'size',
    tp: 'type'
};

const fullToMinMap = _.transform(minToFullMap, (result, value, key) => {
    if (_.indexOf(['gender', 'brand', 'category_id', 'color', 'style'], value) > -1) {
        result[value] = key;
    }
}, {});

const genderMap = {
    minToFull: {
        1: '1,3',
        2: '2,3'
    },
    fullToMin: {
        '1,3': 1,
        '2,3': 2,
        '1,2,3': ''
    }
};

const sringifyParam = (param) => {
    let arr = [];

    _.forEach(param, (value, key) => {
        if (value) {
            arr.push(`${key}=${value}`);
        }
    });

    return arr.join('&');
};

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];

        // 包含',' & 等于{seat} 表示为多选,不需要伪静态
        if (name && _.indexOf(value, ',') === -1 && value !== '{seat}') {
            matchParams[name] = value;
        } else {
            extraParams[key] = value;

            // logger.info(`list parameter [${key}] map value not found`);
        }
    });

    return {
        matchParams,
        extraParams
    };
};

/**
 * 筛选参数转化 min->full
 * @param path 伪静态path
 * @returns {Object}
 */

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中__
        }
    });

    obj.gender = genderMap.minToFull[obj.gender] || obj.gender || '1,2,3';

    return obj;
};

/**
 * 筛选参数转化 full->min
 * @param uri 基础uri
 * @param params 当前 URL 中的参数
 * @param newObj 新增的参数
 * @param delObj 删除的参数
 * @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);
    });

    if (obj.gender) {
        obj.gender = _.has(genderMap.fullToMin, obj.gender) ? genderMap.fullToMin[obj.gender] : obj.gender;
    }

    let transParams = transformKey(obj, true);

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

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

    let minPath = _.sortBy(pathArr).join('-') + (pathArr.length ? '.html' : '');

    return `${_.trimEnd(uri, '/')}/${minPath}${extraQs}`;
};


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