Архитектура
АрхитектураВерсионирование на основе полей/директив

Версионирование на основе полей/директив

Поля и директивы могут версионироваться независимо, а версию для использования можно указать в запросе через аргумент поля/директивы versionConstraint.

Для выбора версии поля/директивы Gato GraphQL использует те же ограничения версий semver, применяемые Composer.

Почему

Стратегия эволюции, принятая в GraphQL, имеет проблему: при устаревании поля (для замены его новой реализацией) новому полю потребуется новое имя. Тогда, если устаревшее поле не может быть удалено (например, потому что некоторые клиенты по-прежнему обращаются к нему из queries, которые так и не были пересмотрены), все эти поля для одной и той же функциональности имеют тенденцию накапливаться в схеме, и новая реализация поля не будет иметь оптимального имени (более того, оно будет хуже, чем имя устаревшего поля).

Эволюция сама по себе со временем засоряет схему нежелательными определениями. Версионирование схемы на основе полей/директив может решить эту проблему.

Целевое версионирование через запрос

Передайте ограничение в поле или директиву через аргумент 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")
  }
}