Архитектура
АрхитектураРабота с директивами типа схемы

Работа с директивами типа схемы

Gato GraphQL — это code-first сервер, то есть он использует код для разработки схемы. (Альтернативой является подход SDL-first, при котором сначала с помощью Schema Definition Language создаётся схема, а затем разрабатывается сервис.)

Поскольку у него нет SDL, code-first серверы не могут естественным образом поддерживать директивы типа схемы. Чтобы обойти это ограничение, Gato GraphQL разработал следующий механизм:

В результате обеспечивается полная поддержка директив типа схемы на GraphQL-сервере.

Почему это работает?

@deprecated — это директива типа схемы, поэтому она должна применяться на уровне схемы. Однако что произошло бы, если бы мы на мгновение представили, что это директива типа запроса, и добавили @deprecated непосредственно в запрос к некоторому полю?

Например, при выполнении такого запроса:

query {
  posts {
    id
    title
    content @deprecated(reason: "Use newContent instead")
  }
}

Что ж, это тоже может работать! Ведь в конечном счёте директива — это просто некоторая функциональность, выполняемая над полем; объявление этой функциональности через схему или непосредственно в запросе не меняет поведения самой функциональности.

Однако, несмотря на то что это работает, смысла в этом нет. Мы не можем заставить наших клиентов добавлять @deprecated в свои queries. Это функциональность, которую определяет приложение на стороне сервера, а не клиент.

Тем не менее сама функциональность по-прежнему работает. Следовательно, с функциональной точки зрения не важно, добавляется ли директива в схему или в запрос. Более того, каждая директива в конечном итоге окажется в запросе, поскольку именно там она выполняется.

Таким образом, если у сервера нет SDL, он всё равно может встроить директиву в запрос во время выполнения.