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

100 lines
2.8 KiB
Go

package server
import (
"encoding/json"
"errors"
"net/http"
"strings"
"chat-agent-system/internal/authz"
)
func (s *Server) handleAdminRoles(w http.ResponseWriter, r *http.Request) {
if _, ok := s.requireSystemAdmin(w, r); !ok {
return
}
switch r.Method {
case http.MethodGet:
roles, err := s.authzSvc().ListRoles(r.Context())
if err != nil {
writeDomainError(w, r, http.StatusInternalServerError, err)
return
}
writeJSONResponse(w, http.StatusOK, map[string]any{"roles": roles})
case http.MethodPost:
var req authz.CreateRoleInput
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
writeSafeError(w, r, http.StatusBadRequest, "无效的 JSON 请求体")
return
}
created, err := s.authzSvc().CreateRole(r.Context(), req)
if err != nil {
status := http.StatusBadRequest
if errors.Is(err, authz.ErrRolesNotAvailable) {
status = http.StatusServiceUnavailable
}
writeDomainError(w, r, status, err)
return
}
writeJSONResponse(w, http.StatusCreated, created)
default:
writeSafeError(w, r, http.StatusMethodNotAllowed, "不支持的请求方法")
}
}
func (s *Server) handleAdminRoleByID(w http.ResponseWriter, r *http.Request) {
if _, ok := s.requireSystemAdmin(w, r); !ok {
return
}
roleID := strings.TrimSpace(r.PathValue("id"))
if roleID == "" {
writeSafeError(w, r, http.StatusBadRequest, "无效的角色 ID")
return
}
switch r.Method {
case http.MethodPatch, http.MethodPut:
var req authz.UpdateRoleInput
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
writeSafeError(w, r, http.StatusBadRequest, "无效的 JSON 请求体")
return
}
updated, err := s.authzSvc().UpdateRole(r.Context(), roleID, req)
if err != nil {
status := http.StatusBadRequest
switch {
case errors.Is(err, authz.ErrRoleNotFound):
status = http.StatusNotFound
case errors.Is(err, authz.ErrRoleIsSystem):
status = http.StatusForbidden
case errors.Is(err, authz.ErrRolesNotAvailable):
status = http.StatusServiceUnavailable
}
writeDomainError(w, r, status, err)
return
}
writeJSONResponse(w, http.StatusOK, updated)
case http.MethodDelete:
if err := s.authzSvc().DeleteRole(r.Context(), roleID); err != nil {
status := http.StatusBadRequest
switch {
case errors.Is(err, authz.ErrRoleNotFound):
status = http.StatusNotFound
case errors.Is(err, authz.ErrRoleIsSystem):
status = http.StatusForbidden
case errors.Is(err, authz.ErrRoleInUse):
status = http.StatusConflict
case errors.Is(err, authz.ErrRolesNotAvailable):
status = http.StatusServiceUnavailable
}
writeDomainError(w, r, status, err)
return
}
writeJSONResponse(w, http.StatusOK, map[string]bool{"success": true})
default:
writeSafeError(w, r, http.StatusMethodNotAllowed, "不支持的请求方法")
}
}