package lifecycle import ( "encoding/json" "errors" "net/http" "git.ilapage.cn/ila/yovision/Bell/server/app/auth" "git.ilapage.cn/ila/yovision/Bell/server/app/rbac" ) type HTTP struct { Service Service Auth auth.HTTP } func (h HTTP) Register(mux *http.ServeMux) { mux.Handle("POST /api/v1/alerts/{id}/ack", h.Auth.Require(rbac.AlertsHandle, http.HandlerFunc(h.ack))) mux.Handle("POST /api/v1/alerts/{id}/close", h.Auth.Require(rbac.AlertsHandle, http.HandlerFunc(h.close))) } func (h HTTP) ack(w http.ResponseWriter, r *http.Request) { result, err := h.Service.Ack(r.Context(), r.PathValue("id"), auth.Principal(r.Context())) if err != nil { status := 500 if errors.Is(err, ErrAlreadyHandled) { status = 409 } writeJSON(w, status, map[string]any{"error": err.Error(), "current": result.Detail}) return } writeJSON(w, 200, result) } func (h HTTP) close(w http.ResponseWriter, r *http.Request) { var input CloseInput decoder := json.NewDecoder(http.MaxBytesReader(w, r.Body, 1<<20)) decoder.DisallowUnknownFields() if err := decoder.Decode(&input); err != nil { writeJSON(w, 400, map[string]string{"error": "请求格式无效"}) return } result, err := h.Service.Close(r.Context(), r.PathValue("id"), input, auth.Principal(r.Context())) if err != nil { status := 500 if errors.Is(err, ErrOutcomeRequired) { status = 400 } else if errors.Is(err, ErrInvalidTransition) { status = 409 } writeJSON(w, status, map[string]any{"error": err.Error(), "current": result.Detail}) return } writeJSON(w, 200, result) } func writeJSON(w http.ResponseWriter, status int, value any) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(value) }