Class: Admission::Arbitration

Inherits:
Object
  • Object
show all
Defined in:
lib/admission/arbitration.rb

Direct Known Subclasses

ResourceArbitration

Defined Under Namespace

Classes: RulesBuilder

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(person, rules_index, request) ⇒ Arbitration

Returns a new instance of Arbitration.



5
6
7
8
9
10
# File 'lib/admission/arbitration.rb', line 5

def initialize person, rules_index, request
  @person = person
  @rules_index = rules_index
  @request = request.to_sym
  @decisions = {}
end

Instance Attribute Details

#personObject (readonly)

Returns the value of attribute person.



3
4
5
# File 'lib/admission/arbitration.rb', line 3

def person
  @person
end

#requestObject (readonly)

Returns the value of attribute request.



3
4
5
# File 'lib/admission/arbitration.rb', line 3

def request
  @request
end

Class Method Details

.define_rules(privilege_order, &block) ⇒ Object



68
69
70
71
72
# File 'lib/admission/arbitration.rb', line 68

def self.define_rules privilege_order, &block
  builder = self::RulesBuilder.new privilege_order
  builder.instance_exec &block
  builder.create_index
end

Instance Method Details

#case_to_sObject



64
65
66
# File 'lib/admission/arbitration.rb', line 64

def case_to_s
  @request.to_s
end

#decide(privilege) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/admission/arbitration.rb', line 54

def decide privilege
  decision = make_decision @rules_index[@request], privilege
  return decision if decision.eql?(:forbidden) || decision.eql?(true)

  decision = decide_per_inheritance privilege
  return decision if decision.eql?(:forbidden) || decision.eql?(true)

  make_decision @rules_index[Admission::ALL_ACTION], privilege
end

#decide_per_inheritance(privilege) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/admission/arbitration.rb', line 41

def decide_per_inheritance privilege
  inherited = privilege.inherited
  return nil if inherited.nil? || inherited.empty?

  explicit_allowance = false
  inherited.each do |p|
    rule = rule_per_privilege p
    return rule if rule == :forbidden
    explicit_allowance ||= rule
  end
  explicit_allowance
end

#make_decision(from_rules, privilege) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/admission/arbitration.rb', line 28

def make_decision from_rules, privilege
  if from_rules
    decision = from_rules[privilege]
    decision = @person.instance_exec @context, &decision if Proc === decision

    unless Admission::VALID_DECISION.include? decision
      raise "invalid decision: #{decision}"
    end

    decision
  end
end

#prepare_sitting(context = nil) ⇒ Object



12
13
14
15
16
# File 'lib/admission/arbitration.rb', line 12

def prepare_sitting context=nil
  return if context == @context
  @context = context
  @decisions = {}
end

#rule_per_privilege(privilege) ⇒ Object



18
19
20
21
22
23
24
25
26
# File 'lib/admission/arbitration.rb', line 18

def rule_per_privilege privilege
  decision = @decisions[privilege]
  return decision unless decision.nil?

  decision = decide privilege

  decision = false if decision.nil?
  @decisions[privilege] = decision
end