class ViewModel::AccessControl::Tree::Node

Attributes

root_children_editable_ifs[R]
root_children_editable_unlesses[R]
root_children_visible_ifs[R]
root_children_visible_unlesses[R]

Public Class Methods

inherited(subclass) click to toggle source
# File lib/view_model/access_control/tree.rb, line 152
def inherited(subclass)
  super
  subclass.initialize_as_node
end
initialize_as_node() click to toggle source
# File lib/view_model/access_control/tree.rb, line 157
def initialize_as_node
  @root = false

  @root_children_editable_ifs      = []
  @root_children_editable_unlesses = []
  @root_children_visible_ifs       = []
  @root_children_visible_unlesses  = []
end
inspect_checks() click to toggle source
# File lib/view_model/access_control/tree.rb, line 192
def inspect_checks
  checks = super
  if root?
    checks << 'no root checks'
  else
    checks << "root_children_visible_if: #{root_children_visible_ifs.map(&:reason)}"            if root_children_visible_ifs.present?
    checks << "root_children_visible_unless: #{root_children_visible_unlesses.map(&:reason)}"   if root_children_visible_unlesses.present?
    checks << "root_children_editable_if: #{root_children_editable_ifs.map(&:reason)}"          if root_children_editable_ifs.present?
    checks << "root_children_editable_unless: #{root_children_editable_unlesses.map(&:reason)}" if root_children_editable_unlesses.present?
  end
  checks
end
new(tree_access_control) click to toggle source
Calls superclass method ViewModel::AccessControl::new
# File lib/view_model/access_control/tree.rb, line 206
def initialize(tree_access_control)
  super()
  @tree_access_control = tree_access_control
end
requires_root?()
Alias for: root?
root?() click to toggle source
# File lib/view_model/access_control/tree.rb, line 186
def root?
  @root
end
Also aliased as: requires_root?
root_children_editable_if!(reason, &block) click to toggle source
# File lib/view_model/access_control/tree.rb, line 176
def root_children_editable_if!(reason, &block)
  @root = true
  root_children_editable_ifs << new_permission_check(reason, &block)
end
root_children_editable_unless!(reason, &block) click to toggle source
# File lib/view_model/access_control/tree.rb, line 181
def root_children_editable_unless!(reason, &block)
  @root = true
  root_children_editable_unlesses << new_permission_check(reason, &block)
end
root_children_visible_if!(reason, &block) click to toggle source
# File lib/view_model/access_control/tree.rb, line 166
def root_children_visible_if!(reason, &block)
  @root = true
  root_children_visible_ifs << new_permission_check(reason, &block)
end
root_children_visible_unless!(reason, &block) click to toggle source
# File lib/view_model/access_control/tree.rb, line 171
def root_children_visible_unless!(reason, &block)
  @root = true
  root_children_visible_unlesses << new_permission_check(reason, &block)
end

Public Instance Methods

editable_check(traversal_env) click to toggle source
# File lib/view_model/access_control/tree.rb, line 230
def editable_check(traversal_env)
  view                = traversal_env.view
  deserialize_context = traversal_env.deserialize_context

  validate_root!(view, deserialize_context)

  if deserialize_context.root?
    save_root_editability!(traversal_env)
    super
  else
    root_editability = fetch_descendent_editability(deserialize_context.nearest_root_viewmodel)
    root_editability.merge { super }
  end
end
visible_check(traversal_env) click to toggle source
# File lib/view_model/access_control/tree.rb, line 215
def visible_check(traversal_env)
  view    = traversal_env.view
  context = traversal_env.context

  validate_root!(view, context)

  if context.root?
    save_root_visibility!(traversal_env)
    super
  else
    root_visibility = fetch_descendent_visibility(context.nearest_root_viewmodel)
    root_visibility.merge { super }
  end
end

Private Instance Methods

save_root_editability!(traversal_env) click to toggle source
# File lib/view_model/access_control/tree.rb, line 261
def save_root_editability!(traversal_env)
  result = check_delegates(traversal_env,
                           self.class.each_check(:root_children_editable_ifs,      ->(a) { a.is_a?(Node) }),
                           self.class.each_check(:root_children_editable_unlesses, ->(a) { a.is_a?(Node) }))

  store_descendent_editability(traversal_env.view, result)
end
save_root_visibility!(traversal_env) click to toggle source
# File lib/view_model/access_control/tree.rb, line 253
def save_root_visibility!(traversal_env)
  result = check_delegates(traversal_env,
                           self.class.each_check(:root_children_visible_ifs,      ->(a) { a.is_a?(Node) }),
                           self.class.each_check(:root_children_visible_unlesses, ->(a) { a.is_a?(Node) }))

  store_descendent_visibility(traversal_env.view, result)
end
validate_root!(view, context) click to toggle source
# File lib/view_model/access_control/tree.rb, line 247
def validate_root!(view, context)
  if self.class.requires_root? && !context.root?
    raise RuntimeError.new("AccessControl instance for #{view.class.view_name} node requires root context but was visited in owned context.")
  end
end