Fixed searchable models as customer user. Added model.search_preferences to get searchable models by config.
This commit is contained in:
parent
a6df782fef
commit
b2aa52c22a
6 changed files with 193 additions and 45 deletions
|
@ -21,60 +21,78 @@ class SearchController < ApplicationController
|
||||||
# convert objects string into array of class names
|
# convert objects string into array of class names
|
||||||
# e.g. user-ticket-another_object = %w( User Ticket AnotherObject )
|
# e.g. user-ticket-another_object = %w( User Ticket AnotherObject )
|
||||||
if !params[:objects]
|
if !params[:objects]
|
||||||
objects_all = %w( Ticket User Organization )
|
objects = %w( Ticket User Organization )
|
||||||
else
|
else
|
||||||
objects_all = params[:objects].split('-').map(&:camelize)
|
objects = params[:objects].split('-').map(&:camelize)
|
||||||
end
|
end
|
||||||
objects = objects_all.clone
|
|
||||||
puts "OBJECTS: #{objects.inspect}"
|
# get priorities of result
|
||||||
search_tickets = objects.delete('Ticket')
|
objects_in_order = []
|
||||||
puts "OBJECTS_a: #{objects_all.inspect}/#{search_tickets.inspect}"
|
objects_in_order_hash = {}
|
||||||
|
objects.each { |object|
|
||||||
|
preferences = object.constantize.search_preferences(current_user)
|
||||||
|
next if !preferences
|
||||||
|
objects_in_order_hash[preferences[:prio]] = object
|
||||||
|
}
|
||||||
|
objects_in_order_hash.keys.sort.reverse.each {|prio|
|
||||||
|
objects_in_order.push objects_in_order_hash[prio]
|
||||||
|
}
|
||||||
|
|
||||||
# try search index backend
|
# try search index backend
|
||||||
assets = {}
|
assets = {}
|
||||||
result = []
|
result = []
|
||||||
if SearchIndexBackend.enabled?
|
if SearchIndexBackend.enabled?
|
||||||
items = SearchIndexBackend.search( query, limit, objects )
|
|
||||||
items.each { |item|
|
# get direct search index based objects
|
||||||
require item[:type].to_filename
|
objects_with_direct_search_index = []
|
||||||
record = Kernel.const_get( item[:type] ).find( item[:id] )
|
objects_without_direct_search_index = []
|
||||||
assets = record.assets(assets)
|
objects.each { |object|
|
||||||
result.push item
|
preferences = object.constantize.search_preferences(current_user)
|
||||||
|
next if !preferences
|
||||||
|
if preferences[:direct_search_index]
|
||||||
|
objects_with_direct_search_index.push object
|
||||||
|
else
|
||||||
|
objects_without_direct_search_index.push object
|
||||||
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
# do ticket query by Ticket class to handle ticket permissions
|
# do only one query to index search backend
|
||||||
if search_tickets
|
if !objects_with_direct_search_index.empty?
|
||||||
tickets = Ticket.search(
|
items = SearchIndexBackend.search( query, limit, objects_with_direct_search_index )
|
||||||
query: query,
|
items.each { |item|
|
||||||
limit: limit,
|
require item[:type].to_filename
|
||||||
current_user: current_user,
|
record = Kernel.const_get( item[:type] ).find( item[:id] )
|
||||||
)
|
assets = record.assets(assets)
|
||||||
tickets.each do |ticket|
|
|
||||||
assets = ticket.assets(assets)
|
|
||||||
item = {
|
|
||||||
id: ticket.id,
|
|
||||||
type: 'Ticket',
|
|
||||||
}
|
|
||||||
result.push item
|
result.push item
|
||||||
end
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# e. g. do ticket query by Ticket class to handle ticket permissions
|
||||||
|
objects_without_direct_search_index.each { |object|
|
||||||
|
object_result = search_generic_backend(object, query, limit, current_user, assets)
|
||||||
|
if !object_result.empty?
|
||||||
|
result = result.concat(object_result)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
# sort order by object priority
|
||||||
|
result_in_order = []
|
||||||
|
objects_in_order.each { |object|
|
||||||
|
result.each {|item|
|
||||||
|
next if item[:type] != object
|
||||||
|
item[:id] = item[:id].to_i
|
||||||
|
result_in_order.push item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = result_in_order
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
# do query
|
# do query
|
||||||
objects_all.each { |object|
|
objects_in_order.each { |object|
|
||||||
|
object_result = search_generic_backend(object, query, limit, current_user, assets)
|
||||||
found_objects = object.constantize.search(
|
if !object_result.empty?
|
||||||
query: query,
|
result = result.concat(object_result)
|
||||||
limit: limit,
|
|
||||||
current_user: current_user,
|
|
||||||
)
|
|
||||||
|
|
||||||
found_objects.each do |found_object|
|
|
||||||
item = {
|
|
||||||
id: found_object.id,
|
|
||||||
type: found_object.class.to_s
|
|
||||||
}
|
|
||||||
result.push item
|
|
||||||
assets = found_object.assets(assets)
|
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -85,4 +103,23 @@ puts "OBJECTS_a: #{objects_all.inspect}/#{search_tickets.inspect}"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def search_generic_backend(object, query, limit, current_user, assets)
|
||||||
|
found_objects = object.constantize.search(
|
||||||
|
query: query,
|
||||||
|
limit: limit,
|
||||||
|
current_user: current_user,
|
||||||
|
)
|
||||||
|
result = []
|
||||||
|
found_objects.each do |found_object|
|
||||||
|
item = {
|
||||||
|
id: found_object.id,
|
||||||
|
type: found_object.class.to_s
|
||||||
|
}
|
||||||
|
result.push item
|
||||||
|
assets = found_object.assets(assets)
|
||||||
|
end
|
||||||
|
result
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,33 @@ class Organization
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
|
search organizations preferences
|
||||||
|
|
||||||
|
result = Organization.search_preferences(user_model)
|
||||||
|
|
||||||
|
returns if user has permissions to search
|
||||||
|
|
||||||
|
result = {
|
||||||
|
prio: 1000,
|
||||||
|
direct_search_index: true
|
||||||
|
}
|
||||||
|
|
||||||
|
returns if user has no permissions to search
|
||||||
|
|
||||||
|
result = false
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def search_preferences(current_user)
|
||||||
|
return false if !current_user.role?('Agent') && !current_user.role?(Z_ROLENAME_ADMIN)
|
||||||
|
{
|
||||||
|
prio: 1000,
|
||||||
|
direct_search_index: true,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
search organizations
|
search organizations
|
||||||
|
|
||||||
result = Organization.search(
|
result = Organization.search(
|
||||||
|
@ -27,7 +54,7 @@ returns
|
||||||
current_user = params[:current_user]
|
current_user = params[:current_user]
|
||||||
|
|
||||||
# enable search only for agents and admins
|
# enable search only for agents and admins
|
||||||
return [] if !current_user.role?('Agent') && !current_user.role?(Z_ROLENAME_ADMIN)
|
return [] if !search_preferences(current_user)
|
||||||
|
|
||||||
# try search index backend
|
# try search index backend
|
||||||
if SearchIndexBackend.enabled?
|
if SearchIndexBackend.enabled?
|
||||||
|
|
|
@ -3,6 +3,32 @@ module Ticket::Search
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
|
search tickets preferences
|
||||||
|
|
||||||
|
result = Ticket.search_preferences(user_model)
|
||||||
|
|
||||||
|
returns if user has permissions to search
|
||||||
|
|
||||||
|
result = {
|
||||||
|
prio: 3000,
|
||||||
|
direct_search_index: false
|
||||||
|
}
|
||||||
|
|
||||||
|
returns if user has no permissions to search
|
||||||
|
|
||||||
|
result = false
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def search_preferences(_current_user)
|
||||||
|
{
|
||||||
|
prio: 3000,
|
||||||
|
direct_search_index: false,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
search tickets via search index
|
search tickets via search index
|
||||||
|
|
||||||
result = Ticket.search(
|
result = Ticket.search(
|
||||||
|
|
|
@ -5,6 +5,33 @@ class User
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
|
search user preferences
|
||||||
|
|
||||||
|
result = User.search_preferences(user_model)
|
||||||
|
|
||||||
|
returns if user has permissions to search
|
||||||
|
|
||||||
|
result = {
|
||||||
|
prio: 1000,
|
||||||
|
direct_search_index: true
|
||||||
|
}
|
||||||
|
|
||||||
|
returns if user has no permissions to search
|
||||||
|
|
||||||
|
result = false
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def search_preferences(current_user)
|
||||||
|
return false if !current_user.role?('Agent') && !current_user.role?(Z_ROLENAME_ADMIN)
|
||||||
|
{
|
||||||
|
prio: 2000,
|
||||||
|
direct_search_index: true,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
search user
|
search user
|
||||||
|
|
||||||
result = User.search(
|
result = User.search(
|
||||||
|
@ -27,7 +54,7 @@ returns
|
||||||
current_user = params[:current_user]
|
current_user = params[:current_user]
|
||||||
|
|
||||||
# enable search only for agents and admins
|
# enable search only for agents and admins
|
||||||
return [] if !current_user.role?('Agent') && !current_user.role?(Z_ROLENAME_ADMIN)
|
return [] if !search_preferences(current_user)
|
||||||
|
|
||||||
# try search index backend
|
# try search index backend
|
||||||
if SearchIndexBackend.enabled?
|
if SearchIndexBackend.enabled?
|
||||||
|
|
|
@ -150,7 +150,7 @@ return search result
|
||||||
|
|
||||||
=end
|
=end
|
||||||
|
|
||||||
def self.search( query, _limit = 10, index = nil, query_extention = {} )
|
def self.search( query, limit = 10, index = nil, query_extention = {} )
|
||||||
return [] if !query
|
return [] if !query
|
||||||
|
|
||||||
url = build_url()
|
url = build_url()
|
||||||
|
@ -166,7 +166,7 @@ return search result
|
||||||
end
|
end
|
||||||
data = {}
|
data = {}
|
||||||
data['from'] = 0
|
data['from'] = 0
|
||||||
data['size'] = 10
|
data['size'] = limit
|
||||||
data['sort'] =
|
data['sort'] =
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
|
@ -152,6 +152,37 @@ class SearchControllerTest < ActionDispatch::IntegrationTest
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# configure es
|
||||||
|
if ENV['ES_URL']
|
||||||
|
#fail "ERROR: Need ES_URL - hint ES_URL='http://172.0.0.1:9200'"
|
||||||
|
Setting.set('es_url', ENV['ES_URL'])
|
||||||
|
|
||||||
|
# Setting.set('es_url', 'http://172.0.0.1:9200')
|
||||||
|
# Setting.set('es_index', 'estest.local_zammad')
|
||||||
|
# Setting.set('es_user', 'elasticsearch')
|
||||||
|
# Setting.set('es_password', 'zammad')
|
||||||
|
|
||||||
|
# set max attachment size in mb
|
||||||
|
Setting.set('es_attachment_max_size_in_mb', 1 )
|
||||||
|
|
||||||
|
if ENV['ES_INDEX']
|
||||||
|
#fail "ERROR: Need ES_INDEX - hint ES_INDEX='estest.local_zammad'"
|
||||||
|
Setting.set('es_index', ENV['ES_INDEX'])
|
||||||
|
end
|
||||||
|
|
||||||
|
# drop/create indexes
|
||||||
|
#Rake::Task["searchindex:drop"].execute
|
||||||
|
#Rake::Task["searchindex:create"].execute
|
||||||
|
system('rake searchindex:rebuild')
|
||||||
|
|
||||||
|
# execute background jobs
|
||||||
|
# execute background jobs
|
||||||
|
#puts Delayed::Job.all.inspect
|
||||||
|
Delayed::Worker.new.work_off
|
||||||
|
|
||||||
|
sleep 6
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'settings index with nobody' do
|
test 'settings index with nobody' do
|
||||||
|
|
Loading…
Reference in a new issue