class Admission::PrivilegesOrder::Definer

Attributes

definitions[R]

Public Class Methods

define(&block) click to toggle source
# File lib/admission/privileges_order.rb, line 52
def self.define &block
  definer = new
  definer.instance_exec &block

  definer.send :setup_inheritance
  definer.send :build_index
end
new() click to toggle source
# File lib/admission/privileges_order.rb, line 30
def initialize
  @definitions = {}
end

Public Instance Methods

privilege(name, levels: [], inherits: nil) click to toggle source
# File lib/admission/privileges_order.rb, line 34
def privilege name, levels: [], inherits: nil
  name = name.to_sym
  if ([name] + levels).any?{|id| id == Admission::Privilege::RESERVED_ID }
    raise "reserved name `#{Admission::Privilege::RESERVED_ID}` !"
  end

  levels.unshift Admission::Privilege::BASE_LEVEL_NAME
  levels.map!{|level| Admission::Privilege.new name, level}

  inherits = nil if inherits && inherits.empty?
  if inherits
    inherits = *inherits
    inherits = inherits.map(&:to_sym).uniq
  end

  @definitions[name] = {levels: levels, inherits: inherits}
end

Private Instance Methods

build_index() click to toggle source
# File lib/admission/privileges_order.rb, line 78
def build_index
  definitions.each_pair.reduce({}) do |h, pair|
    name = pair[0]
    levels = pair[1][:levels]

    levels_hash = levels.reduce({Admission::Privilege::TOP_LEVEL_KEY => levels.last}) do |lh, privilege|
      lh[privilege.level] = privilege
      lh
    end.freeze

    h[name] = levels_hash
    h
  end.freeze
end
setup_inheritance() click to toggle source
# File lib/admission/privileges_order.rb, line 62
def setup_inheritance
  # set inheritance for all privileges
  definitions.values.each do |levels:, inherits:|
    levels.each_with_index do |privilege, index|
      if index > 0 # higher level of privilege, inherits one step lower level
        privilege.inherits_from levels[index - 1]

      elsif inherits # lowest level, inherits top level of other privileges
        inherits = inherits.map{|name| definitions[name][:levels].last if definitions.has_key? name}
        privilege.inherits_from *inherits

      end
    end
  end
end