module Moat

Constants

POLICY_CLASS_SUFFIX
VERSION

Public Instance Methods

authorize(resource, action = " click to toggle source
# File lib/moat.rb, line 46
def authorize(resource, action = "#{action_name}?", user: moat_user, policy: find_policy(resource))
  if authorized?(resource, action, user: user, policy: policy)
    resource
  else
    fail NotAuthorizedError, action: action, resource: resource, policy: policy, user: user
  end
end
authorized?(resource, action = " click to toggle source
# File lib/moat.rb, line 42
def authorized?(resource, action = "#{action_name}?", user: moat_user, policy: find_policy(resource))
  !!apply_policy(resource, action, user: user, policy: policy::Authorization)
end
moat_user() click to toggle source
# File lib/moat.rb, line 54
def moat_user
  current_user
end
policy_filter(scope, action = action_name, user: moat_user, policy: find_policy(scope)) click to toggle source
# File lib/moat.rb, line 38
def policy_filter(scope, action = action_name, user: moat_user, policy: find_policy(scope))
  apply_policy(scope, action, user: user, policy: policy::Filter)
end
skip_verify_policy_applied() click to toggle source
# File lib/moat.rb, line 62
def skip_verify_policy_applied
  @_moat_policy_applied = true
end
Also aliased as: policy_applied
verify_policy_applied() click to toggle source
# File lib/moat.rb, line 58
def verify_policy_applied
  fail PolicyNotAppliedError unless @_moat_policy_applied
end

Private Instance Methods

apply_policy(scope_or_resource, action, user:, policy:) click to toggle source
# File lib/moat.rb, line 70
def apply_policy(scope_or_resource, action, user:, policy:)
  policy_instance = policy.new(user, scope_or_resource)
  fail(ActionNotFoundError, action: action, policy: policy) unless policy_instance.respond_to?(action)

  policy_applied
  policy_instance.public_send(action)
end
find_policy(object) click to toggle source
# File lib/moat.rb, line 78
def find_policy(object)
  policy = if object.nil?
    nil
  elsif object.respond_to?(:policy_class)
    object.policy_class
  elsif object.class.respond_to?(:policy_class)
    object.class.policy_class
  else
    infer_policy(object)
  end

  policy || fail(PolicyNotFoundError)
end
infer_policy(object) click to toggle source

Infer the policy from the object's type. If it is not found from the object's class directly, go up the ancestor chain.

# File lib/moat.rb, line 94
def infer_policy(object)
  initial_policy_inference_class = policy_inference_class(object)
  policy_inference_class = initial_policy_inference_class
  while policy_inference_class
    policy = load_policy_from_class(policy_inference_class)
    return policy if policy
    policy_inference_class = policy_inference_class.superclass
  end

  fail PolicyNotFoundError, initial_policy_inference_class.name
end
load_policy_from_class(klass) click to toggle source
# File lib/moat.rb, line 106
def load_policy_from_class(klass)
  Object.const_get("#{policy_inference_class(klass).name}#{POLICY_CLASS_SUFFIX}")
rescue NameError
  nil
end
policy_applied()
policy_inference_class(object) click to toggle source
# File lib/moat.rb, line 112
def policy_inference_class(object)
  if object.respond_to?(:model) # For ActiveRecord::Relation
    object.model
  elsif object.is_a?(Class)
    object
  else
    object.class
  end
end