package httpapi import ( "context" "errors" "knowledge-governance/internal/dobotaiops" "knowledge-governance/internal/qaopsmirror" "knowledge-governance/internal/qaopsquality" "net/http" "time" ) type qaDashboardReader interface { ReadMasterDashboard(context.Context, dobotaiops.RecordQuery) (qaopsmirror.Dashboard, error) } func qaOperationsDashboard(w http.ResponseWriter, r *http.Request, c Config) { if !authorizeQAOps(w, r) || !authorizeQAIntent(w, r, "qa-dashboard") { return } var request struct { Start string `json:"start"` End string `json:"end"` Keyword string `json:"keyword"` Filters map[string]string `json:"filters,omitempty"` } if decodeQualityJSON(w, r, &request, "start", "end") != nil { qaOpsError(w, dobotaiops.ErrInvalidQuery) return } reader, ok := c.QAOps.(qaDashboardReader) if !ok || c.QAOpsTenantKey == "" { qaOpsError(w, dobotaiops.ErrUnavailable) return } window, e := dobotaiops.NewWindow(c.QAOpsTenantKey, request.Start, request.End, 90*24*time.Hour, c.Now()) if e != nil { qaOpsError(w, e) return } dashboard, e := reader.ReadMasterDashboard(r.Context(), dobotaiops.RecordQuery{Window: window, Keyword: request.Keyword, Filters: request.Filters}) if e != nil { if errors.Is(e, qaopsquality.ErrConflict) { writeQualityError(w, e) return } qaOpsError(w, e) return } writeJSON(w, 200, map[string]any{"data": dashboard}) }