Table of Contents

Mutation Operations

mutation { createUser }

Mutation is one of the three operations that you can run on GraphQL. Mutations’ purpose is to perform changes to the data in the server and then fetch data based on the changes. Mutations are handled by requests.

Definition

Mutations can be composed of 5 different elements:

type
mutation
[name]
An optional name
[variables]
An optional set of variables
[directives]
An optional set of directives
selection
One or more fields from the
schema query fields
#   type         name      variables    directives  selection
  mutation FirstMutation($var: String!) @directive { welcome }

Fields

The top-level fields in the selection of your mutations are called entry points, and they must exist in the mutation fields of your schema. Mutations work similarly to queries, but the entry points should change the data before it can be fetched and formatted.

mutation {
  createUser     # entry point GraphQL::AppSchema[:mutation][:create_user]
  {              # one GraphQL::User < GraphQL::Object with the new record
    id           # GraphQL::User[:id]
    name         # GraphQL::User[:name]
  }
}

Here is an example of a response from the above:

{ "data": { "createUser": { "id": 3, "name": "Jazz Doe" } } }

Read more about performing fields.

Extra Definitions

Mutation fields accept some additional settings when they are being defined.

call

You can add this named argument to your field’s definition to indicate which method it should use when performing the mutation. By default, the called method is the bang! version of the field’s name.

# app/graphql/app_schema.rb
field(:create_user, 'User')                      # Calls create_user!
field(:create_user, 'User', call: :add_user)     # Calls add_user

perform

You can manually set a callback as the perform step. This can be done using the chaining definition or inside the block definition.

# app/graphql/app_schema.rb
field(:create_user, 'User').perform { User.create! }
# OR
field(:create_user, 'User') do
  perform { User.create! }
end