search.js 6.83 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;

/**
 * 搜索落地页
 */
const list = (req, res, next) => {
    let params = Object.assign({
        isSearch: true, // 搜索列表将最新改成默认的标识
        cartUrl: helpers.urlFormat('/cart/index/index')
    }, req.query);
    let title = '';
    let query = req.query.query;
    let isQueryFirstClass = false; // 标识用户搜的是不是一级品类
    let isQuerySecondClass = false; // 标识用户搜的是不是二级品类
    let domain = null;

    if (params.shop_id) {
        params.shopId = params.shop_id;
    }

    if (params.query) {
        return searchModel.searchKeyActivity(params.query).then(activityResult => {
            let activity = _.get(activityResult, 'urlobj.appUrl', '');

            if (activity) {
                return res.redirect(activity);
            } else {

                /* 判断是不是品牌, 是品牌跳到品牌列表页(显示搜索框),判断是不是品类, 是品类加导航标题(不显示搜索框) */
                return Promise.all([
                    searchModel.getAllBrandNames(),
                    searchModel.getClassNames()
                ]).then(result => {
                    if (query) {
                        query = query.toLowerCase();
                        _.forEach(result[0], obj => {

                            if (query === obj.brandDomain) { // 精确查品牌域名
                                domain = query;
                                return false;
                            }

                            if (query === obj.brandName || query === obj.brandName || query === obj.brandName) { // 精确查品牌名称
                                domain = obj.brandDomain;
                                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);

                            return 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.form) {
                            params.search = {
                                default: query === '' ? false : query,
                                url: helpers.urlFormat('', null, 'search')
                            };
                        }
                        title = '搜索';
                    }

                    title = params.title ? params.title : title;

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

/**
 * 搜索主页
 */
const index = (req, res, next) => {
    let title = '搜索';

    ((render) => {
        if (_.get(req, 'app.locals.wap.search.removeHotSearch', false)) {
            render([]);
        } else {
            searchModel.getSearchIndex().then((result) => {
                render(result);
            }).catch(next);
        }

    })((result) => {
        res.render('search/index', {
            module: 'product',
            page: 'search-index',
            pageHeader: headerModel.setNav({
                navTitle: title
            }),
            pageFooter: true,
            search: {
                defaultTerms: (result && result.defaultTerms && result.defaultTerms.length !== 0) ? result.defaultTerms[0].content : '',
                url: helpers.urlFormat('', null, 'search'),
                hotTerms: result.hotTerms
            }

        });
    });

};

/**
 * 联动搜索
 */
let fuzzyDatas = (req, res, next) => {
    let params = req.query.keyword;

    searchModel.getFuzzyDatas(params).then((result) => {
        res.json(result);
    }).catch(next);
};


/**
 * ajax 商品数据请求
 */
const search = (req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');

    let params = Object.assign({}, req.query);

    params.isApp = req.yoho.isApp;
    searchModel.getSearchData(params).then((result) => {
        if (result.list.length > 0) {
            res.render('search/page', {
                layout: false,
                new: result.list,
                total: result.total
            });
        } else {
            res.json(result);
        }

    }).catch(next);
};

/**
 * 筛选
 */
let filter = (req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');

    let params = Object.assign({}, req.query);

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

module.exports = {
    list,
    filter,
    search,
    index,
    fuzzyDatas
};