Commit Graph

68 Commits

Author SHA1 Message Date
9d50adf523 feat: Combat tour par tour — Phases A-D complètes
TurnManager stateless avec sessions en mémoire (TTL 10min).
SpellSystem : 15 sorts (5 par voie du Dao), mana, cooldowns, buffs/debuffs.
CompanionAI : Mira (heal/support) et Vell (tank/dps) — IA contextuelle.
Monster AI : 3 profils (agressif, défensif, chaotique).

Nouvelles entités : Spell, PlayerSpell, PlayerDaoPath.
Character +mana. Monster +aiProfile +isBoss.
Migration : 1743004800000-TurnCombatSystem.

Frontend : TurnCombatPage (select/combat/result), sélecteur compagnon,
barres HP/MP, log scrollable, sous-menu sorts avec cooldowns.

Endpoints : 8 routes sous /combat/turn/ (start, action, session, spells,
unlocked, unlock, dao, dao/choose).

Combat simple (POST /combat/start) et grind ×5/×10 inchangés.
2026-03-25 00:58:47 +01:00
4beb1b2ed9 feat: Phase 3 Lore & Contenu — L'Odyssée d'un têtard
Lore Bible (canon narratif complet) + Engine Design (séparation moteur/univers).

4 nouvelles zones (Ruisseau Miroir, Marais des Murmures, Torrent Brisé, Source du Courant)
dans la chaîne d'unlock après desert (niv 16-25+).

Module NPC complet (entity, service, controller) — 8 PNJ avec dialogues évolutifs
par palier de niveau : Gorn (niv 1-15), Pierre-Mémoire (niv 16+), Mira, Vell,
La Batracienne, Le Forgeron, Le Marchand.

20 monstres lore-friendly, 12 matériaux, 15 items (dont Bâton de Gorn légendaire).

17 quêtes narratives (4 arcs ch.9-12) avec textes acceptText/completeText
qui racontent l'Odyssée. Nouveau type story_event pour les moments narratifs purs.
3 quêtes répétables optionnelles.

Seed runner : npm run seed:odyssee

Tout est additif — zéro impact sur le contenu existant niv 1-15.
2026-03-25 00:52:14 +01:00
2c94e4f3aa refacto: migration Tailwind — composants (6 fichiers)
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 32s
- RarityBadge, RarityDot → Tailwind classes
- MonsterCard → flex/text-rpg-* classes
- CreateCharacter → full Tailwind (max-w, grid, gap)
- Onboarding → Tailwind + responsive grid-cols-1 mobile
- CombatViews (Log+Multi+History) → Tailwind
- NotFoundPage → full Tailwind
- Pattern posé : couleurs dynamiques en style, layout en classes
2026-03-24 23:54:06 +01:00
9eff6d541e refacto: découpage composants — 5 extractions
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 34s
- MonsterCard, CombatViews (Log+Multi+History), CreateCharacter
- RarityBadge + RarityDot partagés (Guide, Drawer, pages)
- CombatPage 341→215 lignes (−37%)
- DashboardPage 368→307 lignes (−17%)
- 9 composants dans components/
2026-03-24 23:50:55 +01:00
71070b2e76 feat: mobile responsive — sidebar bottom nav + grids adaptatifs
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 34s
- Sidebar → bottom nav fixe sur mobile (<768px)
- Classes CSS layout: .sidebar, .nav-item, .grid-2, .layout-*
- Grids 2col → 1col sur mobile (Dashboard, Combat, Forge)
- HudBar compact + wrapping sur mobile
- GuideDrawer full-width mobile
- Cards padding réduit mobile
- Header username masqué mobile
2026-03-24 23:36:45 +01:00
e769c27a42 feat: page 404 RPG + onboarding nouveau joueur
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
- 404: têtard perdu dans les marais, boutons retour jeu + guide
- Onboarding: 4 étapes guidées (quêtes, combat, craft, guide)
  - Visible niv 1-3, dismissable, grille 2×2 avec CTA par étape
- DashboardPage: STAT_LABELS importé depuis constants.ts
2026-03-24 23:17:09 +01:00
17c61a2bb8 refacto: constants.ts — source unique frontend
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 41s
- Centralise RARITY_COLORS, RARITY_LABELS, ZONE_INFO, STAT_LABELS
- Centralise COMBAT_COST, REST_COST, FORGE_*, ATTACK_TYPES
- Supprime 6 duplications dans CombatPage, GuidePage, ShopPage, ForgePage, InventoryPage
2026-03-24 22:30:59 +01:00
faf2a98227 feat: toast system — feedback visuel global (react-hot-toast)
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 36s
- Toaster dark theme (bottom-right, 3s/4s)
- Combat: erreur cooldown/endurance en toast
- Craft: toast start + collect + erreurs
- Forge: toast succès/échec + erreurs
- Shop: toast achat + erreurs
- Inventaire: toast vente + erreurs
- Fix forge costs frontend (200/400/700)
2026-03-24 22:15:28 +01:00
0d917a8b39 feat: audit Phase 1 — P0/P1 quick wins
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 35s
- Fix vitalité: HP initial = 100 + (vitalité-1)×10
- Arme de départ: Bâton de Roseau équipé à la création
- Rebalance forge: niv3 200, niv4 400, niv5 700 (−30%)
- Confirmation avant vente d'item (confirm dialog)
- Fix forge costs dupliqués (shop sellback + inventaire)
2026-03-24 21:53:45 +01:00
23843cb72c feat: guide — bouton Jouer (retour au jeu)
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 35s
2026-03-24 21:33:50 +01:00
dbdc02f4ab feat: guide drawer inline + hook partagé useGuideData
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 34s
- GuideDrawer: panneau coulissant depuis la sidebar, recherche live
- useGuideData: hook unique — même cache React Query pour drawer + page
- Sidebar: BookOpen toggle le drawer (pas de navigation)
- Footer drawer: lien vers /guide complet
- GuidePage refactorisée sur useGuideData (zéro duplication)
2026-03-24 21:32:29 +01:00
84104cd96f feat: guide — barre de recherche live + lien sidebar (BookOpen, bas)
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 34s
2026-03-24 21:25:30 +01:00
823d7911f0 feat: page Guide publique — wiki joueur dynamique
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
- /guide accessible sans authentification
- 7 onglets : Démarrer, Zones, Bestiaire, Équipement, Artisanat, Forge, Boutique
- Données dynamiques (API publiques) — toujours à jour
- Endpoint /monsters/bestiary public (bestiaire complet toutes zones)
- Fix Item.type → inclut 'consumable'
2026-03-24 21:19:08 +01:00
4fc8be9ea0 feat: historique combat enrichi — loot affiché + 10 entrées
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
- Ajout loot_material_id + loot_quantity sur combat_logs
- Historique passe de 5 à 10 entrées
- Affichage loot (🎁×N) dans l'historique récent
- Fix scope variables multi-combat loot tracking
2026-03-24 21:08:49 +01:00
74938dd35f fix: cooldown serveur 2s/8s + loot dans transaction (élimine deadlock)
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
2026-03-24 21:04:11 +01:00
909b8da77f fix: multi-combat single transaction — élimine lock contention
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
2026-03-24 20:51:31 +01:00
6ffc867ef7 fix: imports inutilisés frontend (useEffect, CombatResult)
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
2026-03-24 20:47:35 +01:00
efe4b4e372 feat: multi-combat ×5/×10 + cooldown anti-spam
Some checks failed
CI/CD — Build & Deploy / Build & Deploy (push) Failing after 30s
- Backend: startMultiCombat boucle séquentielle, arrêt sur défaite
- Frontend: cooldown 1.5s entre combats, boutons ×1/×5/×10
- Frontend: résumé multi-combat (wins/losses, XP/Or/loot totaux)
- Fix: lock contention par spam de clics résolu
2026-03-24 20:21:44 +01:00
ec6d91b0f9 fix: seed craft-drops — inclure matériaux/items/recettes Sprint 3 (migration MySQL)
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 31s
2026-03-24 20:10:44 +01:00
47c90e4d55 feat: craft/drops — 10 matériaux, 12 recettes, drop rate variable
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 32s
- 10 matériaux Égouts/Désert (Poil de Rat → Œil du Sphinx)
- 12 items craftables dont 1 legendary (Sceptre Prophétique)
- 12 recettes cross-zone avec ingrédients cohérents
- 15 monstres mappés à leur drop (tous les Égouts/Désert)
- Drop rate variable par difficulté relative (25-80%)
- Quantité drop variable (1-3 selon boss/difficulté)
2026-03-24 20:07:18 +01:00
6938eedcda feat: titres sélectionnables + prix revente forge inclus
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 31s
Dashboard: titre actif affiché "« Champion »" + sélecteur avec tous les
titres débloqués (achievements claimed avec rewardTitle).
Header: titre visible à côté du level.

Revente: prix inclut l'investissement forge (50% des coûts cumulés).
Épée +5 (investissement 1900 or) → revente base + 950 au lieu de base seul.
API client: ajout méthode PUT.
2026-03-24 19:31:02 +01:00
da8401dec2 fix: useState before conditional return — React hooks order
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 35s
2026-03-24 19:23:46 +01:00
0c9839e1d8 feat: bouton Voir tout sur quêtes combat — plus de quêtes cachées derrière les grosses
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
2026-03-24 19:21:24 +01:00
dd2a025c74 feat: quest page restructurée — combat/métiers/dailies/arcs séparés
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
Frontend: 4 sections distinctes sur la page quêtes:
  - Quêtes actives (3 slots combat uniquement)
  - Quêtes de combat (stagger: max 3 affichées, "+N après celles-ci")
  - 🔨 Métiers (forge/craft — hors pool, toujours disponibles)
  - 🔄 Dailies (répétables en fond)

Backend: craft/forge quests ne comptent plus dans le MAX_ACTIVE_QUESTS.
2026-03-24 19:11:29 +01:00
d77666c4cf feat: zone field sur Quest — filtre zone direct, plus besoin de passer par l'arc
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 32s
2026-03-24 19:05:27 +01:00
287774ecd0 fix: kill_any quests respect zone — égouts ne complète plus les quêtes désert
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
2026-03-24 19:02:43 +01:00
bf896a797f feat: vente items + stats combat avec équipement + forge visible
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
Inventaire: bouton Vendre sur items non équipés (40% du prix d'achat).
Stats forge visibles: "+5 ATK (3+2)" montre base + bonus forge.
Dashboard combat: attaque/défense calculés avec arme+armure+forge équipées.
10 side quests Égouts seedées (level 5-7).
2026-03-24 18:58:15 +01:00
9aadc326e1 feat: arc quests accept from arc panel + side quests only in available
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 35s
Arc panel: boutons Accepter/Réclamer directement sur chaque quête d'arc,
progress affiché (3/5), arcs lockés avec 🔒 et opacity réduite.
Quêtes disponibles: seulement les secondaires (pas les arcs).
Quêtes d'arc abandonnées: ré-acceptables depuis le panel arc.
Zone locking respecté dans getArcs (zoneUnlocked flag).
2026-03-24 18:31:42 +01:00
810ad5ee64 fix: quests respect zone locking + level ordering fixes
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 35s
Quêtes d'arcs filtrées par zones débloquées — pas de quête Égouts
visible tant que l'arc Marais n'est pas complété.
Gardien des marais: level 5→4. Dératisation: level 4→5.
Exterminateur: description corrigée (kill_any x30, pas "chaque espèce").
2026-03-24 18:27:36 +01:00
b414200544 fix: forge UI updates forgeLevel after success — prix/taux rafraîchis
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
2026-03-24 18:16:58 +01:00
66df1013e5 fix: forge endpoint URL param + response field mapping
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 34s
2026-03-24 18:14:23 +01:00
95fcf325dc fix: quest available filtering + 6 side quests level 2-4
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 36s
Fix: getAvailable filtre maintenant les quêtes active/completed (pas juste
claimed). Plus de doublons dailies, plus d'internal server error.

6 quêtes secondaires pour combler le gap level 2-5:
  Chasseur de champignons (lv2, 150 XP), La menace rampante (lv3, 180 XP),
  Guerrier éprouvé (lv2, 250 XP), Collecteur de trophées (lv3, 500 XP),
  Exterminateur (lv4, 400 XP), Première forge (lv2, 120 XP).
2026-03-24 18:08:49 +01:00
60d10a5423 feat: achievements zones — Maître des Marais, Seigneur des Égouts, Conquérant du Désert
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 32s
2026-03-24 18:01:05 +01:00
cc3cbc1d2f fix: potion énergie affiche +30 endurance au lieu de +50% PV
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 32s
2026-03-24 17:58:56 +01:00
d1609efaae feat: zone locking — progression par arcs narratifs + arcs Égouts/Désert
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
Zones verrouillées: marais toujours ouvert, égouts après arc Marais,
désert après arc Égouts. Filtrage backend sur monstres ET boutique.

Arc "Les Égouts de la Cité" (4 quêtes, lv4-7, boss Roi des Rats)
Arc "Les Sables Brûlants" (3 quêtes, lv8-12, boss Sphinx)

GET /api/monsters/zones — retourne les zones avec statut unlocked.
Combat page: monstres groupés par zone, zones lockées avec icône cadenas.
Boutique: items filtrés par zones débloquées (potions toujours visibles).
2026-03-24 17:57:23 +01:00
8cb5fcd5ba fix: endurance regen 6min→3min dans combat/forge/craft + potions d'énergie
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 32s
Bug: combat/forge/craft calculaient la regen à 1pt/6min (ancien) alors que
character.service utilisait 1pt/3min (nouveau). Le joueur voyait 8 endurance
dans le HUD mais le backend refusait le combat avec 4.

Potions d'énergie: Potion (30 endurance, 20 or) + Grande (60 endurance, 45 or).
Consommable instantané via la boutique — le joueur peut acheter du temps de jeu.
2026-03-24 17:51:30 +01:00
1ffde61f97 feat: boutique + zones (égouts, désert) + 10 monstres + 14 items + potions
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 31s
Shop module: GET /api/shop, POST /api/shop/buy/:id, POST /api/shop/sell/:id
Potions: achat instantané, heal 50% HP, pas d'inventaire.
Items: buyPrice + minLevel + zone ajoutés à l'entité.
12 équipements (4 par zone: marais/égouts/désert) + 2 potions.

Monstres: zone field ajouté, 10 nouveaux monstres:
  Égouts (lv4-10): Rat, Slime, Araignée, Crocodile, Roi des Rats
  Désert (lv8-15): Scorpion, Vautour, Momie, Ver des Sables, Sphinx

Frontend: page /shop groupée par zone, rarity colors, achat/vente.
Sidebar: icône ShoppingBag pour la boutique.
2026-03-24 17:46:21 +01:00
4d254692b0 feat: page Achievements + soins renommé + bouton soins en combat
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 31s
Page /achievements : 20 succès groupés par catégorie (Combat, Progression,
Économie, Équipement), progress bars, paliers bronze/silver/gold,
bouton réclamer, compteur débloqués/total.

Renommage "repos" → "soins" partout (dashboard, budget, messages).
Bouton soins ajouté dans la page combat (accès rapide entre les fights).
Icône Trophy dans la sidebar pour les succès.
2026-03-24 17:36:20 +01:00
210f32b9cc fix: seed.ts migré PostgreSQL → MySQL (AppDataSource)
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 31s
2026-03-24 17:26:02 +01:00
014ffdd789 refactor: types frontend alignés backend — zéro as any, monstres triés par level
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
types.ts: rewrite complet — Character, Monster, CombatResult, CombatLog
alignés sur les champs réels du backend. Plus de mapping approximatif.

CombatPage: réécriture propre — monstres triés par level (appropriés en
haut, trop forts en bas avec opacity + warning), historique avec vrais
noms de monstres et valeurs XP/or, level up affiché dans le résultat.

Cleanup: 0 occurrence de "as any" dans tout le frontend.
2026-03-24 17:24:59 +01:00
e3c870bb9f fix: combat page field mapping — monster levels, history names, XP/gold values
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
Monster: minLevel/maxLevel (backend) vs levelMin/levelMax (frontend type)
History: xpEarned/goldEarned + monster.name vs xpGained/goldGained/monsterName
Combat result: rewards.xp/gold vs xpGained/goldGained, level up display
2026-03-24 17:16:24 +01:00
eafac3d8c7 feat: endurance tickets — coûts visibles partout + budget dashboard
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 31s
Combat: coût 5 affiché, compteur "X combats possibles", bouton disabled
Forge: coût 10 + or affiché (baissé de 15 à 10), bouton disabled
Dashboard: indicateur budget "X combats · Y forges · Z repos"
Repos: coût 10 affiché, disabled si insuffisant
2026-03-24 17:09:06 +01:00
cfdc5c9b02 feat: HUD bar — stats persistantes sous le header
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 32s
Barre compacte toujours visible : nom+level, HP, endurance+timer regen,
XP, or, quêtes actives (avec compteur "prêtes !").
Timer live : "+1 dans X:XX" quand endurance < max.
Auto-refresh 30s pour l'endurance, 60s pour les quêtes.
Chaque section cliquable vers la page correspondante.
2026-03-24 17:03:31 +01:00
9fac9e123b feat: repeatable quests hors pool 3 slots + section tâches quotidiennes
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 32s
Répétables ne comptent plus dans le MAX_ACTIVE_QUESTS (3).
Frontend: section séparée "Tâches quotidiennes" en grille 3 colonnes,
quêtes narratives en haut avec les slots limités.
Prépare le terrain pour le hub village (forgeron, taverne, etc.).
2026-03-24 16:57:57 +01:00
af247a1c6b fix: quest progression (events after tx), abandon quest, endurance display
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 34s
- Events (achievement/community/quest) émis APRÈS la transaction combat
  au lieu de dedans — corrige les quêtes qui ne progressaient pas
- POST /api/quests/abandon/:id — abandonner une quête active
- Frontend: bouton "Abandonner" sur les quêtes actives non complétées
- Fix endurance display (enduranceCurrent field mapping)
- Types Character mis à jour (xpToNextLevel, activeTitle, enduranceCurrent)
2026-03-24 16:52:48 +01:00
8038ca5d0a feat: quest page frontend — accept, progress, claim, arcs narratifs
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
Nouvelle page /quests avec icône Scroll dans la sidebar.
Layout: quêtes actives (gauche) + disponibles (droite) + arcs en bas.
Progress bars, boutons accepter/réclamer, badges répétable.
Arc section collapsible avec status par quête.
2026-03-24 16:40:04 +01:00
7651f3d8aa feat(sprint5): quest system + arcs + rebalance endurance/damage/xp
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
Quest system:
  4 entities (quest_arcs, quests, player_quests, player_quest_arcs)
  Arc "Les Marais du Têtard" (4 quêtes narratives)
  3 quêtes standalone répétables (chasse/forge/craft)
  5 achievements liés (quests_completed + quest_arc_completed)
  Event-driven: combat/forge/craft/loot émettent quest.progress
  API: available, active, completed, accept, claim, arcs

Rebalance:
  Endurance coût combat 10→5, regen 6min→3min (20/h), repos 20→10
  Dégâts joueur +3 base (plus de combats de 13 tours au level 1)
  Défaite endurance penalty 50→25
  XP monstres réduite (25→8 Têtard, 130→50 Golem) — quêtes = source principale
2026-03-24 16:34:37 +01:00
93b34b1f7b feat: stat distribution UI + rest button + xpToNextLevel from backend
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 34s
Dashboard: stat distributor with +/- buttons when statPoints > 0,
rest button (+50% HP, -20 endurance) when HP < max,
XP bar uses xpToNextLevel from backend instead of local formula.
API: distributeStats + rest endpoints added to client.
2026-03-24 16:09:55 +01:00
214045c7ce fix: level-up formula uses current level, add xpToNextLevel to API
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
XP threshold was computed on level+1 (target), making early levels too
steep (283 XP for level 2 instead of 100). Now uses current level:
level 1→2 = 100 XP, level 2→3 = 283 XP, level 10→11 = 3162 XP.

Added xpToNextLevel field to character and combat responses so the
frontend can display accurate progress bars.
2026-03-24 16:02:51 +01:00
6df11f2860 feat(sprint5): audit fixes — transactions, indexes, stat distribution, rest, forge cost
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 35s
P0 — Race conditions fixées avec pessimistic_write transactions :
  combat (double-spend endurance), forge (double upgrade),
  craft (consumeMaterials atomique), equip (item swap).
Forge : coût or (50-1000) + endurance (15) ajouté.
Combat : item stat bonuses (force/agilite/intelligence/chance) appliqués.

P1 — Features manquantes :
  POST /api/characters/stats — distribution stat points (avec lock).
  POST /api/characters/rest — repos auberge (+50% HP, -20 endurance).
  Vitalité : +10 HP max par point distribué.

P2 — Indexes DB ajoutés :
  character_id sur character_items, character_materials, combat_logs,
  craft_jobs, player_achievements, community_contributions.
  Composite (characterId, materialId) sur character_materials.
  period sur hall_of_fame. achievement_id sur player_achievements.

P3 — Cleanup : @nestjs/jwt et pg retirés de package.json.
2026-03-24 15:55:50 +01:00