From 6a8ad73d509360cd678aad296fd323a7d94a596a Mon Sep 17 00:00:00 2001 From: Frank Jogeleit Date: Thu, 4 Jul 2024 10:59:25 +0200 Subject: [PATCH] total status count api Signed-off-by: Frank Jogeleit --- pkg/api/v2/api.go | 7 +++++++ pkg/database/bun.go | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/pkg/api/v2/api.go b/pkg/api/v2/api.go index f2303e8c..5a0f0f38 100644 --- a/pkg/api/v2/api.go +++ b/pkg/api/v2/api.go @@ -32,6 +32,7 @@ func (h *APIHandler) Register(engine *gin.RouterGroup) error { engine.GET("namespaces", h.ListNamespaces) engine.GET("sources", h.ListSources) engine.GET("sources/:source/use-resources", h.UseResources) + engine.GET("sources/:source/status-counts", h.GetTotalStatusCounts) engine.GET("sources/categories", h.ListSourceWithCategories) engine.GET("policies", h.ListPolicies) engine.GET("findings", h.ListFindings) @@ -145,6 +146,12 @@ func (h *APIHandler) GetNamespaceStatusCounts(ctx *gin.Context) { api.SendResponse(ctx, MapNamespaceStatusCounts(results), "failed to calculate namespace status counts", err) } +func (h *APIHandler) GetTotalStatusCounts(ctx *gin.Context) { + results, err := h.store.FetchTotalStatusCounts(ctx, ctx.Param("source"), api.BuildFilter(ctx)) + + api.SendResponse(ctx, MapClusterStatusCounts(results), "failed to calculate total status counts", err) +} + func (h *APIHandler) ListClusterKinds(ctx *gin.Context) { kinds, err := h.store.FetchClusterKinds(ctx, api.BuildFilter(ctx)) diff --git a/pkg/database/bun.go b/pkg/database/bun.go index 27d95b37..ea9aa64a 100644 --- a/pkg/database/bun.go +++ b/pkg/database/bun.go @@ -601,6 +601,27 @@ func (s *Store) FetchNamespaceStatusCounts(ctx context.Context, source string, f return results, err } +func (s *Store) FetchTotalStatusCounts(ctx context.Context, source string, filter Filter) ([]StatusCount, error) { + results := make([]StatusCount, 0) + + err := FromQuery(s.db. + NewSelect(). + TableExpr("policy_report_filter as f"). + ColumnExpr("SUM(f.count) as count, f.result as status")). + FilterMap(map[string][]string{ + "category": filter.Categories, + "policy": filter.Policies, + "resource_kind": filter.Kinds, + }). + FilterValue("f.source", source). + FilterReportLabels(filter.ReportLabel). + Exclude(filter, "f"). + Group("status"). + Scan(ctx, &results) + + return results, err +} + func (s *Store) FetchNamespaceKinds(ctx context.Context, filter Filter) ([]string, error) { list := make([]string, 0)