channel.js 6.57 KB
/**
 * 频道页面 model
 * @author: Bi Kai<kai.bi@yoho.cn>
 * @date: 2016/05/09
 */
'use strict';
const library = '../../../library';
const utils = '../../../utils';
const _ = require('lodash');
const ServiceAPI = require(`${library}/api`).ServiceAPI;
const sign = require(`${library}/sign`);
const camelCase = require(`${library}/camel-case`);
const logger = require(`${library}/logger`);
const resourcesProcess = require(`${utils}/resources-process`);

const api = new ServiceAPI();

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

/**
 * 楼层资源的位置码
 * @type {Object}
 */
const contentCode = {
    boys: '8512bf0755cc549ac323f852c9fd945d',
    girls: '189b6686065dbd6755dd6906cf03c002',
    kids: 'b8c1bff53d4ea60f978926d538620636',
    lifestyle: '61cd852c6afcf60660196154f66a3a62',
    index: '7ba9118028f9b22090b57341487567eb'
};

/**
 * 频道底部 Banner 位置码
 * @type {Object}
 */
const bottomBannerCode = {
    boys: 'a2ec977c027d0cd9cdccb356ddf16b08',
    girls: '8c8bd1b89a22e5895f05882e0825b493'
};

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

/**
 * 获取二级菜单顶部颜色
 * @param  {[string]} choosed
 * @return {[string]}
 */
const 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]}
 */
const processSideBar = (list, choosed) => {
    const formatData = [];
    let offset = 0; // 分割数组用到的游标

    list = list || [];
    list = camelCase(list);

    _.forEach(list, (item, i) => {
        if (item.sub) {
            item.sub.unshift({
                sortName: item.sortName,
                sortNameEn: item.sortNameEn,
                back: true,
                isSelect: false,
                bgColor: getSidebarColor(choosed)
            });
        }

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

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

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

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

    return api.get('operations/api/v5/resource/home', sign.apiSign(params), true).then(result => {
        if (result && result.code === 200) {
            return resourcesProcess(result.data.list);
        } else {
            logger.error('首页资源位接口返回状态码 不是 200');
            return result;
        }
    });
};

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

    return api.get('operations/api/v6/category/getCategory', sign.apiSign({}), true).then(result => {
        if (result && result.code === 200) {
            return processSideBar(result.data, choosed);
        } else {
            logger.error('侧边栏数据接口返回状态码 不是 200');
            return result;
        }
    });
};

/**
 * 获取频道选择页数据
 * @return {[type]}
 */
const getChannelList = () => {
    return api.get('operations/api/v5/entrance/getEntrance', sign.apiSign({}), true).then((result) => {
        if (result && result.code === 200) {
            const list = {};

            result.data.list = camelCase(result.data.list || []);

            _.forEach(result.data.list, function(item) {
                const channel = channelList[item.channelId];

                if (channel) {
                    list[item.channelId] = channelList[item.channelId];
                }

                if (_.toNumber(item.channelId) === 5) {
                    list.showYohood = true;
                    list.yohoodHref = 'http://yohood.cn';
                }
            });
            return Object.keys(list).length ? list : channelList;
        } else {
            logger.error('频道选择接口返回状态码 不是 200');
            return channelList;
        }
    });
};

/**
 * 获取频道选择页 背景
 * @return {[type]}
 */
const getChannelBg = () => {
    return api.get('operations/api/v5/resource/get', sign.apiSign({
        content_code: contentCode.index
    }), 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('频道选择页背景图接口返回状态码 不是 200');
            return {
                src: ''
            };
        }
    });
};

/**
 * 获取频道选择页面数据
 * @param  {[string]} gender
 * @return {[type]}
 */
exports.getChannelSwitchData = () => {
    return Promise.all([getChannelList(), getChannelBg()]);
};

/**
 * 获取频道页面数据
 * @param  {[object]} params
 * @return {[object]}
 */
exports.getChannelData = (params) => {
    var channelData = {};

    return Promise.all([getChannelResource(params), getLeftNav(params.gender)]).then((data) => {
        channelData.content = data[0]; // 资源位数据
        channelData.sideNav = data[1]; // 侧边栏数据

        return channelData;
    });
};

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

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