Configurar o schema
Configurar o schemaUsando mutations aninhadas

Usando mutations aninhadas

As mutations aninhadas permitem realizar mutations em um tipo diferente do tipo raiz no GraphQL.

A query abaixo executa uma mutation padrão, usando o campo de mutation updatePost do tipo raiz:

mutation {
  updatePost(input: {
    id: 5,
    title: "New title"
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      title
    }
  }
}

A query acima também pode ser executada por meio de uma mutation aninhada, onde o objeto post é primeiro consultado pelo campo post, e então o campo de mutation update, que pertence ao tipo Post, é aplicado sobre o objeto post:

mutation {
  post(by: {id: 5}) {
    update(input: {
      title: "New title"
    }) {
      status
      post {
        title
      }
    }
  }
}

As mutations também podem ser aninhadas, modificando dados no resultado de outra mutation:

mutation {
  createPost(input: {
    title: "First title"
  }) {
    status
    postID
    post {
      update(input: {
        title: "Second title",
        contentAs: { html: "Some content" }
      }) {
        status
        post {
          title
          content
          addComment(input: {
            commentAs: { html: "My first comment" }
          }) {
            status
            commentID
            comment {
              content
              date
            }
          }
        }
      }
    }
  }
}

Tipo raiz simplificado

As mutations aninhadas alteram o tipo raiz, de QueryRoot e MutationRoot para um único tipo Root que lida com queries e mutations:

Mutations aninhadas na documentação do schema

Visualizando campos de mutation

Use o cliente Voyager para visualizar quais são os campos de mutation.

Com mutations aninhadas, cada tipo no schema pode conter tanto campos de query quanto campos de mutation. Para diferenciá-los, a descrição do campo de mutation é precedida pela etiqueta "[Mutation] ".

Por exemplo, estes são os campos do tipo Root:

Descrição do tipo Root na documentação do GraphiQL

Usando mutations aninhadas nos endpoints

Existem 2 níveis nos quais podemos definir se o schema utilizará mutations aninhadas ou não. Em ordem de prioridade:

1. Na configuração do schema

Fazer com que um custom endpoint ou uma persisted query utilize mutations aninhadas pode ser definido por meio da configuração de schema correspondente:

Esquema de mutation na configuração do schema

2. Modo padrão, definido nas Configurações

Se a configuração do schema tiver o valor "Default", ela usará o modo definido nas Configurações:

Configurações para mutations aninhadas
Configurações para mutations aninhadas

Configurando mutations aninhadas

Existem três comportamentos que podemos escolher para o schema:

1. Não habilitar mutations aninhadas

Esta opção desabilita as mutations aninhadas (usando o comportamento padrão) para o schema.

2. Habilitar mutations aninhadas, mantendo todos os campos de mutation na raiz

Quando as mutations aninhadas estão habilitadas, os campos de mutation podem ser adicionados duas vezes ao schema:

  • uma vez sob o tipo Root
  • uma vez sob o tipo específico

Por exemplo:

  • Root.updatePost
  • Post.update

Com esta opção, os campos de mutation "duplicados" do tipo raiz são mantidos.

3. Habilitar mutations aninhadas, removendo os campos de mutation redundantes da raiz

Mesma opção acima, mas removendo os campos de mutation "duplicados" do tipo raiz.

Por exemplo:

  • Root.updatePost é removido
  • Post.update está disponível

Especificação do GraphQL

Esta funcionalidade não faz parte atualmente da especificação do GraphQL, mas foi solicitada: