Architektura
ArchitekturaObsługa dyrektyw typu schema

Obsługa dyrektyw typu schema

Gato GraphQL jest serwerem code-first, czyli używa kodu do tworzenia schematu. (Alternatywą jest podejście SDL-first, które używa Schema Definition Language do najpierw wyprodukowania schematu, a następnie tworzenia usługi).

Ponieważ nie posiada SDL, serwery code-first nie mogą naturalnie obsługiwać dyrektyw typu schema. Aby uniknąć tego ograniczenia, Gato GraphQL opracował następujący mechanizm:

Skutkuje to pełną obsługą dyrektyw typu schema na serwerze GraphQL.

Dlaczego to działa?

@deprecated jest dyrektywą typu schema, więc musi być stosowana na schemacie. Co jednak by się stało, gdybyśmy na chwilę udawali, że jest to dyrektywa typu query i dodali @deprecated bezpośrednio do jakiegoś pola w zapytaniu?

Na przykład, podczas wykonywania tego zapytania:

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

Cóż, to też mogłoby działać! Bo przecież dyrektywa to tylko pewna funkcjonalność do wykonania na polu; zadeklarowanie tej funkcjonalności przez schemat lub bezpośrednio w zapytaniu nie powoduje, że funkcjonalność zachowuje się inaczej.

Jednak choć to działa, to nie ma żadnego sensu. Nie możemy zmuszać naszych klientów do dodawania @deprecated do ich zapytań. To funkcjonalność decydowana przez aplikację po stronie serwera, nie przez klienta.

Niemniej jednak sama funkcjonalność nadal działa. Dlatego, z funkcjonalnego punktu widzenia, nie ma znaczenia, czy dyrektywa jest dodana do schematu, czy do zapytania. Co więcej, każda dyrektywa w końcu znajdzie się w zapytaniu, ponieważ tam właśnie jest wykonywana.

Dlatego jeśli serwer nie ma SDL, nadal może osadzić dyrektywę w zapytaniu, w czasie wykonania.