header.js 4.83 KB
/**
 * header model
 * @author: 赵彪<bill.zhao@yoho.cn>
 * @date: 2016/05/03
 */

'use strict';

const _ = require('lodash');

const ServiceAPI = require(`${global.library}/api`).ServiceAPI;
const sign = require(`${global.library}/sign`);

const serviceApi = new ServiceAPI();

const log = require(`${global.library}/logger`);

/**
 * 获取菜单
 * @param undefined
 * @return {array} 菜单数组
 */
const getMenuData = () => (
    [{
        link: 'http://www.yoho.cn',
        cn: '集团官网',
        en: 'YOHO!'
    }, {
        link: 'http://www.yohoboys.com',
        cn: '男生潮流',
        en: 'YOHO!BOYS'
    }, {
        link: 'http://www.yohogirls.com',
        cn: '女生潮流',
        en: 'YOHO!GIRLS'
    }, {
        link: 'http://www.yohoshow.com',
        cn: '物趣分享',
        en: 'YOHO!SHOW'
    }, {
        link: 'http://www.yohood.cn',
        cn: '潮流嘉年华',
        en: 'YO\'HOOD'
    }]
);

/**
 * 获取导航
 * @param {Object} data 要处理的数据
 * @param {String} type 频道类型
 * @return {array} 导航数组
 */
const getNavBar = (data, type) => {
    let navBars = [];

    _.forEach(data, item => {
        let obj = {},
            lowEn = _.camelCase(item.sort_name_en).toLowerCase();


        obj.link = item.sort_url;
        obj.cn = item.sort_name;
        obj.en = item.sort_name_en;

        if (type === lowEn) {
            obj.active = true;
        }

        // 奥莱频道显示图片,特殊处理
        if (lowEn === 'outlets') {
            obj.ico = item.sort_ico;
        }

        navBars.push(obj);
    });

    return navBars;
};


/**
 * 获取品牌名字
 * @param {Object} data 要处理数据
 * @return {array} 品牌数组
 */
const getBrandItems = (data) => {
    let brandItems = [];

    _.forEach(data, item => {
        let obj = {
            link: '',
            hot: false,
            brandName: ''
        };

        obj.link = item.sort_url;
        obj.hot = item.is_hot === 'Y' ? true : false;
        obj.brandName = item.sort_name;

        brandItems.push(obj);
    });


    return brandItems;
};

/**
 * 获取三级菜单
 * @param {Object} data 要处理数据
 * @return {array} 三级菜单数组
 */
const getThirdNav = (data) => {
    let thirdNav = [];

    _.forEach(data, item => {
        let obj = {
            link: '',
            title: '',
            brandItems: false
        };

        obj.link = item.sort_url;
        obj.title = item.sort_name;


        if (item.sub) {
            obj.brandItems = getBrandItems(item.sub);
        }

        thirdNav.push(obj);
    });



    return thirdNav;
};

/**
 * 获取子菜单
 * @param {Object} data 要处理数据
 * @param {String} type 频道类型
 * @return {array} 子菜单数组
 */
const getSubNav = (data, type) => {
    let subNav = [];

    _.forEach(data, it => {
        if (type === _.camelCase(it.sort_name_en).toLowerCase()) {
            _.forEach(it.sub, item => {
                let obj = {};

                obj.link = item.sort_url;
                obj.name = item.sort_name;
                obj.isHot = item.is_hot === 'Y' ? true : false;
                obj.isNew = item.is_new === 'Y' ? true : false;

                if (item.sub) {
                    obj.thirdNav = getThirdNav(item.sub);
                    obj.imgCode = item.content_code;
                }

                subNav.push(obj);
            });
        }
    });

    return subNav;
};




/**
 * 处理接口返回的数据
 * @param {object} 接口返回的对象
 * @param {String} 指定页面类型为boys,girls,kids,lifestyle
 * @return {object} 头部数据
 */
const setHeaderData = (resData, type) => {
    let data = {
        headerData: {
            header: true,
            headType: type,
            yohoGroup: getMenuData(),
            navbars: resData ? getNavBar(resData, type) : [],
            subNav: resData ? getSubNav(resData, type) : []
        }
    };

    return data;
};



/**
 * 请求头部数据
 * @param {String} 频道类型
 * @return {promise}
 */
exports.requestHeaderData = (type, parentId) => {
    let data = sign.apiSign({
        client_type: 'web',
        parent_id: parentId || null
    });

    type = type || 'boys';

    return serviceApi.get('operations/api/v6/category/getCategory', data, true).then(res => {
        if (res && res.code === 200) {
            // 为了奥莱要单独写个处理方法,因为接口把二级菜单屏蔽掉了,所以需要额外调用方法处理一次
            if (parentId === '1107') {
                return getSubNav([{
                    sort_name_en: 'OUTLETS',
                    sub: res.data
                }], type);
            } else {
                return setHeaderData(res.data, type);
            }
        } else {
            log.error('获取头部信息的接口返回状态码 不是 200');
            return {};
        }
    });
};