// Изменено: 2026-03-07 // router.go — регистрация всех REST-маршрутов через gorilla/mux. // Все маршруты защищены Bearer-токеном (middleware.Auth). // Маршруты сгруппированы по /v1/namespaces/{namespace}/... package api import ( "log/slog" "net/http" "github.com/gorilla/mux" "gitea-naeel.giteak8s.services.ngcloud.ru/naeel/sless/internal/api/handler" "gitea-naeel.giteak8s.services.ngcloud.ru/naeel/sless/internal/api/middleware" ) // NewRouter собирает gorilla/mux роутер со всеми маршрутами. // apiToken — статический Bearer-токен для v1 аутентификации. func NewRouter(h *handler.Handler, apiToken string, log *slog.Logger) http.Handler { r := mux.NewRouter() // Суброутер для /v1 — все маршруты API v1 := r.PathPrefix("/v1").Subrouter() // Functions CRUD v1.HandleFunc("/namespaces/{namespace}/functions", h.ListFunctions).Methods(http.MethodGet) v1.HandleFunc("/namespaces/{namespace}/functions", h.CreateFunction).Methods(http.MethodPost) v1.HandleFunc("/namespaces/{namespace}/functions/{name}", h.GetFunction).Methods(http.MethodGet) v1.HandleFunc("/namespaces/{namespace}/functions/{name}", h.UpdateFunction).Methods(http.MethodPut) v1.HandleFunc("/namespaces/{namespace}/functions/{name}", h.DeleteFunction).Methods(http.MethodDelete) // Invocation logs v1.HandleFunc("/namespaces/{namespace}/functions/{name}/invocations", h.ListInvocations).Methods(http.MethodGet) // Upload code — принимает zip, генерирует Dockerfile, кладёт tar.gz в S3, запускает сборку v1.HandleFunc("/namespaces/{namespace}/functions/{name}/upload", h.UploadCode).Methods(http.MethodPost) // Triggers CRUD v1.HandleFunc("/namespaces/{namespace}/triggers", h.ListTriggers).Methods(http.MethodGet) v1.HandleFunc("/namespaces/{namespace}/triggers", h.CreateTrigger).Methods(http.MethodPost) v1.HandleFunc("/namespaces/{namespace}/triggers/{name}", h.GetTrigger).Methods(http.MethodGet) v1.HandleFunc("/namespaces/{namespace}/triggers/{name}", h.DeleteTrigger).Methods(http.MethodDelete) // Цепочка middleware: logging → auth → router // Порядок важен: сначала логируем (чтобы видеть все запросы включая отклонённые), // затем проверяем авторизацию. return middleware.Logging(log, middleware.Auth(apiToken, log, r), ) }