Usando uma única fonte de código para mutations padrão e aninhadas
O servidor GraphQL suporta 2 comportamentos:
- O comportamento padrão para mutations, por padrão
- 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.