Rename State of Applicability to Statement of Applicability

Rename the entity across the full stack: database table
(states_of_applicability → statements_of_applicability), Go model,
GraphQL types, MCP specification, CLI commands, frontend components,
routes, and display labels. Includes a migration to rename the table
and its foreign key column.

Widen sidebar from 260px to 280px to fit the longer label.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2026-04-09 13:06:06 +02:00
parent 050073ab3c
commit 5fd580e995
48 changed files with 978 additions and 957 deletions

View File

@@ -24,9 +24,9 @@ import (
)
const createMutation = `
mutation($input: CreateStateOfApplicabilityInput!) {
createStateOfApplicability(input: $input) {
stateOfApplicabilityEdge {
mutation($input: CreateStatementOfApplicabilityInput!) {
createStatementOfApplicability(input: $input) {
statementOfApplicabilityEdge {
node {
id
name
@@ -38,15 +38,15 @@ mutation($input: CreateStateOfApplicabilityInput!) {
`
type createResponse struct {
CreateStateOfApplicability struct {
StateOfApplicabilityEdge struct {
CreateStatementOfApplicability struct {
StatementOfApplicabilityEdge struct {
Node struct {
ID string `json:"id"`
Name string `json:"name"`
CreatedAt string `json:"createdAt"`
} `json:"node"`
} `json:"stateOfApplicabilityEdge"`
} `json:"createStateOfApplicability"`
} `json:"statementOfApplicabilityEdge"`
} `json:"createStatementOfApplicability"`
}
func NewCmdCreate(f *cmdutil.Factory) *cobra.Command {
@@ -107,7 +107,7 @@ func NewCmdCreate(f *cmdutil.Factory) *cobra.Command {
return fmt.Errorf("cannot parse response: %w", err)
}
s := resp.CreateStateOfApplicability.StateOfApplicabilityEdge.Node
s := resp.CreateStatementOfApplicability.StatementOfApplicabilityEdge.Node
_, _ = fmt.Fprintf(
f.IOStreams.Out,
"Created statement of applicability %s (%s)\n",

View File

@@ -24,9 +24,9 @@ import (
)
const deleteMutation = `
mutation($input: DeleteStateOfApplicabilityInput!) {
deleteStateOfApplicability(input: $input) {
deletedStateOfApplicabilityId
mutation($input: DeleteStatementOfApplicabilityInput!) {
deleteStatementOfApplicability(input: $input) {
deletedStatementOfApplicabilityId
}
}
`
@@ -78,7 +78,7 @@ func NewCmdDelete(f *cmdutil.Factory) *cobra.Command {
deleteMutation,
map[string]any{
"input": map[string]any{
"stateOfApplicabilityId": args[0],
"statementOfApplicabilityId": args[0],
},
},
)

View File

@@ -24,11 +24,11 @@ import (
)
const listQuery = `
query($id: ID!, $first: Int, $after: CursorKey, $orderBy: StateOfApplicabilityOrder) {
query($id: ID!, $first: Int, $after: CursorKey, $orderBy: StatementOfApplicabilityOrder) {
node(id: $id) {
__typename
... on Organization {
statesOfApplicability(first: $first, after: $after, orderBy: $orderBy) {
statementsOfApplicability(first: $first, after: $after, orderBy: $orderBy) {
totalCount
edges {
node {
@@ -48,7 +48,7 @@ query($id: ID!, $first: Int, $after: CursorKey, $orderBy: StateOfApplicabilityOr
}
`
type stateOfApplicability struct {
type statementOfApplicability struct {
ID string `json:"id"`
Name string `json:"name"`
CreatedAt string `json:"createdAt"`
@@ -118,11 +118,11 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command {
listQuery,
variables,
flagLimit,
func(data json.RawMessage) (*api.Connection[stateOfApplicability], error) {
func(data json.RawMessage) (*api.Connection[statementOfApplicability], error) {
var resp struct {
Node *struct {
Typename string `json:"__typename"`
StatesOfApplicability api.Connection[stateOfApplicability] `json:"statesOfApplicability"`
Typename string `json:"__typename"`
StatementsOfApplicability api.Connection[statementOfApplicability] `json:"statementsOfApplicability"`
} `json:"node"`
}
if err := json.Unmarshal(data, &resp); err != nil {
@@ -134,7 +134,7 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command {
if resp.Node.Typename != "Organization" {
return nil, fmt.Errorf("expected Organization node, got %s", resp.Node.Typename)
}
return &resp.Node.StatesOfApplicability, nil
return &resp.Node.StatementsOfApplicability, nil
},
)
if err != nil {
@@ -143,7 +143,7 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command {
if *flagOutput == cmdutil.OutputJSON {
if soas == nil {
soas = []stateOfApplicability{}
soas = []statementOfApplicability{}
}
return cmdutil.PrintJSON(f.IOStreams.Out, soas)
}

View File

@@ -130,9 +130,9 @@ func NewCmdAdd(f *cmdutil.Factory) *cobra.Command {
)
input := map[string]any{
"stateOfApplicabilityId": flagSoA,
"controlId": flagControl,
"applicability": flagApplicable,
"statementOfApplicabilityId": flagSoA,
"controlId": flagControl,
"applicability": flagApplicable,
}
if flagJustification != "" {

View File

@@ -27,7 +27,7 @@ const listQuery = `
query($id: ID!, $first: Int, $after: CursorKey, $orderBy: ApplicabilityStatementOrder) {
node(id: $id) {
__typename
... on StateOfApplicability {
... on StatementOfApplicability {
applicabilityStatements(first: $first, after: $after, orderBy: $orderBy) {
totalCount
edges {
@@ -130,8 +130,8 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command {
if resp.Node == nil {
return nil, fmt.Errorf("statement of applicability %s not found", args[0])
}
if resp.Node.Typename != "StateOfApplicability" {
return nil, fmt.Errorf("expected StateOfApplicability node, got %s", resp.Node.Typename)
if resp.Node.Typename != "StatementOfApplicability" {
return nil, fmt.Errorf("expected StatementOfApplicability node, got %s", resp.Node.Typename)
}
return &resp.Node.ApplicabilityStatements, nil
},

View File

@@ -24,9 +24,9 @@ import (
)
const updateMutation = `
mutation($input: UpdateStateOfApplicabilityInput!) {
updateStateOfApplicability(input: $input) {
stateOfApplicability {
mutation($input: UpdateStatementOfApplicabilityInput!) {
updateStatementOfApplicability(input: $input) {
statementOfApplicability {
id
name
}
@@ -35,12 +35,12 @@ mutation($input: UpdateStateOfApplicabilityInput!) {
`
type updateResponse struct {
UpdateStateOfApplicability struct {
StateOfApplicability struct {
UpdateStatementOfApplicability struct {
StatementOfApplicability struct {
ID string `json:"id"`
Name string `json:"name"`
} `json:"stateOfApplicability"`
} `json:"updateStateOfApplicability"`
} `json:"statementOfApplicability"`
} `json:"updateStatementOfApplicability"`
}
func NewCmdUpdate(f *cmdutil.Factory) *cobra.Command {
@@ -103,7 +103,7 @@ func NewCmdUpdate(f *cmdutil.Factory) *cobra.Command {
return fmt.Errorf("cannot parse response: %w", err)
}
s := resp.UpdateStateOfApplicability.StateOfApplicability
s := resp.UpdateStatementOfApplicability.StatementOfApplicability
_, _ = fmt.Fprintf(
f.IOStreams.Out,
"Updated statement of applicability %s (%s)\n",

View File

@@ -28,7 +28,7 @@ const viewQuery = `
query($id: ID!) {
node(id: $id) {
__typename
... on StateOfApplicability {
... on StatementOfApplicability {
id
name
owner {
@@ -104,8 +104,8 @@ func NewCmdView(f *cmdutil.Factory) *cobra.Command {
return fmt.Errorf("statement of applicability %s not found", args[0])
}
if resp.Node.Typename != "StateOfApplicability" {
return fmt.Errorf("expected StateOfApplicability node, got %s", resp.Node.Typename)
if resp.Node.Typename != "StatementOfApplicability" {
return fmt.Errorf("expected StatementOfApplicability node, got %s", resp.Node.Typename)
}
if *flagOutput == cmdutil.OutputJSON {

View File

@@ -30,15 +30,15 @@ import (
type (
ApplicabilityStatement struct {
ID gid.GID `db:"id"`
StateOfApplicabilityID gid.GID `db:"state_of_applicability_id"`
ControlID gid.GID `db:"control_id"`
OrganizationID gid.GID `db:"organization_id"`
SnapshotID *gid.GID `db:"snapshot_id"`
Applicability bool `db:"applicability"`
Justification *string `db:"justification"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
ID gid.GID `db:"id"`
StatementOfApplicabilityID gid.GID `db:"statement_of_applicability_id"`
ControlID gid.GID `db:"control_id"`
OrganizationID gid.GID `db:"organization_id"`
SnapshotID *gid.GID `db:"snapshot_id"`
Applicability bool `db:"applicability"`
Justification *string `db:"justification"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
// Ordering only.
SectionTitle string `db:"section_title"`
@@ -82,7 +82,7 @@ func (sac *ApplicabilityStatement) LoadByID(
WITH stmt AS (
SELECT
a.id,
a.state_of_applicability_id,
a.statement_of_applicability_id,
a.control_id,
a.organization_id,
a.snapshot_id,
@@ -104,7 +104,7 @@ WITH stmt AS (
)
SELECT
id,
state_of_applicability_id,
statement_of_applicability_id,
control_id,
organization_id,
snapshot_id,
@@ -142,25 +142,25 @@ LIMIT 1;
return nil
}
func (sac *ApplicabilityStatement) LoadByStateOfApplicabilityIDAndControlID(
func (sac *ApplicabilityStatement) LoadByStatementOfApplicabilityIDAndControlID(
ctx context.Context,
conn pg.Querier,
scope Scoper,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
controlID gid.GID,
) error {
q := `
WITH current_soa AS (
SELECT id
FROM states_of_applicability
FROM statements_of_applicability
WHERE
%s
AND id = @state_of_applicability_id
AND id = @statement_of_applicability_id
AND snapshot_id IS NULL
)
SELECT
soac.id,
soac.state_of_applicability_id,
soac.statement_of_applicability_id,
soac.control_id,
soac.organization_id,
soac.snapshot_id,
@@ -172,7 +172,7 @@ SELECT
FROM
applicability_statements soac
INNER JOIN
current_soa ON soac.state_of_applicability_id = current_soa.id
current_soa ON soac.statement_of_applicability_id = current_soa.id
INNER JOIN
controls c ON c.id = soac.control_id
INNER JOIN
@@ -184,8 +184,8 @@ LIMIT 1;
q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{
"state_of_applicability_id": stateOfApplicabilityID,
"control_id": controlID,
"statement_of_applicability_id": statementOfApplicabilityID,
"control_id": controlID,
}
maps.Copy(args, scope.SQLArguments())
@@ -215,7 +215,7 @@ func (sac *ApplicabilityStatement) Insert(
INSERT INTO
applicability_statements (
id,
state_of_applicability_id,
statement_of_applicability_id,
control_id,
organization_id,
tenant_id,
@@ -227,7 +227,7 @@ INSERT INTO
)
VALUES (
@id,
@state_of_applicability_id,
@statement_of_applicability_id,
@control_id,
@organization_id,
@tenant_id,
@@ -240,16 +240,16 @@ VALUES (
`
args := pgx.StrictNamedArgs{
"id": sac.ID,
"state_of_applicability_id": sac.StateOfApplicabilityID,
"control_id": sac.ControlID,
"organization_id": sac.OrganizationID,
"tenant_id": scope.GetTenantID(),
"snapshot_id": sac.SnapshotID,
"applicability": sac.Applicability,
"justification": sac.Justification,
"created_at": sac.CreatedAt,
"updated_at": sac.UpdatedAt,
"id": sac.ID,
"statement_of_applicability_id": sac.StatementOfApplicabilityID,
"control_id": sac.ControlID,
"organization_id": sac.OrganizationID,
"tenant_id": scope.GetTenantID(),
"snapshot_id": sac.SnapshotID,
"applicability": sac.Applicability,
"justification": sac.Justification,
"created_at": sac.CreatedAt,
"updated_at": sac.UpdatedAt,
}
_, err := conn.Exec(ctx, q, args)
@@ -280,17 +280,17 @@ SET
updated_at = @updated_at
WHERE
%s
AND state_of_applicability_id = @state_of_applicability_id
AND statement_of_applicability_id = @statement_of_applicability_id
AND control_id = @control_id
`
q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{
"state_of_applicability_id": sac.StateOfApplicabilityID,
"control_id": sac.ControlID,
"applicability": sac.Applicability,
"justification": sac.Justification,
"updated_at": sac.UpdatedAt,
"statement_of_applicability_id": sac.StatementOfApplicabilityID,
"control_id": sac.ControlID,
"applicability": sac.Applicability,
"justification": sac.Justification,
"updated_at": sac.UpdatedAt,
}
maps.Copy(args, scope.SQLArguments())
@@ -347,20 +347,20 @@ func (sac *ApplicabilityStatement) Delete(
q := `
WITH current_soa AS (
SELECT id
FROM states_of_applicability
FROM statements_of_applicability
WHERE
%s
AND id = @state_of_applicability_id
AND id = @statement_of_applicability_id
AND snapshot_id IS NULL
)
DELETE FROM applicability_statements
WHERE state_of_applicability_id IN (SELECT id FROM current_soa)
WHERE statement_of_applicability_id IN (SELECT id FROM current_soa)
AND control_id = @control_id;
`
args := pgx.StrictNamedArgs{
"state_of_applicability_id": sac.StateOfApplicabilityID,
"control_id": sac.ControlID,
"statement_of_applicability_id": sac.StatementOfApplicabilityID,
"control_id": sac.ControlID,
}
maps.Copy(args, scope.SQLArguments())
q = fmt.Sprintf(q, scope.SQLFragment())
@@ -398,18 +398,18 @@ WHERE
return nil
}
func (sacs *ApplicabilityStatements) LoadByStateOfApplicabilityID(
func (sacs *ApplicabilityStatements) LoadByStatementOfApplicabilityID(
ctx context.Context,
conn pg.Querier,
scope Scoper,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
cursor *page.Cursor[ApplicabilityStatementOrderField],
) error {
q := `
WITH stmt AS (
SELECT
a.id,
a.state_of_applicability_id,
a.statement_of_applicability_id,
a.control_id,
a.organization_id,
a.snapshot_id,
@@ -427,11 +427,11 @@ WITH stmt AS (
frameworks f ON f.id = c.framework_id
WHERE
a.%[1]s
AND a.state_of_applicability_id = @state_of_applicability_id
AND a.statement_of_applicability_id = @statement_of_applicability_id
)
SELECT
id,
state_of_applicability_id,
statement_of_applicability_id,
control_id,
organization_id,
snapshot_id,
@@ -448,7 +448,7 @@ WHERE
q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment())
args := pgx.NamedArgs{
"state_of_applicability_id": stateOfApplicabilityID,
"statement_of_applicability_id": statementOfApplicabilityID,
}
maps.Copy(args, scope.SQLArguments())
maps.Copy(args, cursor.SQLArguments())
@@ -467,11 +467,11 @@ WHERE
return nil
}
func (sacs *ApplicabilityStatements) CountByStateOfApplicabilityID(
func (sacs *ApplicabilityStatements) CountByStatementOfApplicabilityID(
ctx context.Context,
conn pg.Querier,
scope Scoper,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
) (int, error) {
q := `
SELECT
@@ -480,11 +480,11 @@ FROM
applicability_statements
WHERE
%s
AND state_of_applicability_id = @state_of_applicability_id;
AND statement_of_applicability_id = @statement_of_applicability_id;
`
q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.NamedArgs{"state_of_applicability_id": stateOfApplicabilityID}
args := pgx.NamedArgs{"statement_of_applicability_id": statementOfApplicabilityID}
maps.Copy(args, scope.SQLArguments())
var count int
@@ -506,7 +506,7 @@ func (sacs *ApplicabilityStatements) LoadByControlID(
WITH soac_ctrl AS (
SELECT
soac.id,
soac.state_of_applicability_id,
soac.statement_of_applicability_id,
soac.control_id,
soac.organization_id,
soac.snapshot_id,
@@ -519,7 +519,7 @@ WITH soac_ctrl AS (
FROM
applicability_statements soac
INNER JOIN
states_of_applicability soa ON soac.state_of_applicability_id = soa.id
statements_of_applicability soa ON soac.statement_of_applicability_id = soa.id
INNER JOIN
controls c ON c.id = soac.control_id
INNER JOIN
@@ -531,7 +531,7 @@ WITH soac_ctrl AS (
)
SELECT
id,
state_of_applicability_id,
statement_of_applicability_id,
control_id,
organization_id,
snapshot_id,

View File

@@ -97,8 +97,8 @@ func ResourceTypeName(entityType uint16) string {
return "TransferImpactAssessment"
case RightsRequestEntityType:
return "RightsRequest"
case StateOfApplicabilityEntityType:
return "StateOfApplicability"
case StatementOfApplicabilityEntityType:
return "StatementOfApplicability"
case ApplicabilityStatementEntityType:
return "ApplicabilityStatement"
case WebhookSubscriptionEntityType:

View File

@@ -1041,11 +1041,11 @@ WHERE %s
return nil
}
func (c *Controls) CountByStateOfApplicabilityID(
func (c *Controls) CountByStatementOfApplicabilityID(
ctx context.Context,
conn pg.Querier,
scope Scoper,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
filter *ControlFilter,
) (int, error) {
q := `
@@ -1059,7 +1059,7 @@ WITH ctrl AS (
INNER JOIN
applicability_statements soac ON c.id = soac.control_id
WHERE
soac.state_of_applicability_id = @state_of_applicability_id
soac.statement_of_applicability_id = @statement_of_applicability_id
)
SELECT
COUNT(id)
@@ -1070,7 +1070,7 @@ WHERE %s
`
q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment())
args := pgx.NamedArgs{"state_of_applicability_id": stateOfApplicabilityID}
args := pgx.NamedArgs{"statement_of_applicability_id": statementOfApplicabilityID}
maps.Copy(args, scope.SQLArguments())
maps.Copy(args, filter.SQLArguments())

View File

@@ -72,7 +72,7 @@ const (
DataProtectionImpactAssessmentEntityType uint16 = 46
TransferImpactAssessmentEntityType uint16 = 47
RightsRequestEntityType uint16 = 48
StateOfApplicabilityEntityType uint16 = 49
StatementOfApplicabilityEntityType uint16 = 49
ApplicabilityStatementEntityType uint16 = 50
MembershipProfileEntityType uint16 = 51
SCIMConfigurationEntityType uint16 = 52
@@ -194,8 +194,8 @@ func NewEntityFromID(id gid.GID) (any, bool) {
return &TransferImpactAssessment{ID: id}, true
case RightsRequestEntityType:
return &RightsRequest{ID: id}, true
case StateOfApplicabilityEntityType:
return &StateOfApplicability{ID: id}, true
case StatementOfApplicabilityEntityType:
return &StatementOfApplicability{ID: id}, true
case ApplicabilityStatementEntityType:
return &ApplicabilityStatement{ID: id}, true
case MembershipProfileEntityType:

View File

@@ -0,0 +1,19 @@
-- Copyright (c) 2025-2026 Probo Inc <hello@getprobo.com>.
--
-- Permission to use, copy, modify, and/or distribute this software for any
-- purpose with or without fee is hereby granted, provided that the above
-- copyright notice and this permission notice appear in all copies.
--
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-- PERFORMANCE OF THIS SOFTWARE.
-- Rename states_of_applicability to statements_of_applicability
ALTER TABLE states_of_applicability RENAME TO statements_of_applicability;
ALTER TABLE applicability_statements RENAME COLUMN state_of_applicability_id TO statement_of_applicability_id;
ALTER TYPE snapshots_type RENAME VALUE 'STATES_OF_APPLICABILITY' TO 'STATEMENTS_OF_APPLICABILITY';

View File

@@ -24,14 +24,14 @@ type (
)
const (
SnapshotsTypeRisks SnapshotsType = "RISKS"
SnapshotsTypeVendors SnapshotsType = "VENDORS"
SnapshotsTypeAssets SnapshotsType = "ASSETS"
SnapshotsTypeData SnapshotsType = "DATA"
SnapshotsTypeFindings SnapshotsType = "FINDINGS"
SnapshotsTypeObligations SnapshotsType = "OBLIGATIONS"
SnapshotsTypeProcessingActivities SnapshotsType = "PROCESSING_ACTIVITIES"
SnapshotsTypeStatesOfApplicability SnapshotsType = "STATES_OF_APPLICABILITY"
SnapshotsTypeRisks SnapshotsType = "RISKS"
SnapshotsTypeVendors SnapshotsType = "VENDORS"
SnapshotsTypeAssets SnapshotsType = "ASSETS"
SnapshotsTypeData SnapshotsType = "DATA"
SnapshotsTypeFindings SnapshotsType = "FINDINGS"
SnapshotsTypeObligations SnapshotsType = "OBLIGATIONS"
SnapshotsTypeProcessingActivities SnapshotsType = "PROCESSING_ACTIVITIES"
SnapshotsTypeStatementsOfApplicability SnapshotsType = "STATEMENTS_OF_APPLICABILITY"
)
func SnapshotsTypes() []SnapshotsType {
@@ -43,7 +43,7 @@ func SnapshotsTypes() []SnapshotsType {
SnapshotsTypeFindings,
SnapshotsTypeObligations,
SnapshotsTypeProcessingActivities,
SnapshotsTypeStatesOfApplicability,
SnapshotsTypeStatementsOfApplicability,
}
}
@@ -77,8 +77,8 @@ func (st *SnapshotsType) Scan(value any) error {
*st = SnapshotsTypeObligations
case SnapshotsTypeProcessingActivities.String():
*st = SnapshotsTypeProcessingActivities
case SnapshotsTypeStatesOfApplicability.String():
*st = SnapshotsTypeStatesOfApplicability
case SnapshotsTypeStatementsOfApplicability.String():
*st = SnapshotsTypeStatementsOfApplicability
default:
return fmt.Errorf("invalid SnapshotsType value: %q", s)
}

View File

@@ -42,8 +42,8 @@ func GetSnapshottable(snapshotType SnapshotsType) (Snapshottable, error) {
return ProcessingActivities{}, nil
case SnapshotsTypeVendors:
return Vendors{}, nil
case SnapshotsTypeStatesOfApplicability:
return StatesOfApplicability{}, nil
case SnapshotsTypeStatementsOfApplicability:
return StatementsOfApplicability{}, nil
default:
return nil, fmt.Errorf("unsupported snapshot type: %s", snapshotType)
}

View File

@@ -29,7 +29,7 @@ import (
)
type (
StateOfApplicability struct {
StatementOfApplicability struct {
ID gid.GID `db:"id"`
OrganizationID gid.GID `db:"organization_id"`
Name string `db:"name"`
@@ -40,39 +40,39 @@ type (
UpdatedAt time.Time `db:"updated_at"`
}
StatesOfApplicability []*StateOfApplicability
StatementsOfApplicability []*StatementOfApplicability
)
func (s StateOfApplicability) CursorKey(orderBy StateOfApplicabilityOrderField) page.CursorKey {
func (s StatementOfApplicability) CursorKey(orderBy StatementOfApplicabilityOrderField) page.CursorKey {
switch orderBy {
case StateOfApplicabilityOrderFieldCreatedAt:
case StatementOfApplicabilityOrderFieldCreatedAt:
return page.NewCursorKey(s.ID, s.CreatedAt)
case StateOfApplicabilityOrderFieldName:
case StatementOfApplicabilityOrderFieldName:
return page.NewCursorKey(s.ID, s.Name)
}
panic(fmt.Sprintf("unsupported order by: %s", orderBy))
}
func (s *StateOfApplicability) AuthorizationAttributes(ctx context.Context, conn pg.Querier) (map[string]string, error) {
q := `SELECT organization_id FROM states_of_applicability WHERE id = $1 LIMIT 1;`
func (s *StatementOfApplicability) AuthorizationAttributes(ctx context.Context, conn pg.Querier) (map[string]string, error) {
q := `SELECT organization_id FROM statements_of_applicability WHERE id = $1 LIMIT 1;`
var organizationID gid.GID
if err := conn.QueryRow(ctx, q, s.ID).Scan(&organizationID); err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return nil, ErrResourceNotFound
}
return nil, fmt.Errorf("cannot query state of applicability authorization attributes: %w", err)
return nil, fmt.Errorf("cannot query statement of applicability authorization attributes: %w", err)
}
return map[string]string{"organization_id": organizationID.String()}, nil
}
func (s *StateOfApplicability) LoadByID(
func (s *StatementOfApplicability) LoadByID(
ctx context.Context,
conn pg.Querier,
scope Scoper,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
) error {
q := `
SELECT
@@ -85,43 +85,43 @@ SELECT
created_at,
updated_at
FROM
states_of_applicability
statements_of_applicability
WHERE
%s
AND id = @state_of_applicability_id
AND id = @statement_of_applicability_id
LIMIT 1;
`
q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{"state_of_applicability_id": stateOfApplicabilityID}
args := pgx.StrictNamedArgs{"statement_of_applicability_id": statementOfApplicabilityID}
maps.Copy(args, scope.SQLArguments())
rows, err := conn.Query(ctx, q, args)
if err != nil {
return fmt.Errorf("cannot query states_of_applicability: %w", err)
return fmt.Errorf("cannot query statements_of_applicability: %w", err)
}
stateOfApplicability, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[StateOfApplicability])
statementOfApplicability, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[StatementOfApplicability])
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return ErrResourceNotFound
}
return fmt.Errorf("cannot collect state_of_applicability: %w", err)
return fmt.Errorf("cannot collect statement_of_applicability: %w", err)
}
*s = stateOfApplicability
*s = statementOfApplicability
return nil
}
func (s *StatesOfApplicability) LoadByOrganizationID(
func (s *StatementsOfApplicability) LoadByOrganizationID(
ctx context.Context,
conn pg.Querier,
scope Scoper,
organizationID gid.GID,
cursor *page.Cursor[StateOfApplicabilityOrderField],
filter *StateOfApplicabilityFilter,
cursor *page.Cursor[StatementOfApplicabilityOrderField],
filter *StatementOfApplicabilityFilter,
) error {
q := `
SELECT
@@ -134,7 +134,7 @@ SELECT
created_at,
updated_at
FROM
states_of_applicability
statements_of_applicability
WHERE
%s
AND organization_id = @organization_id
@@ -150,30 +150,30 @@ WHERE
rows, err := conn.Query(ctx, q, args)
if err != nil {
return fmt.Errorf("cannot query states_of_applicability: %w", err)
return fmt.Errorf("cannot query statements_of_applicability: %w", err)
}
statesOfApplicability, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[StateOfApplicability])
statementsOfApplicability, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[StatementOfApplicability])
if err != nil {
return fmt.Errorf("cannot collect states_of_applicability: %w", err)
return fmt.Errorf("cannot collect statements_of_applicability: %w", err)
}
*s = statesOfApplicability
*s = statementsOfApplicability
return nil
}
func (s *StatesOfApplicability) CountByOrganizationID(
func (s *StatementsOfApplicability) CountByOrganizationID(
ctx context.Context,
conn pg.Querier,
scope Scoper,
organizationID gid.GID,
filter *StateOfApplicabilityFilter,
filter *StatementOfApplicabilityFilter,
) (int, error) {
q := `
SELECT
COUNT(*)
FROM
states_of_applicability
statements_of_applicability
WHERE
%s
AND organization_id = @organization_id
@@ -190,20 +190,20 @@ WHERE
row := conn.QueryRow(ctx, q, args)
var count int
if err := row.Scan(&count); err != nil {
return 0, fmt.Errorf("cannot count states_of_applicability: %w", err)
return 0, fmt.Errorf("cannot count statements_of_applicability: %w", err)
}
return count, nil
}
func (s *StateOfApplicability) Insert(
func (s *StatementOfApplicability) Insert(
ctx context.Context,
conn pg.Tx,
scope Scoper,
) error {
q := `
INSERT INTO
states_of_applicability (
statements_of_applicability (
tenant_id,
id,
organization_id,
@@ -216,7 +216,7 @@ INSERT INTO
)
VALUES (
@tenant_id,
@state_of_applicability_id,
@statement_of_applicability_id,
@organization_id,
@name,
@source_id,
@@ -228,15 +228,15 @@ VALUES (
`
args := pgx.StrictNamedArgs{
"tenant_id": scope.GetTenantID(),
"state_of_applicability_id": s.ID,
"organization_id": s.OrganizationID,
"name": s.Name,
"source_id": s.SourceID,
"snapshot_id": s.SnapshotID,
"owner_profile_id": s.OwnerID,
"created_at": s.CreatedAt,
"updated_at": s.UpdatedAt,
"tenant_id": scope.GetTenantID(),
"statement_of_applicability_id": s.ID,
"organization_id": s.OrganizationID,
"name": s.Name,
"source_id": s.SourceID,
"snapshot_id": s.SnapshotID,
"owner_profile_id": s.OwnerID,
"created_at": s.CreatedAt,
"updated_at": s.UpdatedAt,
}
_, err := conn.Exec(ctx, q, args)
@@ -247,35 +247,35 @@ VALUES (
return ErrResourceAlreadyExists
}
}
return fmt.Errorf("cannot insert state_of_applicability: %w", err)
return fmt.Errorf("cannot insert statement_of_applicability: %w", err)
}
return nil
}
func (s *StateOfApplicability) Update(
func (s *StatementOfApplicability) Update(
ctx context.Context,
conn pg.Tx,
scope Scoper,
) error {
q := `
UPDATE states_of_applicability
UPDATE statements_of_applicability
SET
name = @name,
owner_profile_id = @owner_profile_id,
updated_at = @updated_at
WHERE
%s
AND id = @state_of_applicability_id
AND id = @statement_of_applicability_id
`
q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{
"state_of_applicability_id": s.ID,
"name": s.Name,
"owner_profile_id": s.OwnerID,
"updated_at": s.UpdatedAt,
"statement_of_applicability_id": s.ID,
"name": s.Name,
"owner_profile_id": s.OwnerID,
"updated_at": s.UpdatedAt,
}
maps.Copy(args, scope.SQLArguments())
@@ -287,7 +287,7 @@ WHERE
return ErrResourceAlreadyExists
}
}
return fmt.Errorf("cannot update state_of_applicability: %w", err)
return fmt.Errorf("cannot update statement_of_applicability: %w", err)
}
if result.RowsAffected() == 0 {
@@ -297,27 +297,27 @@ WHERE
return nil
}
func (s *StateOfApplicability) Delete(
func (s *StatementOfApplicability) Delete(
ctx context.Context,
conn pg.Tx,
scope Scoper,
) error {
q := `
DELETE FROM states_of_applicability
DELETE FROM statements_of_applicability
WHERE
%s
AND id = @state_of_applicability_id
AND id = @statement_of_applicability_id
`
q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{
"state_of_applicability_id": s.ID,
"statement_of_applicability_id": s.ID,
}
maps.Copy(args, scope.SQLArguments())
result, err := conn.Exec(ctx, q, args)
if err != nil {
return fmt.Errorf("cannot delete state_of_applicability: %w", err)
return fmt.Errorf("cannot delete statement_of_applicability: %w", err)
}
if result.RowsAffected() == 0 {
@@ -327,19 +327,19 @@ WHERE
return nil
}
func (soas StatesOfApplicability) Snapshot(ctx context.Context, conn pg.Tx, scope Scoper, organizationID, snapshotID gid.GID) error {
if err := soas.insertStateOfApplicabilitySnapshots(ctx, conn, scope, organizationID, snapshotID); err != nil {
return fmt.Errorf("cannot insert state_of_applicability snapshots: %w", err)
func (soas StatementsOfApplicability) Snapshot(ctx context.Context, conn pg.Tx, scope Scoper, organizationID, snapshotID gid.GID) error {
if err := soas.insertStatementOfApplicabilitySnapshots(ctx, conn, scope, organizationID, snapshotID); err != nil {
return fmt.Errorf("cannot insert statement_of_applicability snapshots: %w", err)
}
if err := soas.insertStateOfApplicabilityControlSnapshots(ctx, conn, scope, organizationID, snapshotID); err != nil {
return fmt.Errorf("cannot insert state_of_applicability_control snapshots: %w", err)
if err := soas.insertStatementOfApplicabilityControlSnapshots(ctx, conn, scope, organizationID, snapshotID); err != nil {
return fmt.Errorf("cannot insert statement_of_applicability_control snapshots: %w", err)
}
return nil
}
func (soas StatesOfApplicability) insertStateOfApplicabilitySnapshots(
func (soas StatementsOfApplicability) insertStatementOfApplicabilitySnapshots(
ctx context.Context,
conn pg.Querier,
scope Scoper,
@@ -347,7 +347,7 @@ func (soas StatesOfApplicability) insertStateOfApplicabilitySnapshots(
snapshotID gid.GID,
) error {
query := `
INSERT INTO states_of_applicability (
INSERT INTO statements_of_applicability (
id,
tenant_id,
organization_id,
@@ -359,7 +359,7 @@ INSERT INTO states_of_applicability (
updated_at
)
SELECT
generate_gid(decode_base64_unpadded(@tenant_id), @state_of_applicability_entity_type),
generate_gid(decode_base64_unpadded(@tenant_id), @statement_of_applicability_entity_type),
@tenant_id,
soa.organization_id,
soa.name,
@@ -368,7 +368,7 @@ SELECT
soa.owner_profile_id,
soa.created_at,
soa.updated_at
FROM states_of_applicability soa
FROM statements_of_applicability soa
WHERE
%s
AND soa.organization_id = @organization_id
@@ -378,22 +378,22 @@ WHERE
query = fmt.Sprintf(query, scope.SQLFragment())
args := pgx.StrictNamedArgs{
"tenant_id": scope.GetTenantID(),
"snapshot_id": snapshotID,
"organization_id": organizationID,
"state_of_applicability_entity_type": StateOfApplicabilityEntityType,
"tenant_id": scope.GetTenantID(),
"snapshot_id": snapshotID,
"organization_id": organizationID,
"statement_of_applicability_entity_type": StatementOfApplicabilityEntityType,
}
maps.Copy(args, scope.SQLArguments())
_, err := conn.Exec(ctx, query, args)
if err != nil {
return fmt.Errorf("cannot insert state_of_applicability snapshots: %w", err)
return fmt.Errorf("cannot insert statement_of_applicability snapshots: %w", err)
}
return nil
}
func (soas StatesOfApplicability) insertStateOfApplicabilityControlSnapshots(
func (soas StatementsOfApplicability) insertStatementOfApplicabilityControlSnapshots(
ctx context.Context,
conn pg.Querier,
scope Scoper,
@@ -403,7 +403,7 @@ func (soas StatesOfApplicability) insertStateOfApplicabilityControlSnapshots(
query := `
WITH source_soa AS (
SELECT id, organization_id
FROM states_of_applicability
FROM statements_of_applicability
WHERE
%s
AND organization_id = @organization_id
@@ -411,12 +411,12 @@ WITH source_soa AS (
),
snapshot_soa AS (
SELECT id, source_id
FROM states_of_applicability
FROM statements_of_applicability
WHERE snapshot_id = @snapshot_id
)
INSERT INTO applicability_statements (
id,
state_of_applicability_id,
statement_of_applicability_id,
control_id,
organization_id,
tenant_id,
@@ -439,7 +439,7 @@ SELECT
soac.updated_at
FROM applicability_statements soac
INNER JOIN source_soa
ON soac.state_of_applicability_id = source_soa.id
ON soac.statement_of_applicability_id = source_soa.id
INNER JOIN snapshot_soa
ON snapshot_soa.source_id = source_soa.id
WHERE soac.snapshot_id IS NULL
@@ -457,7 +457,7 @@ WHERE soac.snapshot_id IS NULL
_, err := conn.Exec(ctx, query, args)
if err != nil {
return fmt.Errorf("cannot insert state_of_applicability_control snapshots: %w", err)
return fmt.Errorf("cannot insert statement_of_applicability_control snapshots: %w", err)
}
return nil

View File

@@ -20,18 +20,18 @@ import (
)
type (
StateOfApplicabilityFilter struct {
StatementOfApplicabilityFilter struct {
snapshotID **gid.GID
}
)
func NewStateOfApplicabilityFilter(snapshotID **gid.GID) *StateOfApplicabilityFilter {
return &StateOfApplicabilityFilter{
func NewStatementOfApplicabilityFilter(snapshotID **gid.GID) *StatementOfApplicabilityFilter {
return &StatementOfApplicabilityFilter{
snapshotID: snapshotID,
}
}
func (f *StateOfApplicabilityFilter) SQLArguments() pgx.StrictNamedArgs {
func (f *StatementOfApplicabilityFilter) SQLArguments() pgx.StrictNamedArgs {
args := pgx.StrictNamedArgs{}
if f.snapshotID == nil {
@@ -48,7 +48,7 @@ func (f *StateOfApplicabilityFilter) SQLArguments() pgx.StrictNamedArgs {
return args
}
func (f *StateOfApplicabilityFilter) SQLFragment() string {
func (f *StatementOfApplicabilityFilter) SQLFragment() string {
return `
CASE
WHEN @has_snapshot_filter::boolean = false THEN TRUE

View File

@@ -19,44 +19,44 @@ import (
)
type (
StateOfApplicabilityOrderField string
StatementOfApplicabilityOrderField string
)
const (
StateOfApplicabilityOrderFieldName StateOfApplicabilityOrderField = "NAME"
StateOfApplicabilityOrderFieldCreatedAt StateOfApplicabilityOrderField = "CREATED_AT"
StatementOfApplicabilityOrderFieldName StatementOfApplicabilityOrderField = "NAME"
StatementOfApplicabilityOrderFieldCreatedAt StatementOfApplicabilityOrderField = "CREATED_AT"
)
func (s StateOfApplicabilityOrderField) Column() string {
func (s StatementOfApplicabilityOrderField) Column() string {
switch s {
case StateOfApplicabilityOrderFieldName:
case StatementOfApplicabilityOrderFieldName:
return "name"
case StateOfApplicabilityOrderFieldCreatedAt:
case StatementOfApplicabilityOrderFieldCreatedAt:
return "created_at"
}
panic(fmt.Sprintf("unsupported order by: %s", s))
}
func (s StateOfApplicabilityOrderField) String() string {
func (s StatementOfApplicabilityOrderField) String() string {
return string(s)
}
func (s StateOfApplicabilityOrderField) IsValid() bool {
func (s StatementOfApplicabilityOrderField) IsValid() bool {
switch s {
case StateOfApplicabilityOrderFieldName, StateOfApplicabilityOrderFieldCreatedAt:
case StatementOfApplicabilityOrderFieldName, StatementOfApplicabilityOrderFieldCreatedAt:
return true
}
return false
}
func (s StateOfApplicabilityOrderField) MarshalText() ([]byte, error) {
func (s StatementOfApplicabilityOrderField) MarshalText() ([]byte, error) {
return []byte(s.String()), nil
}
func (s *StateOfApplicabilityOrderField) UnmarshalText(text []byte) error {
*s = StateOfApplicabilityOrderField(text)
func (s *StatementOfApplicabilityOrderField) UnmarshalText(text []byte) error {
*s = StatementOfApplicabilityOrderField(text)
if !s.IsValid() {
return fmt.Errorf("%s is not a valid StateOfApplicabilityOrderField", string(text))
return fmt.Errorf("%s is not a valid StatementOfApplicabilityOrderField", string(text))
}
return nil
}

View File

@@ -187,7 +187,7 @@ var (
transferImpactAssessmentsTemplate = template.Must(template.New("transferImpactAssessments").Funcs(templateFuncs).Parse(transferImpactAssessmentsTemplateContent))
stateOfApplicabilityTemplate = template.Must(template.New("state-of-applicability").Funcs(templateFuncs).Parse(soaTemplateContent))
statementOfApplicabilityTemplate = template.Must(template.New("statement-of-applicability").Funcs(templateFuncs).Parse(soaTemplateContent))
)
type (
@@ -279,7 +279,7 @@ type (
SupplementaryMeasures *string
}
StateOfApplicabilityData struct {
StatementOfApplicabilityData struct {
Title string
OrganizationName string
CreatedAt time.Time
@@ -382,9 +382,9 @@ func RenderTransferImpactAssessmentsTableHTML(data TransferImpactAssessmentTable
return buf.Bytes(), nil
}
func RenderStateOfApplicabilityHTML(data StateOfApplicabilityData) ([]byte, error) {
func RenderStatementOfApplicabilityHTML(data StatementOfApplicabilityData) ([]byte, error) {
var buf bytes.Buffer
if err := stateOfApplicabilityTemplate.Execute(&buf, data); err != nil {
if err := statementOfApplicabilityTemplate.Execute(&buf, data); err != nil {
return nil, fmt.Errorf("cannot execute SOA template: %w", err)
}

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>State of Applicability</title>
<title>Statement of Applicability</title>
<style>
@page {
size: A4 landscape;
@@ -254,7 +254,7 @@
{{- end}}
</div>
<h1 class="export-title">State of Applicability</h1>
<h1 class="export-title">Statement of Applicability</h1>
<h2 class="export-subtitle">{{.Title}}</h2>
<div class="document-meta">
@@ -283,7 +283,7 @@
<div class="purpose-section">
<div class="purpose-title">1. Purpose</div>
<div class="purpose-text">
This document provides a comprehensive overview of the state of applicability for controls within the organization.
This document provides a comprehensive overview of the statement of applicability for controls within the organization.
It serves as a record of which controls are applicable or not applicable to the organization, along with their
relationships to regulatory requirements, contractual obligations, risk assessments, and best practices.
</div>

View File

@@ -340,13 +340,13 @@ const (
ActionRightsRequestUpdate = "core:rights-request:update"
ActionRightsRequestDelete = "core:rights-request:delete"
// StateOfApplicability actions
ActionStateOfApplicabilityList = "core:state-of-applicability:list"
ActionStateOfApplicabilityGet = "core:state-of-applicability:get"
ActionStateOfApplicabilityCreate = "core:state-of-applicability:create"
ActionStateOfApplicabilityUpdate = "core:state-of-applicability:update"
ActionStateOfApplicabilityDelete = "core:state-of-applicability:delete"
ActionStateOfApplicabilityExport = "core:state-of-applicability:export"
// StatementOfApplicability actions
ActionStatementOfApplicabilityList = "core:statement-of-applicability:list"
ActionStatementOfApplicabilityGet = "core:statement-of-applicability:get"
ActionStatementOfApplicabilityCreate = "core:statement-of-applicability:create"
ActionStatementOfApplicabilityUpdate = "core:statement-of-applicability:update"
ActionStatementOfApplicabilityDelete = "core:statement-of-applicability:delete"
ActionStatementOfApplicabilityExport = "core:statement-of-applicability:export"
ActionApplicabilityStatementGet = "core:applicability-statement:get"
ActionApplicabilityStatementList = "core:applicability-statement:list"

View File

@@ -816,9 +816,9 @@ func (s ControlService) ListForSnapshotID(
return page.NewPage([]*coredata.Control(controls), cursor), nil
}
func (s ControlService) CountForStateOfApplicabilityID(
func (s ControlService) CountForStatementOfApplicabilityID(
ctx context.Context,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
filter *coredata.ControlFilter,
) (int, error) {
var count int
@@ -827,7 +827,7 @@ func (s ControlService) CountForStateOfApplicabilityID(
ctx,
func(ctx context.Context, conn pg.Querier) (err error) {
controls := &coredata.Controls{}
count, err = controls.CountByStateOfApplicabilityID(ctx, conn, s.svc.scope, stateOfApplicabilityID, filter)
count, err = controls.CountByStatementOfApplicabilityID(ctx, conn, s.svc.scope, statementOfApplicabilityID, filter)
if err != nil {
return fmt.Errorf("cannot count controls: %w", err)
}

View File

@@ -145,7 +145,7 @@ var ViewerPolicy = policy.NewPolicy(
ActionFileGet, ActionFileDownloadUrl,
ActionSlackConnectionList, ActionConnectorList,
ActionRightsRequestGet, ActionRightsRequestList,
ActionStateOfApplicabilityGet, ActionStateOfApplicabilityList,
ActionStatementOfApplicabilityGet, ActionStatementOfApplicabilityList,
ActionApplicabilityStatementGet, ActionApplicabilityStatementList,
ActionWebhookSubscriptionGet, ActionWebhookSubscriptionList,
ActionAccessReviewCampaignGet, ActionAccessReviewCampaignList,
@@ -222,7 +222,7 @@ var AuditorPolicy = policy.NewPolicy(
ActionTransferImpactAssessmentGet, ActionTransferImpactAssessmentList,
ActionSnapshotGet, ActionSnapshotList,
ActionFileGet, ActionFileDownloadUrl,
ActionStateOfApplicabilityGet, ActionStateOfApplicabilityList,
ActionStatementOfApplicabilityGet, ActionStatementOfApplicabilityList,
ActionApplicabilityStatementGet, ActionApplicabilityStatementList,
).WithSID("entity-read-access").When(organizationCondition),
@@ -236,7 +236,7 @@ var AuditorPolicy = policy.NewPolicy(
).WithSID("employee-document-access").When(organizationCondition),
policy.Allow(
ActionStateOfApplicabilityExport,
ActionStatementOfApplicabilityExport,
).WithSID("soa-export").When(organizationCondition),
).WithDescription("Read-only probo access for auditors (excludes internal/employee content)")

View File

@@ -117,7 +117,7 @@ type (
ProcessingActivities *ProcessingActivityService
DataProtectionImpactAssessments *DataProtectionImpactAssessmentService
TransferImpactAssessments *TransferImpactAssessmentService
StatesOfApplicability *StateOfApplicabilityService
StatementsOfApplicability *StatementOfApplicabilityService
Files *FileService
CustomDomains *CustomDomainService
SlackMessages *slack.SlackMessageService
@@ -283,7 +283,7 @@ func (s *Service) WithTenant(tenantID gid.TenantID) *TenantService {
svc: tenantService,
html2pdfConverter: s.html2pdfConverter,
}
tenantService.StatesOfApplicability = &StateOfApplicabilityService{
tenantService.StatementsOfApplicability = &StatementOfApplicabilityService{
svc: tenantService,
html2pdfConverter: s.html2pdfConverter,
}

View File

@@ -29,26 +29,26 @@ import (
"go.probo.inc/probo/pkg/validator"
)
type StateOfApplicabilityService struct {
type StatementOfApplicabilityService struct {
svc *TenantService
html2pdfConverter *html2pdf.Converter
}
type (
CreateStateOfApplicabilityRequest struct {
CreateStatementOfApplicabilityRequest struct {
OrganizationID gid.GID
Name string
OwnerID gid.GID
}
UpdateStateOfApplicabilityRequest struct {
StateOfApplicabilityID gid.GID
Name *string
OwnerID *gid.GID
UpdateStatementOfApplicabilityRequest struct {
StatementOfApplicabilityID gid.GID
Name *string
OwnerID *gid.GID
}
)
func (csr *CreateStateOfApplicabilityRequest) Validate() error {
func (csr *CreateStatementOfApplicabilityRequest) Validate() error {
v := validator.New()
v.Check(csr.OrganizationID, "organization_id", validator.Required(), validator.GID(coredata.OrganizationEntityType))
@@ -58,23 +58,23 @@ func (csr *CreateStateOfApplicabilityRequest) Validate() error {
return v.Error()
}
func (usr *UpdateStateOfApplicabilityRequest) Validate() error {
func (usr *UpdateStatementOfApplicabilityRequest) Validate() error {
v := validator.New()
v.Check(usr.StateOfApplicabilityID, "state_of_applicability_id", validator.Required(), validator.GID(coredata.StateOfApplicabilityEntityType))
v.Check(usr.StatementOfApplicabilityID, "statement_of_applicability_id", validator.Required(), validator.GID(coredata.StatementOfApplicabilityEntityType))
v.Check(usr.Name, "name", validator.SafeTextNoNewLine(TitleMaxLength))
v.Check(usr.OwnerID, "owner_id", validator.GID(coredata.MembershipProfileEntityType))
return v.Error()
}
func (s StateOfApplicabilityService) ListForOrganizationID(
func (s StatementOfApplicabilityService) ListForOrganizationID(
ctx context.Context,
organizationID gid.GID,
cursor *page.Cursor[coredata.StateOfApplicabilityOrderField],
filter *coredata.StateOfApplicabilityFilter,
) (*page.Page[*coredata.StateOfApplicability, coredata.StateOfApplicabilityOrderField], error) {
var statesOfApplicability coredata.StatesOfApplicability
cursor *page.Cursor[coredata.StatementOfApplicabilityOrderField],
filter *coredata.StatementOfApplicabilityFilter,
) (*page.Page[*coredata.StatementOfApplicability, coredata.StatementOfApplicabilityOrderField], error) {
var statementsOfApplicability coredata.StatementsOfApplicability
organization := &coredata.Organization{}
err := s.svc.pg.WithConn(
@@ -84,7 +84,7 @@ func (s StateOfApplicabilityService) ListForOrganizationID(
return fmt.Errorf("cannot load organization: %w", err)
}
err := statesOfApplicability.LoadByOrganizationID(
err := statementsOfApplicability.LoadByOrganizationID(
ctx,
conn,
s.svc.scope,
@@ -93,7 +93,7 @@ func (s StateOfApplicabilityService) ListForOrganizationID(
filter,
)
if err != nil {
return fmt.Errorf("cannot load states_of_applicability: %w", err)
return fmt.Errorf("cannot load statements_of_applicability: %w", err)
}
return nil
@@ -104,23 +104,23 @@ func (s StateOfApplicabilityService) ListForOrganizationID(
return nil, err
}
return page.NewPage(statesOfApplicability, cursor), nil
return page.NewPage(statementsOfApplicability, cursor), nil
}
func (s StateOfApplicabilityService) CountForOrganizationID(
func (s StatementOfApplicabilityService) CountForOrganizationID(
ctx context.Context,
organizationID gid.GID,
filter *coredata.StateOfApplicabilityFilter,
filter *coredata.StatementOfApplicabilityFilter,
) (int, error) {
var count int
err := s.svc.pg.WithConn(
ctx,
func(ctx context.Context, conn pg.Querier) (err error) {
statesOfApplicability := &coredata.StatesOfApplicability{}
count, err = statesOfApplicability.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
statementsOfApplicability := &coredata.StatementsOfApplicability{}
count, err = statementsOfApplicability.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
if err != nil {
return fmt.Errorf("cannot count states_of_applicability: %w", err)
return fmt.Errorf("cannot count statements_of_applicability: %w", err)
}
return nil
@@ -134,16 +134,16 @@ func (s StateOfApplicabilityService) CountForOrganizationID(
return count, nil
}
func (s StateOfApplicabilityService) Get(
func (s StatementOfApplicabilityService) Get(
ctx context.Context,
stateOfApplicabilityID gid.GID,
) (*coredata.StateOfApplicability, error) {
stateOfApplicability := &coredata.StateOfApplicability{}
statementOfApplicabilityID gid.GID,
) (*coredata.StatementOfApplicability, error) {
statementOfApplicability := &coredata.StatementOfApplicability{}
err := s.svc.pg.WithConn(
ctx,
func(ctx context.Context, conn pg.Querier) error {
return stateOfApplicability.LoadByID(ctx, conn, s.svc.scope, stateOfApplicabilityID)
return statementOfApplicability.LoadByID(ctx, conn, s.svc.scope, statementOfApplicabilityID)
},
)
@@ -151,13 +151,13 @@ func (s StateOfApplicabilityService) Get(
return nil, err
}
return stateOfApplicability, nil
return statementOfApplicability, nil
}
func (s StateOfApplicabilityService) Create(
func (s StatementOfApplicabilityService) Create(
ctx context.Context,
req CreateStateOfApplicabilityRequest,
) (*coredata.StateOfApplicability, error) {
req CreateStatementOfApplicabilityRequest,
) (*coredata.StatementOfApplicability, error) {
if err := req.Validate(); err != nil {
return nil, fmt.Errorf("invalid request: %w", err)
}
@@ -175,9 +175,9 @@ func (s StateOfApplicabilityService) Create(
return nil, fmt.Errorf("cannot load organization: %w", err)
}
stateOfApplicabilityID := gid.New(organization.ID.TenantID(), coredata.StateOfApplicabilityEntityType)
stateOfApplicability := &coredata.StateOfApplicability{
ID: stateOfApplicabilityID,
statementOfApplicabilityID := gid.New(organization.ID.TenantID(), coredata.StatementOfApplicabilityEntityType)
statementOfApplicability := &coredata.StatementOfApplicability{
ID: statementOfApplicabilityID,
OrganizationID: organization.ID,
Name: req.Name,
OwnerID: req.OwnerID,
@@ -188,8 +188,8 @@ func (s StateOfApplicabilityService) Create(
err = s.svc.pg.WithTx(
ctx,
func(ctx context.Context, conn pg.Tx) error {
if err := stateOfApplicability.Insert(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot insert state_of_applicability: %w", err)
if err := statementOfApplicability.Insert(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot insert statement_of_applicability: %w", err)
}
return nil
@@ -200,37 +200,37 @@ func (s StateOfApplicabilityService) Create(
return nil, err
}
return stateOfApplicability, nil
return statementOfApplicability, nil
}
func (s StateOfApplicabilityService) Update(
func (s StatementOfApplicabilityService) Update(
ctx context.Context,
req UpdateStateOfApplicabilityRequest,
) (*coredata.StateOfApplicability, error) {
req UpdateStatementOfApplicabilityRequest,
) (*coredata.StatementOfApplicability, error) {
if err := req.Validate(); err != nil {
return nil, fmt.Errorf("invalid request: %w", err)
}
stateOfApplicability := &coredata.StateOfApplicability{}
statementOfApplicability := &coredata.StatementOfApplicability{}
err := s.svc.pg.WithTx(
ctx,
func(ctx context.Context, conn pg.Tx) error {
if err := stateOfApplicability.LoadByID(ctx, conn, s.svc.scope, req.StateOfApplicabilityID); err != nil {
return fmt.Errorf("cannot load state_of_applicability: %w", err)
if err := statementOfApplicability.LoadByID(ctx, conn, s.svc.scope, req.StatementOfApplicabilityID); err != nil {
return fmt.Errorf("cannot load statement_of_applicability: %w", err)
}
if req.Name != nil {
stateOfApplicability.Name = *req.Name
statementOfApplicability.Name = *req.Name
}
if req.OwnerID != nil {
stateOfApplicability.OwnerID = *req.OwnerID
statementOfApplicability.OwnerID = *req.OwnerID
}
stateOfApplicability.UpdatedAt = time.Now()
statementOfApplicability.UpdatedAt = time.Now()
if err := stateOfApplicability.Update(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot update state_of_applicability: %w", err)
if err := statementOfApplicability.Update(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot update statement_of_applicability: %w", err)
}
return nil
@@ -241,24 +241,24 @@ func (s StateOfApplicabilityService) Update(
return nil, err
}
return stateOfApplicability, nil
return statementOfApplicability, nil
}
func (s StateOfApplicabilityService) Delete(
func (s StatementOfApplicabilityService) Delete(
ctx context.Context,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
) error {
stateOfApplicability := &coredata.StateOfApplicability{ID: stateOfApplicabilityID}
statementOfApplicability := &coredata.StatementOfApplicability{ID: statementOfApplicabilityID}
err := s.svc.pg.WithTx(
ctx,
func(ctx context.Context, conn pg.Tx) error {
if err := stateOfApplicability.LoadByID(ctx, conn, s.svc.scope, stateOfApplicabilityID); err != nil {
return fmt.Errorf("cannot load state_of_applicability: %w", err)
if err := statementOfApplicability.LoadByID(ctx, conn, s.svc.scope, statementOfApplicabilityID); err != nil {
return fmt.Errorf("cannot load statement_of_applicability: %w", err)
}
if err := stateOfApplicability.Delete(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot delete state_of_applicability: %w", err)
if err := statementOfApplicability.Delete(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot delete statement_of_applicability: %w", err)
}
return nil
@@ -272,7 +272,7 @@ func (s StateOfApplicabilityService) Delete(
return nil
}
func (s StateOfApplicabilityService) GetApplicabilityStatement(
func (s StatementOfApplicabilityService) GetApplicabilityStatement(
ctx context.Context,
applicabilityStatementID gid.GID,
) (*coredata.ApplicabilityStatement, error) {
@@ -291,9 +291,9 @@ func (s StateOfApplicabilityService) GetApplicabilityStatement(
return applicabilityStatement, nil
}
func (s StateOfApplicabilityService) ListApplicabilityStatements(
func (s StatementOfApplicabilityService) ListApplicabilityStatements(
ctx context.Context,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
cursor *page.Cursor[coredata.ApplicabilityStatementOrderField],
) (*page.Page[*coredata.ApplicabilityStatement, coredata.ApplicabilityStatementOrderField], error) {
var statements coredata.ApplicabilityStatements
@@ -301,7 +301,7 @@ func (s StateOfApplicabilityService) ListApplicabilityStatements(
err := s.svc.pg.WithConn(
ctx,
func(ctx context.Context, conn pg.Querier) error {
if err := statements.LoadByStateOfApplicabilityID(ctx, conn, s.svc.scope, stateOfApplicabilityID, cursor); err != nil {
if err := statements.LoadByStatementOfApplicabilityID(ctx, conn, s.svc.scope, statementOfApplicabilityID, cursor); err != nil {
return fmt.Errorf("cannot load applicability statements: %w", err)
}
return nil
@@ -315,9 +315,9 @@ func (s StateOfApplicabilityService) ListApplicabilityStatements(
return page.NewPage(statements, cursor), nil
}
func (s StateOfApplicabilityService) CountApplicabilityStatements(
func (s StatementOfApplicabilityService) CountApplicabilityStatements(
ctx context.Context,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
) (int, error) {
var count int
@@ -325,7 +325,7 @@ func (s StateOfApplicabilityService) CountApplicabilityStatements(
ctx,
func(ctx context.Context, conn pg.Querier) (err error) {
statements := &coredata.ApplicabilityStatements{}
count, err = statements.CountByStateOfApplicabilityID(ctx, conn, s.svc.scope, stateOfApplicabilityID)
count, err = statements.CountByStatementOfApplicabilityID(ctx, conn, s.svc.scope, statementOfApplicabilityID)
if err != nil {
return fmt.Errorf("cannot count applicability statements: %w", err)
}
@@ -340,35 +340,35 @@ func (s StateOfApplicabilityService) CountApplicabilityStatements(
return count, nil
}
func (s StateOfApplicabilityService) CreateApplicabilityStatement(
func (s StatementOfApplicabilityService) CreateApplicabilityStatement(
ctx context.Context,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
controlID gid.GID,
applicability bool,
justification *string,
) (*coredata.ApplicabilityStatement, error) {
var (
stateOfApplicability = &coredata.StateOfApplicability{}
applicabilityStatement = &coredata.ApplicabilityStatement{}
now = time.Now()
statementOfApplicability = &coredata.StatementOfApplicability{}
applicabilityStatement = &coredata.ApplicabilityStatement{}
now = time.Now()
)
err := s.svc.pg.WithTx(
ctx,
func(ctx context.Context, conn pg.Tx) error {
if err := stateOfApplicability.LoadByID(ctx, conn, s.svc.scope, stateOfApplicabilityID); err != nil {
return fmt.Errorf("cannot load state of applicability: %w", err)
if err := statementOfApplicability.LoadByID(ctx, conn, s.svc.scope, statementOfApplicabilityID); err != nil {
return fmt.Errorf("cannot load statement of applicability: %w", err)
}
applicabilityStatement = &coredata.ApplicabilityStatement{
ID: gid.New(s.svc.scope.GetTenantID(), coredata.ApplicabilityStatementEntityType),
StateOfApplicabilityID: stateOfApplicabilityID,
ControlID: controlID,
OrganizationID: stateOfApplicability.OrganizationID,
Applicability: applicability,
Justification: justification,
CreatedAt: now,
UpdatedAt: now,
ID: gid.New(s.svc.scope.GetTenantID(), coredata.ApplicabilityStatementEntityType),
StatementOfApplicabilityID: statementOfApplicabilityID,
ControlID: controlID,
OrganizationID: statementOfApplicability.OrganizationID,
Applicability: applicability,
Justification: justification,
CreatedAt: now,
UpdatedAt: now,
}
if err := applicabilityStatement.Insert(ctx, conn, s.svc.scope); err != nil {
@@ -385,7 +385,7 @@ func (s StateOfApplicabilityService) CreateApplicabilityStatement(
return applicabilityStatement, nil
}
func (s StateOfApplicabilityService) UpdateApplicabilityStatement(
func (s StatementOfApplicabilityService) UpdateApplicabilityStatement(
ctx context.Context,
applicabilityStatementID gid.GID,
applicability bool,
@@ -414,7 +414,7 @@ func (s StateOfApplicabilityService) UpdateApplicabilityStatement(
return applicabilityStatement, nil
}
func (s StateOfApplicabilityService) DeleteApplicabilityStatement(
func (s StatementOfApplicabilityService) DeleteApplicabilityStatement(
ctx context.Context,
applicabilityStatementID gid.GID,
) error {
@@ -428,7 +428,7 @@ func (s StateOfApplicabilityService) DeleteApplicabilityStatement(
)
}
func (s StateOfApplicabilityService) ListControlLinks(
func (s StatementOfApplicabilityService) ListControlLinks(
ctx context.Context,
controlID gid.GID,
cursor *page.Cursor[coredata.ApplicabilityStatementOrderField],
@@ -445,27 +445,27 @@ func (s StateOfApplicabilityService) ListControlLinks(
return page.NewPage(controls, cursor), nil
}
func (s StateOfApplicabilityService) ExportPDF(
func (s StatementOfApplicabilityService) ExportPDF(
ctx context.Context,
stateOfApplicabilityID gid.GID,
statementOfApplicabilityID gid.GID,
) ([]byte, error) {
var documentData docgen.StateOfApplicabilityData
var documentData docgen.StatementOfApplicabilityData
err := s.svc.pg.WithConn(
ctx,
func(ctx context.Context, conn pg.Querier) error {
stateOfApplicability := &coredata.StateOfApplicability{}
if err := stateOfApplicability.LoadByID(ctx, conn, s.svc.scope, stateOfApplicabilityID); err != nil {
return fmt.Errorf("cannot load state of applicability: %w", err)
statementOfApplicability := &coredata.StatementOfApplicability{}
if err := statementOfApplicability.LoadByID(ctx, conn, s.svc.scope, statementOfApplicabilityID); err != nil {
return fmt.Errorf("cannot load statement of applicability: %w", err)
}
organization := &coredata.Organization{}
if err := organization.LoadByID(ctx, conn, s.svc.scope, stateOfApplicability.OrganizationID); err != nil {
if err := organization.LoadByID(ctx, conn, s.svc.scope, statementOfApplicability.OrganizationID); err != nil {
return fmt.Errorf("cannot load organization: %w", err)
}
owner := &coredata.MembershipProfile{}
if err := owner.LoadByID(ctx, conn, s.svc.scope, stateOfApplicability.OwnerID); err != nil {
if err := owner.LoadByID(ctx, conn, s.svc.scope, statementOfApplicability.OwnerID); err != nil {
return fmt.Errorf("cannot load owner profile: %w", err)
}
@@ -480,16 +480,16 @@ func (s StateOfApplicabilityService) ExportPDF(
Direction: page.OrderDirectionAsc,
},
)
if err := applicabilityStatements.LoadByStateOfApplicabilityID(ctx, conn, s.svc.scope, stateOfApplicabilityID, cursor); err != nil {
if err := applicabilityStatements.LoadByStatementOfApplicabilityID(ctx, conn, s.svc.scope, statementOfApplicabilityID, cursor); err != nil {
return fmt.Errorf("cannot load applicability statements: %w", err)
}
if len(applicabilityStatements) == 0 {
// No linked controls, skip loading additional data
documentData = docgen.StateOfApplicabilityData{
Title: stateOfApplicability.Name,
documentData = docgen.StatementOfApplicabilityData{
Title: statementOfApplicability.Name,
OrganizationName: organization.Name,
CreatedAt: stateOfApplicability.CreatedAt,
CreatedAt: statementOfApplicability.CreatedAt,
TotalControls: 0,
FrameworkGroups: []docgen.FrameworkControlGroup{},
}
@@ -602,19 +602,19 @@ func (s StateOfApplicabilityService) ExportPDF(
}
var snapshots coredata.Snapshots
snapshotType := coredata.SnapshotsTypeStatesOfApplicability
snapshotType := coredata.SnapshotsTypeStatementsOfApplicability
var version int
var publishedAt time.Time
if stateOfApplicability.SnapshotID != nil {
if statementOfApplicability.SnapshotID != nil {
snapshot := &coredata.Snapshot{}
if err := snapshot.LoadByID(ctx, conn, s.svc.scope, *stateOfApplicability.SnapshotID); err != nil {
if err := snapshot.LoadByID(ctx, conn, s.svc.scope, *statementOfApplicability.SnapshotID); err != nil {
return fmt.Errorf("cannot load snapshot: %w", err)
}
publishedAt = snapshot.CreatedAt
snapshotFilter := coredata.NewSnapshotFilter(&snapshotType).WithBeforeDate(&snapshot.CreatedAt)
snapshotCount, err := snapshots.CountByOrganizationID(ctx, conn, s.svc.scope, stateOfApplicability.OrganizationID, snapshotFilter)
snapshotCount, err := snapshots.CountByOrganizationID(ctx, conn, s.svc.scope, statementOfApplicability.OrganizationID, snapshotFilter)
if err != nil {
return fmt.Errorf("cannot count states of applicability snapshots: %w", err)
}
@@ -622,7 +622,7 @@ func (s StateOfApplicabilityService) ExportPDF(
} else {
publishedAt = time.Now()
snapshotFilter := coredata.NewSnapshotFilter(&snapshotType)
snapshotCount, err := snapshots.CountByOrganizationID(ctx, conn, s.svc.scope, stateOfApplicability.OrganizationID, snapshotFilter)
snapshotCount, err := snapshots.CountByOrganizationID(ctx, conn, s.svc.scope, statementOfApplicability.OrganizationID, snapshotFilter)
if err != nil {
return fmt.Errorf("cannot count states of applicability snapshots: %w", err)
}
@@ -641,10 +641,10 @@ func (s StateOfApplicabilityService) ExportPDF(
}
}
documentData = docgen.StateOfApplicabilityData{
Title: stateOfApplicability.Name,
documentData = docgen.StatementOfApplicabilityData{
Title: statementOfApplicability.Name,
OrganizationName: organization.Name,
CreatedAt: stateOfApplicability.CreatedAt,
CreatedAt: statementOfApplicability.CreatedAt,
TotalControls: len(applicabilityStatements),
FrameworkGroups: frameworkGroups,
CompanyHorizontalLogoBase64: horizontalLogoBase64,
@@ -661,7 +661,7 @@ func (s StateOfApplicabilityService) ExportPDF(
return nil, err
}
htmlData, err := docgen.RenderStateOfApplicabilityHTML(documentData)
htmlData, err := docgen.RenderStatementOfApplicabilityHTML(documentData)
if err != nil {
return nil, fmt.Errorf("cannot render HTML: %w", err)
}

View File

@@ -1398,9 +1398,9 @@ enum SnapshotsType
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.SnapshotsTypeProcessingActivities"
)
STATES_OF_APPLICABILITY
STATEMENTS_OF_APPLICABILITY
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.SnapshotsTypeStatesOfApplicability"
value: "go.probo.inc/probo/pkg/coredata.SnapshotsTypeStatementsOfApplicability"
)
}
@@ -1690,7 +1690,7 @@ input DatumFilter {
snapshotId: ID
}
input StateOfApplicabilityFilter {
input StatementOfApplicabilityFilter {
snapshotId: ID
}
@@ -1955,14 +1955,14 @@ type Organization implements Node {
orderBy: MeetingOrder
): MeetingConnection! @goField(forceResolver: true)
statesOfApplicability(
statementsOfApplicability(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: StateOfApplicabilityOrder
filter: StateOfApplicabilityFilter = { snapshotId: null }
): StateOfApplicabilityConnection! @goField(forceResolver: true)
orderBy: StatementOfApplicabilityOrder
filter: StatementOfApplicabilityFilter = { snapshotId: null }
): StatementOfApplicabilityConnection! @goField(forceResolver: true)
measureCategories: [String!]! @goField(forceResolver: true)
@@ -2756,7 +2756,7 @@ type WebhookEventEdge {
node: WebhookEvent!
}
type StateOfApplicability implements Node {
type StatementOfApplicability implements Node {
id: ID!
name: String!
sourceId: ID
@@ -2793,7 +2793,7 @@ type ApplicabilityStatementEdge {
type ApplicabilityStatement implements Node {
id: ID!
stateOfApplicability: StateOfApplicability! @goField(forceResolver: true)
statementOfApplicability: StatementOfApplicability! @goField(forceResolver: true)
control: Control! @goField(forceResolver: true)
applicability: Boolean!
justification: String!
@@ -3427,18 +3427,18 @@ type MeetingEdge {
node: Meeting!
}
type StateOfApplicabilityConnection
type StatementOfApplicabilityConnection
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.StateOfApplicabilityConnection"
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.StatementOfApplicabilityConnection"
) {
totalCount: Int! @goField(forceResolver: true)
edges: [StateOfApplicabilityEdge!]!
edges: [StatementOfApplicabilityEdge!]!
pageInfo: PageInfo!
}
type StateOfApplicabilityEdge {
type StatementOfApplicabilityEdge {
cursor: CursorKey!
node: StateOfApplicability!
node: StatementOfApplicability!
}
@@ -3906,19 +3906,19 @@ type Mutation {
deleteWebhookSubscription(
input: DeleteWebhookSubscriptionInput!
): DeleteWebhookSubscriptionPayload!
# StateOfApplicability mutations
createStateOfApplicability(
input: CreateStateOfApplicabilityInput!
): CreateStateOfApplicabilityPayload!
updateStateOfApplicability(
input: UpdateStateOfApplicabilityInput!
): UpdateStateOfApplicabilityPayload!
deleteStateOfApplicability(
input: DeleteStateOfApplicabilityInput!
): DeleteStateOfApplicabilityPayload!
exportStateOfApplicabilityPDF(
input: ExportStateOfApplicabilityPDFInput!
): ExportStateOfApplicabilityPDFPayload!
# StatementOfApplicability mutations
createStatementOfApplicability(
input: CreateStatementOfApplicabilityInput!
): CreateStatementOfApplicabilityPayload!
updateStatementOfApplicability(
input: UpdateStatementOfApplicabilityInput!
): UpdateStatementOfApplicabilityPayload!
deleteStatementOfApplicability(
input: DeleteStatementOfApplicabilityInput!
): DeleteStatementOfApplicabilityPayload!
exportStatementOfApplicabilityPDF(
input: ExportStatementOfApplicabilityPDFInput!
): ExportStatementOfApplicabilityPDFPayload!
publishMajorDocumentVersion(
input: PublishMajorDocumentVersionInput!
): PublishDocumentVersionPayload!
@@ -4491,7 +4491,7 @@ input DeleteControlDocumentMappingInput {
}
input CreateApplicabilityStatementInput {
stateOfApplicabilityId: ID!
statementOfApplicabilityId: ID!
controlId: ID!
applicability: Boolean!
justification: String
@@ -4735,13 +4735,13 @@ input DeleteMeetingInput {
meetingId: ID!
}
input CreateStateOfApplicabilityInput {
input CreateStatementOfApplicabilityInput {
organizationId: ID!
name: String!
ownerId: ID!
}
input UpdateStateOfApplicabilityInput {
input UpdateStatementOfApplicabilityInput {
id: ID!
name: String
ownerId: ID
@@ -4753,37 +4753,37 @@ input ApplicabilityStatementInput {
justification: String
}
input DeleteStateOfApplicabilityInput {
stateOfApplicabilityId: ID!
input DeleteStatementOfApplicabilityInput {
statementOfApplicabilityId: ID!
}
input ExportStateOfApplicabilityPDFInput {
stateOfApplicabilityId: ID!
input ExportStatementOfApplicabilityPDFInput {
statementOfApplicabilityId: ID!
}
type ExportStateOfApplicabilityPDFPayload {
type ExportStatementOfApplicabilityPDFPayload {
data: String!
}
input StateOfApplicabilityOrder
input StatementOfApplicabilityOrder
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.StateOfApplicabilityOrderBy"
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.StatementOfApplicabilityOrderBy"
) {
direction: OrderDirection!
field: StateOfApplicabilityOrderField!
field: StatementOfApplicabilityOrderField!
}
enum StateOfApplicabilityOrderField
enum StatementOfApplicabilityOrderField
@goModel(
model: "go.probo.inc/probo/pkg/coredata.StateOfApplicabilityOrderField"
model: "go.probo.inc/probo/pkg/coredata.StatementOfApplicabilityOrderField"
) {
NAME
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.StateOfApplicabilityOrderFieldName"
value: "go.probo.inc/probo/pkg/coredata.StatementOfApplicabilityOrderFieldName"
)
CREATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.StateOfApplicabilityOrderFieldCreatedAt"
value: "go.probo.inc/probo/pkg/coredata.StatementOfApplicabilityOrderFieldCreatedAt"
)
}
input CreateControlInput {
@@ -5496,16 +5496,16 @@ type DeleteWebhookSubscriptionPayload {
deletedWebhookSubscriptionId: ID!
}
type CreateStateOfApplicabilityPayload {
stateOfApplicabilityEdge: StateOfApplicabilityEdge!
type CreateStatementOfApplicabilityPayload {
statementOfApplicabilityEdge: StatementOfApplicabilityEdge!
}
type UpdateStateOfApplicabilityPayload {
stateOfApplicability: StateOfApplicability!
type UpdateStatementOfApplicabilityPayload {
statementOfApplicability: StatementOfApplicability!
}
type DeleteStateOfApplicabilityPayload {
deletedStateOfApplicabilityId: ID!
type DeleteStatementOfApplicabilityPayload {
deletedStatementOfApplicabilityId: ID!
}
input VendorRiskAssessmentOrder {

View File

@@ -70,8 +70,8 @@ func NewApplicabilityStatement(as *coredata.ApplicabilityStatement) *Applicabili
return &ApplicabilityStatement{
ID: as.ID,
StateOfApplicability: &StateOfApplicability{
ID: as.StateOfApplicabilityID,
StatementOfApplicability: &StatementOfApplicability{
ID: as.StatementOfApplicabilityID,
},
Control: &Control{
ID: as.ControlID,

View File

@@ -21,32 +21,32 @@ import (
)
type (
StateOfApplicabilityOrderBy OrderBy[coredata.StateOfApplicabilityOrderField]
StatementOfApplicabilityOrderBy OrderBy[coredata.StatementOfApplicabilityOrderField]
StateOfApplicabilityConnection struct {
StatementOfApplicabilityConnection struct {
TotalCount int
Edges []*StateOfApplicabilityEdge
Edges []*StatementOfApplicabilityEdge
PageInfo PageInfo
Resolver any
ParentID gid.GID
Filters *coredata.StateOfApplicabilityFilter
Filters *coredata.StatementOfApplicabilityFilter
}
)
func NewStateOfApplicabilityConnection(
p *page.Page[*coredata.StateOfApplicability, coredata.StateOfApplicabilityOrderField],
func NewStatementOfApplicabilityConnection(
p *page.Page[*coredata.StatementOfApplicability, coredata.StatementOfApplicabilityOrderField],
parentType any,
parentID gid.GID,
filters *coredata.StateOfApplicabilityFilter,
) *StateOfApplicabilityConnection {
var edges = make([]*StateOfApplicabilityEdge, len(p.Data))
filters *coredata.StatementOfApplicabilityFilter,
) *StatementOfApplicabilityConnection {
var edges = make([]*StatementOfApplicabilityEdge, len(p.Data))
for i := range edges {
edges[i] = NewStateOfApplicabilityEdge(p.Data[i], p.Cursor.OrderBy.Field)
edges[i] = NewStatementOfApplicabilityEdge(p.Data[i], p.Cursor.OrderBy.Field)
}
return &StateOfApplicabilityConnection{
return &StatementOfApplicabilityConnection{
Edges: edges,
PageInfo: *NewPageInfo(p),
@@ -56,15 +56,15 @@ func NewStateOfApplicabilityConnection(
}
}
func NewStateOfApplicabilityEdge(soa *coredata.StateOfApplicability, orderBy coredata.StateOfApplicabilityOrderField) *StateOfApplicabilityEdge {
return &StateOfApplicabilityEdge{
func NewStatementOfApplicabilityEdge(soa *coredata.StatementOfApplicability, orderBy coredata.StatementOfApplicabilityOrderField) *StatementOfApplicabilityEdge {
return &StatementOfApplicabilityEdge{
Cursor: soa.CursorKey(orderBy),
Node: NewStateOfApplicability(soa),
Node: NewStatementOfApplicability(soa),
}
}
func NewStateOfApplicability(soa *coredata.StateOfApplicability) *StateOfApplicability {
return &StateOfApplicability{
func NewStatementOfApplicability(soa *coredata.StatementOfApplicability) *StatementOfApplicability {
return &StatementOfApplicability{
ID: soa.ID,
Organization: &Organization{
ID: soa.OrganizationID,

View File

@@ -543,21 +543,21 @@ func (r *accessSourceConnectionResolver) TotalCount(ctx context.Context, obj *ty
panic(fmt.Errorf("unsupported resolver: %T", obj.Resolver))
}
// StateOfApplicability is the resolver for the stateOfApplicability field.
func (r *applicabilityStatementResolver) StateOfApplicability(ctx context.Context, obj *types.ApplicabilityStatement) (*types.StateOfApplicability, error) {
if err := r.authorize(ctx, obj.StateOfApplicability.ID, probo.ActionStateOfApplicabilityGet); err != nil {
// StatementOfApplicability is the resolver for the statementOfApplicability field.
func (r *applicabilityStatementResolver) StatementOfApplicability(ctx context.Context, obj *types.ApplicabilityStatement) (*types.StatementOfApplicability, error) {
if err := r.authorize(ctx, obj.StatementOfApplicability.ID, probo.ActionStatementOfApplicabilityGet); err != nil {
return nil, err
}
prb := r.ProboService(ctx, obj.StateOfApplicability.ID.TenantID())
prb := r.ProboService(ctx, obj.StatementOfApplicability.ID.TenantID())
soa, err := prb.StatesOfApplicability.Get(ctx, obj.StateOfApplicability.ID)
soa, err := prb.StatementsOfApplicability.Get(ctx, obj.StatementOfApplicability.ID)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot get state of applicability", log.Error(err))
r.logger.ErrorCtx(ctx, "cannot get statement of applicability", log.Error(err))
return nil, gqlutils.Internal(ctx)
}
return types.NewStateOfApplicability(soa), nil
return types.NewStatementOfApplicability(soa), nil
}
// Control is the resolver for the control field.
@@ -595,8 +595,8 @@ func (r *applicabilityStatementConnectionResolver) TotalCount(ctx context.Contex
prb := r.ProboService(ctx, obj.ParentID.TenantID())
switch obj.Resolver.(type) {
case *stateOfApplicabilityResolver:
count, err := prb.StatesOfApplicability.CountApplicabilityStatements(ctx, obj.ParentID)
case *statementOfApplicabilityResolver:
count, err := prb.StatementsOfApplicability.CountApplicabilityStatements(ctx, obj.ParentID)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot count applicability statements", log.Error(err))
return 0, gqlutils.Internal(ctx)
@@ -1289,8 +1289,8 @@ func (r *controlConnectionResolver) TotalCount(ctx context.Context, obj *types.C
return 0, gqlutils.Internal(ctx)
}
return count, nil
case *stateOfApplicabilityResolver:
count, err := prb.Controls.CountForStateOfApplicabilityID(ctx, obj.ParentID, obj.Filters)
case *statementOfApplicabilityResolver:
count, err := prb.Controls.CountForStatementOfApplicabilityID(ctx, obj.ParentID, obj.Filters)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot count controls", log.Error(err))
return 0, gqlutils.Internal(ctx)
@@ -4440,9 +4440,9 @@ func (r *mutationResolver) CreateApplicabilityStatement(ctx context.Context, inp
return nil, err
}
prb := r.ProboService(ctx, input.StateOfApplicabilityID.TenantID())
prb := r.ProboService(ctx, input.StatementOfApplicabilityID.TenantID())
applicabilityStatement, err := prb.StatesOfApplicability.CreateApplicabilityStatement(ctx, input.StateOfApplicabilityID, input.ControlID, input.Applicability, input.Justification)
applicabilityStatement, err := prb.StatementsOfApplicability.CreateApplicabilityStatement(ctx, input.StatementOfApplicabilityID, input.ControlID, input.Applicability, input.Justification)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot create applicability statement", log.Error(err))
return nil, gqlutils.Internal(ctx)
@@ -4461,7 +4461,7 @@ func (r *mutationResolver) UpdateApplicabilityStatement(ctx context.Context, inp
prb := r.ProboService(ctx, input.ApplicabilityStatementID.TenantID())
applicabilityStatement, err := prb.StatesOfApplicability.UpdateApplicabilityStatement(ctx, input.ApplicabilityStatementID, input.Applicability, input.Justification)
applicabilityStatement, err := prb.StatementsOfApplicability.UpdateApplicabilityStatement(ctx, input.ApplicabilityStatementID, input.Applicability, input.Justification)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot update applicability statement", log.Error(err))
return nil, gqlutils.Internal(ctx)
@@ -4480,7 +4480,7 @@ func (r *mutationResolver) DeleteApplicabilityStatement(ctx context.Context, inp
prb := r.ProboService(ctx, input.ApplicabilityStatementID.TenantID())
err := prb.StatesOfApplicability.DeleteApplicabilityStatement(ctx, input.ApplicabilityStatementID)
err := prb.StatementsOfApplicability.DeleteApplicabilityStatement(ctx, input.ApplicabilityStatementID)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot delete applicability statement", log.Error(err))
return nil, gqlutils.Internal(ctx)
@@ -5526,17 +5526,17 @@ func (r *mutationResolver) DeleteWebhookSubscription(ctx context.Context, input
}, nil
}
// CreateStateOfApplicability is the resolver for the createStateOfApplicability field.
func (r *mutationResolver) CreateStateOfApplicability(ctx context.Context, input types.CreateStateOfApplicabilityInput) (*types.CreateStateOfApplicabilityPayload, error) {
if err := r.authorize(ctx, input.OrganizationID, probo.ActionStateOfApplicabilityCreate); err != nil {
// CreateStatementOfApplicability is the resolver for the createStatementOfApplicability field.
func (r *mutationResolver) CreateStatementOfApplicability(ctx context.Context, input types.CreateStatementOfApplicabilityInput) (*types.CreateStatementOfApplicabilityPayload, error) {
if err := r.authorize(ctx, input.OrganizationID, probo.ActionStatementOfApplicabilityCreate); err != nil {
return nil, err
}
prb := r.ProboService(ctx, input.OrganizationID.TenantID())
stateOfApplicability, err := prb.StatesOfApplicability.Create(
statementOfApplicability, err := prb.StatementsOfApplicability.Create(
ctx,
probo.CreateStateOfApplicabilityRequest{
probo.CreateStatementOfApplicabilityRequest{
OrganizationID: input.OrganizationID,
Name: input.Name,
OwnerID: input.OwnerID,
@@ -5549,18 +5549,18 @@ func (r *mutationResolver) CreateStateOfApplicability(ctx context.Context, input
if validationErrors, ok := errors.AsType[validator.ValidationErrors](err); ok {
return nil, gqlutils.InvalidValidationErrors(ctx, validationErrors)
}
r.logger.ErrorCtx(ctx, "cannot create state_of_applicability", log.Error(err))
r.logger.ErrorCtx(ctx, "cannot create statement_of_applicability", log.Error(err))
return nil, gqlutils.Internal(ctx)
}
return &types.CreateStateOfApplicabilityPayload{
StateOfApplicabilityEdge: types.NewStateOfApplicabilityEdge(stateOfApplicability, coredata.StateOfApplicabilityOrderFieldCreatedAt),
return &types.CreateStatementOfApplicabilityPayload{
StatementOfApplicabilityEdge: types.NewStatementOfApplicabilityEdge(statementOfApplicability, coredata.StatementOfApplicabilityOrderFieldCreatedAt),
}, nil
}
// UpdateStateOfApplicability is the resolver for the updateStateOfApplicability field.
func (r *mutationResolver) UpdateStateOfApplicability(ctx context.Context, input types.UpdateStateOfApplicabilityInput) (*types.UpdateStateOfApplicabilityPayload, error) {
if err := r.authorize(ctx, input.ID, probo.ActionStateOfApplicabilityUpdate); err != nil {
// UpdateStatementOfApplicability is the resolver for the updateStatementOfApplicability field.
func (r *mutationResolver) UpdateStatementOfApplicability(ctx context.Context, input types.UpdateStatementOfApplicabilityInput) (*types.UpdateStatementOfApplicabilityPayload, error) {
if err := r.authorize(ctx, input.ID, probo.ActionStatementOfApplicabilityUpdate); err != nil {
return nil, err
}
@@ -5571,12 +5571,12 @@ func (r *mutationResolver) UpdateStateOfApplicability(ctx context.Context, input
name = input.Name
}
stateOfApplicability, err := prb.StatesOfApplicability.Update(
statementOfApplicability, err := prb.StatementsOfApplicability.Update(
ctx,
probo.UpdateStateOfApplicabilityRequest{
StateOfApplicabilityID: input.ID,
Name: name,
OwnerID: input.OwnerID,
probo.UpdateStatementOfApplicabilityRequest{
StatementOfApplicabilityID: input.ID,
Name: name,
OwnerID: input.OwnerID,
},
)
if err != nil {
@@ -5586,52 +5586,52 @@ func (r *mutationResolver) UpdateStateOfApplicability(ctx context.Context, input
if validationErrors, ok := errors.AsType[validator.ValidationErrors](err); ok {
return nil, gqlutils.InvalidValidationErrors(ctx, validationErrors)
}
r.logger.ErrorCtx(ctx, "cannot update state_of_applicability", log.Error(err))
r.logger.ErrorCtx(ctx, "cannot update statement_of_applicability", log.Error(err))
return nil, gqlutils.Internal(ctx)
}
return &types.UpdateStateOfApplicabilityPayload{
StateOfApplicability: types.NewStateOfApplicability(stateOfApplicability),
return &types.UpdateStatementOfApplicabilityPayload{
StatementOfApplicability: types.NewStatementOfApplicability(statementOfApplicability),
}, nil
}
// DeleteStateOfApplicability is the resolver for the deleteStateOfApplicability field.
func (r *mutationResolver) DeleteStateOfApplicability(ctx context.Context, input types.DeleteStateOfApplicabilityInput) (*types.DeleteStateOfApplicabilityPayload, error) {
if err := r.authorize(ctx, input.StateOfApplicabilityID, probo.ActionStateOfApplicabilityDelete); err != nil {
// DeleteStatementOfApplicability is the resolver for the deleteStatementOfApplicability field.
func (r *mutationResolver) DeleteStatementOfApplicability(ctx context.Context, input types.DeleteStatementOfApplicabilityInput) (*types.DeleteStatementOfApplicabilityPayload, error) {
if err := r.authorize(ctx, input.StatementOfApplicabilityID, probo.ActionStatementOfApplicabilityDelete); err != nil {
return nil, err
}
prb := r.ProboService(ctx, input.StateOfApplicabilityID.TenantID())
prb := r.ProboService(ctx, input.StatementOfApplicabilityID.TenantID())
err := prb.StatesOfApplicability.Delete(ctx, input.StateOfApplicabilityID)
err := prb.StatementsOfApplicability.Delete(ctx, input.StatementOfApplicabilityID)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot delete state_of_applicability", log.Error(err))
r.logger.ErrorCtx(ctx, "cannot delete statement_of_applicability", log.Error(err))
return nil, gqlutils.Internal(ctx)
}
return &types.DeleteStateOfApplicabilityPayload{
DeletedStateOfApplicabilityID: input.StateOfApplicabilityID,
return &types.DeleteStatementOfApplicabilityPayload{
DeletedStatementOfApplicabilityID: input.StatementOfApplicabilityID,
}, nil
}
// ExportStateOfApplicabilityPDF is the resolver for the exportStateOfApplicabilityPDF field.
func (r *mutationResolver) ExportStateOfApplicabilityPDF(ctx context.Context, input types.ExportStateOfApplicabilityPDFInput) (*types.ExportStateOfApplicabilityPDFPayload, error) {
if err := r.authorize(ctx, input.StateOfApplicabilityID, probo.ActionStateOfApplicabilityExport); err != nil {
// ExportStatementOfApplicabilityPDF is the resolver for the exportStatementOfApplicabilityPDF field.
func (r *mutationResolver) ExportStatementOfApplicabilityPDF(ctx context.Context, input types.ExportStatementOfApplicabilityPDFInput) (*types.ExportStatementOfApplicabilityPDFPayload, error) {
if err := r.authorize(ctx, input.StatementOfApplicabilityID, probo.ActionStatementOfApplicabilityExport); err != nil {
return nil, err
}
prb := r.ProboService(ctx, input.StateOfApplicabilityID.TenantID())
prb := r.ProboService(ctx, input.StatementOfApplicabilityID.TenantID())
pdfData, err := prb.StatesOfApplicability.ExportPDF(ctx, input.StateOfApplicabilityID)
pdfData, err := prb.StatementsOfApplicability.ExportPDF(ctx, input.StatementOfApplicabilityID)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot export state of applicability PDF", log.Error(err))
r.logger.ErrorCtx(ctx, "cannot export statement of applicability PDF", log.Error(err))
return nil, gqlutils.Internal(ctx)
}
base64Data := base64.StdEncoding.EncodeToString(pdfData)
dataURI := fmt.Sprintf("data:application/pdf;base64,%s", base64Data)
return &types.ExportStateOfApplicabilityPDFPayload{
return &types.ExportStatementOfApplicabilityPDFPayload{
Data: dataURI,
}, nil
}
@@ -8522,20 +8522,20 @@ func (r *organizationResolver) Meetings(ctx context.Context, obj *types.Organiza
return types.NewMeetingConnection(page, r, obj.ID), nil
}
// StatesOfApplicability is the resolver for the statesOfApplicability field.
func (r *organizationResolver) StatesOfApplicability(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.StateOfApplicabilityOrderBy, filter *types.StateOfApplicabilityFilter) (*types.StateOfApplicabilityConnection, error) {
if err := r.authorize(ctx, obj.ID, probo.ActionStateOfApplicabilityList); err != nil {
// StatementsOfApplicability is the resolver for the statementsOfApplicability field.
func (r *organizationResolver) StatementsOfApplicability(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.StatementOfApplicabilityOrderBy, filter *types.StatementOfApplicabilityFilter) (*types.StatementOfApplicabilityConnection, error) {
if err := r.authorize(ctx, obj.ID, probo.ActionStatementOfApplicabilityList); err != nil {
return nil, err
}
prb := r.ProboService(ctx, obj.ID.TenantID())
pageOrderBy := page.OrderBy[coredata.StateOfApplicabilityOrderField]{
Field: coredata.StateOfApplicabilityOrderFieldCreatedAt,
pageOrderBy := page.OrderBy[coredata.StatementOfApplicabilityOrderField]{
Field: coredata.StatementOfApplicabilityOrderFieldCreatedAt,
Direction: page.OrderDirectionDesc,
}
if orderBy != nil {
pageOrderBy = page.OrderBy[coredata.StateOfApplicabilityOrderField]{
pageOrderBy = page.OrderBy[coredata.StatementOfApplicabilityOrderField]{
Field: orderBy.Field,
Direction: orderBy.Direction,
}
@@ -8543,18 +8543,18 @@ func (r *organizationResolver) StatesOfApplicability(ctx context.Context, obj *t
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
var stateOfApplicabilityFilter = coredata.NewStateOfApplicabilityFilter(nil)
var statementOfApplicabilityFilter = coredata.NewStatementOfApplicabilityFilter(nil)
if filter != nil {
stateOfApplicabilityFilter = coredata.NewStateOfApplicabilityFilter(&filter.SnapshotID)
statementOfApplicabilityFilter = coredata.NewStatementOfApplicabilityFilter(&filter.SnapshotID)
}
page, err := prb.StatesOfApplicability.ListForOrganizationID(ctx, obj.ID, cursor, stateOfApplicabilityFilter)
page, err := prb.StatementsOfApplicability.ListForOrganizationID(ctx, obj.ID, cursor, statementOfApplicabilityFilter)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot list organization states_of_applicability", log.Error(err))
r.logger.ErrorCtx(ctx, "cannot list organization statements_of_applicability", log.Error(err))
return nil, gqlutils.Internal(ctx)
}
return types.NewStateOfApplicabilityConnection(page, r, obj.ID, stateOfApplicabilityFilter), nil
return types.NewStatementOfApplicabilityConnection(page, r, obj.ID, statementOfApplicabilityFilter), nil
}
// MeasureCategories is the resolver for the measureCategories field.
@@ -9695,14 +9695,14 @@ func (r *queryResolver) Node(ctx context.Context, id gid.GID) (types.Node, error
}
return types.NewRightsRequest(rightsRequest), nil
}
case coredata.StateOfApplicabilityEntityType:
action = probo.ActionStateOfApplicabilityGet
case coredata.StatementOfApplicabilityEntityType:
action = probo.ActionStatementOfApplicabilityGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
stateOfApplicability, err := prb.StatesOfApplicability.Get(ctx, id)
statementOfApplicability, err := prb.StatementsOfApplicability.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewStateOfApplicability(stateOfApplicability), nil
return types.NewStatementOfApplicability(statementOfApplicability), nil
}
case coredata.WebhookSubscriptionEntityType:
action = probo.ActionWebhookSubscriptionGet
@@ -10191,7 +10191,7 @@ func (r *snapshotConnectionResolver) TotalCount(ctx context.Context, obj *types.
}
// Organization is the resolver for the organization field.
func (r *stateOfApplicabilityResolver) Organization(ctx context.Context, obj *types.StateOfApplicability) (*types.Organization, error) {
func (r *statementOfApplicabilityResolver) Organization(ctx context.Context, obj *types.StatementOfApplicability) (*types.Organization, error) {
if err := r.authorize(ctx, obj.ID, probo.ActionOrganizationGet); err != nil {
return nil, err
}
@@ -10211,7 +10211,7 @@ func (r *stateOfApplicabilityResolver) Organization(ctx context.Context, obj *ty
}
// Owner is the resolver for the owner field.
func (r *stateOfApplicabilityResolver) Owner(ctx context.Context, obj *types.StateOfApplicability) (*types.Profile, error) {
func (r *statementOfApplicabilityResolver) Owner(ctx context.Context, obj *types.StatementOfApplicability) (*types.Profile, error) {
if err := r.authorize(ctx, obj.ID, iam.ActionMembershipProfileGet); err != nil {
return nil, err
}
@@ -10231,7 +10231,7 @@ func (r *stateOfApplicabilityResolver) Owner(ctx context.Context, obj *types.Sta
}
// ApplicabilityStatements is the resolver for the applicabilityStatements field.
func (r *stateOfApplicabilityResolver) ApplicabilityStatements(ctx context.Context, obj *types.StateOfApplicability, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ApplicabilityStatementOrderBy) (*types.ApplicabilityStatementConnection, error) {
func (r *statementOfApplicabilityResolver) ApplicabilityStatements(ctx context.Context, obj *types.StatementOfApplicability, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ApplicabilityStatementOrderBy) (*types.ApplicabilityStatementConnection, error) {
if err := r.authorize(ctx, obj.ID, probo.ActionApplicabilityStatementList); err != nil {
return nil, err
}
@@ -10251,7 +10251,7 @@ func (r *stateOfApplicabilityResolver) ApplicabilityStatements(ctx context.Conte
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
p, err := prb.StatesOfApplicability.ListApplicabilityStatements(ctx, obj.ID, cursor)
p, err := prb.StatementsOfApplicability.ListApplicabilityStatements(ctx, obj.ID, cursor)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot list applicability statements", log.Error(err))
return nil, gqlutils.Internal(ctx)
@@ -10261,19 +10261,19 @@ func (r *stateOfApplicabilityResolver) ApplicabilityStatements(ctx context.Conte
}
// Permission is the resolver for the permission field.
func (r *stateOfApplicabilityResolver) Permission(ctx context.Context, obj *types.StateOfApplicability, action string) (bool, error) {
func (r *statementOfApplicabilityResolver) Permission(ctx context.Context, obj *types.StatementOfApplicability, action string) (bool, error) {
return r.Resolver.Permission(ctx, obj, action)
}
// TotalCount is the resolver for the totalCount field.
func (r *stateOfApplicabilityConnectionResolver) TotalCount(ctx context.Context, obj *types.StateOfApplicabilityConnection) (int, error) {
func (r *statementOfApplicabilityConnectionResolver) TotalCount(ctx context.Context, obj *types.StatementOfApplicabilityConnection) (int, error) {
prb := r.ProboService(ctx, obj.ParentID.TenantID())
switch obj.Resolver.(type) {
case *organizationResolver:
count, err := prb.StatesOfApplicability.CountForOrganizationID(ctx, obj.ParentID, obj.Filters)
count, err := prb.StatementsOfApplicability.CountForOrganizationID(ctx, obj.ParentID, obj.Filters)
if err != nil {
r.logger.ErrorCtx(ctx, "cannot count states_of_applicability", log.Error(err))
r.logger.ErrorCtx(ctx, "cannot count statements_of_applicability", log.Error(err))
return 0, gqlutils.Internal(ctx)
}
return count, nil
@@ -12081,14 +12081,14 @@ func (r *Resolver) SnapshotConnection() schema.SnapshotConnectionResolver {
return &snapshotConnectionResolver{r}
}
// StateOfApplicability returns schema.StateOfApplicabilityResolver implementation.
func (r *Resolver) StateOfApplicability() schema.StateOfApplicabilityResolver {
return &stateOfApplicabilityResolver{r}
// StatementOfApplicability returns schema.StatementOfApplicabilityResolver implementation.
func (r *Resolver) StatementOfApplicability() schema.StatementOfApplicabilityResolver {
return &statementOfApplicabilityResolver{r}
}
// StateOfApplicabilityConnection returns schema.StateOfApplicabilityConnectionResolver implementation.
func (r *Resolver) StateOfApplicabilityConnection() schema.StateOfApplicabilityConnectionResolver {
return &stateOfApplicabilityConnectionResolver{r}
// StatementOfApplicabilityConnection returns schema.StatementOfApplicabilityConnectionResolver implementation.
func (r *Resolver) StatementOfApplicabilityConnection() schema.StatementOfApplicabilityConnectionResolver {
return &statementOfApplicabilityConnectionResolver{r}
}
// Task returns schema.TaskResolver implementation.
@@ -12267,8 +12267,8 @@ type riskConnectionResolver struct{ *Resolver }
type slackConnectionResolver struct{ *Resolver }
type snapshotResolver struct{ *Resolver }
type snapshotConnectionResolver struct{ *Resolver }
type stateOfApplicabilityResolver struct{ *Resolver }
type stateOfApplicabilityConnectionResolver struct{ *Resolver }
type statementOfApplicabilityResolver struct{ *Resolver }
type statementOfApplicabilityConnectionResolver struct{ *Resolver }
type taskResolver struct{ *Resolver }
type taskConnectionResolver struct{ *Resolver }
type transferImpactAssessmentResolver struct{ *Resolver }

View File

@@ -2844,17 +2844,17 @@ func (r *Resolver) DeleteDataProtectionImpactAssessmentTool(ctx context.Context,
}, nil
}
func (r *Resolver) ListStatesOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListStatesOfApplicabilityInput) (*mcp.CallToolResult, types.ListStatesOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.OrganizationID, probo.ActionStateOfApplicabilityList)
func (r *Resolver) ListStatementsOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListStatementsOfApplicabilityInput) (*mcp.CallToolResult, types.ListStatementsOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.OrganizationID, probo.ActionStatementOfApplicabilityList)
prb := r.ProboService(ctx, input.OrganizationID)
pageOrderBy := page.OrderBy[coredata.StateOfApplicabilityOrderField]{
Field: coredata.StateOfApplicabilityOrderFieldCreatedAt,
pageOrderBy := page.OrderBy[coredata.StatementOfApplicabilityOrderField]{
Field: coredata.StatementOfApplicabilityOrderFieldCreatedAt,
Direction: page.OrderDirectionDesc,
}
if input.OrderBy != nil {
pageOrderBy = page.OrderBy[coredata.StateOfApplicabilityOrderField]{
pageOrderBy = page.OrderBy[coredata.StatementOfApplicabilityOrderField]{
Field: input.OrderBy.Field,
Direction: input.OrderBy.Direction,
}
@@ -2862,107 +2862,107 @@ func (r *Resolver) ListStatesOfApplicabilityTool(ctx context.Context, req *mcp.C
cursor := types.NewCursor(input.Size, input.Cursor, pageOrderBy)
pg, err := prb.StatesOfApplicability.ListForOrganizationID(ctx, input.OrganizationID, cursor, coredata.NewStateOfApplicabilityFilter(nil))
pg, err := prb.StatementsOfApplicability.ListForOrganizationID(ctx, input.OrganizationID, cursor, coredata.NewStatementOfApplicabilityFilter(nil))
if err != nil {
return nil, types.ListStatesOfApplicabilityOutput{}, fmt.Errorf("failed to list states of applicability: %w", err)
return nil, types.ListStatementsOfApplicabilityOutput{}, fmt.Errorf("failed to list statements of applicability: %w", err)
}
return nil, types.NewListStatesOfApplicabilityOutput(pg), nil
return nil, types.NewListStatementsOfApplicabilityOutput(pg), nil
}
func (r *Resolver) GetStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetStateOfApplicabilityInput) (*mcp.CallToolResult, types.GetStateOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.ID, probo.ActionStateOfApplicabilityGet)
func (r *Resolver) GetStatementOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetStatementOfApplicabilityInput) (*mcp.CallToolResult, types.GetStatementOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.ID, probo.ActionStatementOfApplicabilityGet)
prb := r.ProboService(ctx, input.ID)
soa, err := prb.StatesOfApplicability.Get(ctx, input.ID)
soa, err := prb.StatementsOfApplicability.Get(ctx, input.ID)
if err != nil {
return nil, types.GetStateOfApplicabilityOutput{}, fmt.Errorf("failed to get state of applicability: %w", err)
return nil, types.GetStatementOfApplicabilityOutput{}, fmt.Errorf("failed to get statement of applicability: %w", err)
}
return nil, types.GetStateOfApplicabilityOutput{
StateOfApplicability: types.NewStateOfApplicability(soa),
return nil, types.GetStatementOfApplicabilityOutput{
StatementOfApplicability: types.NewStatementOfApplicability(soa),
}, nil
}
func (r *Resolver) AddStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddStateOfApplicabilityInput) (*mcp.CallToolResult, types.AddStateOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.OrganizationID, probo.ActionStateOfApplicabilityCreate)
func (r *Resolver) AddStatementOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddStatementOfApplicabilityInput) (*mcp.CallToolResult, types.AddStatementOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.OrganizationID, probo.ActionStatementOfApplicabilityCreate)
svc := r.ProboService(ctx, input.OrganizationID)
soa, err := svc.StatesOfApplicability.Create(ctx, probo.CreateStateOfApplicabilityRequest{
soa, err := svc.StatementsOfApplicability.Create(ctx, probo.CreateStatementOfApplicabilityRequest{
OrganizationID: input.OrganizationID,
Name: input.Name,
OwnerID: input.OwnerID,
})
if err != nil {
return nil, types.AddStateOfApplicabilityOutput{}, fmt.Errorf("failed to create state of applicability: %w", err)
return nil, types.AddStatementOfApplicabilityOutput{}, fmt.Errorf("failed to create statement of applicability: %w", err)
}
return nil, types.AddStateOfApplicabilityOutput{
StateOfApplicability: types.NewStateOfApplicability(soa),
return nil, types.AddStatementOfApplicabilityOutput{
StatementOfApplicability: types.NewStatementOfApplicability(soa),
}, nil
}
func (r *Resolver) UpdateStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateStateOfApplicabilityInput) (*mcp.CallToolResult, types.UpdateStateOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.ID, probo.ActionStateOfApplicabilityUpdate)
func (r *Resolver) UpdateStatementOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateStatementOfApplicabilityInput) (*mcp.CallToolResult, types.UpdateStatementOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.ID, probo.ActionStatementOfApplicabilityUpdate)
svc := r.ProboService(ctx, input.ID)
soa, err := svc.StatesOfApplicability.Update(ctx, probo.UpdateStateOfApplicabilityRequest{
StateOfApplicabilityID: input.ID,
Name: input.Name,
OwnerID: input.OwnerID,
soa, err := svc.StatementsOfApplicability.Update(ctx, probo.UpdateStatementOfApplicabilityRequest{
StatementOfApplicabilityID: input.ID,
Name: input.Name,
OwnerID: input.OwnerID,
})
if err != nil {
return nil, types.UpdateStateOfApplicabilityOutput{}, fmt.Errorf("failed to update state of applicability: %w", err)
return nil, types.UpdateStatementOfApplicabilityOutput{}, fmt.Errorf("failed to update statement of applicability: %w", err)
}
return nil, types.UpdateStateOfApplicabilityOutput{
StateOfApplicability: types.NewStateOfApplicability(soa),
return nil, types.UpdateStatementOfApplicabilityOutput{
StatementOfApplicability: types.NewStatementOfApplicability(soa),
}, nil
}
func (r *Resolver) DeleteStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteStateOfApplicabilityInput) (*mcp.CallToolResult, types.DeleteStateOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.ID, probo.ActionStateOfApplicabilityDelete)
func (r *Resolver) DeleteStatementOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteStatementOfApplicabilityInput) (*mcp.CallToolResult, types.DeleteStatementOfApplicabilityOutput, error) {
r.MustAuthorize(ctx, input.ID, probo.ActionStatementOfApplicabilityDelete)
svc := r.ProboService(ctx, input.ID)
err := svc.StatesOfApplicability.Delete(ctx, input.ID)
err := svc.StatementsOfApplicability.Delete(ctx, input.ID)
if err != nil {
return nil, types.DeleteStateOfApplicabilityOutput{}, fmt.Errorf("failed to delete state of applicability: %w", err)
return nil, types.DeleteStatementOfApplicabilityOutput{}, fmt.Errorf("failed to delete statement of applicability: %w", err)
}
return nil, types.DeleteStateOfApplicabilityOutput{
DeletedStateOfApplicabilityID: input.ID,
return nil, types.DeleteStatementOfApplicabilityOutput{
DeletedStatementOfApplicabilityID: input.ID,
}, nil
}
func (r *Resolver) ExportStateOfApplicabilityPDFTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ExportStateOfApplicabilityPDFInput) (*mcp.CallToolResult, types.ExportStateOfApplicabilityPDFOutput, error) {
r.MustAuthorize(ctx, input.ID, probo.ActionStateOfApplicabilityExport)
func (r *Resolver) ExportStatementOfApplicabilityPDFTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ExportStatementOfApplicabilityPDFInput) (*mcp.CallToolResult, types.ExportStatementOfApplicabilityPDFOutput, error) {
r.MustAuthorize(ctx, input.ID, probo.ActionStatementOfApplicabilityExport)
svc := r.ProboService(ctx, input.ID)
soa, err := svc.StatesOfApplicability.Get(ctx, input.ID)
soa, err := svc.StatementsOfApplicability.Get(ctx, input.ID)
if err != nil {
return nil, types.ExportStateOfApplicabilityPDFOutput{}, fmt.Errorf("failed to get state of applicability: %w", err)
return nil, types.ExportStatementOfApplicabilityPDFOutput{}, fmt.Errorf("failed to get statement of applicability: %w", err)
}
pdfData, err := svc.StatesOfApplicability.ExportPDF(ctx, input.ID)
pdfData, err := svc.StatementsOfApplicability.ExportPDF(ctx, input.ID)
if err != nil {
return nil, types.ExportStateOfApplicabilityPDFOutput{}, fmt.Errorf("failed to export state of applicability PDF: %w", err)
return nil, types.ExportStatementOfApplicabilityPDFOutput{}, fmt.Errorf("failed to export statement of applicability PDF: %w", err)
}
return nil, types.ExportStateOfApplicabilityPDFOutput{
return nil, types.ExportStatementOfApplicabilityPDFOutput{
PdfBase64: base64.StdEncoding.EncodeToString(pdfData),
Filename: soa.Name + ".pdf",
}, nil
}
func (r *Resolver) ListApplicabilityStatementsTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListApplicabilityStatementsInput) (*mcp.CallToolResult, types.ListApplicabilityStatementsOutput, error) {
r.MustAuthorize(ctx, input.StateOfApplicabilityID, probo.ActionApplicabilityStatementList)
r.MustAuthorize(ctx, input.StatementOfApplicabilityID, probo.ActionApplicabilityStatementList)
prb := r.ProboService(ctx, input.StateOfApplicabilityID)
prb := r.ProboService(ctx, input.StatementOfApplicabilityID)
pageOrderBy := page.OrderBy[coredata.ApplicabilityStatementOrderField]{
Field: coredata.ApplicabilityStatementOrderFieldControlSectionTitle,
@@ -2977,7 +2977,7 @@ func (r *Resolver) ListApplicabilityStatementsTool(ctx context.Context, req *mcp
cursor := types.NewCursor(input.Size, input.Cursor, pageOrderBy)
pg, err := prb.StatesOfApplicability.ListApplicabilityStatements(ctx, input.StateOfApplicabilityID, cursor)
pg, err := prb.StatementsOfApplicability.ListApplicabilityStatements(ctx, input.StatementOfApplicabilityID, cursor)
if err != nil {
return nil, types.ListApplicabilityStatementsOutput{}, fmt.Errorf("failed to list applicability statements: %w", err)
}
@@ -2990,7 +2990,7 @@ func (r *Resolver) GetApplicabilityStatementTool(ctx context.Context, req *mcp.C
prb := r.ProboService(ctx, input.ID)
stmt, err := prb.StatesOfApplicability.GetApplicabilityStatement(ctx, input.ID)
stmt, err := prb.StatementsOfApplicability.GetApplicabilityStatement(ctx, input.ID)
if err != nil {
return nil, types.GetApplicabilityStatementOutput{}, fmt.Errorf("failed to get applicability statement: %w", err)
}
@@ -3001,13 +3001,13 @@ func (r *Resolver) GetApplicabilityStatementTool(ctx context.Context, req *mcp.C
}
func (r *Resolver) AddApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddApplicabilityStatementInput) (*mcp.CallToolResult, types.AddApplicabilityStatementOutput, error) {
r.MustAuthorize(ctx, input.StateOfApplicabilityID, probo.ActionApplicabilityStatementCreate)
r.MustAuthorize(ctx, input.StatementOfApplicabilityID, probo.ActionApplicabilityStatementCreate)
svc := r.ProboService(ctx, input.StateOfApplicabilityID)
svc := r.ProboService(ctx, input.StatementOfApplicabilityID)
stmt, err := svc.StatesOfApplicability.CreateApplicabilityStatement(
stmt, err := svc.StatementsOfApplicability.CreateApplicabilityStatement(
ctx,
input.StateOfApplicabilityID,
input.StatementOfApplicabilityID,
input.ControlID,
input.Applicability,
input.Justification,
@@ -3026,7 +3026,7 @@ func (r *Resolver) UpdateApplicabilityStatementTool(ctx context.Context, req *mc
svc := r.ProboService(ctx, input.ID)
stmt, err := svc.StatesOfApplicability.UpdateApplicabilityStatement(
stmt, err := svc.StatementsOfApplicability.UpdateApplicabilityStatement(
ctx,
input.ID,
input.Applicability,
@@ -3046,7 +3046,7 @@ func (r *Resolver) DeleteApplicabilityStatementTool(ctx context.Context, req *mc
svc := r.ProboService(ctx, input.ID)
err := svc.StatesOfApplicability.DeleteApplicabilityStatement(ctx, input.ID)
err := svc.StatementsOfApplicability.DeleteApplicabilityStatement(ctx, input.ID)
if err != nil {
return nil, types.DeleteApplicabilityStatementOutput{}, fmt.Errorf("failed to delete applicability statement: %w", err)
}

View File

@@ -6076,27 +6076,27 @@ components:
$ref: "#/components/schemas/Profile"
description: List of attendee profiles
StateOfApplicabilityOrderField:
StatementOfApplicabilityOrderField:
type: string
enum:
- CREATED_AT
- NAME
go.probo.inc/mcpgen/type: go.probo.inc/probo/pkg/coredata.StateOfApplicabilityOrderField
go.probo.inc/mcpgen/type: go.probo.inc/probo/pkg/coredata.StatementOfApplicabilityOrderField
StateOfApplicabilityOrderBy:
StatementOfApplicabilityOrderBy:
type: object
required:
- field
- direction
properties:
field:
$ref: "#/components/schemas/StateOfApplicabilityOrderField"
description: State of applicability order field
$ref: "#/components/schemas/StatementOfApplicabilityOrderField"
description: Statement of applicability order field
direction:
$ref: "#/components/schemas/OrderDirection"
description: Order direction
StateOfApplicability:
StatementOfApplicability:
type: object
required:
- id
@@ -6108,13 +6108,13 @@ components:
properties:
id:
$ref: "#/components/schemas/GID"
description: State of applicability ID
description: Statement of applicability ID
organization_id:
$ref: "#/components/schemas/GID"
description: Organization ID
name:
type: string
description: State of applicability name
description: Statement of applicability name
owner_id:
$ref: "#/components/schemas/GID"
description: Owner profile ID
@@ -6132,7 +6132,7 @@ components:
format: date-time
description: Update timestamp
ListStatesOfApplicabilityInput:
ListStatementsOfApplicabilityInput:
type: object
required:
- organization_id
@@ -6141,7 +6141,7 @@ components:
$ref: "#/components/schemas/GID"
description: Organization ID
order_by:
$ref: "#/components/schemas/StateOfApplicabilityOrderBy"
$ref: "#/components/schemas/StatementOfApplicabilityOrderBy"
description: Order by
size:
type: integer
@@ -6150,37 +6150,37 @@ components:
$ref: "#/components/schemas/CursorKey"
description: Page cursor
ListStatesOfApplicabilityOutput:
ListStatementsOfApplicabilityOutput:
type: object
required:
- states_of_applicability
- statements_of_applicability
properties:
next_cursor:
$ref: "#/components/schemas/CursorKey"
description: Next cursor
states_of_applicability:
statements_of_applicability:
type: array
items:
$ref: "#/components/schemas/StateOfApplicability"
$ref: "#/components/schemas/StatementOfApplicability"
GetStateOfApplicabilityInput:
GetStatementOfApplicabilityInput:
type: object
required:
- id
properties:
id:
$ref: "#/components/schemas/GID"
description: State of applicability ID
description: Statement of applicability ID
GetStateOfApplicabilityOutput:
GetStatementOfApplicabilityOutput:
type: object
required:
- state_of_applicability
- statement_of_applicability
properties:
state_of_applicability:
$ref: "#/components/schemas/StateOfApplicability"
statement_of_applicability:
$ref: "#/components/schemas/StatementOfApplicability"
AddStateOfApplicabilityInput:
AddStatementOfApplicabilityInput:
type: object
required:
- organization_id
@@ -6192,70 +6192,70 @@ components:
description: Organization ID
name:
type: string
description: State of applicability name
description: Statement of applicability name
owner_id:
$ref: "#/components/schemas/GID"
description: Owner profile ID
AddStateOfApplicabilityOutput:
AddStatementOfApplicabilityOutput:
type: object
required:
- state_of_applicability
- statement_of_applicability
properties:
state_of_applicability:
$ref: "#/components/schemas/StateOfApplicability"
statement_of_applicability:
$ref: "#/components/schemas/StatementOfApplicability"
UpdateStateOfApplicabilityInput:
UpdateStatementOfApplicabilityInput:
type: object
required:
- id
properties:
id:
$ref: "#/components/schemas/GID"
description: State of applicability ID
description: Statement of applicability ID
name:
type: string
description: State of applicability name
description: Statement of applicability name
owner_id:
$ref: "#/components/schemas/GID"
description: Owner profile ID
UpdateStateOfApplicabilityOutput:
UpdateStatementOfApplicabilityOutput:
type: object
required:
- state_of_applicability
- statement_of_applicability
properties:
state_of_applicability:
$ref: "#/components/schemas/StateOfApplicability"
statement_of_applicability:
$ref: "#/components/schemas/StatementOfApplicability"
DeleteStateOfApplicabilityInput:
DeleteStatementOfApplicabilityInput:
type: object
required:
- id
properties:
id:
$ref: "#/components/schemas/GID"
description: State of applicability ID
description: Statement of applicability ID
DeleteStateOfApplicabilityOutput:
DeleteStatementOfApplicabilityOutput:
type: object
required:
- deleted_state_of_applicability_id
- deleted_statement_of_applicability_id
properties:
deleted_state_of_applicability_id:
deleted_statement_of_applicability_id:
$ref: "#/components/schemas/GID"
description: Deleted state of applicability ID
description: Deleted statement of applicability ID
ExportStateOfApplicabilityPDFInput:
ExportStatementOfApplicabilityPDFInput:
type: object
required:
- id
properties:
id:
$ref: "#/components/schemas/GID"
description: State of applicability ID
description: Statement of applicability ID
ExportStateOfApplicabilityPDFOutput:
ExportStatementOfApplicabilityPDFOutput:
type: object
required:
- pdf_base64
@@ -6292,7 +6292,7 @@ components:
type: object
required:
- id
- state_of_applicability_id
- statement_of_applicability_id
- control_id
- organization_id
- applicability
@@ -6302,9 +6302,9 @@ components:
id:
$ref: "#/components/schemas/GID"
description: Applicability statement ID
state_of_applicability_id:
statement_of_applicability_id:
$ref: "#/components/schemas/GID"
description: State of applicability ID
description: Statement of applicability ID
control_id:
$ref: "#/components/schemas/GID"
description: Control ID
@@ -6336,11 +6336,11 @@ components:
ListApplicabilityStatementsInput:
type: object
required:
- state_of_applicability_id
- statement_of_applicability_id
properties:
state_of_applicability_id:
statement_of_applicability_id:
$ref: "#/components/schemas/GID"
description: State of applicability ID
description: Statement of applicability ID
order_by:
$ref: "#/components/schemas/ApplicabilityStatementOrderBy"
description: Order by
@@ -6384,13 +6384,13 @@ components:
AddApplicabilityStatementInput:
type: object
required:
- state_of_applicability_id
- statement_of_applicability_id
- control_id
- applicability
properties:
state_of_applicability_id:
statement_of_applicability_id:
$ref: "#/components/schemas/GID"
description: State of applicability ID
description: Statement of applicability ID
control_id:
$ref: "#/components/schemas/GID"
description: Control ID
@@ -8526,60 +8526,60 @@ tools:
$ref: "#/components/schemas/ListMeetingAttendeesInput"
outputSchema:
$ref: "#/components/schemas/ListMeetingAttendeesOutput"
- name: listStatesOfApplicability
description: List all states of applicability for the organization
- name: listStatementsOfApplicability
description: List all statements of applicability for the organization
hints:
readonly: true
idempotent: true
inputSchema:
$ref: "#/components/schemas/ListStatesOfApplicabilityInput"
$ref: "#/components/schemas/ListStatementsOfApplicabilityInput"
outputSchema:
$ref: "#/components/schemas/ListStatesOfApplicabilityOutput"
- name: getStateOfApplicability
description: Get a state of applicability by ID
$ref: "#/components/schemas/ListStatementsOfApplicabilityOutput"
- name: getStatementOfApplicability
description: Get a statement of applicability by ID
hints:
readonly: true
idempotent: true
inputSchema:
$ref: "#/components/schemas/GetStateOfApplicabilityInput"
$ref: "#/components/schemas/GetStatementOfApplicabilityInput"
outputSchema:
$ref: "#/components/schemas/GetStateOfApplicabilityOutput"
- name: addStateOfApplicability
description: Add a new state of applicability to the organization
$ref: "#/components/schemas/GetStatementOfApplicabilityOutput"
- name: addStatementOfApplicability
description: Add a new statement of applicability to the organization
hints:
readonly: false
inputSchema:
$ref: "#/components/schemas/AddStateOfApplicabilityInput"
$ref: "#/components/schemas/AddStatementOfApplicabilityInput"
outputSchema:
$ref: "#/components/schemas/AddStateOfApplicabilityOutput"
- name: updateStateOfApplicability
description: Update an existing state of applicability
$ref: "#/components/schemas/AddStatementOfApplicabilityOutput"
- name: updateStatementOfApplicability
description: Update an existing statement of applicability
hints:
readonly: false
inputSchema:
$ref: "#/components/schemas/UpdateStateOfApplicabilityInput"
$ref: "#/components/schemas/UpdateStatementOfApplicabilityInput"
outputSchema:
$ref: "#/components/schemas/UpdateStateOfApplicabilityOutput"
- name: deleteStateOfApplicability
description: Delete a state of applicability
$ref: "#/components/schemas/UpdateStatementOfApplicabilityOutput"
- name: deleteStatementOfApplicability
description: Delete a statement of applicability
hints:
readonly: false
destructive: true
inputSchema:
$ref: "#/components/schemas/DeleteStateOfApplicabilityInput"
$ref: "#/components/schemas/DeleteStatementOfApplicabilityInput"
outputSchema:
$ref: "#/components/schemas/DeleteStateOfApplicabilityOutput"
- name: exportStateOfApplicabilityPDF
description: Export a state of applicability as a PDF document
$ref: "#/components/schemas/DeleteStatementOfApplicabilityOutput"
- name: exportStatementOfApplicabilityPDF
description: Export a statement of applicability as a PDF document
hints:
readonly: true
idempotent: true
inputSchema:
$ref: "#/components/schemas/ExportStateOfApplicabilityPDFInput"
$ref: "#/components/schemas/ExportStatementOfApplicabilityPDFInput"
outputSchema:
$ref: "#/components/schemas/ExportStateOfApplicabilityPDFOutput"
$ref: "#/components/schemas/ExportStatementOfApplicabilityPDFOutput"
- name: listApplicabilityStatements
description: List all applicability statements for a state of applicability
description: List all applicability statements for a statement of applicability
hints:
readonly: true
idempotent: true
@@ -8597,7 +8597,7 @@ tools:
outputSchema:
$ref: "#/components/schemas/GetApplicabilityStatementOutput"
- name: addApplicabilityStatement
description: Add a control to a state of applicability with an applicability decision
description: Add a control to a statement of applicability with an applicability decision
hints:
readonly: false
inputSchema:
@@ -8613,7 +8613,7 @@ tools:
outputSchema:
$ref: "#/components/schemas/UpdateApplicabilityStatementOutput"
- name: deleteApplicabilityStatement
description: Delete an applicability statement from a state of applicability
description: Delete an applicability statement from a statement of applicability
hints:
readonly: false
destructive: true

View File

@@ -18,8 +18,8 @@ import (
"go.probo.inc/probo/pkg/page"
)
func NewStateOfApplicability(s *coredata.StateOfApplicability) *StateOfApplicability {
return &StateOfApplicability{
func NewStatementOfApplicability(s *coredata.StatementOfApplicability) *StatementOfApplicability {
return &StatementOfApplicability{
ID: s.ID,
OrganizationID: s.OrganizationID,
Name: s.Name,
@@ -30,33 +30,33 @@ func NewStateOfApplicability(s *coredata.StateOfApplicability) *StateOfApplicabi
}
}
func NewListStatesOfApplicabilityOutput(pg *page.Page[*coredata.StateOfApplicability, coredata.StateOfApplicabilityOrderField]) ListStatesOfApplicabilityOutput {
items := make([]*StateOfApplicability, 0, len(pg.Data))
func NewListStatementsOfApplicabilityOutput(pg *page.Page[*coredata.StatementOfApplicability, coredata.StatementOfApplicabilityOrderField]) ListStatementsOfApplicabilityOutput {
items := make([]*StatementOfApplicability, 0, len(pg.Data))
for _, v := range pg.Data {
items = append(items, NewStateOfApplicability(v))
items = append(items, NewStatementOfApplicability(v))
}
var nextCursor *page.CursorKey
if len(pg.Data) > 0 {
cursorKey := pg.Data[len(pg.Data)-1].CursorKey(pg.Cursor.OrderBy.Field)
nextCursor = &cursorKey
}
return ListStatesOfApplicabilityOutput{
NextCursor: nextCursor,
StatesOfApplicability: items,
return ListStatementsOfApplicabilityOutput{
NextCursor: nextCursor,
StatementsOfApplicability: items,
}
}
func NewApplicabilityStatement(a *coredata.ApplicabilityStatement) *ApplicabilityStatement {
return &ApplicabilityStatement{
ID: a.ID,
StateOfApplicabilityID: a.StateOfApplicabilityID,
ControlID: a.ControlID,
OrganizationID: a.OrganizationID,
SnapshotID: a.SnapshotID,
Applicability: a.Applicability,
Justification: a.Justification,
CreatedAt: a.CreatedAt,
UpdatedAt: a.UpdatedAt,
ID: a.ID,
StatementOfApplicabilityID: a.StatementOfApplicabilityID,
ControlID: a.ControlID,
OrganizationID: a.OrganizationID,
SnapshotID: a.SnapshotID,
Applicability: a.Applicability,
Justification: a.Justification,
CreatedAt: a.CreatedAt,
UpdatedAt: a.UpdatedAt,
}
}