module Zen::Service::Plugins::Policies

Constants

GuardViolationError

Public Class Methods

used(service_class, *) click to toggle source
# File lib/zen/service/plugins/policies.rb, line 10
def self.used(service_class, *)
  service_class.partials = []
end

Public Instance Methods

can?(action) click to toggle source
# File lib/zen/service/plugins/policies.rb, line 25
def can?(action)
  why_cant?(action).nil?
end
guard!(action) click to toggle source
# File lib/zen/service/plugins/policies.rb, line 29
def guard!(action)
  reason = why_cant?(action)

  return if reason.nil?

  raise(reason) if (reason.is_a?(Class) ? reason : reason.class) < Exception

  raise(GuardViolationError, reason)
end
why_cant?(action) click to toggle source
# File lib/zen/service/plugins/policies.rb, line 39
def why_cant?(action)
  action_check = "#{action}?"

  reason =
    partials
    .find { |p| p.respond_to?(action_check) && !p.public_send(action_check) }
      &.class
      &.denial_reason

  reason.is_a?(Proc) ? instance_exec(&reason) : reason
end

Private Instance Methods

execute!() click to toggle source
# File lib/zen/service/plugins/policies.rb, line 14
        def execute!
  partials.each_with_object({}) do |partial, permissions|
    partial.public_methods(false).grep(/\?$/).each do |action_check|
      key = action_check.to_s[0...-1]
      can = partial.public_send(action_check)

      permissions[key] = permissions.key?(key) ? permissions[key] && can : can
    end
  end
end
partials() click to toggle source
# File lib/zen/service/plugins/policies.rb, line 51
        def partials
  @partials ||= self.class.partials.map do |klass|
    klass.from(self)
  end
end