Использование единого источника кода для стандартных и вложенных мутаций
Сервер GraphQL поддерживает 2 варианта поведения:
- Стандартное поведение для мутаций — по умолчанию
- Вложенные мутации — как дополнительная опция
Вследствие этого по умолчанию сервер предоставляет типы QueryRoot и MutationRoot, а для вложенных мутаций переключается на единый тип Root.
При создании resolvers нежелательно предоставлять два отдельных resolver — по одному на каждый вариант. Лучше, чтобы тот же resolver, используемый для разрешения полей Root, мог также разрешать поля QueryRoot и MutationRoot.
Детали реализации
Сервер использует объект FieldResolver для разрешения полей и объект MutationResolver для выполнения самой мутации. Один и тот же объект MutationResolver может быть связан с разными FieldResolver-ами, реализующими различные поля, поэтому код реализуется один раз и используется во многих местах в соответствии с принципами SOLID.
Узнать, является ли поле мутацией или нет, можно по тому, объявляет ли FieldResolver объект MutationResolver для этого поля — это делается через функцию resolveFieldMutationResolverClass.
Например, поле Root.replyComment предоставляет объект AddCommentToCustomPostMutationResolver. Этот же объект также используется полем Comment.reply.
Кроме того, при написании кода FieldResolver корневые поля добавляются только к типу Root. При стандартном поведении GraphQL сервер может получить эту конфигурацию и автоматически добавить эти поля в MutationRoot или QueryRoot в зависимости от того, являются ли они мутациями или нет.
В результате, поскольку мы используем единый источник кода, обеспечивающий как стандартное поведение, так и вложенные мутации, мы можем выполнять queries с вложенными мутациями без каких-либо дополнительных усилий.