From 72d4b097c2486f449d459828a7fede1211f18985 Mon Sep 17 00:00:00 2001 From: gearnode Date: Wed, 12 Feb 2025 17:51:42 -0800 Subject: [PATCH] Add control categories Signed-off-by: gearnode --- pkg/api/console/v1/schema.graphql | 1 + pkg/api/console/v1/schema/schema.go | 54 +++++++++++++++++++ pkg/api/console/v1/types/control.go | 1 + pkg/api/console/v1/types/types.go | 1 + pkg/probo/coredata/control.go | 5 ++ .../coredata/migrations/20250212T174900Z.sql | 5 ++ 6 files changed, 67 insertions(+) create mode 100644 pkg/probo/coredata/migrations/20250212T174900Z.sql diff --git a/pkg/api/console/v1/schema.graphql b/pkg/api/console/v1/schema.graphql index 8801216a3..1dc8383fb 100644 --- a/pkg/api/console/v1/schema.graphql +++ b/pkg/api/console/v1/schema.graphql @@ -157,6 +157,7 @@ type ControlEdge { type Control implements Node { id: ID! + category: String! name: String! description: String! state: ControlState! diff --git a/pkg/api/console/v1/schema/schema.go b/pkg/api/console/v1/schema/schema.go index f127828dd..37a199473 100644 --- a/pkg/api/console/v1/schema/schema.go +++ b/pkg/api/console/v1/schema/schema.go @@ -56,6 +56,7 @@ type DirectiveRoot struct { type ComplexityRoot struct { Control struct { + Category func(childComplexity int) int CreatedAt func(childComplexity int) int Description func(childComplexity int) int ID func(childComplexity int) int @@ -309,6 +310,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in _ = ec switch typeName + "." + field { + case "Control.category": + if e.complexity.Control.Category == nil { + break + } + + return e.complexity.Control.Category(childComplexity), true + case "Control.createdAt": if e.complexity.Control.CreatedAt == nil { break @@ -1431,6 +1439,7 @@ type ControlEdge { type Control implements Node { id: ID! + category: String! name: String! description: String! state: ControlState! @@ -2532,6 +2541,44 @@ func (ec *executionContext) fieldContext_Control_id(_ context.Context, field gra return fc, nil } +func (ec *executionContext) _Control_category(ctx context.Context, field graphql.CollectedField, obj *types.Control) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Control_category(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Category, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Control_category(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Control", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _Control_name(ctx context.Context, field graphql.CollectedField, obj *types.Control) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Control_name(ctx, field) if err != nil { @@ -2985,6 +3032,8 @@ func (ec *executionContext) fieldContext_ControlEdge_node(_ context.Context, fie switch field.Name { case "id": return ec.fieldContext_Control_id(ctx, field) + case "category": + return ec.fieldContext_Control_category(ctx, field) case "name": return ec.fieldContext_Control_name(ctx, field) case "description": @@ -9036,6 +9085,11 @@ func (ec *executionContext) _Control(ctx context.Context, sel ast.SelectionSet, if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } + case "category": + out.Values[i] = ec._Control_category(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } case "name": out.Values[i] = ec._Control_name(ctx, field, obj) if out.Values[i] == graphql.Null { diff --git a/pkg/api/console/v1/types/control.go b/pkg/api/console/v1/types/control.go index 999f78e42..6f69b1776 100644 --- a/pkg/api/console/v1/types/control.go +++ b/pkg/api/console/v1/types/control.go @@ -42,6 +42,7 @@ func NewControlEdge(c *coredata.Control) *ControlEdge { func NewControl(c *coredata.Control) *Control { return &Control{ ID: c.ID, + Category: c.Category, Name: c.Name, Description: c.Description, State: c.State, diff --git a/pkg/api/console/v1/types/types.go b/pkg/api/console/v1/types/types.go index 5f20be4fa..edaa27f0a 100644 --- a/pkg/api/console/v1/types/types.go +++ b/pkg/api/console/v1/types/types.go @@ -17,6 +17,7 @@ type Node interface { type Control struct { ID gid.GID `json:"id"` + Category string `json:"category"` Name string `json:"name"` Description string `json:"description"` State coredata.ControlState `json:"state"` diff --git a/pkg/probo/coredata/control.go b/pkg/probo/coredata/control.go index aec247ba6..0852bead5 100644 --- a/pkg/probo/coredata/control.go +++ b/pkg/probo/coredata/control.go @@ -31,6 +31,7 @@ type ( Control struct { ID gid.GID FrameworkID gid.GID + Category string Name string Description string State ControlState @@ -50,6 +51,7 @@ func (c *Control) scan(r pgx.Row) error { return r.Scan( &c.ID, &c.FrameworkID, + &c.Category, &c.Name, &c.Description, &c.State, @@ -82,6 +84,7 @@ WITH control_states AS ( SELECT id, framework_id, + category, name, description, cs.to_state AS state, @@ -125,6 +128,7 @@ INSERT INTO controls ( id, control_id, + category, name, description, content_ref, @@ -179,6 +183,7 @@ WITH control_states AS ( SELECT id, framework_id, + category, name, description, cs.to_state AS state, diff --git a/pkg/probo/coredata/migrations/20250212T174900Z.sql b/pkg/probo/coredata/migrations/20250212T174900Z.sql new file mode 100644 index 000000000..00df7f956 --- /dev/null +++ b/pkg/probo/coredata/migrations/20250212T174900Z.sql @@ -0,0 +1,5 @@ +ALTER TABLE controls ADD COLUMN category TEXT; + +UPDATE controls SET category = 'security'; + +ALTER TABLE controls ALTER COLUMN category SET NOT NULL; \ No newline at end of file