detail-product-api.js 4.66 KB
/**
 * Created by TaoHuang on 2016/6/14.
 */

'use strict';

const api = global.yoho.API;
const config = global.yoho.config;
const redis = global.yoho.redis;
const cache = global.yoho.cache;
const logger = global.yoho.logger;
const uuid = require('uuid');
const helpers = global.yoho.helpers;
const _ = require('lodash');

function _cacheGet(key) {
    return cache.get(key).then((data) => {
        if (data) {
            return JSON.parse(data);
        }

        return Promise.reject();
    });
}

// 半个月
const HALF_MONTH = 60 * 60 * 24 * 15;

function _cacheSave(key, value) {
    return cache.set(key, value, HALF_MONTH)
        .catch(err => logger.error(`save cache data fail:${err.toString()}`));
}

function _cached(fn, ctx) {
    const pre = 'recommend-cache:' + (fn.name || 'random:' + uuid.v4()) + ':';

    return function() {
        const args = Array.prototype.slice.call(arguments);
        const key = pre + JSON.stringify(args || '[]');

        return _cacheGet(key).catch(() => {
            return fn.apply(ctx, args).then(result => {
                _cacheSave(key, result);
                return result;
            });
        });
    };
}

/**
 * 商品的 banner
 */
const getProductBannerAsync = (pid) => {
    return api.get('', {
        method: 'web.productBanner.data',
        product_id: pid
    }, config.apiCache);

};

/**
 * 商品尺寸
 */
const sizeInfoAsync = (skn) => {
    return api.get('', {
        method: 'h5.product.intro',
        productskn: skn
    }, config.apiCache);

};

/**
 * 特殊商品退换货
 */
const isSupportReturnedSale = (skn) => {
    return api.get('', {
        method: 'web.product.refundExchange',
        product_skn: skn
    }, config.apiCache);
};

/**
 * 商品舒适度
 */
const getProductComfortAsync = (pid) => {
    return api.get('', {
        method: 'web.productComfort.data',
        product_id: pid
    }, config.apiCache);

};

/**
 * 模特试穿
 */
const getProductModelTryAsync = (skn) => {
    return api.get('', {
        method: 'web.productModelTry.data',
        product_skn: skn
    }, config.apiCache);
};

/**
 * 获得产品信息
 */
const getProductAsync = (id, uid, isStudents, vipLevel) => {

    let params = {
        method: 'app.product.data'
    };

    if (id.skn) {
        params.product_skn = id.skn;
    }

    if (id.pid) {
        params.product_id = id.pid;
    }

    if (uid) {
        params.uid = uid;
    }

    if (isStudents) {
        params.is_student = isStudents;
    }

    if (vipLevel) {
        params.current_vip_level = vipLevel;
    }

    return api.get('', params, config.apiCache);
};

/**
 * 促销信息
 */
const getPromotionAsync = (skn) => {
    let params = {
        method: 'app.product.promotion',
        product_skn: skn
    };

    return api.get('', params, config.apiCache);
};

/**
 * 限购商品
 */
const getLimitedProductStatusAsync = (code, uid, skn) => {
    let params = {
        method: 'app.limitProduct.productStatus',
        limitProductCode: code
    };

    if (uid) {
        params.uid = uid;
    }

    if (skn) {
        params.product_skn = skn;
    }

    return api.get('', params, config.apiCache);
};

/**
 * 店铺推荐
 */
const getShopRecommendAsync = (skn, page, limit) => {
    return api.get('', {
        method: 'web.product.shopRecommend',
        product_skn: skn,
        page: page || 1,
        limit: limit || 20
    });
};

/**
 * 套餐和量贩
 */
const getBundleAsync = (skn) => {
    return api.get('', {
        method: 'app.query.bundleSkn',
        product_skn: skn
    });
};

/**
 * 找相似
 */
const getLikeAsync = (skn, limit) => {
    return api.get('', {
        method: 'app.search.findLike',
        limit: limit || 10,
        product_skn: skn
    }, {cache: 86400});
};

// 返回6条推荐关键词页面
function getKeywordsInfo(keywords) {
    let res = [];

    _.forEach(_.slice(_.shuffle(keywords), 0, 12), val => {
        res.push({
            url: helpers.urlFormat(`/chanpin/${val.id}.html`),
            keyword: val.keyword
        });
    });
    return res;
}

// 根据small_sort从redis获取分类下的关键词
// skn 用来key
function _getRecommendKeywords(smallSort, skn) { // eslint-disable-line
    return redis.all([['get', `global:yoho:seo:keywords:sortId:${smallSort}:page:1`]]).then(res => {
        return getKeywordsInfo(JSON.parse(res[0] || '[]'));
    });
}

module.exports = {
    getProductBannerAsync,
    sizeInfoAsync,
    getProductComfortAsync,
    getProductModelTryAsync,
    getProductAsync,
    getPromotionAsync,
    isSupportReturnedSale,
    getLimitedProductStatusAsync,
    getShopRecommendAsync,
    getBundleAsync,
    getLikeAsync,
    getRecommendKeywords: _cached(_getRecommendKeywords)
};