2014-02-03 19:23:00 +00:00
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
2015-04-27 23:19:26 +00:00
# rubocop:disable ClassAndModuleChildren
module Ticket::Search
2013-08-17 21:10:11 +00:00
= begin
2014-11-10 07:34:20 +00:00
search tickets via search index
2013-08-17 21:10:11 +00:00
result = Ticket . search (
:current_user = > User . find ( 123 ) ,
:query = > 'search something' ,
:limit = > 15 ,
)
returns
result = [ ticket_model1 , ticket_model2 ]
2014-11-10 07:34:20 +00:00
search tickets via search index
2014-08-18 11:49:08 +00:00
result = Ticket . search (
:current_user = > User . find ( 123 ) ,
:query = > 'search something' ,
:limit = > 15 ,
:full = > 0
)
returns
result = [ 1 , 3 , 5 , 6 , 7 ]
2014-11-10 07:34:20 +00:00
search tickets via database
result = Ticket . search (
:current_user = > User . find ( 123 ) ,
:condition = > '' ,
:detail = > true ,
:limit = > 15 ,
:full = > 0
)
returns
result = [ 1 , 3 , 5 , 6 , 7 ]
2013-08-17 21:10:11 +00:00
= end
2015-04-27 23:19:26 +00:00
def search ( params )
2013-08-17 21:10:11 +00:00
2015-04-27 23:19:26 +00:00
# get params
query = params [ :query ]
limit = params [ :limit ] || 12
current_user = params [ :current_user ]
full = false
if params [ :full ] || ! params . key? ( :full )
full = true
end
2013-08-17 21:10:11 +00:00
2015-04-27 23:19:26 +00:00
# try search index backend
if ! params [ :detail ] && SearchIndexBackend . enabled?
query_extention = { }
query_extention [ 'bool' ] = { }
query_extention [ 'bool' ] [ 'must' ] = [ ]
if current_user . is_role ( 'Agent' )
groups = Group . joins ( :users )
. where ( 'groups_users.user_id = ?' , current_user . id )
. where ( 'groups.active = ?' , true )
group_condition = [ ]
groups . each { | group |
group_condition . push group . name
}
access_condition = {
'query_string' = > { 'default_field' = > 'Ticket.group.name' , 'query' = > " \" #{ group_condition . join ( '" OR "' ) } \" " }
}
query_extention [ 'bool' ] [ 'must' ] . push access_condition
else
if ! current_user . organization || ( ! current_user . organization . shared || current_user . organization . shared == false )
2014-08-18 11:49:08 +00:00
access_condition = {
2015-04-27 23:19:26 +00:00
'query_string' = > { 'default_field' = > 'Ticket.customer_id' , 'query' = > current_user . id }
2014-02-02 18:58:31 +00:00
}
2015-04-27 23:19:26 +00:00
# customer_id: XXX
# conditions = [ 'customer_id = ?', current_user.id ]
2014-02-02 18:58:31 +00:00
else
2015-04-27 23:19:26 +00:00
access_condition = {
'query_string' = > { 'query' = > " Ticket.customer_id: #{ current_user . id } OR Ticket.organization_id: #{ current_user . organization . id } " }
2014-02-02 18:58:31 +00:00
}
2015-04-27 23:19:26 +00:00
# customer_id: XXX OR organization_id: XXX
# conditions = [ '( customer_id = ? OR organization_id = ? )', current_user.id, current_user.organization.id ]
2014-02-02 18:58:31 +00:00
end
2015-04-27 23:19:26 +00:00
query_extention [ 'bool' ] [ 'must' ] . push access_condition
2014-02-02 18:58:31 +00:00
end
2015-04-27 23:19:26 +00:00
items = SearchIndexBackend . search ( query , limit , 'Ticket' , query_extention )
2014-08-18 11:49:08 +00:00
if ! full
2014-09-19 21:35:40 +00:00
ids = [ ]
2015-04-27 23:19:26 +00:00
items . each { | item |
ids . push item [ :id ]
2014-09-19 21:35:40 +00:00
}
2014-08-18 11:49:08 +00:00
return ids
end
2015-04-27 21:27:51 +00:00
tickets = [ ]
2015-04-27 23:19:26 +00:00
items . each { | item |
tickets . push Ticket . lookup ( id : item [ :id ] )
}
return tickets
end
# fallback do sql query
access_condition = Ticket . access_condition ( current_user )
# do query
# - stip out * we already search for *query* -
if query
query . gsub! '*' , ''
tickets_all = Ticket . select ( 'DISTINCT(tickets.id)' )
. where ( access_condition )
. where ( '( `tickets`.`title` LIKE ? OR `tickets`.`number` LIKE ? OR `ticket_articles`.`body` LIKE ? OR `ticket_articles`.`from` LIKE ? OR `ticket_articles`.`to` LIKE ? OR `ticket_articles`.`subject` LIKE ?)' , " % #{ query } % " , " % #{ query } % " , " % #{ query } % " , " % #{ query } % " , " % #{ query } % " , " % #{ query } % " )
. joins ( :articles )
. order ( '`tickets`.`created_at` DESC' )
. limit ( limit )
else
tickets_all = Ticket . select ( 'DISTINCT(tickets.id)' )
. where ( access_condition )
. where ( params [ :condition ] )
. order ( '`tickets`.`created_at` DESC' )
. limit ( limit )
end
# build result list
if ! full
ids = [ ]
2014-08-18 11:49:08 +00:00
tickets_all . each { | ticket |
2015-04-27 23:19:26 +00:00
ids . push ticket . id
2014-08-18 11:49:08 +00:00
}
2015-04-27 23:19:26 +00:00
return ids
2013-08-17 21:10:11 +00:00
end
2015-04-27 23:19:26 +00:00
tickets = [ ]
tickets_all . each { | ticket |
tickets . push Ticket . lookup ( id : ticket . id )
}
tickets
2013-08-17 21:10:11 +00:00
end
2014-02-03 19:23:00 +00:00
end