Class: Roleback::UserExtension

Inherits:
Object
  • Object
show all
Defined in:
lib/roleback/user_extension.rb

Class Method Summary collapse

Class Method Details

.extend!(user_class) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/roleback/user_extension.rb', line 3

def self.extend!(user_class)
  user_instance = user_class.new
  unless user_instance.respond_to?(:roles) && user_instance.method(:roles).arity == 0
    raise ::Roleback::InvalidOrMisconfiguredUserClass, "User class #{user_class.name} should have a method call roles that returns an array of role names"
  end

  if user_class.instance_methods.include?(:can?)
    raise ::Roleback::InvalidOrMisconfiguredUserClass, "User class #{user_class.name} already has a method called can?"
  end

  user_class.class_eval do
    def can?(resource: Roleback.any, scope: Roleback.any, action: Roleback.any)
      # get all user roles
      roles = self.roles
      return false if roles.empty?

      if !roles.is_a?(Array)
        raise ::Roleback::InvalidOrMisconfiguredUserClass, "User class #{self.class}#roles should return an array of role names"
      end

      roles.each do |role|
        return true if ::Roleback.can?(role.to_sym, resource: resource, scope: scope, action: action)
      end

      # no role can perform the action on the resource
      false
    end
  end
end