// Path: Backend/internal/httpx/router.go package httpx import ( "log/slog" "net/http" "strings" "github.com/go-chi/chi/v5" chimiddleware "github.com/go-chi/chi/v5/middleware" "moku-backend/internal/buildinfo" "moku-backend/internal/cache" "moku-backend/internal/config" "moku-backend/internal/database" ) type RouterConfig struct { ServiceName string Config *config.Config Logger *slog.Logger BuildInfo buildinfo.Info Database *database.DB Cache *cache.Client } type routeRegistrar interface { Register(chi.Router) } func NewRouter(cfg RouterConfig) http.Handler { router := chi.NewRouter() registerMiddleware(router, cfg) registerRoutes(router, routesForService(cfg)...) router.NotFound(notFoundHandler) return router } func registerMiddleware(router chi.Router, cfg RouterConfig) { router.Use(chimiddleware.RealIP) router.Use(RequestID) router.Use(Recoverer(cfg.Logger)) router.Use(RequestLogger(cfg.Logger)) } func registerRoutes(router chi.Router, registrars ...routeRegistrar) { for _, registrar := range registrars { registrar.Register(router) } } func routesForService(cfg RouterConfig) []routeRegistrar { registrars := []routeRegistrar{newSharedRoutes(cfg)} switch strings.ToLower(cfg.ServiceName) { case "web": registrars = append(registrars, newWebRoutes(cfg)) case "api": registrars = append(registrars, newAPIRoutes(cfg)) } return registrars } func notFoundHandler(w http.ResponseWriter, r *http.Request) { WriteError(w, http.StatusNotFound, RequestIDFromContext(r.Context()), "not_found", "The requested endpoint does not exist.") }