Module: RoleFu::Resourceable

Extended by:
ActiveSupport::Concern
Defined in:
lib/role_fu/resourceable.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#add_role_to_user(user, role_name) ⇒ Object



145
146
147
# File 'lib/role_fu/resourceable.rb', line 145

def add_role_to_user(user, role_name)
  user.add_role(role_name, self)
end

#applied_rolesObject



68
69
70
# File 'lib/role_fu/resourceable.rb', line 68

def applied_roles
  roles
end

#available_rolesObject



129
130
131
# File 'lib/role_fu/resourceable.rb', line 129

def available_roles
  roles.pluck(:name).uniq
end

#count_users_with_role(role_name) ⇒ Object



137
138
139
# File 'lib/role_fu/resourceable.rb', line 137

def count_users_with_role(role_name)
  users_with_role(role_name).count
end

#destroy_role(role_name) ⇒ Object



72
73
74
# File 'lib/role_fu/resourceable.rb', line 72

def destroy_role(role_name)
  roles.where(name: role_name.to_s).destroy_all
end

#has_role?(role_name) ⇒ Boolean

Returns:

  • (Boolean)


133
134
135
# File 'lib/role_fu/resourceable.rb', line 133

def has_role?(role_name)
  roles.exists?(name: role_name.to_s)
end

#remove_role_from_user(user, role_name) ⇒ Object



149
150
151
# File 'lib/role_fu/resourceable.rb', line 149

def remove_role_from_user(user, role_name)
  user.remove_role(role_name, self)
end

#user_has_role?(user, role_name) ⇒ Boolean

Returns:

  • (Boolean)


141
142
143
# File 'lib/role_fu/resourceable.rb', line 141

def user_has_role?(user, role_name)
  user&.has_role?(role_name, self) || false
end

#users_grouped_by_roleObject



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/role_fu/resourceable.rb', line 76

def users_grouped_by_role
  RoleFu.role_class.table_name

  # Efficiently load roles and their associated users
  # 1. Get all roles for this resource
  # 2. Preload users for these roles

  role_scope = roles.includes(:users)

  results = {}
  role_scope.each do |role|
    results[role.name] ||= []
    results[role.name].concat(role.users)
  end

  # Deduplicate users if a user has the same role multiple times (unlikely with distinct but safer)
  results.transform_values(&:uniq)
end

#users_with_all_roles(*role_names) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/role_fu/resourceable.rb', line 109

def users_with_all_roles(*role_names)
  role_names = role_names.flatten.map(&:to_s)
  role_table = RoleFu.role_class.table_name
  user_table = RoleFu.user_class.table_name
  user_pk = RoleFu.user_class.primary_key

  RoleFu.user_class.joins(:roles)
    .where(role_table => {name: role_names, resource_type: self.class.name, resource_id: id})
    .group("#{user_table}.#{user_pk}")
    .having("COUNT(DISTINCT #{role_table}.name) = ?", role_names.size)
    .distinct
end

#users_with_any_role(*role_names) ⇒ Object



102
103
104
105
106
107
# File 'lib/role_fu/resourceable.rb', line 102

def users_with_any_role(*role_names)
  role_table = RoleFu.role_class.table_name
  RoleFu.user_class.joins(:roles)
    .where(role_table => {name: role_names.flatten.map(&:to_s), resource_type: self.class.name, resource_id: id})
    .distinct
end

#users_with_role(role_name) ⇒ Object



95
96
97
98
99
100
# File 'lib/role_fu/resourceable.rb', line 95

def users_with_role(role_name)
  role_table = RoleFu.role_class.table_name
  RoleFu.user_class.joins(:roles)
    .where(role_table => {name: role_name.to_s, resource_type: self.class.name, resource_id: id})
    .distinct
end

#users_with_rolesObject



122
123
124
125
126
127
# File 'lib/role_fu/resourceable.rb', line 122

def users_with_roles
  role_table = RoleFu.role_class.table_name
  RoleFu.user_class.joins(:roles)
    .where(role_table => {resource_type: self.class.name, resource_id: id})
    .distinct
end