class Rolypoly::RoleGatekeeper

Attributes

actions[RW]
all_actions[RW]
public[RW]
resource[RW]
roles[R]

Public Class Methods

new(roles, actions, resource = nil) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 5
def initialize(roles, actions, resource = nil)
  self.roles = Set.new Array(roles).map(&:to_s)
  self.actions = Set.new Array(actions).map(&:to_s)
  self.resource = resource
  self.all_actions = false
  self.public = false
end

Public Instance Methods

action?(check_actions) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 111
def action?(check_actions)
  check_actions = Set.new Array(check_actions).map(&:to_s)
  all_actions? || !(check_actions & actions).empty?
end
all_public() click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 67
def all_public
  self.public = true
  self.all_actions = true
end
allow(*roles) click to toggle source

on(resource).allow(*roles).to_access(*actions)

# File lib/rolypoly/role_gatekeeper.rb, line 19
def allow(*roles)
  to(*roles)
  self
end
allow?(current_roles, action, options = {}) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 58
def allow?(current_roles, action, options = {})
  action?(action) && role?(current_roles, options)
end
allowed_roles(current_roles, action, options = {}) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 62
def allowed_roles(current_roles, action, options = {})
  return [] if public? || !action?(action)
  match_roles(current_roles, options)
end
initialize_copy(other) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 13
def initialize_copy(other)
  @roles = @roles.dup
  @actions = @actions.dup
end
on(resource) click to toggle source

allow(*roles).on(resource).to_access(*actions)

# File lib/rolypoly/role_gatekeeper.rb, line 31
def on(resource)
  self.resource = resource
  self
end
public?() click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 116
def public?
  !!public
end
restrict(*actions) click to toggle source

on(resource).restrict(*actions).to(*roles)

# File lib/rolypoly/role_gatekeeper.rb, line 25
def restrict(*actions)
  to_access(*actions)
  self
end
role?(check_roles, options = {}) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 72
def role?(check_roles, options = {})
  return true if public?
  required_resource = find_required_resource(options)

  Array(check_roles).any? do |check_role|
    allowed_role?(check_role) && allowed_resource?(check_role, required_resource)
  end
end
to(*roles) click to toggle source

restrict(*actions).to *roles

# File lib/rolypoly/role_gatekeeper.rb, line 37
def to(*roles)
  self.roles = self.roles.merge roles.flatten.compact.map(&:to_s)
end
to_access(*actions) click to toggle source

allow(*roles).to_access *actions

# File lib/rolypoly/role_gatekeeper.rb, line 48
def to_access(*actions)
  self.actions = self.actions.merge actions.flatten.compact.map(&:to_s)
end
to_all() click to toggle source

allow role access to all actions allow(*roles).to_all

# File lib/rolypoly/role_gatekeeper.rb, line 54
def to_all
  self.all_actions = true
end
to_none() click to toggle source

make actions public basically restrict(:index).to_none

# File lib/rolypoly/role_gatekeeper.rb, line 43
def to_none
  self.public = true
end

Private Instance Methods

all_actions?() click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 141
def all_actions?
  !!all_actions
end
allowed_resource?(check_role, required_resource) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 85
        def allowed_resource?(check_role, required_resource)
  return true unless require_resource?

  case required_resource
  when ->(r) { r.is_a?(Hash) && r.keys == [:resource_type] }
    check_role.respond_to?(:resource_type) &&
      check_role.resource_type == required_resource[:resource_type]
  when Hash, ->(r) { type_id_resource?(r) }
    check_role.respond_to?(:resource?) &&
      check_role.resource?(required_resource)
  else
    check_role.respond_to?(:resource?) &&
      Array(required_resource).any? {|r| check_role.resource?(r) }
  end
end
allowed_role?(role_object) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 135
        def allowed_role?(role_object)
  role_string = role_object.respond_to?(:to_role_string) ? role_object.to_role_string : role_object.to_s

  roles.include?(role_string.to_s)
end
find_required_resource(options = {}) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 105
        def find_required_resource(options = {})
  return resource unless %w(String Symbol).include?(resource.class.to_s)

  options[resource]
end
match_roles(check_roles, options = {}) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 127
        def match_roles(check_roles, options = {})
  required_resource = find_required_resource(options)

  Array(check_roles).select do |check_role|
    allowed_role?(check_role) && allowed_resource?(check_role, required_resource)
  end
end
require_resource?() click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 81
        def require_resource?
  !!resource
end
type_id_resource?(required_resource) click to toggle source
# File lib/rolypoly/role_gatekeeper.rb, line 101
        def type_id_resource?(required_resource)
  required_resource.is_a?(Array) && %w(String Symbol).include?(required_resource.first.class.name)
end