Découplage des requêtes demandées et exécutables
Gato GraphQL utilise un pipeline de directives, une architecture qui permet au moteur du serveur de résoudre, valider et exécuter la requête. Pour rendre le moteur aussi simple que possible, toute action concernant la résolution de la requête se déroule dans le pipeline, via des directives.

Appeler le résolveur pour valider et résoudre un champ, puis fusionner sa sortie dans la réponse, se fait via deux directives spéciales : @validate et @resolveValueAndMerge. Ces directives sont d'un type spécial : elles ne sont pas ajoutées par l'application (ni dans la requête ni dans le schéma) mais par le moteur lui-même. Ces 2 directives sont implicites et sont toujours ajoutées, sur chaque champ de chaque requête.
De cette stratégie, nous pouvons voir que, lors de l'exécution d'une requête sur le serveur GraphQL, il y a en réalité 2 requêtes impliquées :
- La requête demandée
- La requête exécutable
La requête exécutable, qui est celle qui sera finalement résolue par le serveur, est produite en appliquant des transformations à la requête demandée, notamment l'inclusion des directives @validate et @resolveValueAndMerge pour chaque champ.

Par exemple, si la requête demandée est celle-ci :
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}La requête exécutable sera celle-ci :
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}Où est-il utilisé
Gato GraphQL utilise ce mécanisme pour produire la requête exécutable dans les circonstances suivantes :
- Ajout de directives de type système (telles que
@validateet@resolveValueAndMerge) - Ajout de toute directive via IFTTT via des directives
- Définition d'un ordre d'exécution des champs strict pour Multiple Query Execution