package server import ( "errors" "io" "net/http" "strings" "chat-agent-system/internal/workflowdef" ) func (s *Server) handleAdminTemplates(w http.ResponseWriter, r *http.Request) { user, ok := s.requireWorkflowAdmin(w, r) if !ok { return } switch r.Method { case http.MethodGet: assets, err := s.wfDefSvc().ListTemplates(r.Context()) if err != nil { writeDomainError(w, r, http.StatusInternalServerError, err) return } writeJSONResponse(w, http.StatusOK, map[string]any{"templates": assets}) case http.MethodPost: if err := r.ParseMultipartForm(defaultUploadBodyLimit); err != nil { if isRequestBodyTooLarge(err) { writeSafeError(w, r, http.StatusRequestEntityTooLarge, "upload too large") return } writeSafeError(w, r, http.StatusBadRequest, "invalid multipart") return } assetKey := strings.TrimSpace(r.FormValue("asset_key")) name := strings.TrimSpace(r.FormValue("name")) if assetKey == "" { assetKey = strings.TrimSpace(r.FormValue("key")) } if name == "" { name = assetKey } file, header, err := r.FormFile("file") if err != nil || assetKey == "" { writeSafeError(w, r, http.StatusBadRequest, "asset_key and file required") return } defer file.Close() data, err := io.ReadAll(io.LimitReader(file, 32<<20)) if err != nil { writeSafeError(w, r, http.StatusBadRequest, "read file failed") return } tv, err := s.wfDefSvc().UploadTemplate(r.Context(), assetKey, name, data, header.Filename, user.ID) if err != nil { status := http.StatusBadRequest switch { case errors.Is(err, workflowdef.ErrUploadRejected): status = http.StatusUnsupportedMediaType case errors.Is(err, workflowdef.ErrNotAvailable): status = http.StatusServiceUnavailable } writeDomainError(w, r, status, err) return } writeJSONResponse(w, http.StatusCreated, tv) default: writeSafeError(w, r, http.StatusMethodNotAllowed, "method not allowed") } } func (s *Server) handleAdminTemplateVersions(w http.ResponseWriter, r *http.Request) { if _, ok := s.requireWorkflowAdmin(w, r); !ok { return } if r.Method != http.MethodGet { writeSafeError(w, r, http.StatusMethodNotAllowed, "method not allowed") return } assetKey := strings.TrimSpace(r.PathValue("key")) if assetKey == "" { writeSafeError(w, r, http.StatusBadRequest, "invalid asset key") return } versions, err := s.wfDefSvc().ListTemplateVersions(r.Context(), assetKey) if err != nil { writeDomainError(w, r, http.StatusInternalServerError, err) return } writeJSONResponse(w, http.StatusOK, map[string]any{"versions": versions}) }