fix(admin): isole l'API admin sous /admin/api pour éviter la collision avec les pages front #33
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/admin-monitoring-spa-route-collision"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bug
Un F5 sur
/admin/monitoringaffichait le JSON brut de l'API au lieu de la page.Cause
server.mountRouter("/admin", adminRouter)(app.ts) montait l'API admin exactement sous/admin— la même racine que les pages/admin/*d'apps/web, servies depuis la même origine/le même process en prod (image Docker unique,serveStaticFrontend). Express matche par chemin sans égard au headerAccept:GET /admin/monitoring(route API) et la page du même nom étaient en conflit direct, et l'API gagnait systématiquement (montée avant le fallback SPA) — donc chaque F5 sur cette page recevait le JSON de l'API plutôt queindex.html.Seule
/admin/monitoringcollidait réellement aujourd'hui (le seul sous-routeur admin à répondreGETsur sa racine bare — vérifié pour/admin/metrics,/admin/catalog,/admin/tech-steps: aucune page front ne partage exactement leur chemin), mais le mécanisme touche potentiellement toute future route admin nommée comme sa page — d'où un correctif structurel plutôt qu'un renommage ponctuel de/admin/monitoringseul.Correctif
L'API admin est montée sous
/admin/api, jamais bare/admin. Toute la surface admin bouge en conséquence (auth/metrics/monitoring/tech-steps/catalog) ; les pages front (/admin/monitoring,/admin/catalogue,/admin/corrections...) sont inchangées — seul admin-client.ts change de base URL.Mis à jour en cohérence : commentaires JSDoc citant les routes (apps/api + apps/web + packages/shared),
specs/backend-architecture.md,specs/batch-cooking-modele.md, les intercepts Cypress (globs + un matcher regex qui avait échappé au premier passage de vérification), et les chemins supertest de la suite Mochaadmin-*.test.ts.Simplifie au passage
admin-monitoring.cy.ts: le contournementresourceTypeajouté dans #32 pour cette même collision n'a plus lieu d'être une fois les chemins distincts (retour à un intercept déclaratif simple) — le bug Cypress/Chrome qu'il avait mis au jour reste noté en commentaire pour référence future, indépendamment de ce correctif.Vérification
pnpm lint: cleanapi+web: cleanadmin-*)fetch("/admin/monitoring")renvoie maintenanttext/html(la page), plus jamais du JSONapps/apinon exécutable cette session (Postgres/Docker injoignable) — les ~40 chemins supertest ont été mis à jour mécaniquement en cohérence avec le nouveau mount point ; à faire tourner en CI ou à la prochaine session avec accès DB avant de considérer ce point définitivement clos.🤖 Generated with Claude Code
Un rafraîchissement (F5) sur /admin/monitoring affichait le JSON brut de l'API au lieu de la page — même chose à craindre pour tout futur /admin/* GET sans segment supplémentaire. Cause : `server.mountRouter("/admin", adminRouter)` (app.ts) montait l'API admin exactement sous /admin, la même racine que les pages /admin/* d'apps/web, servies depuis la même origine/le même process en prod (image Docker unique). Express matche par chemin, sans égard au Accept — `GET /admin/monitoring` (route API) et la page du même nom étaient en conflit direct ; l'API gagnait systématiquement (montée avant serveStaticFrontend), donc chaque F5 sur cette page recevait le JSON de l'API plutôt que index.html. Seule /admin/monitoring collidait réellement aujourd'hui (seul sous-routeur admin à répondre GET sur sa racine bare) mais le mécanisme touche toute future route admin nommée comme sa page — d'où un correctif structurel plutôt qu'un renommage ponctuel. Correctif : l'API admin est montée sous /admin/api (app.ts), jamais bare /admin. Toute la surface admin bouge en conséquence (auth/metrics/monitoring/tech-steps/catalog) ; les pages front (/admin/monitoring, /admin/catalogue, /admin/corrections...) sont inchangées, seul admin-client.ts change de base URL. Mis à jour en cohérence : commentaires JSDoc citant les routes (apps/api + apps/web + packages/shared), specs/backend-architecture.md, specs/batch-cooking-modele.md, les intercepts Cypress (globs + un matcher regex qui avait échappé au premier passage) et les chemins supertest du suite Mocha admin-*.test.ts. Simplifie au passage admin-monitoring.cy.ts : le contournement resourceType ajouté en #32 pour cette même collision n'a plus lieu d'être une fois les chemins distincts (retour à un intercept déclaratif simple) — le bug Cypress/Chrome qu'il avait mis au jour reste noté en commentaire pour référence future. Vérifié : pnpm lint clean ; build api+web clean ; suite e2e complète 28/28 fichiers, 116/116 tests verts (dont les 16 tests admin-*). Suite Mocha apps/api non exécutable cette session (Postgres/Docker injoignable) — chemins mis à jour mécaniquement en cohérence avec le nouveau mount point, à faire tourner en CI/à la prochaine session avec accès DB. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>