package router import ( "dal-license-server/internal/handler" "dal-license-server/internal/middleware" "net/http" "strconv" ) func Setup( client *handler.ClientHandler, admin *handler.AdminHandler, dashboard *handler.DashboardHandler, apiKey string, rateLimitActivate int, rateLimitValidate int, ) http.Handler { mux := http.NewServeMux() apiKeyMw := middleware.APIKeyAuth(apiKey) activateRL := middleware.RateLimit(rateLimitActivate) validateRL := middleware.RateLimit(rateLimitValidate) requireAPI := func(f http.HandlerFunc) http.Handler { return apiKeyMw(http.HandlerFunc(f)) } requireDash := func(f http.HandlerFunc) http.Handler { return dashboard.RequireLogin(http.HandlerFunc(f)) } // Static files mux.Handle("GET /static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) // Health mux.HandleFunc("GET /api/v1/health", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Write([]byte(`{"status":"ok"}`)) }) // Client API mux.Handle("POST /api/v1/activate", activateRL(http.HandlerFunc(client.Activate))) mux.Handle("POST /api/v1/deactivate", activateRL(http.HandlerFunc(client.Deactivate))) mux.Handle("POST /api/v1/validate", validateRL(http.HandlerFunc(client.Validate))) // Admin API mux.Handle("GET /api/v1/admin/products", requireAPI(admin.ListProducts)) mux.Handle("GET /api/v1/admin/licenses", requireAPI(admin.ListLicenses)) mux.Handle("POST /api/v1/admin/licenses", requireAPI(admin.CreateLicense)) mux.Handle("GET /api/v1/admin/licenses/{id}", requireAPI(admin.GetLicense)) mux.Handle("PUT /api/v1/admin/licenses/{id}", requireAPI(admin.UpdateLicense)) mux.Handle("POST /api/v1/admin/licenses/{id}/revoke", requireAPI(admin.RevokeLicense)) mux.Handle("POST /api/v1/admin/licenses/{id}/release", requireAPI(admin.ReleaseLicense)) mux.Handle("GET /api/v1/admin/licenses/{id}/activations", requireAPI(admin.ListActivations)) mux.Handle("GET /api/v1/admin/audit", requireAPI(admin.AuditLog)) mux.Handle("GET /api/v1/admin/stats", requireAPI(admin.Stats)) // Dashboard mux.HandleFunc("GET /login", dashboard.LoginPage) mux.HandleFunc("POST /login", dashboard.Login) mux.Handle("POST /logout", requireDash(dashboard.Logout)) mux.Handle("GET /dashboard", requireDash(dashboard.Dashboard)) mux.Handle("GET /licenses", requireDash(dashboard.LicenseList)) mux.Handle("GET /licenses/new", requireDash(dashboard.LicenseNew)) mux.Handle("POST /licenses", requireDash(dashboard.LicenseCreate)) mux.Handle("GET /licenses/{id}", requireDash(dashboard.LicenseDetail)) mux.Handle("POST /licenses/{id}/revoke", requireDash(dashboard.LicenseRevoke)) mux.Handle("POST /licenses/{id}/release", requireDash(dashboard.LicenseRelease)) mux.Handle("GET /audit", requireDash(dashboard.AuditPage)) // Root redirect mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/dashboard", http.StatusSeeOther) }) _ = strconv.Itoa(0) // satisfy import if needed return mux }