mirror of
https://github.com/zammad/zammad
synced 2026-05-24 09:48:36 +00:00
85 lines
2.1 KiB
Ruby
85 lines
2.1 KiB
Ruby
# Copyright (C) 2012-2026 Zammad Foundation, https://zammad-foundation.org/
|
|
|
|
class SearchController < ApplicationController
|
|
prepend_before_action :authentication_check
|
|
|
|
# GET|POST /api/v1/search
|
|
# GET|POST /api/v1/search/:objects
|
|
|
|
def search_generic
|
|
assets = search_result
|
|
.result
|
|
.values
|
|
.each_with_object({}) { |index_result, memo| ApplicationModel::CanAssets.reduce index_result[:objects], memo }
|
|
|
|
result = if param_by_object?
|
|
result_by_object
|
|
else
|
|
result_flattened
|
|
end
|
|
|
|
render json: {
|
|
assets: assets,
|
|
result: result,
|
|
}
|
|
end
|
|
|
|
private
|
|
|
|
def result_by_object
|
|
search_result
|
|
.result
|
|
.each_with_object({}) do |(model, metadata), memo|
|
|
memo[model.to_app_model.to_s] = {
|
|
object_ids: metadata[:objects].pluck(:id),
|
|
total_count: metadata[:total_count]
|
|
}
|
|
end
|
|
end
|
|
|
|
def result_flattened
|
|
search_result
|
|
.flattened
|
|
.map do |item|
|
|
{
|
|
type: item.class.to_app_model.to_s,
|
|
id: item[:id],
|
|
}
|
|
end
|
|
end
|
|
|
|
def search_result
|
|
@search_result ||= begin
|
|
# get params
|
|
query = params[:query].try(:permit!)&.to_h || params[:query]
|
|
|
|
Service::Search
|
|
.execute(current_user:, query:, objects: search_result_objects, options: search_result_options)
|
|
end
|
|
end
|
|
|
|
def search_result_options
|
|
{
|
|
limit: params[:limit] || 10,
|
|
ids: params[:ids],
|
|
offset: params[:offset],
|
|
sort_by: Array(params[:sort_by]).compact_blank.presence,
|
|
order_by: Array(params[:order_by]).compact_blank.presence,
|
|
with_total_count: param_by_object?,
|
|
}.compact
|
|
end
|
|
|
|
def param_by_object?
|
|
@param_by_object ||= ActiveModel::Type::Boolean.new.cast(params[:by_object])
|
|
end
|
|
|
|
def search_result_objects
|
|
objects = Models.searchable
|
|
|
|
return objects if params[:objects].blank?
|
|
|
|
given_objects = params[:objects].split('-').map(&:downcase)
|
|
|
|
objects.select { |elem| given_objects.include? elem.to_app_model.to_s.downcase }
|
|
end
|
|
end
|