search.rb 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # Copyright (C) 2012-2016 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.permissions?('ticket.agent') && !current_user.permissions?('admin.user')
  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. or with certain role_ids | permissions
  30. result = User.search(
  31. query: 'some search term',
  32. limit: 15,
  33. current_user: user_model,
  34. role_ids: [1,2,3],
  35. permissions: ['ticket.agent']
  36. )
  37. returns
  38. result = [user_model1, user_model2, ...]
  39. =end
  40. def search(params)
  41. # get params
  42. query = params[:query]
  43. limit = params[:limit] || 10
  44. current_user = params[:current_user]
  45. # enable search only for agents and admins
  46. return [] if !search_preferences(current_user)
  47. # lookup for roles of permission
  48. if params[:permissions].present?
  49. params[:role_ids] ||= []
  50. role_ids = Role.with_permissions(params[:permissions]).pluck(:id)
  51. params[:role_ids].concat(role_ids)
  52. end
  53. # try search index backend
  54. if SearchIndexBackend.enabled?
  55. query_extention = {}
  56. if params[:role_ids].present?
  57. query_extention['bool'] = {}
  58. query_extention['bool']['must'] = []
  59. if !params[:role_ids].is_a?(Array)
  60. params[:role_ids] = [params[:role_ids]]
  61. end
  62. access_condition = {
  63. 'query_string' => { 'default_field' => 'role_ids', 'query' => "\"#{params[:role_ids].join('" OR "')}\"" }
  64. }
  65. query_extention['bool']['must'].push access_condition
  66. end
  67. items = SearchIndexBackend.search(query, limit, 'User', query_extention)
  68. users = []
  69. items.each do |item|
  70. user = User.lookup(id: item[:id])
  71. next if !user
  72. users.push user
  73. end
  74. return users
  75. end
  76. # fallback do sql query
  77. # - stip out * we already search for *query* -
  78. query.delete! '*'
  79. users = if params[:role_ids]
  80. User.joins(:roles).where('roles.id' => params[:role_ids]).where(
  81. '(users.firstname LIKE ? OR users.lastname LIKE ? OR users.email LIKE ? OR users.login LIKE ?) AND users.id != 1', "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%"
  82. ).order('updated_at DESC').limit(limit)
  83. else
  84. User.where(
  85. '(firstname LIKE ? OR lastname LIKE ? OR email LIKE ? OR login LIKE ?) AND id != 1', "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%"
  86. ).order('updated_at DESC').limit(limit)
  87. end
  88. users
  89. end
  90. end
  91. end