all files / src/controllers/ search.js

25% Statements 12/48
0% Branches 0/27
0% Functions 0/8
25% Lines 12/48
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                                                                                                                                                                                                 
 
'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;