sale.js 8.82 KB
/**
 * sale controller
 * @author: wsl<shuiling.wang@yoho.cn>
 * @date: 2016/5/17
 */

'use strict';
const mRoot = '../models';
const utils = '../../../utils';
const headerModel = require('../../../doraemon/models/header');
const saleModel = require(`${mRoot}/sale`);
const _ = require('lodash');
const listParamsProcess = require(`${utils}/list-params-process`);

const channelToAppChannel = (channel) => {
    return {
        boys: '1',
        girls: '2',
        kids: '3',
        lifestyle: '4'
    }[channel] || '1';
};

// const queryParam = {
//     brand: '0',
//     gender: '1,2,3',
//     sort: '0',
//     size: '0',
//     price: '0',
//     pD: '0.1,0.9'
// };

/**
 * 公共数据处理
 * @param  {[object]} req
 * @param  {[string]} title 标题
 * @param  {[string]} page js文件page名称
 * @return {[type]}
 */
const _processPublicData = (req, title, page, backUrl) => {
    return {
        channel: req.yoho.channel,
        renderData: {
            module: 'product',
            page: page,

            // title: title,
            saleNav: true,
            pageHeader: headerModel.setNav({
                navTitle: title,
                navBtn: false,
                backUrl: backUrl || ''
            }),
            pageFooter: true
        }
    };
};

/**
 * sale 首页 资源位获取
 * @param  {[object]} req
 * @param  {[object]} res
 * @return {[type]}
 */
let index = (req, res, next) => {
    let refer = req.get('Referer') || `${global.yoho.config.siteUrl}/${req.cookies._Channel || ''}`;
    let reqPath = req.baseUrl + req.path;
    let backUrl = refer.indexOf(reqPath) === -1 && refer.indexOf('-sale') === -1 ? refer : '';

    if (['boys', 'girls', 'kids', 'lifestyle'].indexOf(req.yoho.channel) === -1) {
        return next();
    }

    backUrl && res.cookie('saleRefer', backUrl, {
        domain: 'm.yohobuy.com'
    });
    backUrl = backUrl || req.cookies.saleRefer;

    let params = _processPublicData(req, 'SALE', 'sale', backUrl);

    params.channel = req.query.channel || params.channel;

    let appParams = Object.assign({}, req.query, {
        channel: channelToAppChannel(params.channel),
        uid: undefined // eslint-disable-line
    });

    // 唤起 APP 的路径
    res.locals.appPath = `yohobuy://yohobuy.com/goapp?openby:yohobuy={"action":"go.sale","params":${JSON.stringify(appParams)}}`;


    saleModel.getSaleData(params.channel).then((result) => {

        // 扩展头部频道选择数据
        Object.assign(params.renderData.pageHeader, {
            saleNav: saleModel.saleNav(params.channel)
        });

        // 此处 channel 需要读取 cookies 的 channel
        if (req.cookies._Channel) {
            res.locals.pageChannel = {};
            res.locals.pageChannel[req.cookies._Channel] = true;
        }

        if (!result.length) {
            res.set('Cache-Control', 'no-cache');
        }
        res.render('sale/index', Object.assign(params.renderData, {
            content: result,
            localCss: true,
            floorHeader: {
                title: {
                    title: '最新降价'
                }
            }
        }));
    }).catch(next);
};

// 301到新路由
let indexRedirect = (req, res) => {
    let pathParamsUrl = listParamsProcess.generatePathUrl(req.query, req.path);
    let urlPath = _.replace(pathParamsUrl, '//m.yohobuy.com/sale', `//m.yohobuy.com/${req.yoho.channel}-sale`);

    return res.redirect(301, urlPath);
};

/**
 * 断码区
 * @param  {[object]} req
 * @param  {[object]} res
 * @return {[type]}
 */
let breakingYards = (req, res, next) => {
    let params = _processPublicData(req, '断码区', 'break-code');

    // 唤起 APP 的路径
    res.locals.appPath = 'yohobuy://yohobuy.com/goapp?openby:yohobuy={"action":"go.shortsize"}';


    saleModel.getBreakCodeData({
        yhChannel: params.channel
    }).then((result) => {

        res.render('sale/break-code', Object.assign(params.renderData, result, {
            title: '断码商品|断码折扣商品|YOHO!BUY有货',
            keywords: '断码商品、断码专区、断码折扣',
            description: '有货网为您带断码专区精选商品,大量断码商品,价格优惠幅度大,支持货到付款,让您全面了解潮流断码商品价格、品牌、图片、折扣等方面信息,想网购潮流断码区商品就上有货网!',
            localCss: true
        }));
    }).catch(next);
};

/**
 * 折扣专场列表
 * @param  {[object]} req
 * @param  {[object]} res
 * @return {[type]}
 */
let discount = (req, res, next) => {
    let params = _processPublicData(req, '折扣专场', 'discount');

    saleModel.getDiscountData(params.channel).then((result) => {
        res.render('sale/discount', Object.assign(params.renderData, {
            data: result,
            localCss: true
        }));
    }).catch(next);
};


/**
 * 折扣专场专题详情
 * @param  {[object]} req
 * @param  {[object]} res
 * @return {[type]}
 */
let discountDetail = (req, res, next) => {
    let id = req.query.id;
    let params = _processPublicData(req, '', 'discount-detail');

    saleModel.getDiscountDetailData(id, req.yoho.channel).then((result) => {
        params.renderData.pageHeader.navTitle = result.title;

        // 唤起 APP 的路径
        res.locals.appPath = result.activity && result.activity.cover_url ? `yohobuy://yohobuy.com/goapp?openby:yohobuy={"action":"go.discountmarketpro","params":{"id":"${id}","cover_url":"${result.activity.cover_url.split('?')[0]}","title":"${result.title}"}}` : '';

        res.render('sale/discount-detail', Object.assign(params.renderData, result, {
            title: `【${result.title}】潮流折扣商品|YOHO!BUY 有货`,
            keywords: `${result.title}`,
            description: `有货网为您提供大量${result.title}商品,支持货到付款,质量保证,让您全面了解${result.title}商品价格、品牌、图片、折扣等方面信息,想网购${result.title}商品就上有货网!`, // eslint-disable-line
            localCss: true
        }));
    }).catch(next);
};

let getTime = (req, res, next) => {
    let id = req.query.id;

    saleModel.getDiscountTime(id, req.yoho.channel).then((time) => {
        res.json(time);
    }).catch(next);
};

/**
 * vip 会员专享
 * @param  {[object]} req
 * @param  {[object]} res
 * @return {[type]}
 */
let vip = (req, res, next) => {
    let params = _processPublicData(req, '会员专享', 'vip');

    saleModel.getVipData(params.channel).then((result) => {
        res.render('sale/vip', Object.assign(params.renderData, {
            title: 'VIP会员专享|会员专享|YOHO!BUY有货',
            keywords: '会员专享,VIP专享,专享商品',
            description: '有货网为您带VIP会员专享精选商品,大量潮流品牌商品,VIP价格优惠幅度大,支持货到付款,让您全面了解VIP会员专享商品价格、品牌、图片、折扣等方面信息,想网购VIP会员专享商品就上有货网!', // eslint-disable-line
            content: result,
            localCss: true
        }));
    }).catch(next);
};

/**
 * 筛选
 * @param  {[object]} req
 * @param  {[object]} res
 * @return {[type]}
 */
let filter = (req, res, next) => {
    let params = Object.assign({}, req.query);

    saleModel.getFilterData(params).then((result) => {
        res.render('sale/filter', {
            layout: false,
            params: params,
            filter: result
        });
    }).catch(next);
};


/**
 * 商品搜索
 * @param  {[object]} req
 * @param  {[object]} res
 * @return {[type]}
 */
let search = (req, res, next) => {
    let params = req.query;
    let uid = req.user.uid || 0;

    if (params.from === 'seckill') {
        uid = 0; // 秒杀无须用户信息
    }

    // 断码区域必须传尺码
    if (params.saleType === '1' && (!params.breakSort || !params.breakSize)) {
        return res.render('sale/product', {
            layout: false,
            params: params
        });
    }

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

    saleModel.getSearchData(params, uid).then((result) => {
        let vipLevel = result[1].cur_level;
        let vipObj = {};

        if (req.query.saleType === '2') {
            vipObj = {
                saleVip: (req.query.saleType === '2' && (!uid || vipLevel === '0')),
                vipLevel: vipLevel,
                saleViplogin: vipLevel >= 1 ? true : false,
                vipPrice1: vipLevel === '1',
                vipPrice2: vipLevel === '2',
                vipPrice3: vipLevel === '3'
            };
        }

        res.render('sale/product', Object.assign({
            layout: false,
            params: params,
            goods: result[0],
            _noLazy: params._noLazy || false
        }, vipObj));
    }).catch(next);
};

module.exports = {
    index,
    breakingYards,
    discount,
    discountDetail,
    vip,
    filter,
    search,
    getTime,
    indexRedirect
};