Architektura
ArchitekturaWersjonowanie oparte na polach/dyrektywach

Wersjonowanie oparte na polach/dyrektywach

Pola i dyrektywy mogą być wersjonowane niezależnie, a wersja do użycia może być określona w query poprzez argument pola/dyrektywy versionConstraint.

Aby wybrać wersję pola/dyrektywy, Gato GraphQL używa tych samych ograniczeń wersji semver stosowanych przez Composer.

Dlaczego

Strategia ewolucji przyjęta przez GraphQL ma pewien problem: przy deprecjonowaniu pola (w celu zastąpienia go nową implementacją), nowe pole będzie musiało mieć nową nazwę. Jeśli deprecjonowanego pola nie można usunąć (na przykład dlatego, że niektórzy klienci nadal z niego korzystają, korzystając z queries, które nigdy nie zostały zaktualizowane), wszystkie te pola dla tej samej funkcjonalności mają tendencję do gromadzenia się w schemacie, a nowa implementacja pola nie będzie miała optymalnej nazwy (w rzeczywistości będzie gorsza niż nazwa deprecjonowanego pola).

Sama ewolucja, z biegiem czasu, ma tendencję do zaśmiecania schematu niepożądanymi definicjami. Wersjonowanie schematu na poziomie pól/dyrektyw może rozwiązać ten problem.

Ukierunkowane wersjonowanie poprzez query

Przekaż ograniczenie do pola lub dyrektywy poprzez argument versionConstraint:

# Selecting version for fields
query {
  #This will produce version 0.1.0
  firstVersion: userServiceURLs(versionConstraint: "^0.1")
  # This will produce version 0.2.0
  secondVersion: userServiceURLs(versionConstraint: ">0.1")
  # This will produce version 0.2.0
  thirdVersion: userServiceURLs(versionConstraint: "^0.2")
}
 
# Selecting version for directives
query {
  post(by: { id:1 }) {
    titleCase: title @makeTitle(versionConstraint: "^0.1")
    upperCase: title @makeTitle(versionConstraint: "^0.2")
  }
}