Arquitetura
ArquiteturaUsando uma única fonte de código para mutations padrão e aninhadas

Usando uma única fonte de código para mutations padrão e aninhadas

O servidor GraphQL suporta 2 comportamentos:

  1. O comportamento padrão para mutations, por padrão
  2. Mutations aninhadas, como uma opção opcional

Como consequência, ele exporá os tipos QueryRoot e MutationRoot por padrão, e passará a expor um único tipo Root para mutations aninhadas.

Ao fornecer os resolvers, não gostaríamos de fornecer dois resolvers, um para cada solução. É melhor que o mesmo resolver usado para resolver campos de Root também possa resolver campos de QueryRoot e MutationRoot.

Detalhes de implementação

O servidor usa um objeto chamado FieldResolver para resolver campos, e um objeto chamado MutationResolver para executar a mutation propriamente dita. O mesmo objeto MutationResolver pode ser referenciado por diferentes FieldResolvers que implementam campos distintos, de forma que o código seja implementado apenas uma vez e utilizado em muitos lugares, seguindo a abordagem SOLID.

Sabemos se um campo é uma mutation ou não quando o FieldResolver declara um objeto MutationResolver para esse campo, o que é feito por meio da função resolveFieldMutationResolverClass.

Por exemplo, o campo Root.replyComment fornece o objeto AddCommentToCustomPostMutationResolver. Esse mesmo objeto também é usado pelo campo Comment.reply.

Além disso, ao codificar o FieldResolver, os campos root são adicionados apenas ao tipo Root. Para o comportamento GraphQL padrão, o servidor pode recuperar essa configuração e adicionar automaticamente esses campos a MutationRoot ou QueryRoot dependendo de serem mutations ou não.

Como resultado, como estamos usando uma única fonte para o código que alimenta tanto o comportamento padrão quanto as mutations aninhadas, somos capazes de executar queries com mutations aninhadas sem nenhum esforço adicional.