Add processing activity registry snapshots

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2025-08-29 16:59:54 +02:00
parent 433101fce9
commit 612149afc8
29 changed files with 831 additions and 192 deletions

View File

@@ -0,0 +1,13 @@
ALTER TYPE snapshots_type ADD VALUE 'PROCESSING_ACTIVITY_REGISTRIES';
ALTER TABLE processing_activity_registries ADD COLUMN snapshot_id TEXT;
ALTER TABLE processing_activity_registries ADD COLUMN source_id TEXT;
ALTER TABLE processing_activity_registries ADD CONSTRAINT processing_activity_registries_snapshot_id_fkey
FOREIGN KEY (snapshot_id)
REFERENCES snapshots(id)
ON UPDATE CASCADE
ON DELETE CASCADE;
ALTER TABLE processing_activity_registries ADD CONSTRAINT processing_activity_registries_source_id_snapshot_id_key
UNIQUE (source_id, snapshot_id);

View File

@@ -29,6 +29,8 @@ import (
type (
ProcessingActivityRegistry struct {
ID gid.GID `db:"id"`
SnapshotID *gid.GID `db:"snapshot_id"`
SourceID *gid.GID `db:"source_id"`
OrganizationID gid.GID `db:"organization_id"`
Name string `db:"name"`
Purpose *string `db:"purpose"`
@@ -72,6 +74,8 @@ func (p *ProcessingActivityRegistry) LoadByID(
q := `
SELECT
id,
snapshot_id,
source_id,
organization_id,
name,
purpose,
@@ -123,6 +127,7 @@ func (p *ProcessingActivityRegistries) CountByOrganizationID(
conn pg.Conn,
scope Scoper,
organizationID gid.GID,
filter *ProcessingActivityRegistryFilter,
) (int, error) {
q := `
SELECT
@@ -132,12 +137,14 @@ FROM
WHERE
%s
AND organization_id = @organization_id
AND %s
`
q = fmt.Sprintf(q, scope.SQLFragment())
q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment())
args := pgx.StrictNamedArgs{"organization_id": organizationID}
maps.Copy(args, scope.SQLArguments())
maps.Copy(args, filter.SQLArguments())
row := conn.QueryRow(ctx, q, args)
@@ -156,10 +163,13 @@ func (p *ProcessingActivityRegistries) LoadByOrganizationID(
scope Scoper,
organizationID gid.GID,
cursor *page.Cursor[ProcessingActivityRegistryOrderField],
filter *ProcessingActivityRegistryFilter,
) error {
q := `
SELECT
id,
snapshot_id,
source_id,
organization_id,
name,
purpose,
@@ -184,12 +194,14 @@ WHERE
%s
AND organization_id = @organization_id
AND %s
AND %s
`
q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment())
q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment(), cursor.SQLFragment())
args := pgx.StrictNamedArgs{"organization_id": organizationID}
maps.Copy(args, scope.SQLArguments())
maps.Copy(args, filter.SQLArguments())
maps.Copy(args, cursor.SQLArguments())
rows, err := conn.Query(ctx, q, args)
@@ -216,6 +228,8 @@ func (p *ProcessingActivityRegistry) Insert(
INSERT INTO processing_activity_registries (
id,
tenant_id,
snapshot_id,
source_id,
organization_id,
name,
purpose,
@@ -237,6 +251,8 @@ INSERT INTO processing_activity_registries (
) VALUES (
@id,
@tenant_id,
@snapshot_id,
@source_id,
@organization_id,
@name,
@purpose,
@@ -261,6 +277,8 @@ INSERT INTO processing_activity_registries (
args := pgx.StrictNamedArgs{
"id": p.ID,
"tenant_id": scope.GetTenantID(),
"snapshot_id": p.SnapshotID,
"source_id": p.SourceID,
"organization_id": p.OrganizationID,
"name": p.Name,
"purpose": p.Purpose,
@@ -316,6 +334,7 @@ SET
WHERE
%s
AND id = @id
AND snapshot_id IS NULL
`
q = fmt.Sprintf(q, scope.SQLFragment())
@@ -359,6 +378,7 @@ DELETE FROM processing_activity_registries
WHERE
%s
AND id = @id
AND snapshot_id IS NULL
`
q = fmt.Sprintf(q, scope.SQLFragment())
@@ -373,3 +393,74 @@ WHERE
return nil
}
func (pars ProcessingActivityRegistries) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
query := `
INSERT INTO processing_activity_registries (
id,
tenant_id,
snapshot_id,
source_id,
organization_id,
name,
purpose,
data_subject_category,
personal_data_category,
special_or_criminal_data,
consent_evidence_link,
lawful_basis,
recipients,
location,
international_transfers,
transfer_safeguards,
retention_period,
security_measures,
data_protection_impact_assessment,
transfer_impact_assessment,
created_at,
updated_at
)
SELECT
generate_gid(decode_base64_unpadded(@tenant_id), @processing_activity_registry_entity_type),
@tenant_id,
@snapshot_id,
par.id,
par.organization_id,
par.name,
par.purpose,
par.data_subject_category,
par.personal_data_category,
par.special_or_criminal_data,
par.consent_evidence_link,
par.lawful_basis,
par.recipients,
par.location,
par.international_transfers,
par.transfer_safeguards,
par.retention_period,
par.security_measures,
par.data_protection_impact_assessment,
par.transfer_impact_assessment,
par.created_at,
par.updated_at
FROM processing_activity_registries par
WHERE %s AND par.organization_id = @organization_id AND par.snapshot_id IS NULL
`
query = fmt.Sprintf(query, scope.SQLFragment())
args := pgx.StrictNamedArgs{
"tenant_id": scope.GetTenantID(),
"snapshot_id": snapshotID,
"organization_id": organizationID,
"processing_activity_registry_entity_type": ProcessingActivityRegistryEntityType,
}
maps.Copy(args, scope.SQLArguments())
_, err := conn.Exec(ctx, query, args)
if err != nil {
return fmt.Errorf("cannot insert processing activity registry snapshots: %w", err)
}
return nil
}

View File

@@ -0,0 +1,54 @@
// Copyright (c) 2025 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.
package coredata
import (
"github.com/getprobo/probo/pkg/gid"
"github.com/jackc/pgx/v5"
)
type (
ProcessingActivityRegistryFilter struct {
snapshotID **gid.GID
}
)
func NewProcessingActivityRegistryFilter(snapshotID **gid.GID) *ProcessingActivityRegistryFilter {
return &ProcessingActivityRegistryFilter{
snapshotID: snapshotID,
}
}
func (f *ProcessingActivityRegistryFilter) SQLArguments() pgx.NamedArgs {
args := pgx.NamedArgs{}
if f.snapshotID != nil && *f.snapshotID != nil {
args["filter_snapshot_id"] = **f.snapshotID
}
return args
}
func (f *ProcessingActivityRegistryFilter) SQLFragment() string {
if f.snapshotID == nil {
return "TRUE"
}
if *f.snapshotID == nil {
return "snapshot_id IS NULL"
} else {
return "snapshot_id = @filter_snapshot_id"
}
}

View File

@@ -31,6 +31,7 @@ const (
SnapshotsTypeNonConformityRegistries SnapshotsType = "NONCONFORMITY_REGISTRIES"
SnapshotsTypeComplianceRegistries SnapshotsType = "COMPLIANCE_REGISTRIES"
SnapshotsTypeContinualImprovementRegistries SnapshotsType = "CONTINUAL_IMPROVEMENT_REGISTRIES"
SnapshotsTypeProcessingActivityRegistries SnapshotsType = "PROCESSING_ACTIVITY_REGISTRIES"
)
func (st SnapshotsType) String() string {
@@ -63,6 +64,8 @@ func (st *SnapshotsType) Scan(value any) error {
*st = SnapshotsTypeComplianceRegistries
case SnapshotsTypeContinualImprovementRegistries.String():
*st = SnapshotsTypeContinualImprovementRegistries
case SnapshotsTypeProcessingActivityRegistries.String():
*st = SnapshotsTypeProcessingActivityRegistries
default:
return fmt.Errorf("invalid SnapshotsType value: %q", s)
}

View File

@@ -36,6 +36,8 @@ func GetSnapshottable(snapshotType SnapshotsType) (Snapshottable, error) {
return ComplianceRegistries{}, nil
case SnapshotsTypeContinualImprovementRegistries:
return ContinualImprovementRegistries{}, nil
case SnapshotsTypeProcessingActivityRegistries:
return ProcessingActivityRegistries{}, nil
default:
return nil, fmt.Errorf("unsupported snapshot type: %s", snapshotType)
}

View File

@@ -237,13 +237,14 @@ func (s ProcessingActivityRegistryService) ListForOrganizationID(
ctx context.Context,
organizationID gid.GID,
cursor *page.Cursor[coredata.ProcessingActivityRegistryOrderField],
filter *coredata.ProcessingActivityRegistryFilter,
) (*page.Page[*coredata.ProcessingActivityRegistry, coredata.ProcessingActivityRegistryOrderField], error) {
var processingActivityRegistries coredata.ProcessingActivityRegistries
err := s.svc.pg.WithConn(
ctx,
func(conn pg.Conn) error {
err := processingActivityRegistries.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor)
err := processingActivityRegistries.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor, filter)
if err != nil {
return fmt.Errorf("cannot load processing activity registries: %w", err)
}
@@ -262,6 +263,7 @@ func (s ProcessingActivityRegistryService) ListForOrganizationID(
func (s ProcessingActivityRegistryService) CountForOrganizationID(
ctx context.Context,
organizationID gid.GID,
filter *coredata.ProcessingActivityRegistryFilter,
) (int, error) {
var count int
@@ -269,7 +271,7 @@ func (s ProcessingActivityRegistryService) CountForOrganizationID(
ctx,
func(conn pg.Conn) (err error) {
processingActivityRegistries := coredata.ProcessingActivityRegistries{}
count, err = processingActivityRegistries.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID)
count, err = processingActivityRegistries.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
if err != nil {
return fmt.Errorf("cannot count processing activity registries: %w", err)
}

View File

@@ -880,6 +880,10 @@ enum SnapshotsType
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeContinualImprovementRegistries"
)
PROCESSING_ACTIVITY_REGISTRIES
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeProcessingActivityRegistries"
)
}
enum SnapshotOrderField
@@ -1122,6 +1126,10 @@ input ContinualImprovementRegistryFilter {
snapshotId: ID
}
input ProcessingActivityRegistryFilter {
snapshotId: ID
}
# Core Types
type TrustCenter implements Node {
id: ID!
@@ -1288,6 +1296,7 @@ type Organization implements Node {
last: Int
before: CursorKey
orderBy: ProcessingActivityRegistryOrder
filter: ProcessingActivityRegistryFilter
): ProcessingActivityRegistryConnection! @goField(forceResolver: true)
snapshots(
@@ -1770,6 +1779,8 @@ type ContinualImprovementRegistry implements Node {
type ProcessingActivityRegistry implements Node {
id: ID!
snapshotId: ID
sourceId: ID
organization: Organization! @goField(forceResolver: true)
name: String!
purpose: String

View File

@@ -889,7 +889,7 @@ type ComplexityRoot struct {
Name func(childComplexity int) int
NonconformityRegistries func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.NonconformityRegistryOrderBy, filter *types.NonconformityRegistryFilter) int
Peoples func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.PeopleOrderBy, filter *types.PeopleFilter) int
ProcessingActivityRegistries func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ProcessingActivityRegistryOrderBy) int
ProcessingActivityRegistries func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ProcessingActivityRegistryOrderBy, filter *types.ProcessingActivityRegistryFilter) int
Risks func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.RiskOrderBy, filter *types.RiskFilter) int
Snapshots func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.SnapshotOrderBy) int
Tasks func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.TaskOrderBy) int
@@ -956,6 +956,8 @@ type ComplexityRoot struct {
Recipients func(childComplexity int) int
RetentionPeriod func(childComplexity int) int
SecurityMeasures func(childComplexity int) int
SnapshotID func(childComplexity int) int
SourceID func(childComplexity int) int
SpecialOrCriminalData func(childComplexity int) int
TransferImpactAssessment func(childComplexity int) int
TransferSafeguards func(childComplexity int) int
@@ -1675,7 +1677,7 @@ type OrganizationResolver interface {
NonconformityRegistries(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.NonconformityRegistryOrderBy, filter *types.NonconformityRegistryFilter) (*types.NonconformityRegistryConnection, error)
ComplianceRegistries(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ComplianceRegistryOrderBy, filter *types.ComplianceRegistryFilter) (*types.ComplianceRegistryConnection, error)
ContinualImprovementRegistries(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ContinualImprovementRegistriesOrderBy, filter *types.ContinualImprovementRegistryFilter) (*types.ContinualImprovementRegistryConnection, error)
ProcessingActivityRegistries(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ProcessingActivityRegistryOrderBy) (*types.ProcessingActivityRegistryConnection, error)
ProcessingActivityRegistries(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ProcessingActivityRegistryOrderBy, filter *types.ProcessingActivityRegistryFilter) (*types.ProcessingActivityRegistryConnection, error)
Snapshots(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.SnapshotOrderBy) (*types.SnapshotConnection, error)
TrustCenter(ctx context.Context, obj *types.Organization) (*types.TrustCenter, error)
}
@@ -5550,7 +5552,7 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
return 0, false
}
return e.complexity.Organization.ProcessingActivityRegistries(childComplexity, args["first"].(*int), args["after"].(*page.CursorKey), args["last"].(*int), args["before"].(*page.CursorKey), args["orderBy"].(*types.ProcessingActivityRegistryOrderBy)), true
return e.complexity.Organization.ProcessingActivityRegistries(childComplexity, args["first"].(*int), args["after"].(*page.CursorKey), args["last"].(*int), args["before"].(*page.CursorKey), args["orderBy"].(*types.ProcessingActivityRegistryOrderBy), args["filter"].(*types.ProcessingActivityRegistryFilter)), true
case "Organization.risks":
if e.complexity.Organization.Risks == nil {
@@ -5892,6 +5894,20 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
return e.complexity.ProcessingActivityRegistry.SecurityMeasures(childComplexity), true
case "ProcessingActivityRegistry.snapshotId":
if e.complexity.ProcessingActivityRegistry.SnapshotID == nil {
break
}
return e.complexity.ProcessingActivityRegistry.SnapshotID(childComplexity), true
case "ProcessingActivityRegistry.sourceId":
if e.complexity.ProcessingActivityRegistry.SourceID == nil {
break
}
return e.complexity.ProcessingActivityRegistry.SourceID(childComplexity), true
case "ProcessingActivityRegistry.specialOrCriminalData":
if e.complexity.ProcessingActivityRegistry.SpecialOrCriminalData == nil {
break
@@ -7780,6 +7796,7 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler {
ec.unmarshalInputOrganizationOrder,
ec.unmarshalInputPeopleFilter,
ec.unmarshalInputPeopleOrder,
ec.unmarshalInputProcessingActivityRegistryFilter,
ec.unmarshalInputProcessingActivityRegistryOrder,
ec.unmarshalInputPublishDocumentVersionInput,
ec.unmarshalInputRemoveUserInput,
@@ -8806,6 +8823,10 @@ enum SnapshotsType
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeContinualImprovementRegistries"
)
PROCESSING_ACTIVITY_REGISTRIES
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeProcessingActivityRegistries"
)
}
enum SnapshotOrderField
@@ -9048,6 +9069,10 @@ input ContinualImprovementRegistryFilter {
snapshotId: ID
}
input ProcessingActivityRegistryFilter {
snapshotId: ID
}
# Core Types
type TrustCenter implements Node {
id: ID!
@@ -9214,6 +9239,7 @@ type Organization implements Node {
last: Int
before: CursorKey
orderBy: ProcessingActivityRegistryOrder
filter: ProcessingActivityRegistryFilter
): ProcessingActivityRegistryConnection! @goField(forceResolver: true)
snapshots(
@@ -9696,6 +9722,8 @@ type ContinualImprovementRegistry implements Node {
type ProcessingActivityRegistry implements Node {
id: ID!
snapshotId: ID
sourceId: ID
organization: Organization! @goField(forceResolver: true)
name: String!
purpose: String
@@ -17139,6 +17167,11 @@ func (ec *executionContext) field_Organization_processingActivityRegistries_args
return nil, err
}
args["orderBy"] = arg4
arg5, err := ec.field_Organization_processingActivityRegistries_argsFilter(ctx, rawArgs)
if err != nil {
return nil, err
}
args["filter"] = arg5
return args, nil
}
func (ec *executionContext) field_Organization_processingActivityRegistries_argsFirst(
@@ -17206,6 +17239,19 @@ func (ec *executionContext) field_Organization_processingActivityRegistries_args
return zeroVal, nil
}
func (ec *executionContext) field_Organization_processingActivityRegistries_argsFilter(
ctx context.Context,
rawArgs map[string]any,
) (*types.ProcessingActivityRegistryFilter, error) {
ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("filter"))
if tmp, ok := rawArgs["filter"]; ok {
return ec.unmarshalOProcessingActivityRegistryFilter2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐProcessingActivityRegistryFilter(ctx, tmp)
}
var zeroVal *types.ProcessingActivityRegistryFilter
return zeroVal, nil
}
func (ec *executionContext) field_Organization_risks_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
var err error
args := map[string]any{}
@@ -42331,7 +42377,7 @@ func (ec *executionContext) _Organization_processingActivityRegistries(ctx conte
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Organization().ProcessingActivityRegistries(rctx, obj, fc.Args["first"].(*int), fc.Args["after"].(*page.CursorKey), fc.Args["last"].(*int), fc.Args["before"].(*page.CursorKey), fc.Args["orderBy"].(*types.ProcessingActivityRegistryOrderBy))
return ec.resolvers.Organization().ProcessingActivityRegistries(rctx, obj, fc.Args["first"].(*int), fc.Args["after"].(*page.CursorKey), fc.Args["last"].(*int), fc.Args["before"].(*page.CursorKey), fc.Args["orderBy"].(*types.ProcessingActivityRegistryOrderBy), fc.Args["filter"].(*types.ProcessingActivityRegistryFilter))
})
if err != nil {
ec.Error(ctx, err)
@@ -43733,6 +43779,88 @@ func (ec *executionContext) fieldContext_ProcessingActivityRegistry_id(_ context
return fc, nil
}
func (ec *executionContext) _ProcessingActivityRegistry_snapshotId(ctx context.Context, field graphql.CollectedField, obj *types.ProcessingActivityRegistry) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_ProcessingActivityRegistry_snapshotId(ctx, field)
if err != nil {
return graphql.Null
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
ctx = rctx // use context from middleware stack in children
return obj.SnapshotID, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
return graphql.Null
}
res := resTmp.(*gid.GID)
fc.Result = res
return ec.marshalOID2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_ProcessingActivityRegistry_snapshotId(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "ProcessingActivityRegistry",
Field: field,
IsMethod: false,
IsResolver: false,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
return nil, errors.New("field of type ID does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _ProcessingActivityRegistry_sourceId(ctx context.Context, field graphql.CollectedField, obj *types.ProcessingActivityRegistry) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_ProcessingActivityRegistry_sourceId(ctx, field)
if err != nil {
return graphql.Null
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
ctx = rctx // use context from middleware stack in children
return obj.SourceID, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
return graphql.Null
}
res := resTmp.(*gid.GID)
fc.Result = res
return ec.marshalOID2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_ProcessingActivityRegistry_sourceId(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "ProcessingActivityRegistry",
Field: field,
IsMethod: false,
IsResolver: false,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
return nil, errors.New("field of type ID does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _ProcessingActivityRegistry_organization(ctx context.Context, field graphql.CollectedField, obj *types.ProcessingActivityRegistry) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_ProcessingActivityRegistry_organization(ctx, field)
if err != nil {
@@ -44781,6 +44909,10 @@ func (ec *executionContext) fieldContext_ProcessingActivityRegistryEdge_node(_ c
switch field.Name {
case "id":
return ec.fieldContext_ProcessingActivityRegistry_id(ctx, field)
case "snapshotId":
return ec.fieldContext_ProcessingActivityRegistry_snapshotId(ctx, field)
case "sourceId":
return ec.fieldContext_ProcessingActivityRegistry_sourceId(ctx, field)
case "organization":
return ec.fieldContext_ProcessingActivityRegistry_organization(ctx, field)
case "name":
@@ -50682,6 +50814,10 @@ func (ec *executionContext) fieldContext_UpdateProcessingActivityRegistryPayload
switch field.Name {
case "id":
return ec.fieldContext_ProcessingActivityRegistry_id(ctx, field)
case "snapshotId":
return ec.fieldContext_ProcessingActivityRegistry_snapshotId(ctx, field)
case "sourceId":
return ec.fieldContext_ProcessingActivityRegistry_sourceId(ctx, field)
case "organization":
return ec.fieldContext_ProcessingActivityRegistry_organization(ctx, field)
case "name":
@@ -63407,6 +63543,33 @@ func (ec *executionContext) unmarshalInputPeopleOrder(ctx context.Context, obj a
return it, nil
}
func (ec *executionContext) unmarshalInputProcessingActivityRegistryFilter(ctx context.Context, obj any) (types.ProcessingActivityRegistryFilter, error) {
var it types.ProcessingActivityRegistryFilter
asMap := map[string]any{}
for k, v := range obj.(map[string]any) {
asMap[k] = v
}
fieldsInOrder := [...]string{"snapshotId"}
for _, k := range fieldsInOrder {
v, ok := asMap[k]
if !ok {
continue
}
switch k {
case "snapshotId":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("snapshotId"))
data, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, v)
if err != nil {
return it, err
}
it.SnapshotID = data
}
}
return it, nil
}
func (ec *executionContext) unmarshalInputProcessingActivityRegistryOrder(ctx context.Context, obj any) (types.ProcessingActivityRegistryOrderBy, error) {
var it types.ProcessingActivityRegistryOrderBy
asMap := map[string]any{}
@@ -75118,6 +75281,10 @@ func (ec *executionContext) _ProcessingActivityRegistry(ctx context.Context, sel
if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1)
}
case "snapshotId":
out.Values[i] = ec._ProcessingActivityRegistry_snapshotId(ctx, field, obj)
case "sourceId":
out.Values[i] = ec._ProcessingActivityRegistry_sourceId(ctx, field, obj)
case "organization":
field := field
@@ -84978,6 +85145,7 @@ var (
"NONCONFORMITY_REGISTRIES": coredata.SnapshotsTypeNonConformityRegistries,
"COMPLIANCE_REGISTRIES": coredata.SnapshotsTypeComplianceRegistries,
"CONTINUAL_IMPROVEMENT_REGISTRIES": coredata.SnapshotsTypeContinualImprovementRegistries,
"PROCESSING_ACTIVITY_REGISTRIES": coredata.SnapshotsTypeProcessingActivityRegistries,
}
marshalNSnapshotsType2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐSnapshotsType = map[coredata.SnapshotsType]string{
coredata.SnapshotsTypeRisks: "RISKS",
@@ -84987,6 +85155,7 @@ var (
coredata.SnapshotsTypeNonConformityRegistries: "NONCONFORMITY_REGISTRIES",
coredata.SnapshotsTypeComplianceRegistries: "COMPLIANCE_REGISTRIES",
coredata.SnapshotsTypeContinualImprovementRegistries: "CONTINUAL_IMPROVEMENT_REGISTRIES",
coredata.SnapshotsTypeProcessingActivityRegistries: "PROCESSING_ACTIVITY_REGISTRIES",
}
)
@@ -87738,6 +87907,14 @@ var (
}
)
func (ec *executionContext) unmarshalOProcessingActivityRegistryFilter2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐProcessingActivityRegistryFilter(ctx context.Context, v any) (*types.ProcessingActivityRegistryFilter, error) {
if v == nil {
return nil, nil
}
res, err := ec.unmarshalInputProcessingActivityRegistryFilter(ctx, v)
return &res, graphql.ErrorOnPath(ctx, err)
}
func (ec *executionContext) unmarshalOProcessingActivityRegistryLawfulBasis2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐProcessingActivityRegistryLawfulBasis(ctx context.Context, v any) (*coredata.ProcessingActivityRegistryLawfulBasis, error) {
if v == nil {
return nil, nil

View File

@@ -30,6 +30,7 @@ type (
Resolver any
ParentID gid.GID
Filter *ProcessingActivityRegistryFilter
}
)
@@ -37,6 +38,7 @@ func NewProcessingActivityRegistryConnection(
p *page.Page[*coredata.ProcessingActivityRegistry, coredata.ProcessingActivityRegistryOrderField],
parentType any,
parentID gid.GID,
filter *ProcessingActivityRegistryFilter,
) *ProcessingActivityRegistryConnection {
edges := make([]*ProcessingActivityRegistryEdge, len(p.Data))
for i, registry := range p.Data {
@@ -49,12 +51,14 @@ func NewProcessingActivityRegistryConnection(
Resolver: parentType,
ParentID: parentID,
Filter: filter,
}
}
func NewProcessingActivityRegistry(par *coredata.ProcessingActivityRegistry) *ProcessingActivityRegistry {
return &ProcessingActivityRegistry{
ID: par.ID,
SnapshotID: par.SnapshotID,
Name: par.Name,
Purpose: par.Purpose,
DataSubjectCategory: par.DataSubjectCategory,

View File

@@ -1239,6 +1239,8 @@ type PeopleFilter struct {
type ProcessingActivityRegistry struct {
ID gid.GID `json:"id"`
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
SourceID *gid.GID `json:"sourceId,omitempty"`
Organization *Organization `json:"organization"`
Name string `json:"name"`
Purpose *string `json:"purpose,omitempty"`
@@ -1267,6 +1269,10 @@ type ProcessingActivityRegistryEdge struct {
Node *ProcessingActivityRegistry `json:"node"`
}
type ProcessingActivityRegistryFilter struct {
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
}
type PublishDocumentVersionInput struct {
DocumentID gid.GID `json:"documentId"`
Changelog *string `json:"changelog,omitempty"`

View File

@@ -3797,7 +3797,7 @@ func (r *organizationResolver) ContinualImprovementRegistries(ctx context.Contex
}
// ProcessingActivityRegistries is the resolver for the processingActivityRegistries field.
func (r *organizationResolver) ProcessingActivityRegistries(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ProcessingActivityRegistryOrderBy) (*types.ProcessingActivityRegistryConnection, error) {
func (r *organizationResolver) ProcessingActivityRegistries(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ProcessingActivityRegistryOrderBy, filter *types.ProcessingActivityRegistryFilter) (*types.ProcessingActivityRegistryConnection, error) {
prb := r.ProboService(ctx, obj.ID.TenantID())
pageOrderBy := page.OrderBy[coredata.ProcessingActivityRegistryOrderField]{
@@ -3814,12 +3814,17 @@ func (r *organizationResolver) ProcessingActivityRegistries(ctx context.Context,
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
page, err := prb.ProcessingActivityRegistries.ListForOrganizationID(ctx, obj.ID, cursor)
processingActivityRegistryFilter := coredata.NewProcessingActivityRegistryFilter(nil)
if filter != nil {
processingActivityRegistryFilter = coredata.NewProcessingActivityRegistryFilter(&filter.SnapshotID)
}
page, err := prb.ProcessingActivityRegistries.ListForOrganizationID(ctx, obj.ID, cursor, processingActivityRegistryFilter)
if err != nil {
panic(fmt.Errorf("cannot list organization processing activity registries: %w", err))
}
return types.NewProcessingActivityRegistryConnection(page, r, obj.ID), nil
return types.NewProcessingActivityRegistryConnection(page, r, obj.ID, filter), nil
}
// Snapshots is the resolver for the snapshots field.
@@ -3898,7 +3903,12 @@ func (r *processingActivityRegistryConnectionResolver) TotalCount(ctx context.Co
switch obj.Resolver.(type) {
case *organizationResolver:
count, err := prb.ProcessingActivityRegistries.CountForOrganizationID(ctx, obj.ParentID)
processingActivityRegistryFilter := coredata.NewProcessingActivityRegistryFilter(nil)
if obj.Filter != nil {
processingActivityRegistryFilter = coredata.NewProcessingActivityRegistryFilter(&obj.Filter.SnapshotID)
}
count, err := prb.ProcessingActivityRegistries.CountForOrganizationID(ctx, obj.ParentID, processingActivityRegistryFilter)
if err != nil {
panic(fmt.Errorf("cannot count organization processing activity registries: %w", err))
}