mirror of
https://github.com/discourse/discourse.git
synced 2025-02-11 22:44:14 +08:00
123 lines
3.6 KiB
JavaScript
123 lines
3.6 KiB
JavaScript
|
|
export function translateResults(results, opts) {
|
|
|
|
const User = require('discourse/models/user').default;
|
|
const Category = require('discourse/models/category').default;
|
|
const Post = require('discourse/models/post').default;
|
|
const Topic = require('discourse/models/topic').default;
|
|
|
|
if (!opts) opts = {};
|
|
|
|
// Topics might not be included
|
|
if (!results.topics) { results.topics = []; }
|
|
if (!results.users) { results.users = []; }
|
|
if (!results.posts) { results.posts = []; }
|
|
if (!results.categories) { results.categories = []; }
|
|
|
|
const topicMap = {};
|
|
results.topics = results.topics.map(function(topic){
|
|
topic = Topic.create(topic);
|
|
topicMap[topic.id] = topic;
|
|
return topic;
|
|
});
|
|
|
|
results.posts = results.posts.map(function(post){
|
|
post = Post.create(post);
|
|
post.set('topic', topicMap[post.topic_id]);
|
|
return post;
|
|
});
|
|
|
|
results.users = results.users.map(function(user){
|
|
user = User.create(user);
|
|
return user;
|
|
});
|
|
|
|
results.categories = results.categories.map(function(category){
|
|
return Category.list().findProperty('id', category.id);
|
|
}).compact();
|
|
|
|
const r = results.grouped_search_result;
|
|
results.resultTypes = [];
|
|
|
|
// TODO: consider refactoring front end to take a better structure
|
|
[['topic','posts'],['user','users'],['category','categories']].forEach(function(pair){
|
|
const type = pair[0], name = pair[1];
|
|
if (results[name].length > 0) {
|
|
var result = {
|
|
results: results[name],
|
|
componentName: "search-result-" + ((opts.searchContext && opts.searchContext.type === 'topic' && type === 'topic') ? 'post' : type),
|
|
type,
|
|
more: r['more_' + name]
|
|
};
|
|
|
|
if (result.more && name === "posts" && opts.fullSearchUrl) {
|
|
result.more = false;
|
|
result.moreUrl = opts.fullSearchUrl;
|
|
}
|
|
|
|
results.resultTypes.push(result);
|
|
}
|
|
});
|
|
|
|
const noResults = !!(results.topics.length === 0 &&
|
|
results.posts.length === 0 &&
|
|
results.users.length === 0 &&
|
|
results.categories.length === 0);
|
|
|
|
return noResults ? null : Em.Object.create(results);
|
|
}
|
|
|
|
function searchForTerm(term, opts) {
|
|
if (!opts) opts = {};
|
|
|
|
// Only include the data we have
|
|
const data = { term: term, include_blurbs: 'true' };
|
|
if (opts.typeFilter) data.type_filter = opts.typeFilter;
|
|
if (opts.searchForId) data.search_for_id = true;
|
|
|
|
if (opts.searchContext) {
|
|
data.search_context = {
|
|
type: opts.searchContext.type,
|
|
id: opts.searchContext.id
|
|
};
|
|
}
|
|
|
|
var promise = Discourse.ajax('/search/query', { data: data });
|
|
|
|
promise.then(function(results){
|
|
return translateResults(results, opts);
|
|
});
|
|
|
|
return promise;
|
|
}
|
|
|
|
const searchContextDescription = function(type, name){
|
|
if (type) {
|
|
switch(type) {
|
|
case 'topic':
|
|
return I18n.t('search.context.topic');
|
|
case 'user':
|
|
return I18n.t('search.context.user', {username: name});
|
|
case 'category':
|
|
return I18n.t('search.context.category', {category: name});
|
|
case 'private_messages':
|
|
return I18n.t('search.context.private_messages');
|
|
}
|
|
}
|
|
};
|
|
|
|
const getSearchKey = function(args){
|
|
return args.q + "|" + ((args.searchContext && args.searchContext.type) || "") + "|" +
|
|
((args.searchContext && args.searchContext.id) || "");
|
|
};
|
|
|
|
const isValidSearchTerm = function(searchTerm) {
|
|
if (searchTerm) {
|
|
return searchTerm.trim().length >= Discourse.SiteSettings.min_search_term_length;
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
export { searchForTerm, searchContextDescription, getSearchKey, isValidSearchTerm };
|