Comment l’API parle à 01 Edu
Cette API n’est pas un simple proxy GraphQL : c’est une couche de projection qui exécute des requêtes GraphQL prédéfinies vers le moteur Hasura de la plateforme 01 Edu et renvoie le résultat sous forme JSON structuré.
Le client GraphQL interne
Le client est défini dans src/services/graphql.ts :
const client = await getClient();
const data = await client.run(`
query {
user(where: { login: { _eq: "alice" } }) {
id
login
}
}
`);Sous le capot, il :
- Demande un JWT Hasura via le service d’auth 01 Edu
(
src/services/auth.ts). - Le stocke en mémoire (
config/storage.ts). - Le rafraîchit automatiquement avant expiration (
isExpired). - Envoie la requête à
https://${DOMAIN}/api/graphql-engine/v1/graphqlavecAuthorization: Bearer <jwt>.
Variables d’environnement
| Variable | Rôle |
|---|---|
DOMAIN | Domaine 01 Edu (ex. zone01normandie.org) |
ACCESS_TOKEN | Token d’accès initial pour récupérer le JWT Hasura |
Endpoints qui passent par GraphQL
/api/v1/users—user { id, login }/api/v1/user-info/:username— détails d’un utilisateur/api/v1/promotions/:eventId/students—progressfiltré/api/v1/promotions/:eventId/students/optionals/api/v1/promotions/:eventId/students/additionals/api/v1/specialties/:name/students/api/v1/piscine/progress—progress(Piscine Go)/api/v1/toad/sessions—toad_sessions
Endpoints qui parlent à Postgres directement
- Toute la famille
/api/v1/discord/*:discord_technologies,discord_config,forbidden_schools,job_queries.
Endpoints qui passent par Drizzle (ORM Postgres)
/api/v1/projects/api/v1/holidays/api/v1/promo-configs/api/v1/discord-users/api/v1/promotions(liste seulement)
Limitation à connaître
Les requêtes GraphQL sont construites par interpolation de strings (cf.
src/api/v1/promotion.ts). Les listes de projets sont injectées via
JSON.stringify puis passées à _in:. Tout ajout d’endpoint qui accepte
de l’input utilisateur doit valider strictement les entrées avant
interpolation, ou idéalement utiliser des variables GraphQL plutôt que
de la concaténation.
En cas d’erreur GraphQL
Le client lève une exception si Hasura renvoie errors[0].message. Côté
handler, ça se traduit en :
{ "error": "..." }avec un 500. Vérifier le log serveur pour le message Hasura précis.