class GraphQL::Rails::Operations::QueryDefinition

DSL for query definition. TODO: Support resolve-only blocks.

Attributes

field[R]

Public Class Methods

new(klass) click to toggle source
# File lib/graphql/rails/operations.rb, line 88
def initialize(klass)
  @klass = klass
  @field = ::GraphQL::Field.new
end

Public Instance Methods

argument(name, type, required = false) click to toggle source
# File lib/graphql/rails/operations.rb, line 111
def argument(name, type, required = false)
  argument = ::GraphQL::Argument.define do
    name Types.to_field_name(name)
    type Types.resolve(type, required == :required)
  end
  @field.arguments[argument.name] = argument
end
description(description) click to toggle source
# File lib/graphql/rails/operations.rb, line 107
def description(description)
  @field.description = description
end
name(name) click to toggle source
# File lib/graphql/rails/operations.rb, line 93
def name(name)
  @name = name
  @field.name = Types.to_field_name(name)
end
resolve(&block) click to toggle source
# File lib/graphql/rails/operations.rb, line 119
def resolve(&block)
  @field.resolve = -> (obj, args, ctx) do
    # Instantiate the Operations class with state on this query.
    instance = @klass.new({
      op: :query, name: @name, type: @type,
      obj: obj, args: Fields.new(args), ctx: ctx, context: ctx
    })

    begin
      # Run callbacks for this Operations class.
      instance.run_callbacks(:perform_operation) do
        # Call out to the app-defined resolver.
        instance.instance_eval(&block)
      end
    rescue => e
      # Surface messages from standard errors in GraphQL response.
      ::GraphQL::ExecutionError.new(e.message)
    rescue ::Exception => e
      # Log and genericize other runtime errors.
      Rails.logger.error "Unexpected exception during query: #{@name}"
      Rails.logger.exception e
      ::GraphQL::ExecutionError.new('Internal error')
    end
  end
end
type(type) click to toggle source
# File lib/graphql/rails/operations.rb, line 102
def type(type)
  @type = type
  @field.type = Types.resolve(type)
end
uses(type) click to toggle source
# File lib/graphql/rails/operations.rb, line 98
def uses(type)
  Types.explicit.push Types.resolve(type)
end