Merge pull request #7427 from rekonder/aj_SCI_10246

Implement quick search backend [SCI-10246]
This commit is contained in:
Martin Artnik 2024-04-15 10:36:12 +02:00 committed by GitHub
commit 2ff3477956
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 52 additions and 18 deletions

View file

@ -224,23 +224,33 @@ class SearchController < ApplicationController
end
def quick
results = [
Project.first,
Experiment.first,
MyModule.first,
Protocol.first,
RepositoryRow.first,
Result.first,
Step.first,
Report.first,
LabelTemplate.first
].compact
results = if params[:filter].present?
object_quick_search(params[:filter].singularize,
search_by_id: Constants::QUICK_SEARCH_SEARCHABLE_BY_NAME
.exclude?(params[:filter].singularize))
else
Constants::QUICK_SEARCH_SEARCHABLE_OBJECTS.filter_map do |object|
next if object == 'label_template' && !LabelTemplate.enabled?
object_quick_search(object, search_by_id: Constants::QUICK_SEARCH_SEARCHABLE_BY_NAME.exclude?(object))
end.flatten.sort_by(&:updated_at).reverse.take(Constants::QUICK_SEARCH_LIMIT)
end
render json: results, each_serializer: QuickSearchSerializer
end
private
def object_quick_search(class_name, search_by_id: true)
search_method = class_name.to_s.camelize.constantize.method(search_by_id ? :search_by_name_and_id : :search_by_name)
search_method.call(current_user,
current_team,
params[:query],
limit: Constants::QUICK_SEARCH_LIMIT)
.order(updated_at: :desc)
end
def load_vars
query = (params.fetch(:q) { '' }).strip
@search_category = params[:category] || ''

View file

@ -210,7 +210,9 @@ export default {
const breadcrumbs = attributes.breadcrumbs.map((breadcrumb) => breadcrumb.name);
breadcrumbs.pop();
breadcrumbs.shift();
breadcrumbs.push(`ID: ${attributes.code}`);
if (attributes.code) {
breadcrumbs.push(`ID: ${attributes.code}`);
}
return breadcrumbs;
},
setQuery(query) {

View file

@ -20,10 +20,10 @@ module SearchableByNameModel
sql_q = sql_q.where(id: viewable_by_user(user, teams))
sql_q.limit(Constants::SEARCH_LIMIT)
sql_q.limit(options[:limit] || Constants::SEARCH_LIMIT)
end
def self.search_by_name_and_id(user, teams = [], query = nil)
def self.search_by_name_and_id(user, teams = [], query = nil, options = {})
return if user.blank? || teams.blank?
sanitized_query = ActiveRecord::Base.sanitize_sql_like(query.to_s)
@ -34,7 +34,7 @@ module SearchableByNameModel
"%#{sanitized_query}%", "%#{sanitized_query}%"
)
sql_q.limit(Constants::SEARCH_LIMIT)
sql_q.limit(options[:limit] || Constants::SEARCH_LIMIT)
end
end
# rubocop:enable Metrics/BlockLength

View file

@ -2,6 +2,7 @@
class LabelTemplate < ApplicationRecord
include SearchableModel
include SearchableByNameModel
belongs_to :team
belongs_to :created_by, class_name: 'User', optional: true
@ -20,6 +21,17 @@ class LabelTemplate < ApplicationRecord
scope :default, -> { where(default: true) }
def self.viewable_by_user(user, teams)
joins("INNER JOIN user_assignments team_user_assignments
ON team_user_assignments.assignable_id = label_templates.team_id
AND team_user_assignments.assignable_type = 'Team'
AND team_user_assignments.user_id = #{user.id}
INNER JOIN user_roles team_user_roles
ON team_user_roles.id = team_user_assignments.user_role_id
AND team_user_roles.permissions @> ARRAY['#{TeamPermissions::LABEL_TEMPLATES_READ}']::varchar[]")
.where(team: teams)
end
def self.enabled?
ApplicationSettings.instance.values['label_templates_enabled'] == true
end

View file

@ -33,6 +33,12 @@ class ProjectFolder < ApplicationRecord
scope :top_level, -> { where(parent_folder: nil) }
def self.viewable_by_user(user, teams)
joins(team: :users)
.where(teams: { user_assignments: { user: user } })
.where(team: teams)
end
def self.search(user, _include_archived, query = nil, page = 1, current_team = nil, options = {})
new_query = if current_team
current_team.project_folders.where_attributes_like(:name, query, options)

View file

@ -13,9 +13,7 @@ class QuickSearchSerializer < ActiveModel::Serializer
end
def code
@object.code
rescue StandardError
@object.id
@object.code unless @object.is_a?(ProjectFolder) || object.is_a?(Result) || object.is_a?(LabelTemplate)
end
def updated_at

View file

@ -443,6 +443,12 @@ class Constants
MIN_SCINOTE_EDIT_VERSION = ENV['MIN_SCINOTE_EDIT_VERSION'].freeze
MAX_SCINOTE_EDIT_VERSION = ENV['MAX_SCINOTE_EDIT_VERSION'].freeze
# quick search
QUICK_SEARCH_LIMIT = 5
QUICK_SEARCH_SEARCHABLE_OBJECTS = %w(project experiment my_module protocol repository_row
report project_folder result label_template).freeze
QUICK_SEARCH_SEARCHABLE_BY_NAME = %w(project_folder result label_template).freeze
# ) \ / (
# /|\ )\_/( /|\
# * / | \ (/\|/\) / | \ *