package server import ( "net/http" "time" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" ) func (s *Server) Router() http.Handler { r := chi.NewRouter() // middleware r.Use(middleware.RequestID) r.Use(middleware.RealIP) r.Use(s.loggingMiddleware) r.Use(middleware.Recoverer) r.Use(middleware.Timeout(60 * time.Second)) // basic routes r.Get("/", s.Home) r.Get("/health", s.Health) r.Get("/robots.txt", s.RobotsTxt) // oauth routes r.Get("/login", s.Login) r.Post("/login", s.Login) r.Post("/logout", s.Logout) r.Post("/account/switch", s.SwitchAccount) r.Post("/account/{did}", s.RemoveAccount) r.Delete("/account/{did}", s.RemoveAccount) r.Get("/oauth/client-metadata.json", s.OAuthClientMetadata) r.Get("/oauth/jwks.json", s.OAuthJWKS) r.Get("/oauth/callback", s.OAuthCallback) // xrpc routes r.Mount("/xrpc", s.XRPCRouter()) return r } func (s *Server) loggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) defer func() { s.logger.Info("request", "method", r.Method, "path", r.URL.Path, "status", ww.Status(), "bytes", ww.BytesWritten(), "duration", time.Since(start), ) }() next.ServeHTTP(ww, r) }) }