has_roles.rb 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. module HasRoles
  3. extend ActiveSupport::Concern
  4. # Checks a given Group( ID) for given access(es) for the instance associated roles.
  5. #
  6. # @example Group ID param
  7. # user.role_access?(1, 'read')
  8. # #=> true
  9. #
  10. # @example Group param
  11. # user.role_access?(group, 'read')
  12. # #=> true
  13. #
  14. # @example Access list
  15. # user.role_access?(group, ['read', 'create'])
  16. # #=> true
  17. #
  18. # @return [Boolean]
  19. def role_access?(group_id, access)
  20. return false if !groups_access_permission?
  21. group_id = self.class.ensure_group_id_parameter(group_id)
  22. access = self.class.ensure_group_access_list_parameter(access)
  23. RoleGroup.eager_load(:group, :role).exists?(
  24. role_id: roles.pluck(:id),
  25. group_id: group_id,
  26. access: access,
  27. groups: {
  28. active: true
  29. },
  30. roles: {
  31. active: true
  32. }
  33. )
  34. end
  35. # methods defined here are going to extend the class, not the instance of it
  36. class_methods do
  37. # Lists instances having the given access(es) to the given Group through Roles.
  38. #
  39. # @example Group ID param
  40. # User.role_access(1, 'read')
  41. # #=> [1, 3, ...]
  42. #
  43. # @example Group param
  44. # User.role_access(group, 'read')
  45. # #=> [1, 3, ...]
  46. #
  47. # @example Access list
  48. # User.role_access(group, ['read', 'create'])
  49. # #=> [1, 3, ...]
  50. #
  51. # @return [Array<Integer>]
  52. def role_access(group_id, access)
  53. group_id = ensure_group_id_parameter(group_id)
  54. access = ensure_group_access_list_parameter(access)
  55. role_ids = RoleGroup.eager_load(:role).where(group_id: group_id, access: access, roles: { active: true }).pluck(:role_id)
  56. join_table = reflect_on_association(:roles).join_table
  57. joins(:roles).where(active: true, join_table => { role_id: role_ids }).distinct.select(&:groups_access_permission?)
  58. end
  59. # Lists IDs of instances having the given access(es) to the given Group through Roles.
  60. #
  61. # @example Group ID param
  62. # User.role_access_ids(1, 'read')
  63. # #=> [1, 3, ...]
  64. #
  65. # @example Group param
  66. # User.role_access_ids(group, 'read')
  67. # #=> [1, 3, ...]
  68. #
  69. # @example Access list
  70. # User.role_access_ids(group, ['read', 'create'])
  71. # #=> [1, 3, ...]
  72. #
  73. # @return [Array<Integer>]
  74. def role_access_ids(group_id, access)
  75. role_access(group_id, access).collect(&:id)
  76. end
  77. def ensure_group_id_parameter(group_or_id)
  78. return group_or_id if group_or_id.is_a?(Integer)
  79. group_or_id.id
  80. end
  81. def ensure_group_access_list_parameter(access)
  82. access = [access] if access.is_a?(String)
  83. access.push('full') if !access.include?('full')
  84. access
  85. end
  86. end
  87. end