Files
Agent-System/internal/server/admin_template_handlers.go
T
weichen f3f23a3018 feat(errcode): 用稳定错误码记录 HTTP 与异步失败
失败响应此前不写日志,request_id 无法对照原因。注册表不覆盖处理器已经给出的 HTTP 状态。
2026-09-28 02:27:16 +00:00

92 lines
2.6 KiB
Go

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})
}