module GraphQL::Schema::Member::HasArguments::ArgumentObjectLoader

def authorize_application_object(argument, id, context, loaded_application_object)

def authorize_application_object(argument, id, context, loaded_application_object)
  context.schema.after_lazy(loaded_application_object) do |application_object|
    if application_object.nil?
      err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
      load_application_object_failed(err)
    end
    # Double-check that the located object is actually of this type
    # (Don't want to allow arbitrary access to objects this way)
    resolved_application_object_type = context.schema.resolve_type(argument.loads, application_object, context)
    context.schema.after_lazy(resolved_application_object_type) do |application_object_type|
      possible_object_types = context.warden.possible_types(argument.loads)
      if !possible_object_types.include?(application_object_type)
        err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
        load_application_object_failed(err)
      else
        # This object was loaded successfully
        # and resolved to the right type,
        # now apply the `.authorized?` class method if there is one
        context.schema.after_lazy(application_object_type.authorized?(application_object, context)) do |authed|
          if authed
            application_object
          else
            err = GraphQL::UnauthorizedError.new(
              object: application_object,
              type: application_object_type,
              context: context,
            )
            if self.respond_to?(:unauthorized_object)
              err.set_backtrace(caller)
              unauthorized_object(err)
            else
              raise err
            end
          end
        end
      end
    end
  end
end

def load_and_authorize_application_object(argument, id, context)

def load_and_authorize_application_object(argument, id, context)
  loaded_application_object = load_application_object(argument, id, context)
  authorize_application_object(argument, id, context, loaded_application_object)
end

def load_application_object(argument, id, context)

def load_application_object(argument, id, context)
  # See if any object can be found for this ID
  if id.nil?
    return nil
  end
  object_from_id(argument.loads, id, context)
end

def load_application_object_failed(err)

def load_application_object_failed(err)
  raise err
end

def object_from_id(type, id, context)

Parameters:
  • context (GraphQL::Query::Context) -- the current context
  • id (String) -- A client-provided to look up
  • type (Class, Module) -- A GraphQL type definition
def object_from_id(type, id, context)
  context.schema.object_from_id(id, context)
end