1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× | 'use strict'; var async = require('async'); var meta = require('../meta'); var plugins = require('../plugins'); var search = require('../search'); var categories = require('../categories'); var pagination = require('../pagination'); var helpers = require('./helpers'); var searchController = {}; searchController.search = function(req, res, next) { if (!plugins.hasListeners('filter:search.query')) { return next(); } if (!req.user && parseInt(meta.config.allowGuestSearching, 10) !== 1) { return helpers.notAllowed(req, res); } var page = Math.max(1, parseInt(req.query.page, 10)) || 1; if (req.query.categories && !Array.isArray(req.query.categories)) { req.query.categories = [req.query.categories]; } var data = { query: req.params.term, searchIn: req.query.in || 'posts', postedBy: req.query.by, categories: req.query.categories, searchChildren: req.query.searchChildren, replies: req.query.replies, repliesFilter: req.query.repliesFilter, timeRange: req.query.timeRange, timeFilter: req.query.timeFilter, sortBy: req.query.sortBy, sortDirection: req.query.sortDirection, page: page, uid: req.uid, qs: req.query }; async.parallel({ categories: async.apply(buildCategories, req.uid), search: async.apply(search.search, data) }, function(err, results) { if (err) { return next(err); } var searchData = results.search; searchData.categories = results.categories; searchData.categoriesCount = results.categories.length; searchData.pagination = pagination.create(page, searchData.pageCount, req.query); searchData.showAsPosts = !req.query.showAs || req.query.showAs === 'posts'; searchData.showAsTopics = req.query.showAs === 'topics'; searchData.title = '[[global:header.search]]'; searchData.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]); searchData.expandSearch = !req.params.term; res.render('search', searchData); }); }; function buildCategories(uid, callback) { categories.getCategoriesByPrivilege('cid:0:children', uid, 'read', function(err, categories) { if (err) { return callback(err); } var categoriesData = [ {value: 'all', text: '[[unread:all_categories]]'}, {value: 'watched', text: '[[category:watched-categories]]'} ]; categories = categories.filter(function(category) { return category && !category.link && !parseInt(category.parentCid, 10); }); categories.forEach(function(category) { recursive(category, categoriesData, ''); }); callback(null, categoriesData); }); } function recursive(category, categoriesData, level) { if (category.link) { return; } var bullet = level ? '• ' : ''; categoriesData.push({ value: category.cid, text: level + bullet + category.name }); category.children.forEach(function(child) { recursive(child, categoriesData, ' ' + level); }); } module.exports = searchController; |