brands-service.js 9.76 KB
/**
 * 品牌一览 controller
 * @author: ghw<hongwei.gao@yoho.cn>
 * @date: 2016/9/29
 */
'use strict';

const Promise = require('bluebird');
const co = Promise.coroutine;
const api = global.yoho.API;
const headerModel = require('../../../doraemon/models/header');
const brandsModel = require('./brands-model');
const _ = require('lodash');
const helpers = global.yoho.helpers;
const pager = require(`${global.utils}/pager`).setPager;

const BOYS = 'boys';
const GIRLS = 'girls';
const KIDS = 'kids';
const LIFESTYLE = 'lifestyle';
const queryString = require('querystring');

/**
 * 获取品牌一览资源位&channelType
 *
 * @param string $channelStr
 * @return array
 */
const getGenderByChannel = channel => {
    let gender = '';

    switch (channel) {

        case BOYS:
            gender = '1,3';
            break;
        case GIRLS:
            gender = '2,3';
            break;
        default:
            gender = '1,2,3';
            break;
    }
    return gender;
};

const getHomeurlByChannel = channel => {
    let home;

    switch (channel) {
        case GIRLS:
            home = helpers.urlFormat('/woman', {}, 'new');
            break;
        case LIFESTYLE:
            home = helpers.urlFormat('/lifestyle', {}, 'new');
            break;
        case KIDS:
            home = helpers.urlFormat('/kids', {}, 'new');
            break;
        default:
            home = helpers.urlFormat('');
            break;
    }
    return home;
};

// 添加网站的SEO
const seoMap = {
    boys: {
        title: '品牌一览|男装品牌排行榜,男装品牌大全|YOHO!BUY 有货 100%正品保证',
        keywords: '品牌一览,男装品牌,男装品牌排行榜,男装品牌大全,YOHO!BUY 有货',
        description: 'YOHO!BUY 有货男装品牌一览汇集国内国际各大男装品牌大全,为广大爱好时尚的男士青年提供品牌男装、' +
        '休闲男装、商务男装.YOHO!BUY 有货,100%正品保证'
    },
    girls: {
        title: '品牌一览|女装品牌排行榜,女装品牌大全|YOHO!BUY 有货 100%正品保证',
        keywords: '品牌一览,女装品牌,女装品牌排行榜,女装品牌大全,YOHO!BUY 有货',
        description: 'YOHO!BUY 有货女装品牌一览汇集国内国际各大女装品牌,为广大爱美女生提供品牌女装、休闲女装、' +
        '商务女装.买品牌女装就上YOHO!BUY 有货,100%正品保证'
    },
    kids: {
        title: '品牌一览|童装童鞋品牌,儿童鞋包配饰排行榜,潮童品牌大全|YOHO!BUY 有货 100%正品保证',
        keywords: '童装品牌,童装童鞋排行榜,儿童鞋包配饰排行榜,潮童品牌大全,品牌一览,YOHO!BUY 有货',
        description: 'YOHO!BUY 有货童装品牌一览汇集国内国际各大童装品牌大全,为广大爱好潮流的儿童提供品牌童装、童鞋,' +
        '儿童鞋包配饰.YOHO!BUY 有货,100%正品保证'
    },
    lifestyle: {
        title: '品牌一览|数码3c,居家,玩具娱乐,文具,美妆品牌|YOHO!BUY 有货 100%正品保证',
        keywords: '数码3c品牌,居家品牌,玩具娱乐品牌,文具品牌,美妆品牌',
        description: 'YOHO!BUY 有货女装品牌一览汇集国内国际各大数码3c品牌,居家品牌,玩具娱乐品牌,文具品牌,' +
        '美妆品牌.买创意生活家居就上YOHO!BUY 有货,100%正品保证'
    },
    'boys-plusstar': {
        title: '品牌plusstar,男装潮流品牌简介|YOHO!BUY有货',
        keywords: '品牌plusstar,男装潮流品牌简介',
        description: 'YOHO!BUY 有货男装品牌一览汇集国内国际各大男装品牌,为广大爱美男生提供品牌男装、' +
        '休闲男装、商务男装.买品牌男装就上YOHO!BUY 有货,100%正品保证'
    },
    'girls-plusstar': {
        title: '品牌plusstar,女装潮流品牌简介|YOHO!BUY有货',
        keywords: '品牌plusstar,女装潮流品牌简介',
        description: 'YOHO!BUY 有货女装品牌一览汇集国内国际各大女装品牌,为广大爱美女生提供品牌女装、' +
        '休闲女装、商务女装.买品牌女装就上YOHO!BUY 有货,100%正品保证'
    }
};

/**
 * plusstar 分页链接伪静态
 * @param string uri
 * @param string originUrl  动态地址
 */
const staticUrl = (uri, originUrl) => {
    originUrl = queryString.parse(_.split(originUrl, '?')[1]);
    return `${uri}id${originUrl.id || 0}-p${originUrl.page || 1}/`;
};

/**
 * 获取品牌一览list
 * @param string $channel 频道名称
 * @param int start  开始位置 1 开始
 * @param int length 取数长度 0 取到最后
 */
exports.getBrandViewList = (channel) => {
    let apiMethod = [
        headerModel.requestHeaderData(channel),
        brandsModel.getBrandViewTop(channel),
        brandsModel.getBrandViewList(channel) // 分屏加载
    ];

    return api.all(apiMethod).then(result => {
        let responseData = {
            module: 'brands',
            page: 'brands',
            noCashe: false
        };

        // 头部数据
        Object.assign(responseData, result[0]);

        // 品牌一览列表
        responseData.brands = result[1];
        responseData.brands.navigation = result[2].navigation;
        responseData.brands.category = result[2];

        // 导航pathNav
        responseData.brands.pathNav = [
            {
                href: getHomeurlByChannel(channel),
                name: `${_.toUpper(channel)}首页`,
                pathTitle: 'YOHO!BUY 有货'
            },
            {
                href: helpers.urlFormat('/brands'),
                name: '品牌一览',
                pathTitle: '品牌一览'
            }
        ];

        // SEO
        Object.assign(responseData, seoMap[channel]);

        // 数据出错不cashe
        if (_.isEmpty(result[0].headerData) || _.isEmpty(result[1]) || _.isEmpty(result[2])) {
            responseData.noCashe = true;
        }
        return responseData;
    });
};

/**
 * brandList-Ajax调用
 */
exports.getBrandList = (channel, start) => {
    let apiMethod = [
        brandsModel.getBrandViewList(channel, start)
    ];

    return api.all(apiMethod).then(result => {
        let responseData = {};

        // 品牌一览列表
        responseData.category = result[0];
        return responseData;
    });
};

/**
 * 品牌接口数据
 *
 * @param string brandId 获取品牌ID
 * @return json
 */
exports.brandInfo = (brandId, uid) => {
    let apiMethod = [
        brandsModel.getBrandInfo(brandId, uid)
    ];

    return api.all(apiMethod).then(result => {
        let responseData = {
            code: _.isEmpty(result[0]) ? 400 : 200,
            brand: _.isEmpty(result[0]) ? '' : result[0],
            noCashe: false
        };

        // 数据出错不cashe
        if (_.isEmpty(result[0])) {
            responseData.noCashe = true;
        }
        return responseData;
    });
};

/**
 * 多个品牌ID获取品牌信息
 *
 * @param array $brandIds
 * @return array
 */
exports.plusstarList = (channel, req) => {
    return co(function*() {
        let headerData = yield headerModel.requestHeaderData(channel);

        let responseData = {
            module: 'brands',
            page: 'brands',
            brandsHomePage: true,
            noCashe: false
        };

        let id = req.query.id || '',
            gender = req.query.gender || getGenderByChannel(channel),
            limit = 20,
            page = parseInt(req.query.page, 10) || 1;

        let items = yield brandsModel.getPlusstarBrandListItem(channel);

        let brandType = 1;

        if (+id !== 0 && items[id]) {
            brandType = items[id].brandType;
        }
        let plustarList = yield brandsModel.getPlustarList(brandType, gender);

        let list = plustarList.data;

        // 数据出错不cashe
        if (_.isEmpty(headerData.headerData) || _.isEmpty(items) || _.isEmpty(list)) {
            responseData.noCashe = true;
        }
        let brandIds = [],
            brands = [],
            pageList = {};

        brandIds = plustarList.brandsIds.slice((page - 1) * limit, page * limit);
        if (plustarList.brandsIds.length > limit) {
            pageList = pager(Math.ceil(plustarList.brandsIds.length / limit), {
                page: page,
                id: id
            });

            // url 伪静态
            _.forEach(pageList.pages, (val) => {
                val.url = staticUrl(`/${channel}-brands/plusstar/`, val.url);
            });
            if (pageList.nextPage) {
                pageList.nextPage.url = staticUrl(`/${channel}-brands/plusstar/`, pageList.nextPage.url);
            }
            if (pageList.prePage) {
                pageList.prePage.url = staticUrl(`/${channel}-brands/plusstar/`, pageList.prePage.url);
            }
        }

        if (brandIds.length > 0) {
            // 获取品牌信息
            let brandsInfo = yield brandsModel.getBrandInfoByIds(brandIds);

            _.forEach(brandIds, brandId => {
                if (brandsInfo[brandId]) {
                    list[brandId].desc = brandsInfo[brandId].desc;
                    list[brandId].url = helpers.urlFormat('', {gender: gender}, brandsInfo[brandId].url);
                }
                brands.push(list[brandId]);
            });

            // 数据出错不cashe
            if (_.isEmpty(brandsInfo)) {
                responseData.noCashe = true;
            }
        }
        let data = {
            brandsHomePage: true,
            brands: {
                items: brands,
                tabs: items

            }
        };

        // 头部数据
        Object.assign(responseData, headerData);

        // 产品信息
        Object.assign(responseData, data);

        // 页码
        Object.assign(responseData, pageList);

        // SEO
        Object.assign(responseData, seoMap[`${channel}-plusstar`] || {});
        return responseData;
    })();

};