// Package server собирает HTTP-роутер сервиса api из модулей. package server import ( "log/slog" "net/http" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "pipu/api/internal/api/gen" "pipu/api/internal/platform/httpx" "pipu/api/internal/system" ) // Deps — модули, реализующие части контракта API. type Deps struct { Log *slog.Logger System *system.Handler } // handlers объединяет модули в единую реализацию gen.StrictServerInterface. // По мере появления модулей (auth, catalog, ...) они встраиваются сюда. type handlers struct { *system.Handler } var _ gen.StrictServerInterface = handlers{} // NewRouter возвращает корневой http.Handler. func NewRouter(d Deps) http.Handler { log := d.Log if log == nil { log = slog.New(slog.DiscardHandler) } r := chi.NewRouter() r.Use(middleware.RequestID, httpx.RealIP, httpx.AccessLog(log), middleware.Recoverer) r.NotFound(httpx.NotFound) r.MethodNotAllowed(httpx.MethodNotAllowed) strict := gen.NewStrictHandlerWithOptions(handlers{Handler: d.System}, nil, gen.StrictHTTPServerOptions{ RequestErrorHandlerFunc: httpx.RequestError, ResponseErrorHandlerFunc: httpx.ResponseError(log), }) return gen.HandlerWithOptions(strict, gen.ChiServerOptions{BaseRouter: r}) }