diff --git a/apps/console/src/pages/organizations/findings/FindingDetailsPage.tsx b/apps/console/src/pages/organizations/findings/FindingDetailsPage.tsx index 4050c7896..8ba135ed1 100644 --- a/apps/console/src/pages/organizations/findings/FindingDetailsPage.tsx +++ b/apps/console/src/pages/organizations/findings/FindingDetailsPage.tsx @@ -131,8 +131,10 @@ type Props = { function getKindLabel(kind: string, __: (s: string) => string): string { switch (kind) { - case "NONCONFORMITY": - return __("Nonconformity"); + case "MINOR_NONCONFORMITY": + return __("Minor nonconformity"); + case "MAJOR_NONCONFORMITY": + return __("Major nonconformity"); case "OBSERVATION": return __("Observation"); case "EXCEPTION": diff --git a/apps/console/src/pages/organizations/findings/FindingsPage.tsx b/apps/console/src/pages/organizations/findings/FindingsPage.tsx index 881c6585b..784a92d90 100644 --- a/apps/console/src/pages/organizations/findings/FindingsPage.tsx +++ b/apps/console/src/pages/organizations/findings/FindingsPage.tsx @@ -271,7 +271,8 @@ export default function FindingsPage({ queryRef }: FindingsPageProps) { onValueChange={handleKindFilterChange} > - + + @@ -366,8 +367,10 @@ export default function FindingsPage({ queryRef }: FindingsPageProps) { function getKindLabel(kind: string, __: (s: string) => string): string { switch (kind) { - case "NONCONFORMITY": - return __("Nonconformity"); + case "MINOR_NONCONFORMITY": + return __("Minor nonconformity"); + case "MAJOR_NONCONFORMITY": + return __("Major nonconformity"); case "OBSERVATION": return __("Observation"); case "EXCEPTION": diff --git a/apps/console/src/pages/organizations/findings/dialogs/CreateFindingDialog.tsx b/apps/console/src/pages/organizations/findings/dialogs/CreateFindingDialog.tsx index 51e0e3ef2..254a1d7ec 100644 --- a/apps/console/src/pages/organizations/findings/dialogs/CreateFindingDialog.tsx +++ b/apps/console/src/pages/organizations/findings/dialogs/CreateFindingDialog.tsx @@ -63,7 +63,7 @@ const createFindingMutation = graphql` `; const schema = z.object({ - kind: z.enum(["NONCONFORMITY", "OBSERVATION", "EXCEPTION"]), + kind: z.enum(["MINOR_NONCONFORMITY", "MAJOR_NONCONFORMITY", "OBSERVATION", "EXCEPTION"]), description: z.string().optional(), source: z.string().optional(), identifiedOn: z.string().optional(), @@ -98,7 +98,8 @@ export function CreateFindingDialog({ ); const kindOptions = [ - { value: "NONCONFORMITY", label: __("Nonconformity") }, + { value: "MINOR_NONCONFORMITY", label: __("Minor nonconformity") }, + { value: "MAJOR_NONCONFORMITY", label: __("Major nonconformity") }, { value: "OBSERVATION", label: __("Observation") }, { value: "EXCEPTION", label: __("Exception") }, ]; @@ -111,7 +112,7 @@ export function CreateFindingDialog({ const { register, handleSubmit, formState, reset, control } = useFormWithSchema(schema, { defaultValues: { - kind: "NONCONFORMITY" as const, + kind: "MINOR_NONCONFORMITY" as const, description: "", source: "", identifiedOn: "", diff --git a/e2e/console/finding_test.go b/e2e/console/finding_test.go index 813e7bd67..d9fc4d4a4 100644 --- a/e2e/console/finding_test.go +++ b/e2e/console/finding_test.go @@ -68,7 +68,7 @@ func TestFinding_CreateNonconformity(t *testing.T) { err := owner.Execute(query, map[string]any{ "input": map[string]any{ "organizationId": owner.GetOrganizationID().String(), - "kind": "NONCONFORMITY", + "kind": "MINOR_NONCONFORMITY", "description": "Unauthorized access detected", "rootCause": "Insufficient access controls", "correctiveAction": "Implement MFA", @@ -81,7 +81,7 @@ func TestFinding_CreateNonconformity(t *testing.T) { node := result.CreateFinding.FindingEdge.Node assert.NotEmpty(t, node.ID) - assert.Equal(t, "NONCONFORMITY", node.Kind) + assert.Equal(t, "MINOR_NONCONFORMITY", node.Kind) assert.Equal(t, "Unauthorized access detected", node.Description) assert.Equal(t, "Insufficient access controls", node.RootCause) assert.Equal(t, "Implement MFA", node.CorrectiveAction) @@ -178,7 +178,7 @@ func TestFinding_Update(t *testing.T) { err := owner.Execute(createQuery, map[string]any{ "input": map[string]any{ "organizationId": owner.GetOrganizationID().String(), - "kind": "NONCONFORMITY", + "kind": "MINOR_NONCONFORMITY", "description": "Original description", "ownerId": profileID, "status": "OPEN", @@ -330,7 +330,7 @@ func TestFinding_List(t *testing.T) { err := owner.Execute(createQuery, map[string]any{ "input": map[string]any{ "organizationId": owner.GetOrganizationID().String(), - "kind": "NONCONFORMITY", + "kind": "MINOR_NONCONFORMITY", "description": fmt.Sprintf("Finding %d", i), "ownerId": profileID, "status": "OPEN", @@ -402,7 +402,7 @@ func TestFinding_ListWithKindFilter(t *testing.T) { } ` - kinds := []string{"NONCONFORMITY", "OBSERVATION", "EXCEPTION"} + kinds := []string{"MINOR_NONCONFORMITY", "MAJOR_NONCONFORMITY", "OBSERVATION", "EXCEPTION"} for _, kind := range kinds { var createResult struct { CreateFinding struct { @@ -503,7 +503,7 @@ func TestFinding_CreateAuditMapping(t *testing.T) { err := owner.Execute(createQuery, map[string]any{ "input": map[string]any{ "organizationId": owner.GetOrganizationID().String(), - "kind": "NONCONFORMITY", + "kind": "MINOR_NONCONFORMITY", "ownerId": profileID, "status": "OPEN", "priority": "HIGH", @@ -774,7 +774,7 @@ func TestFinding_StatusAndPriorityValues(t *testing.T) { input := map[string]any{ "organizationId": owner.GetOrganizationID().String(), - "kind": "NONCONFORMITY", + "kind": "MINOR_NONCONFORMITY", "ownerId": profileID, "status": status, "priority": "LOW", diff --git a/pkg/cmd/finding/create/create.go b/pkg/cmd/finding/create/create.go index 4dee7a399..382d86552 100644 --- a/pkg/cmd/finding/create/create.go +++ b/pkg/cmd/finding/create/create.go @@ -74,10 +74,10 @@ func NewCmdCreate(f *cmdutil.Factory) *cobra.Command { Use: "create", Short: "Create a new finding", Example: ` # Create a finding - prb finding create --organization ORG_ID --kind NONCONFORMITY --owner-id OWNER_ID --status OPEN --priority HIGH`, + prb finding create --organization ORG_ID --kind MINOR_NONCONFORMITY --owner-id OWNER_ID --status OPEN --priority HIGH`, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - if err := cmdutil.ValidateEnum("kind", flagKind, []string{"NONCONFORMITY", "OBSERVATION", "EXCEPTION"}); err != nil { + if err := cmdutil.ValidateEnum("kind", flagKind, []string{"MINOR_NONCONFORMITY", "MAJOR_NONCONFORMITY", "OBSERVATION", "EXCEPTION"}); err != nil { return err } if err := cmdutil.ValidateEnum("status", flagStatus, []string{"OPEN", "IN_PROGRESS", "CLOSED", "RISK_ACCEPTED", "MITIGATED", "FALSE_POSITIVE"}); err != nil { @@ -165,7 +165,7 @@ func NewCmdCreate(f *cmdutil.Factory) *cobra.Command { } cmd.Flags().StringVar(&flagOrganization, "organization", "", "Organization ID (required)") - cmd.Flags().StringVar(&flagKind, "kind", "", "Finding kind: NONCONFORMITY, OBSERVATION, EXCEPTION (required)") + cmd.Flags().StringVar(&flagKind, "kind", "", "Finding kind: MINOR_NONCONFORMITY, MAJOR_NONCONFORMITY, OBSERVATION, EXCEPTION (required)") cmd.Flags().StringVar(&flagDescription, "description", "", "Finding description") cmd.Flags().StringVar(&flagSource, "source", "", "Finding source") cmd.Flags().StringVar(&flagIdentifiedOn, "identified-on", "", "Date identified (RFC3339)") diff --git a/pkg/cmd/finding/list/list.go b/pkg/cmd/finding/list/list.go index 9e08e6b93..776a33e64 100644 --- a/pkg/cmd/finding/list/list.go +++ b/pkg/cmd/finding/list/list.go @@ -77,7 +77,7 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command { prb finding list --organization # Filter by kind and output as JSON - prb finding ls --organization --kind NONCONFORMITY --json`, + prb finding ls --organization --kind MINOR_NONCONFORMITY --json`, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { if err := cmdutil.ValidateOutputFlag(flagOutput); err != nil { @@ -117,7 +117,7 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command { filter := map[string]any{} if flagKind != "" { - if err := cmdutil.ValidateEnum("kind", flagKind, []string{"NONCONFORMITY", "OBSERVATION", "EXCEPTION"}); err != nil { + if err := cmdutil.ValidateEnum("kind", flagKind, []string{"MINOR_NONCONFORMITY", "MAJOR_NONCONFORMITY", "OBSERVATION", "EXCEPTION"}); err != nil { return err } filter["kind"] = flagKind @@ -200,7 +200,7 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command { cmd.Flags().IntVarP(&flagLimit, "limit", "L", 30, "Maximum number of findings to list") cmd.Flags().StringVar(&flagOrderBy, "order-by", "", "Order by field (CREATED_AT, REFERENCE_ID, IDENTIFIED_ON, DUE_DATE, STATUS, PRIORITY, KIND)") cmd.Flags().StringVar(&flagOrderDir, "order-direction", "DESC", "Sort direction (ASC, DESC)") - cmd.Flags().StringVar(&flagKind, "kind", "", "Filter by kind (NONCONFORMITY, OBSERVATION, EXCEPTION)") + cmd.Flags().StringVar(&flagKind, "kind", "", "Filter by kind (MINOR_NONCONFORMITY, MAJOR_NONCONFORMITY, OBSERVATION, EXCEPTION)") flagOutput = cmdutil.AddOutputFlag(cmd) _ = cmd.MarkFlagRequired("organization") diff --git a/pkg/coredata/finding_kind.go b/pkg/coredata/finding_kind.go index a740a11d1..87e3983c4 100644 --- a/pkg/coredata/finding_kind.go +++ b/pkg/coredata/finding_kind.go @@ -22,14 +22,16 @@ import ( type FindingKind string const ( - FindingKindNonconformity FindingKind = "NONCONFORMITY" - FindingKindObservation FindingKind = "OBSERVATION" - FindingKindException FindingKind = "EXCEPTION" + FindingKindMinorNonconformity FindingKind = "MINOR_NONCONFORMITY" + FindingKindMajorNonconformity FindingKind = "MAJOR_NONCONFORMITY" + FindingKindObservation FindingKind = "OBSERVATION" + FindingKindException FindingKind = "EXCEPTION" ) func FindingKinds() []FindingKind { return []FindingKind{ - FindingKindNonconformity, + FindingKindMinorNonconformity, + FindingKindMajorNonconformity, FindingKindObservation, FindingKindException, } @@ -51,8 +53,10 @@ func (fk *FindingKind) Scan(value any) error { } switch s { - case "NONCONFORMITY": - *fk = FindingKindNonconformity + case "MINOR_NONCONFORMITY": + *fk = FindingKindMinorNonconformity + case "MAJOR_NONCONFORMITY": + *fk = FindingKindMajorNonconformity case "OBSERVATION": *fk = FindingKindObservation case "EXCEPTION": diff --git a/pkg/coredata/migrations/20260319T120000Z.sql b/pkg/coredata/migrations/20260319T120000Z.sql new file mode 100644 index 000000000..34f1e29f6 --- /dev/null +++ b/pkg/coredata/migrations/20260319T120000Z.sql @@ -0,0 +1,3 @@ +-- Rename NONCONFORMITY to MINOR_NONCONFORMITY and add MAJOR_NONCONFORMITY +ALTER TYPE findings_kind RENAME VALUE 'NONCONFORMITY' TO 'MINOR_NONCONFORMITY'; +ALTER TYPE findings_kind ADD VALUE 'MAJOR_NONCONFORMITY'; diff --git a/pkg/server/api/console/v1/schema.graphql b/pkg/server/api/console/v1/schema.graphql index 8da9abe55..3cac4142a 100644 --- a/pkg/server/api/console/v1/schema.graphql +++ b/pkg/server/api/console/v1/schema.graphql @@ -165,9 +165,13 @@ enum TrustCenterDocumentAccessStatus enum FindingKind @goModel(model: "go.probo.inc/probo/pkg/coredata.FindingKind") { - NONCONFORMITY + MINOR_NONCONFORMITY @goEnum( - value: "go.probo.inc/probo/pkg/coredata.FindingKindNonconformity" + value: "go.probo.inc/probo/pkg/coredata.FindingKindMinorNonconformity" + ) + MAJOR_NONCONFORMITY + @goEnum( + value: "go.probo.inc/probo/pkg/coredata.FindingKindMajorNonconformity" ) OBSERVATION @goEnum( diff --git a/pkg/server/api/mcp/v1/specification.yaml b/pkg/server/api/mcp/v1/specification.yaml index 1157cd1d7..1c929c7d0 100644 --- a/pkg/server/api/mcp/v1/specification.yaml +++ b/pkg/server/api/mcp/v1/specification.yaml @@ -2312,7 +2312,8 @@ components: FindingKind: type: string enum: - - NONCONFORMITY + - MINOR_NONCONFORMITY + - MAJOR_NONCONFORMITY - OBSERVATION - EXCEPTION go.probo.inc/mcpgen/type: go.probo.inc/probo/pkg/coredata.FindingKind @@ -2491,7 +2492,7 @@ components: anyOf: - $ref: "#/components/schemas/FindingKind" - type: "null" - description: Filter by finding kind (NONCONFORMITY, OBSERVATION, EXCEPTION). Defaults to null which returns all kinds. + description: Filter by finding kind (MINOR_NONCONFORMITY, MAJOR_NONCONFORMITY, OBSERVATION, EXCEPTION). Defaults to null which returns all kinds. status: anyOf: - $ref: "#/components/schemas/FindingStatus"