Работа с директивами типа схемы
Gato GraphQL — это code-first сервер, то есть он использует код для разработки схемы. (Альтернативой является подход SDL-first, при котором сначала с помощью Schema Definition Language создаётся схема, а затем разрабатывается сервис.)
Поскольку у него нет SDL, code-first серверы не могут естественным образом поддерживать директивы типа схемы. Чтобы обойти это ограничение, Gato GraphQL разработал следующий механизм:
- Преобразование запроса из запрошенного в исполняемый
- Применение правил IFTTT к исполняемому запросу
В результате обеспечивается полная поддержка директив типа схемы на GraphQL-сервере.
Почему это работает?
@deprecated — это директива типа схемы, поэтому она должна применяться на уровне схемы. Однако что произошло бы, если бы мы на мгновение представили, что это директива типа запроса, и добавили @deprecated непосредственно в запрос к некоторому полю?
Например, при выполнении такого запроса:
query {
posts {
id
title
content @deprecated(reason: "Use newContent instead")
}
}Что ж, это тоже может работать! Ведь в конечном счёте директива — это просто некоторая функциональность, выполняемая над полем; объявление этой функциональности через схему или непосредственно в запросе не меняет поведения самой функциональности.
Однако, несмотря на то что это работает, смысла в этом нет. Мы не можем заставить наших клиентов добавлять @deprecated в свои queries. Это функциональность, которую определяет приложение на стороне сервера, а не клиент.
Тем не менее сама функциональность по-прежнему работает. Следовательно, с функциональной точки зрения не важно, добавляется ли директива в схему или в запрос. Более того, каждая директива в конечном итоге окажется в запросе, поскольку именно там она выполняется.
Таким образом, если у сервера нет SDL, он всё равно может встроить директиву в запрос во время выполнения.