From 3dd6310c727897aa2d921b63a8059cb58fefad85 Mon Sep 17 00:00:00 2001 From: gearnode Date: Fri, 31 Jan 2025 09:04:10 -0800 Subject: [PATCH] Add evidence node query support Signed-off-by: gearnode --- pkg/api/console/v1/v1_resolver.go | 7 ++++ pkg/probo/coredata/evidence.go | 58 +++++++++++++++++++++++++++++++ pkg/probo/probo.go | 20 +++++++++++ 3 files changed, 85 insertions(+) diff --git a/pkg/api/console/v1/v1_resolver.go b/pkg/api/console/v1/v1_resolver.go index 5d4bd6058..fc1c3c4c5 100644 --- a/pkg/api/console/v1/v1_resolver.go +++ b/pkg/api/console/v1/v1_resolver.go @@ -145,6 +145,13 @@ func (r *queryResolver) Node(ctx context.Context, id gid.GID) (types.Node, error } return types.NewTask(task), nil + case coredata.EvidenceEntityType: + evidence, err := r.svc.GetEvidence(ctx, id) + if err != nil { + return nil, err + } + + return types.NewEvidence(evidence), nil default: } diff --git a/pkg/probo/coredata/evidence.go b/pkg/probo/coredata/evidence.go index 717375fae..a2a1951ce 100644 --- a/pkg/probo/coredata/evidence.go +++ b/pkg/probo/coredata/evidence.go @@ -59,6 +59,64 @@ func (e *Evidence) scan(r pgx.Row) error { ) } +func (e *Evidence) LoadByID( + ctx context.Context, + conn pg.Conn, + scope *Scope, + evidenceID gid.GID, +) error { + q := ` +WITH + evidence_states AS ( + SELECT + evidence_id, + to_state AS state, + reason, + RANK() OVER w + FROM + evidence_state_transitions + WHERE + evidence_id = @evidence_id + WINDOW + w AS (PARTITION BY evidence_id ORDER BY created_at DESC) + ) +SELECT + id, + task_id, + es.state, + object_key, + mime_type, + size, + created_at, + updated_at +FROM + evidences +INNER JOIN + evidence_states es ON es.evidence_id = evidences.id +WHERE + %s + AND id = @evidence_id + AND es.rank = 1 +LIMIT 1; +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.NamedArgs{"evidence_id": evidenceID} + maps.Copy(args, scope.SQLArguments()) + + r := conn.QueryRow(ctx, q, args) + + e2 := Evidence{} + if err := e2.scan(r); err != nil { + return err + } + + *e = e2 + + return nil +} + func (e *Evidences) LoadByTaskID( ctx context.Context, conn pg.Conn, diff --git a/pkg/probo/probo.go b/pkg/probo/probo.go index 3ab562c09..4603da071 100644 --- a/pkg/probo/probo.go +++ b/pkg/probo/probo.go @@ -169,6 +169,26 @@ func (s Service) GetTask( return task, nil } +func (s Service) GetEvidence( + ctx context.Context, + evidenceID gid.GID, +) (*coredata.Evidence, error) { + evidence := &coredata.Evidence{} + + err := s.pg.WithConn( + ctx, + func(conn pg.Conn) error { + return evidence.LoadByID(ctx, conn, s.scope, evidenceID) + }, + ) + + if err != nil { + return nil, err + } + + return evidence, nil +} + func (s Service) ListOrganizationFrameworks( ctx context.Context, organizationID gid.GID,