channel.js 9.21 KB
/**
 * 频道页面 model
 * @author: Bi Kai<kai.bi@yoho.cn>
 * @date: 2016/05/09
 */
'use strict';
const utils = '../../../utils';
const contentCodeConfig = require('../../../config/content-code');
const _ = require('lodash');
const logger = global.yoho.logger;
const resourcesProcess = require(`${utils}/resources-process`);

/**
 * 性别数据
 * @type {Object}
 */
const genderData = {
    boys: '1,3',
    girls: '2,3'
};

/**
 * 楼层资源的位置码
 * @type {Object}
 */
const contentCode = contentCodeConfig.channel;

/**
 * 频道底部 Banner 位置码
 * @type {Object}
 */
const bottomBannerCode = contentCodeConfig.bottom;

/**
 * 频道选择页 默认数据
 * @type {Object}
 */
const channelList = [{
    href: '/boys',
    title: '男生',
    entitle: 'BOYS'
}, {
    href: '/girls',
    title: '女生',
    entitle: 'GIRLS'
}, {
    href: '/kids',
    title: '潮童',
    entitle: 'KIDS'
}, {
    href: '/lifestyle',
    title: '创意生活',
    entitle: 'LIFESTYLE'
}];

module.exports = class extends global.yoho.BaseModel {
    constructor(ctx) {
        super(ctx);
    }

    /**
     * 获取二级菜单顶部颜色
     * @param  {[string]} choosed
     * @return {[string]}
     */
    _getSidebarColor(choosed) {
        let color = false;

        if (choosed === 'girls') {
            color = '#FF88AE';
        } else if (choosed === 'kids') {
            color = '#7ad9f9';
        } else if (choosed === 'lifestyle') {
            color = '#4f4138';
        }

        return color;
    }

    /**
     * 处理侧边栏数据
     * @param  {[array]} list
     * @return {[array]}
     */
    _processSideBar(list, choosed) {
        const formatData = [];
        let offset = 0; // 分割数组用到的游标

        list = list || [];

        _.forEach(list, (item, i) => {
            if (item.sub) {
                item.sub.unshift({
                    sort_name: item.sort_name,
                    sort_name_en: item.sort_name_en,
                    back: true,
                    isSelect: false,
                    bgColor: this._getSidebarColor(choosed)
                });
            }

            // 如果有分隔符,分割数组
            if (item.separative_sign === 'Y') {
                formatData.push(list.slice(offset, i));
                offset = i;
            }
        });

        // 数组被分割剩余的部分
        formatData.push(list.slice(offset));
        return formatData;
    }

    /**
     * 获取频道页面资源位
     * @param  {[object]} gender
     * @return {[type]}
     */
    getChannelResource(params) {
        params.gender = params.gender || 'boys';
        params.limit = params.limit || 100;

        params = Object.assign(params, {
            gender: genderData[params.gender] || '1,2,3',
            content_code: contentCode[params.gender], // eslint-disable-line
            page: 1
        });
        if (!params.uid) {
            params.new_device = true; // eslint-disable-line
        }

        params.new_device = true;

        return this.get({
            url: 'operations/api/v5/resource/home',
            data: params,
            api: global.yoho.ServiceAPI
        }, {
            cache: true
        }).then(result => {
            if (result && result.code === 200 && result.data && result.data.list) {
                for (let item of result.data.list) {
                    item.template_name === 'single_image' &&
                        item.data.length === 1 &&
                        (item.singleOne = true);
                }
                return resourcesProcess(result.data.list);
            } else {
                logger.error('index resouce is not 200');
                return result;
            }
        });
    }

    /**
     * 获取左侧边栏数据
     * @param  {[string]} choosed
     * @return {[object]}
     */
    _getLeftNav(choosed) {
        choosed = choosed || 'all';

        return this.get({
            url: 'operations/api/v6/category/getCategory',
            api: global.yoho.ServiceAPI
        }, {
            cache: true
        }).then(result => {
            // console.log(result)
            if (result && result.code === 200) {
                return this._processSideBar(result.data, choosed);
            } else {
                logger.error('sidebar code is not 200');
                return result;
            }
        });
    }

    /**
     * 获取热门搜索
     **/
    _getSearchIndex(params) {
        let channels = {
            boys: 1,
            girl: 2,
            kids: 3,
            lifestyle: 4
        };

        if (params.gender && channels[params.gender]) {
            params.yh_channel = channels[params.gender];
            delete params.gender;
        }

        return this.get({
            data: _.assign({
                method: 'app.search.getTerms'
            }, params),
            api: global.yoho.API
        }, {
            cache: true
        }).then((result) => {
            if (result && result.code === 200) {
                return result.data;
            } else {
                logger.error('Hot Search return code is not 200');
                return {};
            }
        });
    }

    /**
     * 获取频道选择页数据
     * @return {[type]}
     */
    _getChannelList() {
        return this.get({
            url: 'operations/api/v5/entrance/getEntrance',
            api: global.yoho.ServiceAPI
        }, {
            cache: true
        }).then((result) => {
            if (result && result.code === 200) {
                const list = {};

                list.channelList = [];
                list.yohood = {};
                result.data.list = result.data.list || [];

                _.forEach(result.data.list, function(item) {
                    let id = _.toNumber(item.id);
                    const channel = channelList[id - 1];

                    if (channel) {
                        list.channelList.push(channel);
                    }

                    if (id === 5) {
                        list.yohood.showYohood = true;
                        list.yohood.yohoodHref = 'http://www.yohood.cn';
                    }

                    if (id === 6) {
                        list.double11 = {};
                        list.double11.href = item.url;
                    }
                });

                return Object.keys(list).length ? list : {
                    channelList: channelList
                };
            } else {
                logger.error('channel select code is not  200');
                return {
                    channelList: channelList
                };
            }
        });
    }

    /**
     * 获取频道选择页 背景
     * @return {[type]}
     */
    _getChannelBg() {
        return this.get({
            url: 'operations/api/v5/resource/get',
            data: {content_code: contentCode.index},
            api: global.yoho.ServiceAPI
        }, {
            cache: true
        }).then(result => {
            if (result && result.code === 200) {
                return result.data.length && result.data[0] && result.data[0].data && result.data[0].data.list[0];
            } else {
                logger.error('channel select background code is not 200');
                return {
                    src: ''
                };
            }
        });
    }

    /**
     * 获取频道选择页面数据
     * @param  {[string]} gender
     * @return {[type]}
     */
    getChannelSwitchData() {
        return Promise.all([this._getChannelList(), this._getChannelBg()]);
    }

    /**
     * 获取频道页面数据
     * @param  {[object]} params
     * @return {[object]}
     */
    getChannelData(params) {
        var channelData = {};
        let navGender = _.cloneDeep(params.gender);

        return Promise.all([this.getChannelResource(params), this._getLeftNav(navGender), this._getSearchIndex({
            gender: navGender,
            uid: params.uid,
        })]).then((data) => {
            channelData.content = data[0] || []; // 资源位数据
            channelData.sideNav = data[1] || []; // 侧边栏数据
            channelData.defaultTerms = (data[2] && data[2].defaultTerms && data[2].defaultTerms.length) ?
                data[2].defaultTerms[0].content : '搜索商品、品牌';
            return channelData;
        });
    }

    /**
     * 获取频道页底部 bannel 数据
     * @param  {[string]} gender
     * @return {[type]}
     */
    getBottomBannerData(gender) {
        gender = gender || 'boys';

        if (gender === 'boys' || gender === 'girls') {
            return this.get({
                url: 'operations/api/v5/resource/get',
                data: {content_code: bottomBannerCode[gender]}, // eslint-disable-line
                api: global.yoho.ServiceAPI
            }, {
                cache: true
            });
        }
        return Promise.resolve({
            code: 400,
            data: '',
            message: '参数错误'
        });
    }

    /**
     * 获取店铺推荐收藏和人数
     */
    shopRecom(params) {
        return this.get({
            data: {
                method: 'app.shops.floorNewInfo',
                shop_ids: params.shopIds,
                uid: params.uid,
            },
            api: global.yoho.API
        });
    }
};