Arquitetura
ArquiteturaVersionamento baseado em campos/diretivas

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")
  }
}