2013-02-05 14:16:51 -05:00
|
|
|
require_dependency 'search'
|
|
|
|
|
|
|
|
class SearchController < ApplicationController
|
|
|
|
|
2017-08-31 00:06:56 -04:00
|
|
|
skip_before_action :check_xhr, only: :show
|
2015-07-27 02:13:11 -04:00
|
|
|
|
2013-05-24 14:03:45 -04:00
|
|
|
def self.valid_context_types
|
2014-12-03 21:46:52 -05:00
|
|
|
%w{user topic category private_messages}
|
2013-05-24 14:03:45 -04:00
|
|
|
end
|
|
|
|
|
2015-07-27 02:13:11 -04:00
|
|
|
def show
|
2018-12-20 11:13:14 -05:00
|
|
|
@search_term = params[:q]
|
|
|
|
raise Discourse::InvalidParameters.new(:q) if @search_term.present? && @search_term.length < SiteSetting.min_search_term_length
|
2018-12-18 09:36:59 -05:00
|
|
|
|
2015-09-07 21:03:51 -04:00
|
|
|
search_args = {
|
|
|
|
type_filter: 'topic',
|
|
|
|
guardian: guardian,
|
|
|
|
include_blurbs: true,
|
2017-07-20 12:12:34 -04:00
|
|
|
blurb_length: 300,
|
|
|
|
page: if params[:page].to_i <= 10
|
|
|
|
[params[:page].to_i, 1].max
|
|
|
|
end
|
2015-09-07 21:03:51 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
context, type = lookup_search_context
|
|
|
|
if context
|
|
|
|
search_args[:search_context] = context
|
|
|
|
search_args[:type_filter] = type if type
|
|
|
|
end
|
|
|
|
|
2017-07-13 13:34:31 -04:00
|
|
|
search_args[:search_type] = :full_page
|
|
|
|
search_args[:ip_address] = request.remote_ip
|
|
|
|
search_args[:user_id] = current_user.id if current_user.present?
|
|
|
|
|
2017-10-26 22:41:10 -04:00
|
|
|
search = Search.new(@search_term, search_args)
|
2015-07-27 02:13:11 -04:00
|
|
|
result = search.execute
|
|
|
|
|
2016-03-18 14:07:20 -04:00
|
|
|
result.find_user_data(guardian) if result
|
2016-03-18 01:26:20 -04:00
|
|
|
|
2015-08-19 15:40:43 -04:00
|
|
|
serializer = serialize_data(result, GroupedSearchResultSerializer, result: result)
|
2015-07-27 02:13:11 -04:00
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html do
|
|
|
|
store_preloaded("search", MultiJson.dump(serializer))
|
|
|
|
end
|
|
|
|
format.json do
|
|
|
|
render_json_dump(serializer)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
def query
|
2013-06-06 03:14:32 -04:00
|
|
|
params.require(:term)
|
2014-08-28 03:15:53 -04:00
|
|
|
|
2015-08-19 15:40:43 -04:00
|
|
|
search_args = { guardian: guardian }
|
|
|
|
|
|
|
|
search_args[:type_filter] = params[:type_filter] if params[:type_filter].present?
|
|
|
|
search_args[:include_blurbs] = params[:include_blurbs] == "true" if params[:include_blurbs].present?
|
|
|
|
search_args[:search_for_id] = true if params[:search_for_id].present?
|
2013-05-24 14:03:45 -04:00
|
|
|
|
2017-07-25 20:51:44 -04:00
|
|
|
context, type = lookup_search_context
|
|
|
|
|
2015-09-07 21:03:51 -04:00
|
|
|
if context
|
|
|
|
search_args[:search_context] = context
|
|
|
|
search_args[:type_filter] = type if type
|
|
|
|
end
|
|
|
|
|
2017-07-13 13:34:31 -04:00
|
|
|
search_args[:search_type] = :header
|
|
|
|
search_args[:ip_address] = request.remote_ip
|
|
|
|
search_args[:user_id] = current_user.id if current_user.present?
|
2019-01-14 04:30:45 -05:00
|
|
|
search_args[:restrict_to_archetype] = params[:restrict_to_archetype] if params[:restrict_to_archetype].present?
|
2017-07-13 13:34:31 -04:00
|
|
|
|
|
|
|
search = Search.new(params[:term], search_args)
|
2015-09-07 21:03:51 -04:00
|
|
|
result = search.execute
|
|
|
|
render_serialized(result, GroupedSearchResultSerializer, result: result)
|
|
|
|
end
|
|
|
|
|
2017-07-17 15:42:32 -04:00
|
|
|
def click
|
|
|
|
params.require(:search_log_id)
|
|
|
|
params.require(:search_result_type)
|
|
|
|
params.require(:search_result_id)
|
|
|
|
|
2017-11-28 12:54:27 -05:00
|
|
|
search_result_type = params[:search_result_type].downcase.to_sym
|
|
|
|
if SearchLog.search_result_types.has_key?(search_result_type)
|
2017-08-31 00:06:56 -04:00
|
|
|
attributes = { id: params[:search_log_id] }
|
2017-07-17 15:42:32 -04:00
|
|
|
if current_user.present?
|
2017-08-31 00:06:56 -04:00
|
|
|
attributes[:user_id] = current_user.id
|
2017-07-17 15:42:32 -04:00
|
|
|
else
|
2017-08-31 00:06:56 -04:00
|
|
|
attributes[:ip_address] = request.remote_ip
|
2017-07-17 15:42:32 -04:00
|
|
|
end
|
|
|
|
|
2017-11-28 12:54:27 -05:00
|
|
|
if search_result_type == :tag
|
|
|
|
search_result_id = Tag.find_by_name(params[:search_result_id])&.id
|
|
|
|
else
|
|
|
|
search_result_id = params[:search_result_id]
|
|
|
|
end
|
|
|
|
|
2017-08-31 00:06:56 -04:00
|
|
|
SearchLog.where(attributes).update_all(
|
2017-11-28 12:54:27 -05:00
|
|
|
search_result_type: SearchLog.search_result_types[search_result_type],
|
|
|
|
search_result_id: search_result_id
|
2017-07-17 15:42:32 -04:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
render json: success_json
|
|
|
|
end
|
|
|
|
|
2015-09-07 21:03:51 -04:00
|
|
|
protected
|
|
|
|
|
|
|
|
def lookup_search_context
|
|
|
|
|
|
|
|
return if params[:skip_context] == "true"
|
|
|
|
|
2013-05-24 14:03:45 -04:00
|
|
|
search_context = params[:search_context]
|
2015-09-07 21:03:51 -04:00
|
|
|
unless search_context
|
|
|
|
if (context = params[:context]) && (id = params[:context_id])
|
2017-07-27 21:20:09 -04:00
|
|
|
search_context = { type: context, id: id }
|
2015-09-07 21:03:51 -04:00
|
|
|
end
|
|
|
|
end
|
2015-08-19 15:40:43 -04:00
|
|
|
|
2013-05-24 14:03:45 -04:00
|
|
|
if search_context.present?
|
|
|
|
raise Discourse::InvalidParameters.new(:search_context) unless SearchController.valid_context_types.include?(search_context[:type])
|
|
|
|
raise Discourse::InvalidParameters.new(:search_context) if search_context[:id].blank?
|
|
|
|
|
|
|
|
# A user is found by username
|
|
|
|
context_obj = nil
|
2017-07-27 21:20:09 -04:00
|
|
|
if ['user', 'private_messages'].include? search_context[:type]
|
2015-09-07 21:03:51 -04:00
|
|
|
context_obj = User.find_by(username_lower: search_context[:id].downcase)
|
2016-06-16 23:46:59 -04:00
|
|
|
elsif 'category' == search_context[:type]
|
|
|
|
context_obj = Category.find_by(id: search_context[:id].to_i)
|
|
|
|
elsif 'topic' == search_context[:type]
|
|
|
|
context_obj = Topic.find_by(id: search_context[:id].to_i)
|
2013-05-24 14:03:45 -04:00
|
|
|
end
|
|
|
|
|
2015-09-07 21:03:51 -04:00
|
|
|
type_filter = nil
|
2014-12-03 21:46:52 -05:00
|
|
|
if search_context[:type] == 'private_messages'
|
2015-09-07 21:03:51 -04:00
|
|
|
type_filter = 'private_messages'
|
2014-12-03 21:46:52 -05:00
|
|
|
end
|
|
|
|
|
2013-05-24 14:03:45 -04:00
|
|
|
guardian.ensure_can_see!(context_obj)
|
|
|
|
|
2015-09-07 21:03:51 -04:00
|
|
|
[context_obj, type_filter]
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|