class Ingress::PermissionsDsl

Attributes

permission_repository[R]
role_identifier[R]

Public Class Methods

new(role_identifier) click to toggle source
# File lib/ingress/permissions_dsl.rb, line 7
def initialize(role_identifier)
  @role_identifier = role_identifier
  @permission_repository = PermissionsRepository.new
end

Public Instance Methods

can(actions, subjects, options = {}, &block) click to toggle source
# File lib/ingress/permissions_dsl.rb, line 16
def can(actions, subjects, options = {}, &block)
  for_each_action_and_subject(actions, subjects) do |action, subject|
    conditions = conditions_from(options, block)

    permission_repository.add_permission(role_identifier, true, action, subject, conditions)
  end
end
can_do_anything() click to toggle source
# File lib/ingress/permissions_dsl.rb, line 12
def can_do_anything
  permission_repository.add_permission(role_identifier, true, "*", "*")
end
cannot(actions, subjects, options = {}, &block) click to toggle source
# File lib/ingress/permissions_dsl.rb, line 24
def cannot(actions, subjects, options = {}, &block)
  for_each_action_and_subject(actions, subjects) do |action, subject|
    conditions = conditions_from(options, block)

    permission_repository.add_permission(role_identifier, false, action, subject, conditions)
  end
end

Private Instance Methods

conditions_from(options, block) click to toggle source
# File lib/ingress/permissions_dsl.rb, line 46
def conditions_from(options, block)
  generic_condition = generic_condition_from(options[:if] || block)
  instance_condition = if_subject_is_an_instance_condition_from(options[:if_subject_is_an_instance])
  class_condition = if_subject_is_a_class_condition_from(options[:if_subject_is_a_class])

  [generic_condition, instance_condition, class_condition].compact
end
for_each_action_and_subject(actions, subjects) { |action, subject| ... } click to toggle source
# File lib/ingress/permissions_dsl.rb, line 34
def for_each_action_and_subject(actions, subjects)
  return unless block_given?
  actions = [actions].flatten
  subjects = [subjects].flatten

  actions.each do |action|
    subjects.each do |subject|
      yield(action, subject)
    end
  end
end
generic_condition_from(callback) click to toggle source
# File lib/ingress/permissions_dsl.rb, line 54
def generic_condition_from(callback)
  callback if callback&.respond_to?(:call)
end
if_subject_is_a_class_condition_from(callback) click to toggle source
# File lib/ingress/permissions_dsl.rb, line 70
def if_subject_is_a_class_condition_from(callback)
  if callback&.respond_to?(:call)
    lambda do |user, given_subject, option|
      if [Class, Module].include?(given_subject.class)
        callback.call(user, given_subject, option)
      else
        true
      end
    end
  end
end
if_subject_is_an_instance_condition_from(callback) click to toggle source
# File lib/ingress/permissions_dsl.rb, line 58
def if_subject_is_an_instance_condition_from(callback)
  if callback&.respond_to?(:call)
    lambda do |user, given_subject, option|
      if [Class, Module].include?(given_subject.class)
        true
      else
        callback.call(user, given_subject, option)
      end
    end
  end
end