// Изменено: 2026-03-08 // 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 аутентификации. // /fn/{namespace}/{name} — публичный прокси для вызова функций, без auth. func NewRouter(h *handler.Handler, apiToken string, log *slog.Logger) http.Handler { r := mux.NewRouter() // Публичный прокси для вызова HTTP-триггеров — без auth токена // Все HTTP методы разрешены (GET/POST/PUT/... — решает сама функция) r.PathPrefix("/fn/{namespace}/{name}").HandlerFunc(h.InvokeFunction) // Суброутер для /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.UpdateTrigger).Methods(http.MethodPatch) v1.HandleFunc("/namespaces/{namespace}/triggers/{name}", h.DeleteTrigger).Methods(http.MethodDelete) // Jobs CRUD — одноразовые запуски функций v1.HandleFunc("/namespaces/{namespace}/jobs", h.CreateJob).Methods(http.MethodPost) v1.HandleFunc("/namespaces/{namespace}/jobs/{name}", h.GetJob).Methods(http.MethodGet) v1.HandleFunc("/namespaces/{namespace}/jobs/{name}", h.DeleteJob).Methods(http.MethodDelete) // Цепочка middleware: logging → (auth только для /v1/) → router // /fn/ — без auth, /v1/ — с auth. // Используем gorilla/mux Use() чтобы auth применялся только к v1 суброутеру. v1.Use(func(next http.Handler) http.Handler { return middleware.Auth(apiToken, log, next) }) return middleware.Logging(log, r) }