brands-model.js 10.4 KB

/**
 * 品牌一览 model
 * @author: ghw<hongwei.gao@yoho.cn>
 * @date: 2016/9/29
 */
'use strict';

const Promise = require('bluebird');
const co = Promise.coroutine;
const _ = require('lodash');
const helpers = global.yoho.helpers;
const brandApi = require('./brands-api');
const serviceApi = global.yoho.ServiceAPI;

// 品牌一览资源位CODE码
const channelCode = {
    boys_brand: '8b16b7baf9a66fbe553a6caa97d2ce2a',
    girls_brand: 'c95ae9e40f0add10549b819f821ad626',
    kids_brand: 'c575c6bfdfa4125fae7d24bbec7119c8',
    lifestyle_brand: '84b7926282fdef92f1039bdcf77c18ba',
    brand_list: 'f0f72b1e8f30e6ad086dfc4401f3a856', // 品牌列表资源位CODE码
    brand_plusstar_banner_boys: 'd0149783b8dd2adaf083fd10556c39a9',
    brand_plusstar_banner_girls: 'd0149783b8dd2adaf083fd10556c39a9',
    brand_plusstarindex_boys: 'a833aed63d28457156310e97faa7fa37', // plusstarindex男首资源位
    brand_plusstarindex_girls: '6e4f162be3b3ba44f3bfcf1c38bdb745' // plusstarindex女首资源位
};

const BOYS = 'boys';
const GIRLS = 'girls';
const KIDS = 'kids';
const LIFESTYLE = 'lifestyle';

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

    switch (channel) {

        case BOYS:
            req = {
                channelType: 1,
                brandCode: channelCode.brand_plusstar_banner_boys
            };
            break;
        case GIRLS:
            req = {
                channelType: 2,
                brandCode: channelCode.brand_plusstar_banner_girls
            };
            break;
        case KIDS:
            req = {
                channelType: 3,
                brandCode: channelCode.kids_brand
            };
            break;
        case LIFESTYLE:
            req = {
                channelType: 4,
                brandCode: channelCode.lifestyle_brand
            };
            break;
        default:
            req = {
                channelType: 1,
                brandCode: channelCode.boys_brand
            };
            break;
    }
    return req;
};

/**
 * 获取品牌一览页面,品牌top
 * @param string $channel 频道名称
 */
const getBrandViewTop = channel => {
    return co(function*() {
        let switchParams = switchBrandParams(channel);

        let res = yield brandApi.getBrandTopData(switchParams.brandCode);

        let result = {},
            brandAds = [],
            brandLogos = [];

        // 头部10个品牌小图块 url
        if (res.data[1].data && res.data[1].data.list) {
            _.forEach(res.data[1].data.list, subValue => {
                brandAds.push({
                    name: subValue.name,
                    src: helpers.image(subValue.src, 80, 50, 3),
                    url: helpers.urlFormat(subValue.url)
                });
            });
        }

        // 头部品牌图块,广告位
        if (res.data[0].data) {
            _.forEach(res.data[0].data, (subValue, k) => {
                let srcUrl;

                // kids lifestyle 第一张图尺寸不同
                if (switchParams.channelType === 1 || switchParams.channelType === 2) {
                    srcUrl = helpers.image(subValue.src, 222, 180, 3);
                } else {
                    srcUrl = (k === 0) ? helpers.image(subValue.src, 570, 280, 3) :
                        helpers.image(subValue.src, 280, 280, 3);
                }
                brandLogos.push({
                    name: subValue.title,
                    src: srcUrl,
                    url: helpers.urlFormat(subValue.url)
                });
            });
        }

        // 整合brandTop数据结构,boys、girls
        if (switchParams.channelType === 1 || switchParams.channelType === 2) {
            result.isTab = true;
        }
        result.tabHeader = brandLogos;
        result.logos = brandAds;

        return result;
    })();
};

/**
 * 获取品牌一览list
 * @param string $channel 频道名称
 * @param int start  开始位置 1 开始
 * @param int length 取数长度 0 取到最后
 */
const getBrandViewList = (channel, start, length) => {
    return co(function*() {
        let switchParams = switchBrandParams(channel);

        let res = yield brandApi.getBrandListData(switchParams.channelType);

        let result = [],
            navigation = [];

        // 品牌list A-Z 0-9
        if (res.data.brands) {

            _.forEach(res.data.brands, (subValue, key) => {
                let listTmp = [];

                _.forEach(subValue, ssubValue => {
                    // 为品牌名称
                    let href;

                    if (switchParams.channelType === 1) {
                        href = helpers.urlFormat(ssubValue.brand_domain) + '?gender=1,3';
                    } else if (switchParams.channelType === 2) {
                        href = helpers.urlFormat(ssubValue.brand_domain) + '?gender=2,3';
                    } else {
                        href = helpers.urlFormat(ssubValue.brand_domain);
                    }
                    let brandItem = {
                        name: ssubValue.brand_name,
                        key: ssubValue.id,
                        href: href
                    };

                    if (ssubValue.is_hot === 'Y') {
                        brandItem.hot = 'hot';
                    }
                    listTmp.push(brandItem);

                });
                navigation.push(key);

                result.push({
                    key: key,
                    val: listTmp
                });
            });

        }

        // 只取部分数据
        let begin;

        begin = (start - 1) ? (start - 1) : 0;
        begin = (begin > 0) ? begin : 0;
        result = length ? result.slice(begin, length + begin) : result.slice(begin);
        result.navigation = navigation;

        return result;
    })();
};

/**
 * 获取单个广告浮窗内容
 *
 * @param int $brandId
 * @param int $uid
 * @return array
 */
const getBrandInfo = (brandId, uid) => {
    return co(function*() {
        let data = {},
            imgs = [];

        // 获取品牌简介
        let res = yield brandApi.getBrandIntro(brandId, uid);

        if (res.data) {
            // 获取品牌下的产品信息
            let proInfo = yield brandApi.getProductByBrand(brandId, 3);

            let proInfoTmp = proInfo.data.product_list;

            if (!_.isEmpty(proInfoTmp)) {
                _.forEach(proInfoTmp, subValue => {
                    imgs.push({
                        src: helpers.image(subValue.default_images, 80, 100)
                    });
                });
            }

            // 整合
            data = {
                key: res.data.brand_id,
                icon: helpers.image(res.data.brand_ico, 80, 50),
                title: res.data.brand_name,
                content: res.data.brand_intro,
                subtitle: 'FEATURED ITEMS',
                imgs: imgs
            };
        }
        return data;
    })();
};

/**
 * 多个品牌ID获取品牌信息
 *
 * @param array $brandIds
 * @return array
 */
const getBrandInfoByIds = (brandIds) => {
    return co(function*() {
        let data = yield brandApi.getBrandInfoByIds(brandIds);

        let brandsInfo = {};

        if (data.data && data.code === 200) {
            _.forEach(data.data, (subValue, k) => {
                subValue.desc = _.trim(subValue.brand_intro.replace('/[\r\n\t ]/g', ''));
                subValue.url = helpers.urlFormat(subValue.brand_domain);
                delete subValue.brand_intro;
                brandsInfo[k] = subValue;
            });
        }

        return brandsInfo;
    })();
};

/**
 * 获取plusstar品牌列表项目
 *
 * @param string $channel
 * @return array
 */
const getPlusstarBrandListItem = (channel) => {
    return co(function*() {
        let code = channel === 'girls' ? channelCode.brand_plusstar_banner_girls :
            channelCode.brand_plusstar_banner_boys;

        // 资源位数据
        let resource = yield serviceApi.get('operations/api/v5/resource/get', {content_code: code}, {cache: 3600});

        let items = [];

        if (resource.data && resource.code === 200) {
            items[0] = {name: '所有品牌', src: '', url: helpers.urlFormat('/brands'), brandType: ''};
            items[1] = {name: '设计新潮', src: '', url: '', brandType: 4};
            items[2] = {name: '潮流经典', src: '', url: '', brandType: 1};
            items[3] = {name: '明星潮牌', src: '', url: '', brandType: 2};
            items[4] = {name: '原创潮牌', src: '', url: '', brandType: 3};

            let resourceData = resource.data,
                pos = 0;

            _.forEach(items, (subValue, k) => {
                if (_.isEmpty(subValue.url)) {
                    subValue.url = helpers.urlFormat('/brands/plusstar?id=' + k);
                }

                if (pos in resourceData[0].data) {
                    subValue.url = helpers.urlFormat(resourceData[0].data[pos].url);
                    subValue.src = helpers.image(resourceData[0].data[pos].src, 222, 180, 1);
                    subValue.name = resourceData[0].data[pos].title;
                }
                pos++;
            });
        }

        return items;
    })();
};

/**
 * 获取Plustar列表
 *
 * @param string $brandType
 * @param string $gender
 * @return array
 */
const getPlustarList = (brandType, gender) => {
    return co(function*() {
        let list = yield brandApi.getPlusstarList(brandType, gender);

        let brandList = {},
            data = {},
            brandsIds = [];

        if (list.data.data.list) {
            brandList = list.data.data.list[0];
        }

        if (brandList.data) {
            _.forEach(brandList.data, brand => {
                let src = '';

                if (brand.data[0]) {
                    src = helpers.image(brand.data[0].src, 320, 160, 1);
                }
                data[brand.brand_id] = {
                    brand_id: brand.brand_id,
                    name: brand.brand_name,
                    sort_id: brand.sort_id,
                    src: src,
                    desc: '',
                    url: ''
                };
                brandsIds.push(brand.brand_id);
            });
        }

        return {brandsIds: brandsIds, data: data};
    })();
};

module.exports = {
    getBrandViewTop,
    getBrandViewList,
    getBrandInfo,
    getBrandInfoByIds,
    getPlusstarBrandListItem,
    getPlustarList
};