module GraphQL::Pundit::Authorization

Authorization methods to be included in the used Field class

Public Class Methods

new(*args, authorize: nil, record: nil, policy: nil, **kwargs, &block) click to toggle source

rubocop:disable Metrics/ParameterLists

Calls superclass method
# File lib/graphql-pundit/authorization.rb, line 14
def initialize(*args, authorize: nil,
               record: nil,
               policy: nil,
               **kwargs, &block)
  # rubocop:enable Metrics/ParameterLists
  # authorize! is not a valid variable name
  authorize_bang = kwargs.delete(:authorize!)
  @record = record if record
  @policy = policy if policy
  @authorize = authorize_bang || authorize
  @do_raise = !!authorize_bang
  super(*args, policy: policy, record: record, **kwargs, &block)
end
prepended(base) click to toggle source
# File lib/graphql-pundit/authorization.rb, line 9
def self.prepended(base)
  base.include(GraphQL::Pundit::Common)
end

Public Instance Methods

authorize(*args, record: nil, policy: nil) click to toggle source
# File lib/graphql-pundit/authorization.rb, line 28
def authorize(*args, record: nil, policy: nil)
  @authorize = args[0] || true
  @record = record if record
  @policy = policy if policy
end
authorize!(*args, record: nil, policy: nil) click to toggle source
# File lib/graphql-pundit/authorization.rb, line 34
def authorize!(*args, record: nil, policy: nil)
  @do_raise = true
  authorize(*args, record: record, policy: policy)
end
resolve(obj, args, ctx) click to toggle source
Calls superclass method
# File lib/graphql-pundit/authorization.rb, line 39
def resolve(obj, args, ctx)
  raise ::Pundit::NotAuthorizedError unless do_authorize(obj, args, ctx)

  super(obj, args, ctx)
rescue ::Pundit::NotAuthorizedError
  raise GraphQL::ExecutionError, "You're not authorized to do this" if @do_raise
end
Also aliased as: resolve_field
resolve_field(obj, args, ctx)
Alias for: resolve

Private Instance Methods

do_authorize(root, arguments, context) click to toggle source
# File lib/graphql-pundit/authorization.rb, line 51
def do_authorize(root, arguments, context)
  return true unless @authorize
  return @authorize.call(root, arguments, context) if callable? @authorize

  query = infer_query(@authorize)
  record = infer_record(@record, root, arguments, context)
  policy = infer_policy(@policy, record, arguments, context)

  policy.new(context[self.class.current_user], record).public_send query
end
infer_policy(policy, record, arguments, context) click to toggle source
# File lib/graphql-pundit/authorization.rb, line 79
def infer_policy(policy, record, arguments, context)
  # policy can be callable, nil (for inference) or a policy class
  if callable?(policy)
    policy.call(record, arguments, context)
  elsif policy.equal?(nil)
    infer_from = model?(record) ? record.model : record
    infer_from = object?(record) ? record.object : infer_from
    ::Pundit::PolicyFinder.new(infer_from).policy!
  else
    policy
  end
end
infer_query(auth_value) click to toggle source
# File lib/graphql-pundit/authorization.rb, line 62
def infer_query(auth_value)
  # authorize can be callable, true (for inference) or a policy query
  query = auth_value.equal?(true) ? method_sym : auth_value
  "#{query}?"
end
infer_record(record, root, arguments, context) click to toggle source
# File lib/graphql-pundit/authorization.rb, line 68
def infer_record(record, root, arguments, context)
  # record can be callable, nil (for inference) or just any other value
  if callable?(record)
    record.call(root, arguments, context)
  elsif record.equal?(nil)
    root
  else
    record
  end
end