Comment lagiga.info lit en direct les résultats de GigaBracket
TL;DR
lagiga.info, le site de GIGA'GAMES, ne stocke aucun classement de tournoi dans son CMS. Il lit les classements sur une route publique de GigaBracket, intègre le tableau en iframe et retombe sur un podium statique si la route ne répond pas. Cet article suit ce qui passe d'un produit à l'autre, et dans quel sens.
Deux dépôts, trois sources de données
GIGA'GAMES Federation Guadeloupe eSports fait tourner deux applications. GigaBracket, lancé en juin 2026, gère les tournois : l'article consacré à GigaBracket couvre ses formats et sa stack. lagiga.info est le site public : agenda, disciplines, actualités, annuaires et résultats.
Le site répartit son contenu entre trois sources, selon qui le produit :
- Payload CMS : ce que rédige l'association, dans un Postgres dédié, édité depuis
/admin. - PocketBase : ce que créent les utilisateurs, comme les comptes, les profils joueurs et les équipes. L'instance et le schéma appartiennent à GigaBracket.
- Le code : les pages fixes et le contenu de repli, dans
src/lib/data.ts.
Payload et PocketBase ne se croisent pas. Sans aucun des deux, le site démarre et sert son contenu statique.
Le contrat : une route publique en lecture seule
Le classement dépend du format du tournoi, et seul GigaBracket sait le calculer. En élimination, il suit la profondeur d'élimination et non le nombre de victoires. lagiga ne recalcule rien : il reçoit le résultat.
GigaBracket expose pour cela une route sans authentification, comme ses vues spectateur :
GET /api/public/results/:shareId
Le shareId est l'identifiant public de 12 caractères déjà utilisé par les liens /spectate. La route répond avec un JSON dont l'ordre des clés reste stable, ici raccourci à quelques champs :
{
"shareId": "dEYzqldL00VY",
"gameName": "street-fighter-6",
"format": "double-elimination",
"status": "completed",
"playerCount": 11,
"standings": [
{
"rank": 1,
"playerName": "100scrupuls",
"played": 5,
"wins": 4,
"points": 4
}
]
}
Un shareId inconnu renvoie une 404 avec not_found. Une panne de PocketBase renvoie une 503, une erreur inattendue une 500.
Un seul champ fait la jonction
Le contrat complet compte 11 champs, et la page de résultats n'en affiche qu'un : standings. Le titre, le lieu, la date et le nombre de joueurs viennent de Payload ou du repli statique. Le compte-rendu et la galerie n'existent que dans Payload.
La jonction tient dans le champ shareId de la collection Payload tournament-results. Un membre connecté le renseigne dans l'admin. Il alimente le classement et le tableau intégré ; vide, aucun des deux ne s'affiche.
Direct : deux vitesses sur la même page
Le mot « direct » recouvre deux mécanismes différents sur une page de résultats :
- Le classement : la route de GigaBracket ne met rien en cache, mais lagiga garde sa réponse 300 secondes (
revalidate: 300). Le tableau de classement peut donc retarder d'environ cinq minutes. - Le tableau intégré : l'iframe charge
/embed/:shareId. Cette vue s'abonne aux matchs par le temps réel de PocketBase et se rafraîchit à chaque changement.
Pendant un tournoi en cours, le tableau peut donc avoir un score d'avance sur le classement affiché juste au-dessus.
L'intégration est bornée côté GigaBracket. Les routes /embed/ déclarent les domaines de lagiga dans frame-ancestors. Toutes les autres pages répondent frame-ancestors 'none' et X-Frame-Options: DENY.
Quand GigaBracket ne répond pas
fetchLiveResults ne lève jamais d'exception. Elle renvoie null si le shareId est vide, si la réponse échoue, si le JSON est invalide ou si le réseau coupe. La page choisit alors parmi trois affichages :
- Le classement live : rang, joueur, matchs, victoires et points.
- Le podium statique de
data.ts: rang et joueur seulement, avec une mention discrète. - Le message « classement à venir », s'il n'existe ni l'un ni l'autre.
Payload suit le même principe. Si sa base est absente ou si une migration manque, la lecture échoue proprement et le site bascule sur le repli statique.
Ce qui passe aussi par PocketBase
La route de résultats n'est pas le seul lien. Les deux applications partagent la même instance PocketBase, et j'ai consigné la règle dans une décision du projet : le schéma vit dans GigaBracket, pour éviter deux sources de vérité.
Les échanges vont dans les deux sens :
- De GigaBracket vers lagiga : le catalogue de jeux (
games) et les statistiques de joueurs (player_stats), recalculées par GigaBracket et lues par lagiga. - De lagiga vers GigaBracket : les profils (
player_profiles). lagiga est le seul à les créer et à les éditer ; GigaBracket sélectionne des profils existants pour ses équipes et ses tableaux. - Les votes Awards : lagiga les écrit, et la page de vote de GigaBracket redirige vers lui.
Une seconde route publique, /api/public/map-tournaments, alimente la carte /carte avec les tournois déclarés visibles (mapVisible). Le navigateur l'appelle quand le visiteur change de filtre, d'où les en-têtes CORS ouverts.
Cette règle a un coût, écrit lui aussi dans la décision : toute nouvelle collection côté lagiga passe par GigaBracket.
Trois langues, mais pas les mêmes partout
lagiga.info propose le français, l'anglais et l'espagnol. Le créole guadeloupéen reste servi sur /gcf/, hors sélecteur et hors sitemap. Chaque couche couvre un périmètre différent :
- Dictionnaires et contenu statique : français, anglais et espagnol.
- Payload : français et anglais, avec repli sur le français. Sur
/es/, un compte-rendu s'affiche en anglais. - GigaBracket : français, anglais et créole, sans espagnol.
La route de résultats passe cet écart sans dommage, parce qu'elle renvoie des données et non des phrases : des noms, des rangs, des chiffres. Les libellés des colonnes viennent du dictionnaire de lagiga, donc de la langue de la page.
L'iframe, elle, le subit. Son URL ne porte pas de langue et GigaBracket choisit la sienne : un navigateur qui demande l'espagnol reçoit le tableau en français, à l'intérieur d'une page en espagnol.
Ce que montre le #GCD 2026
Le #GCD, événement phare de la fédération, a réuni 7 tournois et 143 participants les 25 et 26 juillet 2026 à Sainte-Anne. Ces tournois ont tourné sur start.gg et Challonge, et six ont ensuite rejoint GigaBracket par des scripts d'import : quatre depuis start.gg, deux depuis Challonge. Pour cette édition, la route sert donc des résultats clos.
Le septième, Domino Clash, s'est joué sur place. Son shareId vaut null : sa page n'appelle pas GigaBracket et affiche 13 participants et un podium statique de trois noms.