Class: GraphQL::Schema::Mutation

Inherits:
Resolver
  • Object
show all
Extended by:
GraphQL::Schema::Member::HasFields, Resolver::HasPayloadType
Defined in:
lib/graphql/schema/mutation.rb

Overview

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.

Examples:

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

See Also:

  • for an extension of this class with some conventions built-in.

Direct Known Subclasses

RelayClassicMutation

Constant Summary

Constants included from GraphQL::Schema::Member::HasFields

GraphQL::Schema::Member::HasFields::CONFLICT_FIELD_NAMES

Constants included from GraphQL::Schema::Member::GraphQLTypeNames

GraphQL::Schema::Member::GraphQLTypeNames::Boolean, GraphQL::Schema::Member::GraphQLTypeNames::ID, GraphQL::Schema::Member::GraphQLTypeNames::Int

Instance Attribute Summary

Attributes inherited from Resolver

#context, #object

Class Method Summary collapse

Methods included from Resolver::HasPayloadType

field_class, object_class, payload_type

Methods included from GraphQL::Schema::Member::HasFields

add_field, field, field_class, fields, get_field, global_id_field, own_fields

Methods inherited from Resolver

argument, arguments_loads_as_type, #authorized?, complexity, extras, field_options, #initialize, null, #ready?, #resolve, resolve_method, #resolve_with_support, type, type_expr

Methods included from GraphQL::Schema::Member::HasPath

#path

Methods included from GraphQL::Schema::Member::HasArguments

#add_argument, #argument, #argument_class, #arguments, #own_arguments

Methods included from GraphQL::Schema::Member::BaseDSLMethods

#accessible?, #authorized?, #default_graphql_name, #description, #graphql_name, #introspection, #introspection?, #mutation, #name, #overridden_graphql_name, #to_graphql, #visible?

Constructor Details

This class inherits a constructor from GraphQL::Schema::Resolver

Class Method Details

.field(*args, &block) ⇒ Object

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



67
68
69
70
71
72
73
# File 'lib/graphql/schema/mutation.rb', line 67

def field(*args, &block)
  if args.empty?
    raise ArgumentError, "#{name}.field is used for adding fields to this mutation. Use `mutation: #{name}` to attach this mutation instead."
  else
    super
  end
end

.visible?(context) ⇒ Boolean

Returns:



75
76
77
# File 'lib/graphql/schema/mutation.rb', line 75

def visible?(context)
  true
end