|
|
|
'use strict';
|
|
|
|
|
|
|
|
var async = require('async'),
|
|
|
|
posts = require('./posts'),
|
|
|
|
topics = require('./topics'),
|
|
|
|
plugins = require('./plugins'),
|
|
|
|
privileges = require('./privileges');
|
|
|
|
|
|
|
|
var search = {};
|
|
|
|
|
|
|
|
module.exports = search;
|
|
|
|
|
|
|
|
search.search = function(term, uid, callback) {
|
|
|
|
var start = process.hrtime();
|
|
|
|
|
|
|
|
async.parallel({
|
|
|
|
pids: function(next) {
|
|
|
|
searchTerm('post', term, next);
|
|
|
|
},
|
|
|
|
tids: function(next) {
|
|
|
|
searchTerm('topic', term, next);
|
|
|
|
}
|
|
|
|
}, function (err, results) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!results || (!results.pids.length && !results.tids.length)) {
|
|
|
|
return callback(null, {
|
|
|
|
time: (process.elapsedTimeSince(start) / 1000).toFixed(2),
|
|
|
|
search_query: term,
|
|
|
|
results: [],
|
|
|
|
matchCount: 0
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
getMainPids(results.tids, function(err, mainPids) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
results.pids.forEach(function(pid) {
|
|
|
|
if (mainPids.indexOf(pid) === -1) {
|
|
|
|
mainPids.push(pid);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
privileges.posts.filter('read', mainPids, uid, function(err, pids) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
posts.getPostSummaryByPids(pids, uid, {stripTags: true, parse: false}, function(err, posts) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
callback(null, {
|
|
|
|
time: (process.elapsedTimeSince(start) / 1000).toFixed(2),
|
|
|
|
search_query: term,
|
|
|
|
results: posts,
|
|
|
|
matchCount: posts.length
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
function getMainPids(tids, callback) {
|
|
|
|
topics.getTopicsFields(tids, ['mainPid'], function(err, topics) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
topics = topics.map(function(topic) {
|
|
|
|
return topic && topic.mainPid;
|
|
|
|
}).filter(Boolean);
|
|
|
|
callback(null, topics);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function searchTerm(index, term, callback) {
|
|
|
|
plugins.fireHook('filter:search.query', {
|
|
|
|
index: index,
|
|
|
|
query: term
|
|
|
|
}, callback);
|
|
|
|
}
|
|
|
|
|