Versionamento baseado em campos/diretivas
Campos e diretivas podem ser versionados de forma independente, e a versão a ser usada pode ser especificada na query através do argumento de campo/diretiva versionConstraint.
Para selecionar a versão do campo/diretiva, o Gato GraphQL utiliza as mesmas restrições de versão semver empregadas pelo Composer.
Por que
A estratégia de evolução adotada pelo GraphQL apresenta um problema: ao deprecar um campo (para substituí-lo por uma nova implementação), o novo campo precisará ter um novo nome. Assim, se o campo deprecado não puder ser removido (por exemplo, porque alguns clientes ainda o acessam, a partir de queries que nunca foram revisadas), todos esses campos para uma mesma funcionalidade tendem a se acumular no schema, e a nova implementação do campo não terá um nome ideal (na verdade, será pior do que o nome do campo deprecado).
A evolução por si só, ao longo do tempo, tende a poluir o schema com definições indesejadas. Versionar o schema com base em campos/diretivas pode resolver esse problema.
Versionamento direcionado através da query
Passe a restrição ao campo ou à diretiva, através do argumento 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")
}
}