Module: IAmICan::Permission::Assignment

Includes:
Helpers::Ins
Defined in:
lib/i_am_i_can/permission/assignment.rb

Instance Method Summary collapse

Methods included from Helpers::Ins

#_pms_assignment_result, #local_permissions, #permissions, #pms_matched?

Instance Method Details

#can(*preds, obj: nil, strict_mode: false, auto_define_before: i_am_i_can.auto_define_before) ⇒ Object Also known as: has_permission

permission assignment for stored role



9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/i_am_i_can/permission/assignment.rb', line 9

def can *preds, obj: nil, strict_mode: false, auto_define_before: i_am_i_can.auto_define_before
  self.class.have_permissions *preds, obj: obj if auto_define_before
  not_defined_items, covered_items = [ ], [ ]

  preds.each do |pred|
    pms_name = pms_naming(pred, obj)
    covered_items << pms_name if pms_matched?(pms_name, in: stored_permission_names)
    not_defined_items << pms_name unless stored_permissions_add(pred: pred, **deconstruct_obj(obj))
  end

  _pms_assignment_result(preds, obj, not_defined_items, covered_items, strict_mode)
end

#can?(pred, obj0 = nil, obj: nil) ⇒ Boolean

‘can? :manage, User` / `can? :manage, obj: User`

Returns:

  • (Boolean)


61
62
63
64
65
# File 'lib/i_am_i_can/permission/assignment.rb', line 61

def can? pred, obj0 = nil, obj: nil
  obj = obj0 || obj
  pms_name = pms_naming(pred, obj)
  temporarily_can?(pred, obj) || pms_matched?(pms_name, in: stored_permission_names)
end

#cannot(*preds, obj: nil, saved: true) ⇒ Object Also known as: is_not_allowed_to



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/i_am_i_can/permission/assignment.rb', line 41

def cannot *preds, obj: nil, saved: true
  not_defined_items = [ ]

  preds.each do |pred|
    pms_name = pms_naming(pred, obj)
    if saved
      next if stored_permissions_rmv(pred: pred, **deconstruct_obj(obj))
      not_defined_items << pms_name
    else
      next not_defined_items << pms_name unless pms_name.in?(defined_permissions.keys)
      pms_of_defined_local_role(self.name).delete(pms_name)
    end
  end

  _pms_assignment_result(preds, obj, not_defined_items)
end

#temporarily_can(*preds, obj: nil, strict_mode: false, auto_define_before: i_am_i_can.auto_define_before) ⇒ Object Also known as: locally_can

Raises:



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/i_am_i_can/permission/assignment.rb', line 24

def temporarily_can *preds, obj: nil, strict_mode: false, auto_define_before: i_am_i_can.auto_define_before
  raise Error, "Permission Assignment: local role `#{name}` was not defined" unless i_am_i_can.subject_model.defined_local_roles.key?(self.name.to_sym)
  self.class.have_permissions *preds, obj: obj, save: false if auto_define_before
  not_defined_items, covered_items = [ ], [ ]

  preds.each do |pred|
    pms_name = pms_naming(pred, obj)
    next not_defined_items << pms_name unless pms_name.in?(defined_permissions.keys)
    covered_items << pms_name if pms_matched?(pms_name, in: pms_of_defined_local_role(self.name))
    pms_of_defined_local_role(self.name) << pms_name
  end

  _pms_assignment_result(preds, obj, not_defined_items, covered_items, strict_mode)
end

#temporarily_can?(pred, obj) ⇒ Boolean Also known as: locally_can?

Returns:

  • (Boolean)


67
68
69
70
# File 'lib/i_am_i_can/permission/assignment.rb', line 67

def temporarily_can? pred, obj
  pms_name = pms_naming(pred, obj)
  pms_matched?(pms_name, in: pms_of_defined_local_role(self.name))
end