search.rb 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
  2. class User
  3. module Search
  4. =begin
  5. search user preferences
  6. result = User.search_preferences(user_model)
  7. returns if user has permissions to search
  8. result = {
  9. prio: 1000,
  10. direct_search_index: true
  11. }
  12. returns if user has no permissions to search
  13. result = false
  14. =end
  15. def search_preferences(current_user)
  16. return false if !current_user.role?('Agent') && !current_user.role?(Z_ROLENAME_ADMIN)
  17. {
  18. prio: 2000,
  19. direct_search_index: true,
  20. }
  21. end
  22. =begin
  23. search user
  24. result = User.search(
  25. :query => 'some search term'
  26. :limit => 15,
  27. :current_user => user_model,
  28. )
  29. returns
  30. result = [user_model1, user_model2, ...]
  31. =end
  32. def search(params)
  33. # get params
  34. query = params[:query]
  35. limit = params[:limit] || 10
  36. current_user = params[:current_user]
  37. # enable search only for agents and admins
  38. return [] if !search_preferences(current_user)
  39. # try search index backend
  40. if SearchIndexBackend.enabled?
  41. items = SearchIndexBackend.search( query, limit, 'User' )
  42. users = []
  43. items.each { |item|
  44. users.push User.lookup( id: item[:id] )
  45. }
  46. return users
  47. end
  48. # fallback do sql query
  49. # - stip out * we already search for *query* -
  50. query.gsub! '*', ''
  51. if params[:role_ids]
  52. users = User.joins(:roles).where( 'roles.id' => params[:role_ids] ).where(
  53. '(users.firstname LIKE ? or users.lastname LIKE ? or users.email LIKE ?) AND users.id != 1', "%#{query}%", "%#{query}%", "%#{query}%",
  54. ).order('firstname').limit(limit)
  55. else
  56. users = User.where(
  57. '(firstname LIKE ? or lastname LIKE ? or email LIKE ?) AND id != 1', "%#{query}%", "%#{query}%", "%#{query}%",
  58. ).order('firstname').limit(limit)
  59. end
  60. users
  61. end
  62. end
  63. end