Архитектура
АрхитектураИспользование единого источника кода для стандартных и вложенных мутаций

Использование единого источника кода для стандартных и вложенных мутаций

Сервер GraphQL поддерживает 2 варианта поведения:

  1. Стандартное поведение для мутаций — по умолчанию
  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 с вложенными мутациями без каких-либо дополнительных усилий.