From 365165c13b0ff1cde0ba470e7cf9c9dc5afaf4a4 Mon Sep 17 00:00:00 2001 From: enzo Date: Sun, 22 Mar 2026 18:44:10 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20RegisterPublicRoute=20pour=20pages=20HTM?= =?UTF-8?q?L=20modules=20+=20masquer=20install=C3=A9s=20dans=20store?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RouteEntry.Public bool : routes sans auth (pages HTML navigables par Swup) - RegisterPublicRoute() ajouté à Registry interface + coreRegistry - main.go : switch public/auth/admin pour les routes modules - modules.html : masque les modules déjà installés dans le store Co-Authored-By: Claude Sonnet 4.6 --- backend/main.go | 7 +++++-- backend/modules/loader.go | 8 +++++++- backend/modules/module.go | 4 +++- frontend/modules.html | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/backend/main.go b/backend/main.go index 0a01aa0..4824c0d 100644 --- a/backend/main.go +++ b/backend/main.go @@ -201,9 +201,12 @@ func main() { // Routes enregistrées par les modules actifs for _, route := range loader.Registry().GetRoutes() { routeCopy := route // Capturer la variable pour la closure - if routeCopy.RequireAdmin { + switch { + case routeCopy.Public: + r.MethodFunc(routeCopy.Method, routeCopy.Path, routeCopy.Handler) + case routeCopy.RequireAdmin: r.With(api.RequireAuth(jwtManager), api.RequireAdmin).MethodFunc(routeCopy.Method, routeCopy.Path, routeCopy.Handler) - } else { + default: r.With(api.RequireAuth(jwtManager)).MethodFunc(routeCopy.Method, routeCopy.Path, routeCopy.Handler) } } diff --git a/backend/modules/loader.go b/backend/modules/loader.go index 3ddc9d9..4150254 100644 --- a/backend/modules/loader.go +++ b/backend/modules/loader.go @@ -80,6 +80,7 @@ type RouteEntry struct { Path string Handler http.HandlerFunc RequireAdmin bool + Public bool // true = pas d'authentification requise (ex: pages HTML) } type migrationEntry struct { @@ -118,7 +119,12 @@ func newCoreRegistry(sqlDB *sql.DB, pool *sshpool.Pool, enc *crypto.Encryptor) * } func (r *coreRegistry) RegisterRoute(method, path string, handler http.HandlerFunc, requireAdmin bool) { - r.routes = append(r.routes, RouteEntry{method, path, handler, requireAdmin}) + r.routes = append(r.routes, RouteEntry{Method: method, Path: path, Handler: handler, RequireAdmin: requireAdmin}) +} + +// RegisterPublicRoute enregistre une route sans authentification (ex: page HTML d'un module). +func (r *coreRegistry) RegisterPublicRoute(method, path string, handler http.HandlerFunc) { + r.routes = append(r.routes, RouteEntry{Method: method, Path: path, Handler: handler, Public: true}) } func (r *coreRegistry) RegisterWSChannel(channel string, handler WSHandler) { diff --git a/backend/modules/module.go b/backend/modules/module.go index 64e6e76..4bb5e82 100644 --- a/backend/modules/module.go +++ b/backend/modules/module.go @@ -24,8 +24,10 @@ type NavItemDef struct { // Registry est l'interface exposée aux modules pour s'enregistrer dans le CORE. // Seuls des types de la bibliothèque standard sont exposés — aucun type internal. type Registry interface { - // Enregistrement de routes HTTP + // Enregistrement de routes HTTP (avec authentification) RegisterRoute(method, path string, handler http.HandlerFunc, requireAdmin bool) + // Enregistrement d'une route publique (sans auth — pour les pages HTML) + RegisterPublicRoute(method, path string, handler http.HandlerFunc) // Enregistrement du canal WebSocket RegisterWSChannel(channel string, handler WSHandler) diff --git a/frontend/modules.html b/frontend/modules.html index 67785b8..14b153c 100644 --- a/frontend/modules.html +++ b/frontend/modules.html @@ -111,7 +111,7 @@