cart.js 6.51 KB
/**
 * 购物车 controller
 * @author: jinhu.dong<jinhu.dong@yoho.cn>
 * @date: 2016/07/04
 */

'use strict';

const cartModel = require('../models/cart');
const _ = require('lodash');

// 购物车首页
exports.index = (req, res, next) => {
    const shoppingKey = req.cookies._SPK || null;
    const uid = req.user.uid || null;

    cartModel.getCartData(shoppingKey, uid).then((result) => {
        if (result.code === 200) {

            res.header('Cache-Control', 'no-store');

            res.display('cart', _.merge({
                module: 'shopping',
                page: 'cart',
                bcNavFocus: 1,
                defaultHeader: false
            }, {
                helpers: require('../helpers')
            }, cartModel.filterCartData(result, uid)));
        }
    }).catch(next);
};


// 通过stepper修改购物车商品数量
exports.changeProductNum = (req, res, next) => {
    const changeType = req.body.changeType;
    const uid = req.user.uid;
    const shoppingKey = req.cookies._SPK;
    const sku = req.body.sku;
    const goodTpye = req.body.goodType;

    if (changeType === 'INCREASE') {
        cartModel.modifyProductNum({
            increaseNum: 1, // 默认是1
            uid,
            shoppingKey,
            sku,
            goodTpye
        }).then(result => {
            if (result.code === 200) {
                cartModel.getCartData(shoppingKey, uid).then(cartData => {
                    res.json(_.merge(
                        cartModel.filterCartData(cartData, uid),
                        {code: cartData.code, message: result.message})
                    );
                });
            } else {
                res.json(result);
            }
        }).catch(next);
    } else if (changeType === 'DECREASE') {
        cartModel.modifyProductNum({
            decreaseNum: 1, // 默认是1
            uid,
            shoppingKey,
            sku,
            goodTpye
        }).then(result => {
            if (result.code === 200) {
                cartModel.getCartData(shoppingKey, uid).then(cartData => {
                    res.json(_.merge(
                        cartModel.filterCartData(cartData, uid),
                        {code: cartData.code, message: result.message})
                    );
                });
            } else {
                res.json(result);
            }
        }).catch(next);
    }
};

// 删除商品
exports.removeProduct = (req, res, next) => {
    const params = {};
    const uid = req.user.uid;
    const shoppingKey = req.cookies._SPK;
    const productSkuList = req.body.skuList;

    if (uid) {
        _.merge(params, {uid});
    }

    if (shoppingKey) {
        _.merge(params, {shopping_key: shoppingKey});
    }

    if (productSkuList) {
        _.merge(params, {product_sku_list: productSkuList});
    }

    cartModel.removeGoods(params).then(result => {
        res.json(_.merge(cartModel.filterCartData(result, uid), {code: result.code, message: result.message}));
    }).catch(next);
};

// 收藏商品
exports.sendToFavorite = (req, res, next) => {
    const params = {};
    const uid = req.user.uid;
    const productSkuList = req.body.skuList;

    if (uid) {
        _.merge(params, {uid});
    }

    if (productSkuList) {
        _.merge(params, {product_sku_list: productSkuList});
    }

    cartModel.transferToFavorite(params).then(result => {
        res.json(_.merge(cartModel.filterCartData(result, uid), {code: result.code, message: result.message}));
    }).catch(next);
};

// 添加商品到购物车
exports.addToCart = (req, res, next) => {
    const productSku = req.body.productSku;
    const buyNumber = req.body.buyNumber;

    cartModel.addToCart({
        productSku: productSku,
        buyNumber: buyNumber,
        shoppingKey: req.cookies._SPK || null,
        uid: req.user.uid
    }).then((result) => {
        res.cookie('_SPK', result.data.shopping_key, { maxAge: 1000 * 60 * 60 * 24 * 365, httpOnly: true, path: '/'});
        res.json(result);
    }).catch(next);
};

// 购物车商品选择与取消选择
exports.toggleSelectGoods = (req, res, next) => {
    const params = {};
    const uid = req.user.uid;
    const shoppingKey = req.cookies._SPK;

    // 商品sku列表
    // skuList:
    // [{"goods_type":"advance","buy_number":1,"selected":"Y","product_sku":"1006277","promotion_id":0}, {...}]
    // [{"goods_type":"ordinary","buy_number":1,"selected":"Y","product_sku":"1006277","promotion_id":0}, {...}]
    const productSkuList = req.body.skuList;

    if (uid) {
        _.merge(params, {uid});
    }

    if (shoppingKey) {
        _.merge(params, {shopping_key: shoppingKey});
    }

    if (productSkuList) {
        _.merge(params, {product_sku_list: productSkuList});
    }

    cartModel.toggleSelectGoods(params).then(result => {
        res.json(_.merge(cartModel.filterCartData(result, uid), {code: result.code, message: result.message}));
    }).catch(next);
};


// 点击去结算时检查库存
exports.checkStorage = (req, res, next) => {
    const shoppingKey = req.cookies._SPK || null;
    const uid = req.user.uid || null;

    cartModel.getCartData(shoppingKey, uid).then((result) => {
        res.json(_.merge(cartModel.filterCartData(result, uid), {code: result.code, message: result.message}));
    }).catch(next);
};

// 修改购物车商品颜色和尺寸
exports.modifyProduct = (req, res, next) => {
    const uid = req.user && req.user.uid;
    const shoppingKey = req.cookies._SPK;

    // swapData => [{"buy_number":"1","selected":"Y","new_product_sku":"735172","old_product_sku":"735171"}]
    const swapData = req.body.swapData;

    cartModel.modifyProduct({swapData, shoppingKey, uid}).then((result) => {
        if (result.code === 200) {
            cartModel.getCartData(shoppingKey, uid).then(cartData => {
                res.json(_.merge(
                    cartModel.filterCartData(cartData, uid),
                    {code: cartData.code, message: result.message})
                );
            });
        } else {
            res.json(result);
        }
    }).catch(next);
};

// 获取购物车商品信息
exports.getCartData = (req, res, next) => {
    const shoppingKey = req.cookies._SPK || null;
    const uid = req.user.uid || null;

    cartModel.getCartData(shoppingKey, uid).then((result) => {
        if (result.code === 200) {
            res.json(
                _.merge(
                    cartModel.filterCartData(result, uid),
                    {code: result.code, message: result.message}
                )
            );
        } else {
            res.send(result);
        }
    }).catch(next);
};