class GraphQL::Schema::Mutation

This base class accepts configuration for a mutation root field, then it can be hooked up to your mutation root object type.

If you want to customize how this class generates types, in your base class, override the various `generate_*` methods.

@see {GraphQL::Schema::RelayClassicMutation} for an extension of this class with some conventions built-in.

@example Creating a comment

# Define the mutation:
class Mutations::CreateComment < GraphQL::Schema::Mutation
  argument :body, String, required: true
  argument :post_id, ID, required: true

  field :comment, Types::Comment, null: true
  field :errors, [String], null: false

  def resolve(body:, post_id:)
    post = Post.find(post_id)
    comment = post.comments.build(body: body, author: context[:current_user])
    if comment.save
      # Successful creation, return the created object with no errors
      {
        comment: comment,
        errors: [],
      }
    else
      # Failed save, return the errors to the client
      {
        comment: nil,
        errors: comment.errors.full_messages
      }
    end
  end
end

# Hook it up to your mutation:
class Types::Mutation < GraphQL::Schema::Object
  field :create_comment, mutation: Mutations::CreateComment
end

# Call it from GraphQL:
result = MySchema.execute <<-GRAPHQL
mutation {
  createComment(postId: "1", body: "Nice Post!") {
    errors
    comment {
      body
      author {
        login
      }
    }
  }
}
GRAPHQL

Public Class Methods

field(*args, &block) click to toggle source

Override this method to handle legacy-style usages of `MyMutation.field`

Calls superclass method
# File lib/graphql/schema/mutation.rb, line 66
def field(*args, &block)
  if args.none?
    raise ArgumentError, "#{name}.field is used for adding fields to this mutation. Use `mutation: #{name}` to attach this mutation instead."
  else
    super
  end
end
field_class(new_class = nil) click to toggle source
# File lib/graphql/schema/mutation.rb, line 89
def field_class(new_class = nil)
  if new_class
    @field_class = new_class
  else
    @field_class || find_inherited_method(:field_class, GraphQL::Schema::Field)
  end
end
object_class(new_class = nil) click to toggle source

An object class to use for deriving return types @param new_class [Class, nil] Defaults to {GraphQL::Schema::Object} @return [Class]

# File lib/graphql/schema/mutation.rb, line 100
def object_class(new_class = nil)
  if new_class
    @object_class = new_class
  end
  @object_class || (superclass.respond_to?(:object_class) ? superclass.object_class : GraphQL::Schema::Object)
end
payload_type(new_payload_type = nil) click to toggle source

Call this method to get the derived return type of the mutation, or use it as a configuration method to assign a return type instead of generating one. @param new_payload_type [Class, nil] If a type definition class is provided, it will be used as the return type of the mutation field @return [Class] The object type which this mutation returns.

# File lib/graphql/schema/mutation.rb, line 79
def payload_type(new_payload_type = nil)
  if new_payload_type
    @payload_type = new_payload_type
  end
  @payload_type ||= generate_payload_type
end
Also aliased as: type, type_expr
type(new_payload_type = nil)
Alias for: payload_type
type_expr(new_payload_type = nil)
Alias for: payload_type
visible?(context) click to toggle source
# File lib/graphql/schema/mutation.rb, line 107
def visible?(context)
  true
end

Private Class Methods

generate_payload_type() click to toggle source

Build a subclass of {.object_class} based on `self`. This value will be cached as `{.payload_type}`. Override this hook to customize return type generation.

# File lib/graphql/schema/mutation.rb, line 116
def generate_payload_type
  mutation_name = graphql_name
  mutation_fields = fields
  mutation_class = self
  Class.new(object_class) do
    graphql_name("#{mutation_name}Payload")
    description("Autogenerated return type of #{mutation_name}")
    mutation(mutation_class)
    mutation_fields.each do |name, f|
      field(name, field: f)
    end
  end
end