Files
NodeBB/src/search.js

112 lines
2.4 KiB
JavaScript
Raw Normal View History

2014-07-07 17:36:10 -04:00
'use strict';
var async = require('async'),
posts = require('./posts'),
topics = require('./topics'),
2015-01-07 16:10:11 -05:00
user = require('./user'),
2014-07-07 17:36:10 -04:00
plugins = require('./plugins'),
privileges = require('./privileges');
var search = {};
module.exports = search;
2015-01-07 16:10:11 -05:00
search.search = function(query, searchIn, uid, callback) {
function done(err, data) {
if (err) {
return callback(err);
}
result.search_query = query;
result[searchIn] = data;
result.matchCount = data.length;
result.time = (process.elapsedTimeSince(start) / 1000).toFixed(2);
callback(null, result);
}
2014-07-07 17:36:10 -04:00
var start = process.hrtime();
2015-01-07 16:10:11 -05:00
searchIn = searchIn || 'posts';
2014-07-07 17:36:10 -04:00
2015-01-07 16:10:11 -05:00
var result = {
posts: [],
users: [],
tags: []
};
if (searchIn === 'posts') {
searchInPosts(query, uid, done);
} else if (searchIn === 'users') {
searchInUsers(query, done);
} else if (searchIn === 'tags') {
searchInTags(query, done);
} else {
callback(new Error('[[error:unknown-search-filter]]'));
}
};
function searchInPosts(query, uid, callback) {
2014-07-07 17:36:10 -04:00
async.parallel({
pids: function(next) {
2015-01-07 16:10:11 -05:00
searchQuery('post', query, next);
2014-07-07 17:36:10 -04:00
},
tids: function(next) {
2015-01-07 16:10:11 -05:00
searchQuery('topic', query, next);
2014-07-07 17:36:10 -04:00
}
}, function (err, results) {
if (err) {
return callback(err);
}
if (!results || (!results.pids.length && !results.tids.length)) {
2015-01-07 16:10:11 -05:00
return callback(null, []);
2014-07-07 17:36:10 -04:00
}
2015-01-07 16:10:11 -05:00
async.waterfall([
function(next) {
getMainPids(results.tids, next);
},
function(mainPids, next) {
results.pids.forEach(function(pid) {
if (mainPids.indexOf(pid) === -1) {
mainPids.push(pid);
2014-07-07 17:36:10 -04:00
}
});
2015-01-07 16:10:11 -05:00
privileges.posts.filter('read', mainPids, uid, next);
},
function(pids, next) {
posts.getPostSummaryByPids(pids, uid, {stripTags: true, parse: false}, next);
}
], callback);
2014-07-07 17:36:10 -04:00
});
2015-01-07 16:10:11 -05:00
}
2014-07-07 17:36:10 -04:00
2015-01-07 16:10:11 -05:00
function searchInUsers(query, callback) {
user.search({query: query}, function(err, results) {
callback(err, results ? results.users : null);
});
}
function searchInTags(query, callback) {
topics.searchAndLoadTags({query: query}, callback);
}
2014-07-07 17:36:10 -04:00
function getMainPids(tids, callback) {
topics.getTopicsFields(tids, ['mainPid'], function(err, topics) {
if (err) {
return callback(err);
}
2014-09-05 13:51:02 -04:00
topics = topics.map(function(topic) {
return topic && topic.mainPid;
}).filter(Boolean);
2014-07-07 17:36:10 -04:00
callback(null, topics);
});
}
2015-01-07 16:10:11 -05:00
function searchQuery(index, query, callback) {
2014-07-07 17:36:10 -04:00
plugins.fireHook('filter:search.query', {
index: index,
2015-01-07 16:10:11 -05:00
query: query
2014-07-07 17:36:10 -04:00
}, callback);
}