package routes import ( "net/http" "time" "github.com/juanatsap/cv-site/internal/handlers" "github.com/juanatsap/cv-site/internal/middleware" ) // Setup configures all application routes and middleware func Setup(cvHandler *handlers.CVHandler, healthHandler *handlers.HealthHandler) http.Handler { mux := http.NewServeMux() // Public routes mux.HandleFunc("/", cvHandler.Home) mux.HandleFunc("/cv", cvHandler.CVContent) mux.HandleFunc("/health", healthHandler.Check) // HTMX endpoints for interactive controls mux.HandleFunc("/switch-language", cvHandler.SwitchLanguage) mux.HandleFunc("/toggle/length", cvHandler.ToggleLength) mux.HandleFunc("/toggle/logos", cvHandler.ToggleLogos) mux.HandleFunc("/toggle/theme", cvHandler.ToggleTheme) // Protected PDF endpoint with rate limiting (3 requests/minute per IP) pdfRateLimiter := middleware.NewRateLimiter(3, 1*time.Minute) protectedPDFHandler := middleware.OriginChecker( pdfRateLimiter.Middleware( http.HandlerFunc(cvHandler.ExportPDF), ), ) mux.Handle("/export/pdf", protectedPDFHandler) // Static files with cache control staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("static"))) mux.Handle("/static/", middleware.CacheControl(staticHandler)) // Apply comprehensive middleware chain handler := middleware.Recovery( middleware.Logger( middleware.SecurityHeaders(mux), ), ) return handler }