7.5 KiB
7.5 KiB
JWE v2 â DĂ©cisions d'architecture (Agent Architecte)
Date : 2026-07-16 · Mission : refonte GeoGuessr souverain (voir projet_geoguessr_97x.md)
1. Décision back-end : SvelteKit seul (pas de Strapi)
Décision : SvelteKit seul, avec les lieux dans un fichier JSON versionné dans Git.
Arguments :
- Frugalité OKI : un seul processus Node à héberger, pas de CMS + admin + DB à maintenir, pas de surface d'attaque supplémentaire. SQLite serait de toute façon peu utile pour un corpus de ~40 lieux statiques.
- CritÚre du prompt (« qui ajoute les lieux ? ») : le corpus est éditorial, produit par l'Agent Contenu et relu. Le workflow Git (pull request = relecture + crédits photos vérifiés) est la modération. Le
docs/contribution.mddocumente l'ajout d'un lieu par PR. - Livrables finaux : le guide de dĂ©ploiement demandĂ© est « SvelteKit + Tile Server » â Strapi n'y figure pas.
- Anti-triche : le JSON reste cÎté serveur (
src/lib/server/), jamais importé par le client ; les endpoints filtrent les champs. Impossible de faire plus simple.
Si un jour des contributeurs non-dev doivent saisir des lieux en masse, la porte vers Strapi reste ouverte (le schéma JSON est le content-type tout désigné), mais ce n'est pas le besoin actuel.
2. Architecture des tiles MapLibre
- Rendu : MapLibre GL JS (verrouillé), chargé en lazy (import dynamique uniquement sur les écrans de jeu / exploration).
- Dev / dĂ©mo : tiles vectorielles OpenFreeMap â libres, basĂ©es OpenStreetMap, sans clĂ© API. Style custom OKI (JSON de style propre, dĂ©rivĂ© du style Positron, re-teintĂ© : mer bleu profond caraĂŻbe, terre sable, vĂ©gĂ©tation verte dense, labels sobres â pas le « bleu Google »).
- Prod auto-hébergée :
tileserver-gl+ extraits.mbtilesOpenStreetMap des 4 rĂ©gions (Guadeloupe, Martinique, Guyane, La RĂ©union â quelques dizaines de Mo au total). ProcĂ©dure dansdocs/deploiement.md. Le style OKI accepte l'URL des tiles par variable d'environnement (PUBLIC_TILES_URL), bascule sans changement de code. - Contrainte gĂ©ographique :
maxBounds= enveloppe union des 4 rĂ©gions (â lon â63âŠ57, lat â23âŠ18) +minZoom, donc impossible de scroller en Europe/AmĂ©rique du Nord. 4 boutons « saut de rĂ©gion » (GUADELOUPE / MARTINIQUE / GUYANE / RĂUNION) replacent la vue sur la rĂ©gion. Limite connue : l'enveloppe rectangulaire inclut l'Atlantique tropical et le BrĂ©sil â inoffensif (aucun indice sur le lieu), documentĂ©. - Attribution © OpenStreetMap contributors affichĂ©e.
3. Stratégie Wikipedia / Wikidata
Principe : rien de stocké en base, interroge l'API en temps réel avec cache court, cÎté serveur uniquement.
Endpoint serveur : GET /api/wiki/[qid] (ex. Q3077840 = Fort DelgrĂšs â l'exemple Q2216838 du prompt initial Ă©tait erronĂ©, corrigĂ© par l'Agent Contenu)
wbgetentitiessurwww.wikidata.orgâ rĂ©cupĂšre lesitelinkfrwiki (et le libellĂ© fr en fallback).GET https://fr.wikipedia.org/api/rest_v1/page/summary/{titre}âtitle,extract,content_urls,thumbnail.- RĂ©ponse normalisĂ©e :
{ qid, title, extract, url, thumbnail, description }. - Pas de sitelink fr ou erreur â
404: le front bascule sur l'écran Cas B « Pwen blindé ». - Cache :
Mapen mémoire, TTL 24 h (+Cache-Control: max-age=3600). User-Agent explicite (JWE-OKI/x.y (contact)) comme demandé par la politique Wikimédia.
4. Arborescence du projet
JWE/ (dĂ©pĂŽt existant â l'ancien PHP est conservĂ© tel quel)
âââ app/ â nouvelle application SvelteKit 2 / Svelte 5
â âââ src/
â â âââ lib/
â â â âââ server/
â â â â âââ lieux.ts (accĂšs donnĂ©es + sĂ©lection alĂ©atoire + scoring)
â â â â âââ data/lieux.json (corpus 40 lieux â serveur uniquement)
â â â âââ components/ (GameMap, PhotoPanel, ResultPanel, ScoreCardâŠ)
â â â âââ i18n/ (fr.ts, gcf.ts, store)
â â â âââ styles/oki.css (tokens couleurs OKI)
â â â âââ utils/ (score.ts, geo.ts)
â â âââ routes/
â â â âââ +layout.svelte (header, switch langue FR/CR)
â â â âââ +page.svelte (accueil : 4 rĂ©gions, modes, Jouer)
â â â âââ jeu/[mode]/ (Ă©cran de jeu split photo/carte)
â â â âââ explorer/ (mode Aprann : carte pleine page)
â â â âââ api/
â â â âââ round/+server.ts (GET : lieu alĂ©atoire SANITISĂ)
â â â âââ guess/+server.ts (POST : {placeId, lat, lon, hints, timeMs} â score + vĂ©ritĂ©)
â â â âââ lieux/+server.ts (GET : catalogue sanitise pour Explorer)
â â â âââ wiki/[qid]/+server.ts (GET : extrait Wikipedia, cache 24 h)
â â âââ app.html / app.d.ts
â â âââ service-worker.ts (PWA)
â âââ static/ (manifest.webmanifest, icĂŽnes, photos Ă©ventuelles)
â âââ package.json / svelte.config.js / vite.config.ts
âââ docs/ (architecture, dĂ©ploiement, contribution, audit)
âââ content/ (sources de travail de l'Agent Contenu : crĂ©dits photos)
âââ projet_geoguessr_97x.md
5. Spécifications API REST (anti-triche)
| Endpoint | Méthode | Payload | Réponse |
|---|---|---|---|
/api/round?region=&mode=&exclude= |
GET | â | { id, nom, nom_creole, categorie, difficulte, photo{url,credit,alt}, indices[] } â jamais coordonnees, commune, region, wikidata_id |
/api/guess |
POST | { id, lat, lon, hintsUsed, timeMs? } |
{ distanceKm, score, coordonnees, commune, region, nom, wikidata_id } |
/api/lieux |
GET | â | Catalogue sanitise (sans coordonnĂ©es prĂ©cises : coords arrondies Ă 0.05° pour l'affichage Explorer uniquement â mode sans score) |
/api/wiki/[qid] |
GET | â | { title, extract, url, thumbnail } ou 404 |
RĂšgles :
- Le scoring est recalculé cÎté serveur :
score = round(5000 Ă e^(âd/r)),rselon difficultĂ© du lieu (50/15/5/1 km), pĂ©nalitĂ© â10 %/indice, bonus temps †+20 % plafonnĂ© Ă 5000. - Distance : haversine.
- Le client ne reçoit la vérité (coordonnées, commune, wikidata_id) qu'aprÚs la soumission du marqueur.
exclude: liste d'ids dĂ©jĂ jouĂ©s (mode DĂ©fi 5 rounds, stateless â pas de session serveur nĂ©cessaire, pas de leaderboard).
6. Décisions annexes
- Adapter :
adapter-node(auto-hébergement sobre derriÚre nginx/caddy). - PWA : manifest + service worker minimal (cache app shell, photos en stale-while-revalidate).
- i18n : dictionnaires maison
fr/gcf(créole), store Svelte,langpersistée en localStorage. - Photos : URLs Wikimedia Commons (Special:FilePath,
?width=1200) vérifiées CC par l'Agent Contenu ;<img loading="lazy">+srcset. - A11y / calm tech :
prefers-reduced-motionrespectĂ© (pas de vol de marqueur), timer informatif non anxiogĂšne, navigation clavier (carte : flĂšches dĂ©placent le marqueur, EntrĂ©e valide). - Licence code : MIT (le dĂ©pĂŽt historique Ă©tait AGPL â la refonte est un nouveau module
app/sous MIT comme exigé par le prompt ; leLICENSEracine reste l'historique, unapp/LICENSEMIT est ajouté).