package handlers import ( "log" "net/http" "time" ) // LoggingMiddleware logs HTTP requests func LoggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { startTime := time.Now() log.Printf("[HTTP] %s %s %s", r.Method, r.URL.Path, r.RemoteAddr) next.ServeHTTP(w, r) log.Printf("[HTTP] %s %s completed in %v", r.Method, r.URL.Path, time.Since(startTime)) }) } // CORSMiddleware adds CORS headers to responses func CORSMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Set CORS headers w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") // Handle preflight requests if r.Method == http.MethodOptions { w.WriteHeader(http.StatusOK) return } // Call the next handler next.ServeHTTP(w, r) }) } // RecoveryMiddleware recovers from panics func RecoveryMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { if err := recover(); err != nil { log.Printf("[PANIC] %v", err) http.Error(w, "Internal server error", http.StatusInternalServerError) } }() next.ServeHTTP(w, r) }) }