package httpapi import ( "context" "errors" "knowledge-governance/internal/dobotaiops" "knowledge-governance/internal/qaopsfields" "knowledge-governance/internal/qaopsmirror" "knowledge-governance/internal/qaopsquality" "net/http" ) type masterFieldWriter interface { PatchMasterFields(context.Context, string, qaopsmirror.MasterFieldPatch, string) (qaopsmirror.MasterFieldReceipt, error) } func qaMasterFieldOptions(w http.ResponseWriter, r *http.Request, c Config) { if !authorizeQAOps(w, r) { return } if r.URL.RawQuery != "" { qaOpsError(w, dobotaiops.ErrInvalidQuery) return } w.Header().Set("Cache-Control", "no-store") writeJSON(w, 200, map[string]any{"data": map[string]any{"version": "qa-master-options-v1", "fields": qaopsfields.EditableOptions()}}) } func qaMasterFieldPatch(w http.ResponseWriter, r *http.Request, c Config) { if !authorizeQAOps(w, r) || !authorizeQAIntent(w, r, "qa-master-fields") { return } var q qaopsmirror.MasterFieldPatch if decodeQualityJSON(w, r, &q, "input_hash", "input_epoch", "base_revision", "base_review_revision", "nonce", "fields") != nil { writeJSON(w, 400, map[string]string{"error": "字段选项或编辑参数无效"}) return } writer, ok := c.QAOps.(masterFieldWriter) if !ok || c.QAOpsTenantKey == "" { qaOpsError(w, dobotaiops.ErrUnavailable) return } identity, _ := sessionFrom(r.Context()) result, err := writer.PatchMasterFields(r.Context(), r.PathValue("id"), q, identity.Username) if err != nil { switch { case errors.Is(err, qaopsquality.ErrDownvoted): writeJSON(w, 409, map[string]string{"error": "问题已点踩,是否正确固定为否;未保存冲突选择,请重新读取"}) case errors.Is(err, qaopsquality.ErrConflict): writeJSON(w, 409, map[string]string{"error": "字段或问答版本已变化,请重新读取后修改;未覆盖其他人的内容"}) case errors.Is(err, dobotaiops.ErrInvalidQuery): writeJSON(w, 400, map[string]string{"error": "字段选项无效,未保存;请选择主表允许的内容"}) default: qaOpsError(w, err) } return } writeJSON(w, 200, map[string]any{"data": result}) }