item.js 4.94 KB
/**
 * 商品详情页model
 * @author: yyq<yanqing.yang@yoho.cn>
 * @date: 2016/7/11
 */
'use strict';

const _ = require('lodash');
const itemApi = require('./item-api');
const brandApi = require('./brand-api');
const shopApi = require('./shop-api');
const itemFun = require('./item-handler');

const search = require('./search-api');


/**
 * 根据商品基本信息获取商品品牌、材质、尺码、描述、详情等
 * @function _getMultiResourceByBaseInfo
 * @param { Object } 商品的基本信息
 * @return { Object } 返回单个商品品牌、材质、尺码、描述、详情等信息
 */
const _getMultiResourceByBaseInfo = (base) => {
    const productId = base.id;
    const skn = base.erpProductId;
    const brandId = base.brandId || 0;
    const brandDomain = _.get(base, 'brand.brandDomain', false);
    const shopId = base.shopId || 0;
    let apiIndex = {};

    // 获取相关数据
    let promiseData = [
        itemApi.getsizeInfoAsync(skn),
        itemApi.getComfortAsync(productId),
        itemApi.getModelTryAsync(skn),
        search.getSortAsync({sort: base.smallSortId}),
        itemApi.getBrandBannerAsync(brandId)
    ];

    if (base.uid) {
        apiIndex.productFav = promiseData.length;
        promiseData.push(itemApi.getUserIsFav(base.uid, productId));
        apiIndex.brandFav = promiseData.length;
        promiseData.push(brandApi.getBrandInfo(brandId, base.uid));
    }

    // 根据品牌名获取店铺信息
    if (brandDomain) {
        apiIndex.domainInfo = promiseData.length;
        promiseData.push(brandApi.getDomainInfo(brandDomain));
    }

    // 根据店铺ID获取店铺装修信息
    if (shopId) {
        apiIndex.shopDecorator = promiseData.length;
        promiseData.push(shopApi.getShopDecorator(shopId));
    }

    return Promise.all(promiseData).then(result => {
        return {
            sizeInfo: result[0],
            comfort: result[1].data,
            modelTry: result[2].data,
            sort: result[3].data,
            brandBanner: result[4].data,
            productFav: (result[apiIndex.productFav] && result[apiIndex.productFav].data),
            brandFav: (_.get(result[apiIndex.brandFav], 'data.is_favorite', 'N') === 'Y'),
            shopInfo: Object.assign(
                {},
                {type: _.get(result[apiIndex.domainInfo], 'data.type', 0)},
                {list: _.get(result[apiIndex.shopDecorator], 'data.list', [])}
            )
        };
    });
};

/**
 * 获取商品基本信息、品牌、材质、尺码、描述、详情等
 * @function getProductItemData
 * @param { Object } 商品的参数
 * @param { String } url 用户ID
 * @param { String } uid 用户ID
 * @return { Object } 返回单个商品的基本信息及品牌、材质、尺码、描述、详情等
 */
const getProductItemData = (params, url, uid) => {
    let pid = params[0];

    // let gid = params[1];

    return itemApi.getProductBaseAsync(pid).then(result => {
        let resData = {};
        let data = {};

        if (!result.productName &&
            !result.erpProductId &&
            !result.productPriceBo) {
            return data;
        }

        result.uid = uid;
        result.mainPath = `/product${url}`;

        // 商品基本信息
        data.goodInfo = itemFun.setProductData(result);

        // BRAND品牌简介
        if (result.brand) {
            Object.assign(data, itemFun.setBrandIntro(result.brand));
        }

        return _getMultiResourceByBaseInfo(result).then(mulRes => {

            Object.assign(data,
                itemFun.setBrandBanner(result, mulRes.brandBanner, mulRes.shopInfo), // banner
                itemFun.setPathNav(mulRes.sort, result.productName, params.channel), // 面包屑导航
                itemFun.setDescriptionData(mulRes.sizeInfo, mulRes.comfort), // DESCRIPTION商品描述
                itemFun.setMaterialData(mulRes.sizeInfo), // MATERIALS材料洗涤
                itemFun.setSizeData(mulRes.sizeInfo, mulRes.modelTry), // SIZEINFO尺码信息
                itemFun.setDetailData(mulRes.sizeInfo) // DETAILS商品详情
            );

            // 收藏状态
            _.set(data, 'goodInfo.productFav', mulRes.productFav);
            if (data.brandBanner) {
                _.set(data, 'brandBanner.brandFav', mulRes.brandFav);
            }

            resData.content = data;

            // 商品详情SEO
            Object.assign(resData, itemFun.setSeoInfo(data.goodInfo, data.nav));

            return resData;
        });

    });
};

/**
 * 获取商品尺寸,颜色,和缩略图
 * @function getProductInfo
 * @param { Number } productId 商品ID
 * @param { String } uid 用户ID
 * @param { Number } skn 商品skn
 * @return { Object } 接口返回单个商品的基本信息
 */
const getProductInfo = (productId, uid, skn) => {
    return itemApi.getProductBaseAsync(productId, uid, skn).then(result => {
        return itemFun.setProductData(result);
    });
};

module.exports = {
    getProductItemData,
    getProductInfo
};