Omgaan met schema-type directives
Gato GraphQL is een code-first-server, d.w.z. het gebruikt code om het schema te ontwikkelen. (Het alternatief is de SDL-first-aanpak, waarbij de Schema Definition Language wordt gebruikt om eerst het schema te produceren en daarna de service te ontwikkelen).
Omdat het geen SDL heeft, kunnen code-first-servers schema-type directives niet op een natuurlijke manier ondersteunen. Om deze beperking te omzeilen heeft Gato GraphQL het volgende mechanisme ontwikkeld:
- Het transformeren van de query van gevraagd naar uitvoerbaar
- Het toepassen van IFTTT-regels op de uitvoerbare query
Dit resulteert in volledige ondersteuning voor schema-type directives op de GraphQL-server.
Waarom werkt dit?
@deprecated is een schema-type directive, dus die moet op het schema worden toegepast. Maar wat zou er gebeuren als we even doen alsof het een query-type directive is, en @deprecated direct aan een veld in de query toevoegen?
Bijvoorbeeld, bij het uitvoeren van deze query:
query {
posts {
id
title
content @deprecated(reason: "Use newContent instead")
}
}Wel, dat zou ook kunnen werken! Want een directive is uiteindelijk gewoon een functionaliteit die op het veld wordt uitgevoerd; of je die functionaliteit via het schema of direct in de query declareert, maakt voor het gedrag van de functionaliteit geen verschil.
Hoewel het dan wel werkt, slaat het nergens op. We kunnen onze clients niet dwingen @deprecated aan hun queries toe te voegen. Dit is functionaliteit die door de applicatie aan de serverzijde wordt bepaald, niet door de client.
De functionaliteit zelf werkt echter nog steeds. Of de directive aan het schema of aan de query wordt toegevoegd, maakt dus vanuit functioneel oogpunt niets uit. Bovendien zal elke directive uiteindelijk in de query terechtkomen, aangezien dat de plek is waar die wordt uitgevoerd.
Als de server dus geen SDL heeft, kan die de directive alsnog in de query inbedden, tijdens runtime.