module SnFoil::Contexts::SetupContext

Attributes

entity[R]

Public Class Methods

new(entity = nil) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 47
def initialize(entity = nil)
  @entity = entity
end

Public Instance Methods

adapter() click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 84
def adapter
  @adapter ||= SnFoil.adapter
end
adapter?(object) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 78
def adapter?(object)
  return false unless adapter

  object.instance_of? adapter
end
authorize(object, action, **options) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 51
def authorize(object, action, **options)
  return unless entity # Add logging

  policy = lookup_policy(object, options)
  raise Pundit::NotAuthorizedError, query: action, record: object, policy: policy unless policy.public_send(action)

  true
end
hook_valid?(hook, **options) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 96
def hook_valid?(hook, **options)
  return false if !hook[:if].nil? && hook[:if].call(options) == false
  return false if !hook[:unless].nil? && hook[:unless].call(options) == true

  true
end
model(klass = nil) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 14
def model(klass = nil)
  @i_model = klass
end
policy(klass = nil) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 18
def policy(klass = nil)
  @i_policy = klass
end
run_hook(hook, **options) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 88
def run_hook(hook, **options)
  return options unless hook_valid?(hook, **options)

  return send(hook[:method], **options) if hook[:method]

  instance_exec options, &hook[:block]
end
scope(object_class = nil, **options) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 60
def scope(object_class = nil, **options)
  object_class ||= model
  policy_name = lookup_policy(object_class, options).class.name
  "#{policy_name}::Scope".safe_constantize.new(wrap_object(object_class), entity)
end
setup(method = nil, **options, &block) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 22
def setup(method = nil, **options, &block)
  raise ArgumentError, '#setup requires either a method name or a block' if method.nil? && block.nil?

  (@i_setup_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
end
setup_hooks() click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 41
def setup_hooks
  self.class.i_setup_hooks || []
end
unwrap_object(object) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 72
def unwrap_object(object)
  return object unless adapter

  adapter?(object) ? object.__getobj__ : object
end
wrap_object(object) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 66
def wrap_object(object)
  return object unless adapter

  adapter.new(object)
end

Private Instance Methods

lookup_policy(object, options) click to toggle source
# File lib/sn_foil/contexts/setup_context.rb, line 105
def lookup_policy(object, options)
  lookup = if options[:policy]
             options[:policy].new(entity, object)
           elsif policy
             policy.new(entity, object)
           else
             Pundit.policy!(entity, object)
           end

  lookup.options = options if lookup.respond_to? :options=
  lookup
end