search.js 9.88 KB
/**
 * search controller
 * @author: wsl<shuiling.wang@yoho.cn>
 * @date: 2016/7/21
 */

'use strict';
const mRoot = '../models';
const headerModel = require('../../../doraemon/models/header');
const searchModel = require(`${mRoot}/search`);
const _ = require('lodash');
const helpers = global.yoho.helpers;

/**
 * 新店铺首页
 * @param {int} shopId 店铺id
 * @param {int} uid 用户id
 * @param {string} isApp app版本
 * @return array
 */
const _getShopData = (shopId, uid, isApp) => {
    let data = {};
    let channel = req.yoho.channel;
    isApp = isApp || '';

    Promise.all([searchModel.getShopDecorator(shopId),searchModel.getShopInfo(shopId, uid)]).then((result) => {
        data = {
            decorator: result[0], // 店铺装修资源数据
            shopInfo: result[1] // 店铺信息
        };

        // 店铺使用基础模板,返回品牌页面
        if (data.shopInfo.data.shopTemplateType && data.shopInfo.data.shopTemplateType ===1) {
            return {
                goBrand: data.shopInfo.data
            }
        }

        // 店铺分类
        return searchModel.getShopCategory(shopId, channel);
    }).then(shopCategory => {
        _.assign({
            shopCategory: shopCategory
        }, data);

        return searchModel.formShopData(data, shopId, isApp); // 组织楼层数据
    });
};

/**
 * 店铺首页 || 若店铺使用基础模板跳转品牌页
 * @return int
 */
const _shop = (req, res, shopId) => {
    let isApp = req.query.app_version || req.query.appVersion || false;
    let pageHeader = {};
    let uid = 0;

    if (!isApp) {
        pageHeader = headerModel.setNav({
            navTitle: ''
        });
        uid = req.user.uid;
    } else {
        uid = req.query.uid;
        req.session.appUid = uid;
        res.cookie('appUid', uid, {
            domain: 'yohobuy.com',
            expires: new Date(Date.now() + 2592000000) // 有效期一年
        });
    }

    _getShopData(shopId, uid, isApp).then((result) => {
        if (result.goBrand) {
            // 跳转基础模板
            _baseShop(result.goBrand);
        }

        res.render('shop', {
            shopIndex: result,
            shopPage: {
                text: '分类',
                url: helpers.urlFormat('/product/index/category', {
                    shop_id: shopId
                })
            },
            gender: req.query.gender,
            channel: req.query.channel
        }
    });


};

// 搜索落地页
const list = (req, res, next) => {
    let params = Object.assign({}, req.query);
    let title = '';
    let query = req.query.query;
    let isQueryFirstClass = false; // 标识用户搜的是不是一级品类
    let isQuerySecondClass = false; // 标识用户搜的是不是二级品类
    let domain = null;

    params = _.assign({
        isSearch: true,
        cartUrl: helpers.urlFormat('/cart/index/index')
    }, params);

    /* 判断是不是品牌, 是品牌跳到品牌列表页(显示搜索框),判断是不是品类, 是品类加导航标题(不显示搜索框) */
    Promise.all([searchModel.getAllBrandNames(), searchModel.getClassNames()]).then((result) => {
        if (query) {
            _.forEach(result[0], function(obj) {
                if (query === obj.brandDomain) { // 精确查品牌域名
                    domain = query;
                    return false;
                }
                if (query === obj.brandName) { // 精确查品牌名称
                    domain = obj.brandName;
                    return false;
                }

                if (obj.brandDomain.indexOf(query) > 0) { // 模糊查品牌域名
                    domain = obj.brandDomain;
                    return false;
                }
            });

            // 跳转到品牌商品列表页
            if (domain !== null && !params.shop_id) {
                let url = helpers.urlFormat('', {
                    from: 'search',
                    query: query

                }, domain);

                res.redirect(url);
            }

            // 品类名称为空时跳出
            if (!result[1]) {
                return;
            }

            _.forEach(result[1].first, (obj) => {
                // 精确查一级品类
                if (obj === query) {
                    isQueryFirstClass = true;
                    return false;
                }
            });

            _.forEach(result[1].second, (obj) => {
                // 精确查二级品类
                if (obj === query) {
                    isQuerySecondClass = true;
                    return false;
                }
            });
        } else {
            params.query = '';
        }

        // 搜索是一级品类
        if (isQueryFirstClass) {
            title = '全部' + query;
        } else if (isQuerySecondClass) { // 搜索是二级品类
            title = query;
        } else { // 搜索其它内容
            if (query) {
                params.search = {
                    default: query === '' ? false : query,
                    url: ''
                };
            }
            title = '搜索';
        }

        res.render('search/list', {
            module: 'product',
            page: 'search-list',
            pageHeader: headerModel.setNav({
                navTitle: title
            }),
            goodList: params,
            pageFooter: true
        });
    }).catch(next);
};

// 品类落地页
const category = (req, res) => {
    let params = Object.assign({}, req.query);

    res.render('search/goods-list', {
        module: 'product',
        page: 'search-list',
        pageHeader: headerModel.setNav({
            navTitle: req.query.title
        }),
        goodList: params,
        showDownloadApp: true,
        pageFooter: true
    });
};

// 品牌落地页
const brand = (req, res, next) => {
    let params = Object.assign({}, req.query);
    let domain = 'vans';
    let uid = req.user.uid || 20000032;
    let brandId = 0;
    let brandLogo = {};
    let title = '';
    let brandHome = false;

    if (!domain) {
        res.redirect('/?go=1');
    }

    searchModel.getBrandLogoByDomain(domain).then((result) => {
        brandLogo = result;

        title = brandLogo.name;

        //无店铺:0--->品牌页 无单品店有多品店:1--->搜索页 有单品店:2--->店铺页面
        if (brandLogo.type === 2 && brandLogo.shopId) {
            _shop(req, res, brandLogo.shopId);
            return false;
        }

        if (brandLogo && brandLogo.id) {
            brandId = brandLogo.id;
        }

        params = _.assign({
            brand: brandId
        }, params);

        //获取品牌店铺信息
        return searchModel.getBrandShops(brandId);
    }).then((brandShop) => {
        if (brandId === 0) {
            params.query = domain;
        }

        // 从搜索页过来的,显示搜索框, 和进入品牌引导信息 或者品牌关联多店铺
        if (req.query.from === 'search' || brandShop.length > 0) {
            params = {
                brandWay: brandShop ? brandShop : brandLogo,
                search: {
                    default: req.query.query,
                    url: helpers.urlFormat('', null, 'search')
                }
            };
        } else if (brandId !== 0) { // 品牌一览过来的展示品牌介绍和LOGO
            return Promise.all([searchModel.getBrandIntro(brandId, uid), searchModel.getBrandBanner(brandId)]).then((result) => {
                title = result[0].title;
                delete result[0].title;

                return _.assign({
                    banner: result[1]
                }, result[0]);
            });
        }
    }).then((brandHome) => {
        params.brandHome = brandHome;

        res.render('search/goods-list', {
            module: 'product',
            page: 'search-list',
            pageHeader: headerModel.setNav({
                navTitle: title !== '' ? title : domain
            }),
            goodList: params,
            showDownloadApp: true,
            pageFooter: true
        });
    }).catch(next);
};

const search = (req, res, next) => {
    let params = Object.assign({}, req.query);

    searchModel.getSearchData(params).then((result) => {
        res.render('search/page', {
            layout: false,
            new: result
        });
    }).catch(next);
};

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

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

/**
 * 品牌[店铺]收藏/取消收藏
 * id 品牌ID
 * opt 操作标识("ok":表示收藏,"cancel":表示取消收藏)
 */
const favoriteBrand = (req, res, next) => {
    let id = req.body.id;
    let uid = req.user.uid || 20000032;
    let opt = req.body.opt || 'ok';


    if (_.isNumber(id)) {
        res.json({
            code: 401,
            message: '参数不正确',
            data: false
        });
        return false;
    } else if (!uid) {
        res.json({
            code: 400,
            message: '未登录',
            data: helpers.urlFormat('/signin.html', {
                refer: decodeURI(req.cookies.refer)
            })
        });
        return false;
    } else if (opt !== 'ok') { // 取消收藏
        searchModel.setFavoriteCancel(id, uid).then((data) => {
            res.json(data);
            return false;
        }).catch(next);
    }

    searchModel.setFavorite(id, uid).then((result) => {
        if (!result.code) { // 收藏
            result = {
                code: 401,
                message: '参数不正确',
                data: false
            };
        }

        res.json(result);
    });
};

module.exports = {
    list,
    filter,
    search,
    category,
    brand,
    favoriteBrand
};