Class: Seven::Manager

Inherits:
Object
  • Object
show all
Defined in:
lib/seven/manager.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(store: {}) ⇒ Manager

Params:

store: hash or your store, the store requires get(user_id) and set(user_id, ability, status) methods
        get(user_id) should return a hash of abilities {${ability}: ${true || false}}


8
9
10
11
# File 'lib/seven/manager.rb', line 8

def initialize(store: {})
  @rules = []
  @store = fetch_store(store)
end

Instance Attribute Details

#rulesObject (readonly)

Returns the value of attribute rules.



3
4
5
# File 'lib/seven/manager.rb', line 3

def rules
  @rules
end

#storeObject (readonly)

Returns the value of attribute store.



3
4
5
# File 'lib/seven/manager.rb', line 3

def store
  @store
end

Instance Method Details

#can?(current_user, ability, target = nil) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/seven/manager.rb', line 23

def can?(current_user, ability, target = nil)
  matched_rules = rules.select {|m, rc| m === target || m == target }
  return false if matched_rules.empty?

  # class A; end
  # class B < A; end
  # [A, B, Object].min # => B
  # find last class
  rule_class = matched_rules.min_by(&:first).last
  abilities = rule_class.new(current_user, target).abilities

  # dynamic abilities
  store.list(current_user).each do |new_ability, is_allowed|
    is_allowed ? (abilities << new_ability) : abilities.delete(new_ability)
  end
  abilities.include?(ability.to_sym)
end

#define_rules(matcher, rule_class = nil, &rule_proc) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'lib/seven/manager.rb', line 13

def define_rules(matcher, rule_class = nil, &rule_proc)
  rule_class ||= Seven::Abilities.wrap_proc(rule_proc)

  if valid_rule_class?(rule_class)
    @rules << [matcher, rule_class]
  else
    raise ArgsError, 'No valid rule_class or rule_proc'
  end
end