@@ -1,421 +0,0 @@
|
||||
// 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 (
|
||||
"context"
|
||||
"fmt"
|
||||
"maps"
|
||||
"time"
|
||||
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type (
|
||||
ComplianceRegistry struct {
|
||||
ID gid.GID `db:"id"`
|
||||
OrganizationID gid.GID `db:"organization_id"`
|
||||
ReferenceID string `db:"reference_id"`
|
||||
Area *string `db:"area"`
|
||||
Source *string `db:"source"`
|
||||
Requirement *string `db:"requirement"`
|
||||
ActionsToBeImplemented *string `db:"actions_to_be_implemented"`
|
||||
Regulator *string `db:"regulator"`
|
||||
OwnerID gid.GID `db:"owner_id"`
|
||||
LastReviewDate *time.Time `db:"last_review_date"`
|
||||
DueDate *time.Time `db:"due_date"`
|
||||
Status ComplianceRegistryStatus `db:"status"`
|
||||
SnapshotID *gid.GID `db:"snapshot_id"`
|
||||
SourceID *gid.GID `db:"source_id"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
|
||||
ComplianceRegistries []*ComplianceRegistry
|
||||
)
|
||||
|
||||
func (cr *ComplianceRegistry) CursorKey(field ComplianceRegistryOrderField) page.CursorKey {
|
||||
switch field {
|
||||
case ComplianceRegistryOrderFieldCreatedAt:
|
||||
return page.NewCursorKey(cr.ID, cr.CreatedAt)
|
||||
case ComplianceRegistryOrderFieldLastReviewDate:
|
||||
return page.NewCursorKey(cr.ID, cr.LastReviewDate)
|
||||
case ComplianceRegistryOrderFieldDueDate:
|
||||
return page.NewCursorKey(cr.ID, cr.DueDate)
|
||||
case ComplianceRegistryOrderFieldStatus:
|
||||
return page.NewCursorKey(cr.ID, cr.Status)
|
||||
case ComplianceRegistryOrderFieldReferenceId:
|
||||
return page.NewCursorKey(cr.ID, cr.ReferenceID)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("unsupported order by: %s", field))
|
||||
}
|
||||
|
||||
func (cr *ComplianceRegistry) LoadByID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
complianceRegistryID gid.GID,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
reference_id,
|
||||
area,
|
||||
source,
|
||||
requirement,
|
||||
actions_to_be_implemented,
|
||||
regulator,
|
||||
owner_id,
|
||||
last_review_date,
|
||||
due_date,
|
||||
status,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
compliance_registries
|
||||
WHERE
|
||||
%s
|
||||
AND id = @compliance_registry_id
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"compliance_registry_id": complianceRegistryID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query compliance registry: %w", err)
|
||||
}
|
||||
|
||||
registry, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[ComplianceRegistry])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect compliance registry: %w", err)
|
||||
}
|
||||
|
||||
*cr = registry
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (crs *ComplianceRegistries) CountByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
filter *ComplianceRegistryFilter,
|
||||
) (int, error) {
|
||||
q := `
|
||||
SELECT
|
||||
COUNT(id)
|
||||
FROM
|
||||
compliance_registries
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
|
||||
var count int
|
||||
err := row.Scan(&count)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("cannot count compliance registries: %w", err)
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (crs *ComplianceRegistries) LoadByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[ComplianceRegistryOrderField],
|
||||
filter *ComplianceRegistryFilter,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
area,
|
||||
source,
|
||||
requirement,
|
||||
actions_to_be_implemented,
|
||||
regulator,
|
||||
owner_id,
|
||||
last_review_date,
|
||||
due_date,
|
||||
status,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
compliance_registries
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query compliance registries: %w", err)
|
||||
}
|
||||
|
||||
registries, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[ComplianceRegistry])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect compliance registries: %w", err)
|
||||
}
|
||||
|
||||
*crs = registries
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cr *ComplianceRegistry) Insert(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
INSERT INTO compliance_registries (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
area,
|
||||
source,
|
||||
requirement,
|
||||
actions_to_be_implemented,
|
||||
regulator,
|
||||
owner_id,
|
||||
last_review_date,
|
||||
due_date,
|
||||
status,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
@id,
|
||||
@tenant_id,
|
||||
@organization_id,
|
||||
@reference_id,
|
||||
@area,
|
||||
@source,
|
||||
@requirement,
|
||||
@actions_to_be_implemented,
|
||||
@regulator,
|
||||
@owner_id,
|
||||
@last_review_date,
|
||||
@due_date,
|
||||
@status,
|
||||
@snapshot_id,
|
||||
@source_id,
|
||||
@created_at,
|
||||
@updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": cr.ID,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"organization_id": cr.OrganizationID,
|
||||
"reference_id": cr.ReferenceID,
|
||||
"area": cr.Area,
|
||||
"source": cr.Source,
|
||||
"requirement": cr.Requirement,
|
||||
"actions_to_be_implemented": cr.ActionsToBeImplemented,
|
||||
"regulator": cr.Regulator,
|
||||
"owner_id": cr.OwnerID,
|
||||
"last_review_date": cr.LastReviewDate,
|
||||
"due_date": cr.DueDate,
|
||||
"status": cr.Status,
|
||||
"snapshot_id": cr.SnapshotID,
|
||||
"source_id": cr.SourceID,
|
||||
"created_at": cr.CreatedAt,
|
||||
"updated_at": cr.UpdatedAt,
|
||||
}
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert compliance registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cr *ComplianceRegistry) Update(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
UPDATE compliance_registries SET
|
||||
reference_id = @reference_id,
|
||||
area = @area,
|
||||
source = @source,
|
||||
requirement = @requirement,
|
||||
actions_to_be_implemented = @actions_to_be_implemented,
|
||||
regulator = @regulator,
|
||||
owner_id = @owner_id,
|
||||
last_review_date = @last_review_date,
|
||||
due_date = @due_date,
|
||||
status = @status,
|
||||
updated_at = @updated_at
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
AND snapshot_id IS NULL
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": cr.ID,
|
||||
"reference_id": cr.ReferenceID,
|
||||
"area": cr.Area,
|
||||
"source": cr.Source,
|
||||
"requirement": cr.Requirement,
|
||||
"actions_to_be_implemented": cr.ActionsToBeImplemented,
|
||||
"regulator": cr.Regulator,
|
||||
"owner_id": cr.OwnerID,
|
||||
"last_review_date": cr.LastReviewDate,
|
||||
"due_date": cr.DueDate,
|
||||
"status": cr.Status,
|
||||
"updated_at": cr.UpdatedAt,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot update compliance registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cr *ComplianceRegistry) Delete(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM compliance_registries
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
AND snapshot_id IS NULL
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"id": cr.ID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete compliance registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (crs ComplianceRegistries) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
|
||||
query := `
|
||||
INSERT INTO compliance_registries (
|
||||
id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
area,
|
||||
source,
|
||||
requirement,
|
||||
actions_to_be_implemented,
|
||||
regulator,
|
||||
owner_id,
|
||||
last_review_date,
|
||||
due_date,
|
||||
status,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @compliance_registry_entity_type),
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
r.id,
|
||||
r.organization_id,
|
||||
r.reference_id,
|
||||
r.area,
|
||||
r.source,
|
||||
r.requirement,
|
||||
r.actions_to_be_implemented,
|
||||
r.regulator,
|
||||
r.owner_id,
|
||||
r.last_review_date,
|
||||
r.due_date,
|
||||
r.status,
|
||||
r.created_at,
|
||||
r.updated_at
|
||||
FROM compliance_registries r
|
||||
WHERE %s AND r.organization_id = @organization_id AND r.snapshot_id IS NULL
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"snapshot_id": snapshotID,
|
||||
"organization_id": organizationID,
|
||||
"compliance_registry_entity_type": ComplianceRegistryEntityType,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, query, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert compliance registry snapshots: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
// 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 (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ComplianceRegistryOrderField string
|
||||
|
||||
const (
|
||||
ComplianceRegistryOrderFieldCreatedAt ComplianceRegistryOrderField = "CREATED_AT"
|
||||
ComplianceRegistryOrderFieldLastReviewDate ComplianceRegistryOrderField = "LAST_REVIEW_DATE"
|
||||
ComplianceRegistryOrderFieldDueDate ComplianceRegistryOrderField = "DUE_DATE"
|
||||
ComplianceRegistryOrderFieldStatus ComplianceRegistryOrderField = "STATUS"
|
||||
ComplianceRegistryOrderFieldReferenceId ComplianceRegistryOrderField = "REFERENCE_ID"
|
||||
)
|
||||
|
||||
func (p ComplianceRegistryOrderField) Column() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ComplianceRegistryOrderField) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ComplianceRegistryOrderField) MarshalText() ([]byte, error) {
|
||||
return []byte(p.String()), nil
|
||||
}
|
||||
|
||||
func (p *ComplianceRegistryOrderField) UnmarshalText(text []byte) error {
|
||||
val := string(text)
|
||||
switch val {
|
||||
case string(ComplianceRegistryOrderFieldCreatedAt),
|
||||
string(ComplianceRegistryOrderFieldLastReviewDate),
|
||||
string(ComplianceRegistryOrderFieldDueDate),
|
||||
string(ComplianceRegistryOrderFieldStatus),
|
||||
string(ComplianceRegistryOrderFieldReferenceId):
|
||||
*p = ComplianceRegistryOrderField(val)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid ComplianceRegistryOrderField value: %q", val)
|
||||
}
|
||||
@@ -20,18 +20,18 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
NonconformityRegistryFilter struct {
|
||||
ContinualImprovementFilter struct {
|
||||
snapshotID **gid.GID
|
||||
}
|
||||
)
|
||||
|
||||
func NewNonconformityRegistryFilter(snapshotID **gid.GID) *NonconformityRegistryFilter {
|
||||
return &NonconformityRegistryFilter{
|
||||
func NewContinualImprovementFilter(snapshotID **gid.GID) *ContinualImprovementFilter {
|
||||
return &ContinualImprovementFilter{
|
||||
snapshotID: snapshotID,
|
||||
}
|
||||
}
|
||||
|
||||
func (f *NonconformityRegistryFilter) SQLArguments() pgx.NamedArgs {
|
||||
func (f *ContinualImprovementFilter) SQLArguments() pgx.NamedArgs {
|
||||
args := pgx.NamedArgs{}
|
||||
|
||||
if f.snapshotID != nil && *f.snapshotID != nil {
|
||||
@@ -41,7 +41,7 @@ func (f *NonconformityRegistryFilter) SQLArguments() pgx.NamedArgs {
|
||||
return args
|
||||
}
|
||||
|
||||
func (f *NonconformityRegistryFilter) SQLFragment() string {
|
||||
func (f *ContinualImprovementFilter) SQLFragment() string {
|
||||
if f.snapshotID == nil {
|
||||
return "TRUE"
|
||||
}
|
||||
55
pkg/coredata/continual_improvement_order_field.go
Normal file
55
pkg/coredata/continual_improvement_order_field.go
Normal file
@@ -0,0 +1,55 @@
|
||||
// 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 (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ContinualImprovementOrderField string
|
||||
|
||||
const (
|
||||
ContinualImprovementOrderFieldCreatedAt ContinualImprovementOrderField = "CREATED_AT"
|
||||
ContinualImprovementOrderFieldTargetDate ContinualImprovementOrderField = "TARGET_DATE"
|
||||
ContinualImprovementOrderFieldStatus ContinualImprovementOrderField = "STATUS"
|
||||
ContinualImprovementOrderFieldPriority ContinualImprovementOrderField = "PRIORITY"
|
||||
ContinualImprovementOrderFieldReferenceId ContinualImprovementOrderField = "REFERENCE_ID"
|
||||
)
|
||||
|
||||
func (p ContinualImprovementOrderField) Column() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ContinualImprovementOrderField) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ContinualImprovementOrderField) MarshalText() ([]byte, error) {
|
||||
return []byte(p.String()), nil
|
||||
}
|
||||
|
||||
func (p *ContinualImprovementOrderField) UnmarshalText(text []byte) error {
|
||||
val := string(text)
|
||||
switch val {
|
||||
case string(ContinualImprovementOrderFieldCreatedAt),
|
||||
string(ContinualImprovementOrderFieldTargetDate),
|
||||
string(ContinualImprovementOrderFieldStatus),
|
||||
string(ContinualImprovementOrderFieldPriority),
|
||||
string(ContinualImprovementOrderFieldReferenceId):
|
||||
*p = ContinualImprovementOrderField(val)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid ContinualImprovementOrderField value: %q", val)
|
||||
}
|
||||
@@ -19,19 +19,19 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ContinualImprovementRegistriesPriority string
|
||||
type ContinualImprovementPriority string
|
||||
|
||||
const (
|
||||
ContinualImprovementRegistriesPriorityLow ContinualImprovementRegistriesPriority = "LOW"
|
||||
ContinualImprovementRegistriesPriorityMedium ContinualImprovementRegistriesPriority = "MEDIUM"
|
||||
ContinualImprovementRegistriesPriorityHigh ContinualImprovementRegistriesPriority = "HIGH"
|
||||
ContinualImprovementPriorityLow ContinualImprovementPriority = "LOW"
|
||||
ContinualImprovementPriorityMedium ContinualImprovementPriority = "MEDIUM"
|
||||
ContinualImprovementPriorityHigh ContinualImprovementPriority = "HIGH"
|
||||
)
|
||||
|
||||
func (cirp ContinualImprovementRegistriesPriority) String() string {
|
||||
return string(cirp)
|
||||
func (cip ContinualImprovementPriority) String() string {
|
||||
return string(cip)
|
||||
}
|
||||
|
||||
func (cirp *ContinualImprovementRegistriesPriority) Scan(value any) error {
|
||||
func (cip *ContinualImprovementPriority) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
@@ -39,22 +39,22 @@ func (cirp *ContinualImprovementRegistriesPriority) Scan(value any) error {
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ContinualImprovementRegistriesPriority: %T", value)
|
||||
return fmt.Errorf("unsupported type for ContinualImprovementPriority: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "LOW":
|
||||
*cirp = ContinualImprovementRegistriesPriorityLow
|
||||
*cip = ContinualImprovementPriorityLow
|
||||
case "MEDIUM":
|
||||
*cirp = ContinualImprovementRegistriesPriorityMedium
|
||||
*cip = ContinualImprovementPriorityMedium
|
||||
case "HIGH":
|
||||
*cirp = ContinualImprovementRegistriesPriorityHigh
|
||||
*cip = ContinualImprovementPriorityHigh
|
||||
default:
|
||||
return fmt.Errorf("invalid ContinualImprovementRegistriesPriority value: %q", s)
|
||||
return fmt.Errorf("invalid ContinualImprovementPriority value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cirp ContinualImprovementRegistriesPriority) Value() (driver.Value, error) {
|
||||
return cirp.String(), nil
|
||||
func (cip ContinualImprovementPriority) Value() (driver.Value, error) {
|
||||
return cip.String(), nil
|
||||
}
|
||||
@@ -1,383 +0,0 @@
|
||||
// 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 (
|
||||
"context"
|
||||
"fmt"
|
||||
"maps"
|
||||
"time"
|
||||
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type (
|
||||
ContinualImprovementRegistry struct {
|
||||
ID gid.GID `db:"id"`
|
||||
OrganizationID gid.GID `db:"organization_id"`
|
||||
ReferenceID string `db:"reference_id"`
|
||||
Description *string `db:"description"`
|
||||
Source *string `db:"source"`
|
||||
OwnerID gid.GID `db:"owner_id"`
|
||||
TargetDate *time.Time `db:"target_date"`
|
||||
Status ContinualImprovementRegistriesStatus `db:"status"`
|
||||
Priority ContinualImprovementRegistriesPriority `db:"priority"`
|
||||
SnapshotID *gid.GID `db:"snapshot_id"`
|
||||
SourceID *gid.GID `db:"source_id"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
|
||||
ContinualImprovementRegistries []*ContinualImprovementRegistry
|
||||
)
|
||||
|
||||
func (cir *ContinualImprovementRegistry) CursorKey(field ContinualImprovementRegistriesOrderField) page.CursorKey {
|
||||
switch field {
|
||||
case ContinualImprovementRegistriesOrderFieldCreatedAt:
|
||||
return page.NewCursorKey(cir.ID, cir.CreatedAt)
|
||||
case ContinualImprovementRegistriesOrderFieldTargetDate:
|
||||
return page.NewCursorKey(cir.ID, cir.TargetDate)
|
||||
case ContinualImprovementRegistriesOrderFieldStatus:
|
||||
return page.NewCursorKey(cir.ID, cir.Status)
|
||||
case ContinualImprovementRegistriesOrderFieldPriority:
|
||||
return page.NewCursorKey(cir.ID, cir.Priority)
|
||||
case ContinualImprovementRegistriesOrderFieldReferenceId:
|
||||
return page.NewCursorKey(cir.ID, cir.ReferenceID)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("unsupported order by: %s", field))
|
||||
}
|
||||
|
||||
func (cir *ContinualImprovementRegistry) LoadByID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
continualImprovementRegistryID gid.GID,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
source,
|
||||
owner_id,
|
||||
target_date,
|
||||
status,
|
||||
priority,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
continual_improvement_registries
|
||||
WHERE
|
||||
%s
|
||||
AND id = @continual_improvement_registry_id
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"continual_improvement_registry_id": continualImprovementRegistryID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query continual improvement registry: %w", err)
|
||||
}
|
||||
|
||||
registry, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[ContinualImprovementRegistry])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect continual improvement registry: %w", err)
|
||||
}
|
||||
|
||||
*cir = registry
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cirs *ContinualImprovementRegistries) CountByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
filter *ContinualImprovementRegistryFilter,
|
||||
) (int, error) {
|
||||
q := `
|
||||
SELECT
|
||||
COUNT(id)
|
||||
FROM
|
||||
continual_improvement_registries
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
|
||||
var count int
|
||||
err := row.Scan(&count)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("cannot count continual improvement registries: %w", err)
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (cirs *ContinualImprovementRegistries) LoadByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[ContinualImprovementRegistriesOrderField],
|
||||
filter *ContinualImprovementRegistryFilter,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
source,
|
||||
owner_id,
|
||||
target_date,
|
||||
status,
|
||||
priority,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
continual_improvement_registries
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query continual improvement registries: %w", err)
|
||||
}
|
||||
|
||||
registries, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[ContinualImprovementRegistry])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect continual improvement registries: %w", err)
|
||||
}
|
||||
|
||||
*cirs = registries
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cir *ContinualImprovementRegistry) Insert(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
INSERT INTO continual_improvement_registries (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
source,
|
||||
owner_id,
|
||||
target_date,
|
||||
status,
|
||||
priority,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
@id,
|
||||
@tenant_id,
|
||||
@organization_id,
|
||||
@reference_id,
|
||||
@description,
|
||||
@source,
|
||||
@owner_id,
|
||||
@target_date,
|
||||
@status,
|
||||
@priority,
|
||||
@created_at,
|
||||
@updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": cir.ID,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"organization_id": cir.OrganizationID,
|
||||
"reference_id": cir.ReferenceID,
|
||||
"description": cir.Description,
|
||||
"source": cir.Source,
|
||||
"owner_id": cir.OwnerID,
|
||||
"target_date": cir.TargetDate,
|
||||
"status": cir.Status,
|
||||
"priority": cir.Priority,
|
||||
"created_at": cir.CreatedAt,
|
||||
"updated_at": cir.UpdatedAt,
|
||||
}
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert continual improvement registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cir *ContinualImprovementRegistry) Update(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
UPDATE continual_improvement_registries SET
|
||||
reference_id = @reference_id,
|
||||
description = @description,
|
||||
source = @source,
|
||||
owner_id = @owner_id,
|
||||
target_date = @target_date,
|
||||
status = @status,
|
||||
priority = @priority,
|
||||
updated_at = @updated_at
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": cir.ID,
|
||||
"reference_id": cir.ReferenceID,
|
||||
"description": cir.Description,
|
||||
"source": cir.Source,
|
||||
"owner_id": cir.OwnerID,
|
||||
"target_date": cir.TargetDate,
|
||||
"status": cir.Status,
|
||||
"priority": cir.Priority,
|
||||
"updated_at": cir.UpdatedAt,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot update continual improvement registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cir *ContinualImprovementRegistry) Delete(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM continual_improvement_registries
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"id": cir.ID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete continual improvement registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cirs ContinualImprovementRegistries) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
|
||||
query := `
|
||||
INSERT INTO continual_improvement_registries (
|
||||
id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
source,
|
||||
owner_id,
|
||||
target_date,
|
||||
status,
|
||||
priority,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @continual_improvement_registry_entity_type),
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
r.id,
|
||||
r.organization_id,
|
||||
r.reference_id,
|
||||
r.description,
|
||||
r.source,
|
||||
r.owner_id,
|
||||
r.target_date,
|
||||
r.status,
|
||||
r.priority,
|
||||
r.created_at,
|
||||
r.updated_at
|
||||
FROM continual_improvement_registries r
|
||||
WHERE %s AND r.organization_id = @organization_id AND r.snapshot_id IS NULL
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"snapshot_id": snapshotID,
|
||||
"organization_id": organizationID,
|
||||
"continual_improvement_registry_entity_type": ContinualImprovementRegistryEntityType,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, query, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert continual improvement registry snapshots: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
// 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 (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ContinualImprovementRegistriesOrderField string
|
||||
|
||||
const (
|
||||
ContinualImprovementRegistriesOrderFieldCreatedAt ContinualImprovementRegistriesOrderField = "CREATED_AT"
|
||||
ContinualImprovementRegistriesOrderFieldTargetDate ContinualImprovementRegistriesOrderField = "TARGET_DATE"
|
||||
ContinualImprovementRegistriesOrderFieldStatus ContinualImprovementRegistriesOrderField = "STATUS"
|
||||
ContinualImprovementRegistriesOrderFieldPriority ContinualImprovementRegistriesOrderField = "PRIORITY"
|
||||
ContinualImprovementRegistriesOrderFieldReferenceId ContinualImprovementRegistriesOrderField = "REFERENCE_ID"
|
||||
)
|
||||
|
||||
func (p ContinualImprovementRegistriesOrderField) Column() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ContinualImprovementRegistriesOrderField) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ContinualImprovementRegistriesOrderField) MarshalText() ([]byte, error) {
|
||||
return []byte(p.String()), nil
|
||||
}
|
||||
|
||||
func (p *ContinualImprovementRegistriesOrderField) UnmarshalText(text []byte) error {
|
||||
val := string(text)
|
||||
switch val {
|
||||
case string(ContinualImprovementRegistriesOrderFieldCreatedAt),
|
||||
string(ContinualImprovementRegistriesOrderFieldTargetDate),
|
||||
string(ContinualImprovementRegistriesOrderFieldStatus),
|
||||
string(ContinualImprovementRegistriesOrderFieldPriority),
|
||||
string(ContinualImprovementRegistriesOrderFieldReferenceId):
|
||||
*p = ContinualImprovementRegistriesOrderField(val)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid ContinualImprovementRegistriesOrderField value: %q", val)
|
||||
}
|
||||
@@ -19,19 +19,19 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type NonconformityRegistryStatus string
|
||||
type ContinualImprovementStatus string
|
||||
|
||||
const (
|
||||
NonconformityRegistryStatusOpen NonconformityRegistryStatus = "OPEN"
|
||||
NonconformityRegistryStatusInProgress NonconformityRegistryStatus = "IN_PROGRESS"
|
||||
NonconformityRegistryStatusClosed NonconformityRegistryStatus = "CLOSED"
|
||||
ContinualImprovementStatusOpen ContinualImprovementStatus = "OPEN"
|
||||
ContinualImprovementStatusInProgress ContinualImprovementStatus = "IN_PROGRESS"
|
||||
ContinualImprovementStatusClosed ContinualImprovementStatus = "CLOSED"
|
||||
)
|
||||
|
||||
func (nrs NonconformityRegistryStatus) String() string {
|
||||
return string(nrs)
|
||||
func (cis ContinualImprovementStatus) String() string {
|
||||
return string(cis)
|
||||
}
|
||||
|
||||
func (nrs *NonconformityRegistryStatus) Scan(value any) error {
|
||||
func (cis *ContinualImprovementStatus) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
@@ -39,22 +39,22 @@ func (nrs *NonconformityRegistryStatus) Scan(value any) error {
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for NonconformityRegistryStatus: %T", value)
|
||||
return fmt.Errorf("unsupported type for ContinualImprovementStatus: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "OPEN":
|
||||
*nrs = NonconformityRegistryStatusOpen
|
||||
*cis = ContinualImprovementStatusOpen
|
||||
case "IN_PROGRESS":
|
||||
*nrs = NonconformityRegistryStatusInProgress
|
||||
*cis = ContinualImprovementStatusInProgress
|
||||
case "CLOSED":
|
||||
*nrs = NonconformityRegistryStatusClosed
|
||||
*cis = ContinualImprovementStatusClosed
|
||||
default:
|
||||
return fmt.Errorf("invalid NonconformityRegistryStatus value: %q", s)
|
||||
return fmt.Errorf("invalid ContinualImprovementStatus value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nrs NonconformityRegistryStatus) Value() (driver.Value, error) {
|
||||
return nrs.String(), nil
|
||||
func (cis ContinualImprovementStatus) Value() (driver.Value, error) {
|
||||
return cis.String(), nil
|
||||
}
|
||||
383
pkg/coredata/continual_improvements.go
Normal file
383
pkg/coredata/continual_improvements.go
Normal file
@@ -0,0 +1,383 @@
|
||||
// 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 (
|
||||
"context"
|
||||
"fmt"
|
||||
"maps"
|
||||
"time"
|
||||
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type (
|
||||
ContinualImprovement struct {
|
||||
ID gid.GID `db:"id"`
|
||||
OrganizationID gid.GID `db:"organization_id"`
|
||||
ReferenceID string `db:"reference_id"`
|
||||
Description *string `db:"description"`
|
||||
Source *string `db:"source"`
|
||||
OwnerID gid.GID `db:"owner_id"`
|
||||
TargetDate *time.Time `db:"target_date"`
|
||||
Status ContinualImprovementStatus `db:"status"`
|
||||
Priority ContinualImprovementPriority `db:"priority"`
|
||||
SnapshotID *gid.GID `db:"snapshot_id"`
|
||||
SourceID *gid.GID `db:"source_id"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
|
||||
ContinualImprovements []*ContinualImprovement
|
||||
)
|
||||
|
||||
func (ci *ContinualImprovement) CursorKey(field ContinualImprovementOrderField) page.CursorKey {
|
||||
switch field {
|
||||
case ContinualImprovementOrderFieldCreatedAt:
|
||||
return page.NewCursorKey(ci.ID, ci.CreatedAt)
|
||||
case ContinualImprovementOrderFieldTargetDate:
|
||||
return page.NewCursorKey(ci.ID, ci.TargetDate)
|
||||
case ContinualImprovementOrderFieldStatus:
|
||||
return page.NewCursorKey(ci.ID, ci.Status)
|
||||
case ContinualImprovementOrderFieldPriority:
|
||||
return page.NewCursorKey(ci.ID, ci.Priority)
|
||||
case ContinualImprovementOrderFieldReferenceId:
|
||||
return page.NewCursorKey(ci.ID, ci.ReferenceID)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("unsupported order by: %s", field))
|
||||
}
|
||||
|
||||
func (ci *ContinualImprovement) LoadByID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
continualImprovementID gid.GID,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
source,
|
||||
owner_id,
|
||||
target_date,
|
||||
status,
|
||||
priority,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
continual_improvements
|
||||
WHERE
|
||||
%s
|
||||
AND id = @continual_improvement_id
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"continual_improvement_id": continualImprovementID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query continual improvement: %w", err)
|
||||
}
|
||||
|
||||
improvement, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[ContinualImprovement])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect continual improvement: %w", err)
|
||||
}
|
||||
|
||||
*ci = improvement
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cis *ContinualImprovements) CountByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
filter *ContinualImprovementFilter,
|
||||
) (int, error) {
|
||||
q := `
|
||||
SELECT
|
||||
COUNT(id)
|
||||
FROM
|
||||
continual_improvements
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
|
||||
var count int
|
||||
err := row.Scan(&count)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("cannot count continual improvements: %w", err)
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (cis *ContinualImprovements) LoadByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[ContinualImprovementOrderField],
|
||||
filter *ContinualImprovementFilter,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
source,
|
||||
owner_id,
|
||||
target_date,
|
||||
status,
|
||||
priority,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
continual_improvements
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query continual improvements: %w", err)
|
||||
}
|
||||
|
||||
improvements, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[ContinualImprovement])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect continual improvements: %w", err)
|
||||
}
|
||||
|
||||
*cis = improvements
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ci *ContinualImprovement) Insert(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
INSERT INTO continual_improvements (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
source,
|
||||
owner_id,
|
||||
target_date,
|
||||
status,
|
||||
priority,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
@id,
|
||||
@tenant_id,
|
||||
@organization_id,
|
||||
@reference_id,
|
||||
@description,
|
||||
@source,
|
||||
@owner_id,
|
||||
@target_date,
|
||||
@status,
|
||||
@priority,
|
||||
@created_at,
|
||||
@updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": ci.ID,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"organization_id": ci.OrganizationID,
|
||||
"reference_id": ci.ReferenceID,
|
||||
"description": ci.Description,
|
||||
"source": ci.Source,
|
||||
"owner_id": ci.OwnerID,
|
||||
"target_date": ci.TargetDate,
|
||||
"status": ci.Status,
|
||||
"priority": ci.Priority,
|
||||
"created_at": ci.CreatedAt,
|
||||
"updated_at": ci.UpdatedAt,
|
||||
}
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert continual improvement: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ci *ContinualImprovement) Update(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
UPDATE continual_improvements SET
|
||||
reference_id = @reference_id,
|
||||
description = @description,
|
||||
source = @source,
|
||||
owner_id = @owner_id,
|
||||
target_date = @target_date,
|
||||
status = @status,
|
||||
priority = @priority,
|
||||
updated_at = @updated_at
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": ci.ID,
|
||||
"reference_id": ci.ReferenceID,
|
||||
"description": ci.Description,
|
||||
"source": ci.Source,
|
||||
"owner_id": ci.OwnerID,
|
||||
"target_date": ci.TargetDate,
|
||||
"status": ci.Status,
|
||||
"priority": ci.Priority,
|
||||
"updated_at": ci.UpdatedAt,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot update continual improvement: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ci *ContinualImprovement) Delete(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM continual_improvements
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"id": ci.ID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete continual improvement: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cis ContinualImprovements) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
|
||||
query := `
|
||||
INSERT INTO continual_improvements (
|
||||
id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
source,
|
||||
owner_id,
|
||||
target_date,
|
||||
status,
|
||||
priority,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @continual_improvement_entity_type),
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
r.id,
|
||||
r.organization_id,
|
||||
r.reference_id,
|
||||
r.description,
|
||||
r.source,
|
||||
r.owner_id,
|
||||
r.target_date,
|
||||
r.status,
|
||||
r.priority,
|
||||
r.created_at,
|
||||
r.updated_at
|
||||
FROM continual_improvements r
|
||||
WHERE %s AND r.organization_id = @organization_id AND r.snapshot_id IS NULL
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"snapshot_id": snapshotID,
|
||||
"organization_id": organizationID,
|
||||
"continual_improvement_entity_type": ContinualImprovementEntityType,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, query, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert continual improvement snapshots: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -43,11 +43,11 @@ const (
|
||||
FileEntityType
|
||||
VendorContactEntityType
|
||||
VendorDataPrivacyAgreementEntityType
|
||||
NonconformityRegistryEntityType
|
||||
ComplianceRegistryEntityType
|
||||
NonconformityEntityType
|
||||
ObligationEntityType
|
||||
VendorServiceEntityType
|
||||
SnapshotEntityType
|
||||
ContinualImprovementRegistryEntityType
|
||||
ProcessingActivityRegistryEntityType
|
||||
ContinualImprovementEntityType
|
||||
ProcessingActivityEntityType
|
||||
FrameworkExportEntityType
|
||||
)
|
||||
|
||||
51
pkg/coredata/migrations/20250905T122423Z.sql
Normal file
51
pkg/coredata/migrations/20250905T122423Z.sql
Normal file
@@ -0,0 +1,51 @@
|
||||
ALTER TYPE nonconformity_registries_status RENAME TO nonconformities_status;
|
||||
|
||||
ALTER TYPE snapshots_type
|
||||
RENAME VALUE 'NONCONFORMITY_REGISTRIES' TO 'NONCONFORMITIES';
|
||||
|
||||
ALTER TABLE nonconformity_registries RENAME TO nonconformities;
|
||||
|
||||
ALTER TABLE nonconformities RENAME CONSTRAINT nonconformity_registries_organization_id_fkey TO nonconformities_organization_id_fkey;
|
||||
ALTER TABLE nonconformities RENAME CONSTRAINT nonconformity_registries_owner_id_fkey TO nonconformities_owner_id_fkey;
|
||||
ALTER TABLE nonconformities RENAME CONSTRAINT nonconformity_registries_audit_id_fkey TO nonconformities_audit_id_fkey;
|
||||
ALTER TABLE nonconformities RENAME CONSTRAINT nonconformity_registries_snapshot_id_fkey TO nonconformities_snapshot_id_fkey;
|
||||
ALTER TABLE nonconformities RENAME CONSTRAINT nonconformity_registries_source_id_snapshot_id_key TO nonconformities_source_id_snapshot_id_key;
|
||||
|
||||
ALTER TYPE continual_improvement_registries_status RENAME TO continual_improvements_status;
|
||||
|
||||
ALTER TYPE snapshots_type
|
||||
RENAME VALUE 'CONTINUAL_IMPROVEMENT_REGISTRIES' TO 'CONTINUAL_IMPROVEMENTS';
|
||||
|
||||
ALTER TABLE continual_improvement_registries RENAME TO continual_improvements;
|
||||
|
||||
ALTER TABLE continual_improvements RENAME CONSTRAINT continual_improvement_registries_organization_id_fkey TO continual_improvements_organization_id_fkey;
|
||||
ALTER TABLE continual_improvements RENAME CONSTRAINT continual_improvement_registries_owner_id_fkey TO continual_improvements_owner_id_fkey;
|
||||
ALTER TABLE continual_improvements RENAME CONSTRAINT continual_improvement_registries_snapshot_id_fkey TO continual_improvements_snapshot_id_fkey;
|
||||
ALTER TABLE continual_improvements RENAME CONSTRAINT continual_improvement_registries_source_id_snapshot_id_key TO continual_improvements_source_id_snapshot_id_key;
|
||||
|
||||
ALTER TYPE processing_activity_registries_special_or_criminal_data RENAME TO processing_activities_special_or_criminal_data;
|
||||
ALTER TYPE processing_activity_registries_lawful_basis RENAME TO processing_activities_lawful_basis;
|
||||
ALTER TYPE processing_activity_registries_transfer_safeguards RENAME TO processing_activities_transfer_safeguards;
|
||||
ALTER TYPE processing_activity_registries_data_protection_impact_assessment RENAME TO processing_activities_data_protection_impact_assessment;
|
||||
ALTER TYPE processing_activity_registries_transfer_impact_assessment RENAME TO processing_activities_transfer_impact_assessment;
|
||||
|
||||
ALTER TYPE snapshots_type
|
||||
RENAME VALUE 'PROCESSING_ACTIVITY_REGISTRIES' TO 'PROCESSING_ACTIVITIES';
|
||||
|
||||
ALTER TABLE processing_activity_registries RENAME TO processing_activities;
|
||||
|
||||
ALTER TABLE processing_activities RENAME CONSTRAINT processing_activity_registries_organization_id_fkey TO processing_activities_organization_id_fkey;
|
||||
ALTER TABLE processing_activities RENAME CONSTRAINT processing_activity_registries_snapshot_id_fkey TO processing_activities_snapshot_id_fkey;
|
||||
ALTER TABLE processing_activities RENAME CONSTRAINT processing_activity_registries_source_id_snapshot_id_key TO processing_activities_source_id_snapshot_id_key;
|
||||
|
||||
ALTER TYPE compliance_registries_status RENAME TO obligations_status;
|
||||
|
||||
ALTER TYPE snapshots_type
|
||||
RENAME VALUE 'COMPLIANCE_REGISTRIES' TO 'OBLIGATIONS';
|
||||
|
||||
ALTER TABLE compliance_registries RENAME TO obligations;
|
||||
|
||||
ALTER TABLE obligations RENAME CONSTRAINT compliance_registries_organization_id_fkey TO obligations_organization_id_fkey;
|
||||
ALTER TABLE obligations RENAME CONSTRAINT compliance_registries_owner_id_fkey TO obligations_owner_id_fkey;
|
||||
ALTER TABLE obligations RENAME CONSTRAINT compliance_registries_snapshot_id_fkey TO obligations_snapshot_id_fkey;
|
||||
ALTER TABLE obligations RENAME CONSTRAINT compliance_registries_source_id_snapshot_id_key TO obligations_source_id_snapshot_id_key;
|
||||
415
pkg/coredata/nonconformity.go
Normal file
415
pkg/coredata/nonconformity.go
Normal file
@@ -0,0 +1,415 @@
|
||||
// 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 (
|
||||
"context"
|
||||
"fmt"
|
||||
"maps"
|
||||
"time"
|
||||
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type (
|
||||
Nonconformity struct {
|
||||
ID gid.GID `db:"id"`
|
||||
OrganizationID gid.GID `db:"organization_id"`
|
||||
SnapshotID *gid.GID `db:"snapshot_id"`
|
||||
SourceID *gid.GID `db:"source_id"`
|
||||
ReferenceID string `db:"reference_id"`
|
||||
Description *string `db:"description"`
|
||||
AuditID gid.GID `db:"audit_id"`
|
||||
DateIdentified *time.Time `db:"date_identified"`
|
||||
RootCause string `db:"root_cause"`
|
||||
CorrectiveAction *string `db:"corrective_action"`
|
||||
OwnerID gid.GID `db:"owner_id"`
|
||||
DueDate *time.Time `db:"due_date"`
|
||||
Status NonconformityStatus `db:"status"`
|
||||
EffectivenessCheck *string `db:"effectiveness_check"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
|
||||
Nonconformities []*Nonconformity
|
||||
)
|
||||
|
||||
func (nc *Nonconformity) CursorKey(field NonconformityOrderField) page.CursorKey {
|
||||
switch field {
|
||||
case NonconformityOrderFieldCreatedAt:
|
||||
return page.NewCursorKey(nc.ID, nc.CreatedAt)
|
||||
case NonconformityOrderFieldDateIdentified:
|
||||
return page.NewCursorKey(nc.ID, nc.DateIdentified)
|
||||
case NonconformityOrderFieldDueDate:
|
||||
return page.NewCursorKey(nc.ID, nc.DueDate)
|
||||
case NonconformityOrderFieldStatus:
|
||||
return page.NewCursorKey(nc.ID, nc.Status)
|
||||
case NonconformityOrderFieldReferenceId:
|
||||
return page.NewCursorKey(nc.ID, nc.ReferenceID)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("unsupported order by: %s", field))
|
||||
}
|
||||
|
||||
func (nc *Nonconformity) LoadByID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
nonconformityID gid.GID,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
reference_id,
|
||||
description,
|
||||
audit_id,
|
||||
date_identified,
|
||||
root_cause,
|
||||
corrective_action,
|
||||
owner_id,
|
||||
due_date,
|
||||
status,
|
||||
effectiveness_check,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
nonconformities
|
||||
WHERE
|
||||
%s
|
||||
AND id = @nonconformity_id
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"nonconformity_id": nonconformityID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query nonconformity: %w", err)
|
||||
}
|
||||
|
||||
nonconformity, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[Nonconformity])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect nonconformity: %w", err)
|
||||
}
|
||||
|
||||
*nc = nonconformity
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ncs *Nonconformities) CountByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
filter *NonconformityFilter,
|
||||
) (int, error) {
|
||||
q := `
|
||||
SELECT
|
||||
COUNT(id)
|
||||
FROM
|
||||
nonconformities
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
|
||||
var count int
|
||||
err := row.Scan(&count)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("cannot count nonconformities: %w", err)
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (ncs *Nonconformities) LoadByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[NonconformityOrderField],
|
||||
filter *NonconformityFilter,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
reference_id,
|
||||
description,
|
||||
audit_id,
|
||||
date_identified,
|
||||
root_cause,
|
||||
corrective_action,
|
||||
owner_id,
|
||||
due_date,
|
||||
status,
|
||||
effectiveness_check,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
nonconformities
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query nonconformities: %w", err)
|
||||
}
|
||||
|
||||
nonconformities, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Nonconformity])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect nonconformities: %w", err)
|
||||
}
|
||||
|
||||
*ncs = nonconformities
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nc *Nonconformity) Insert(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
INSERT INTO nonconformities (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
audit_id,
|
||||
date_identified,
|
||||
root_cause,
|
||||
corrective_action,
|
||||
owner_id,
|
||||
due_date,
|
||||
status,
|
||||
effectiveness_check,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
@id,
|
||||
@tenant_id,
|
||||
@organization_id,
|
||||
@reference_id,
|
||||
@description,
|
||||
@audit_id,
|
||||
@date_identified,
|
||||
@root_cause,
|
||||
@corrective_action,
|
||||
@owner_id,
|
||||
@due_date,
|
||||
@status,
|
||||
@effectiveness_check,
|
||||
@created_at,
|
||||
@updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": nc.ID,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"organization_id": nc.OrganizationID,
|
||||
"reference_id": nc.ReferenceID,
|
||||
"description": nc.Description,
|
||||
"audit_id": nc.AuditID,
|
||||
"date_identified": nc.DateIdentified,
|
||||
"root_cause": nc.RootCause,
|
||||
"corrective_action": nc.CorrectiveAction,
|
||||
"owner_id": nc.OwnerID,
|
||||
"due_date": nc.DueDate,
|
||||
"status": nc.Status,
|
||||
"effectiveness_check": nc.EffectivenessCheck,
|
||||
"created_at": nc.CreatedAt,
|
||||
"updated_at": nc.UpdatedAt,
|
||||
}
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert nonconformity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nc *Nonconformity) Update(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
UPDATE nonconformities
|
||||
SET
|
||||
reference_id = @reference_id,
|
||||
description = @description,
|
||||
date_identified = @date_identified,
|
||||
root_cause = @root_cause,
|
||||
corrective_action = @corrective_action,
|
||||
due_date = @due_date,
|
||||
status = @status,
|
||||
effectiveness_check = @effectiveness_check,
|
||||
owner_id = @owner_id,
|
||||
audit_id = @audit_id,
|
||||
updated_at = @updated_at
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
AND snapshot_id IS NULL
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": nc.ID,
|
||||
"reference_id": nc.ReferenceID,
|
||||
"description": nc.Description,
|
||||
"date_identified": nc.DateIdentified,
|
||||
"root_cause": nc.RootCause,
|
||||
"corrective_action": nc.CorrectiveAction,
|
||||
"due_date": nc.DueDate,
|
||||
"status": nc.Status,
|
||||
"effectiveness_check": nc.EffectivenessCheck,
|
||||
"owner_id": nc.OwnerID,
|
||||
"audit_id": nc.AuditID,
|
||||
"updated_at": nc.UpdatedAt,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot update nonconformity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nc *Nonconformity) Delete(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM nonconformities
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id AND snapshot_id IS NULL
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"id": nc.ID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete nonconformity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ncs Nonconformities) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
|
||||
query := `
|
||||
INSERT INTO nonconformities (
|
||||
id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
audit_id,
|
||||
date_identified,
|
||||
root_cause,
|
||||
corrective_action,
|
||||
owner_id,
|
||||
due_date,
|
||||
status,
|
||||
effectiveness_check,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @nonconformity_entity_type),
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
nc.id,
|
||||
nc.organization_id,
|
||||
nc.reference_id,
|
||||
nc.description,
|
||||
nc.audit_id,
|
||||
nc.date_identified,
|
||||
nc.root_cause,
|
||||
nc.corrective_action,
|
||||
nc.owner_id,
|
||||
nc.due_date,
|
||||
nc.status,
|
||||
nc.effectiveness_check,
|
||||
nc.created_at,
|
||||
nc.updated_at
|
||||
FROM nonconformities nc
|
||||
WHERE %s AND nc.organization_id = @organization_id AND nc.snapshot_id IS NULL
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"snapshot_id": snapshotID,
|
||||
"organization_id": organizationID,
|
||||
"nonconformity_entity_type": NonconformityEntityType,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, query, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert data snapshots: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -20,18 +20,18 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
ProcessingActivityRegistryFilter struct {
|
||||
NonconformityFilter struct {
|
||||
snapshotID **gid.GID
|
||||
}
|
||||
)
|
||||
|
||||
func NewProcessingActivityRegistryFilter(snapshotID **gid.GID) *ProcessingActivityRegistryFilter {
|
||||
return &ProcessingActivityRegistryFilter{
|
||||
func NewNonconformityFilter(snapshotID **gid.GID) *NonconformityFilter {
|
||||
return &NonconformityFilter{
|
||||
snapshotID: snapshotID,
|
||||
}
|
||||
}
|
||||
|
||||
func (f *ProcessingActivityRegistryFilter) SQLArguments() pgx.NamedArgs {
|
||||
func (f *NonconformityFilter) SQLArguments() pgx.NamedArgs {
|
||||
args := pgx.NamedArgs{}
|
||||
|
||||
if f.snapshotID != nil && *f.snapshotID != nil {
|
||||
@@ -41,7 +41,7 @@ func (f *ProcessingActivityRegistryFilter) SQLArguments() pgx.NamedArgs {
|
||||
return args
|
||||
}
|
||||
|
||||
func (f *ProcessingActivityRegistryFilter) SQLFragment() string {
|
||||
func (f *NonconformityFilter) SQLFragment() string {
|
||||
if f.snapshotID == nil {
|
||||
return "TRUE"
|
||||
}
|
||||
55
pkg/coredata/nonconformity_order_field.go
Normal file
55
pkg/coredata/nonconformity_order_field.go
Normal file
@@ -0,0 +1,55 @@
|
||||
// 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 (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type NonconformityOrderField string
|
||||
|
||||
const (
|
||||
NonconformityOrderFieldCreatedAt NonconformityOrderField = "CREATED_AT"
|
||||
NonconformityOrderFieldDateIdentified NonconformityOrderField = "DATE_IDENTIFIED"
|
||||
NonconformityOrderFieldDueDate NonconformityOrderField = "DUE_DATE"
|
||||
NonconformityOrderFieldStatus NonconformityOrderField = "STATUS"
|
||||
NonconformityOrderFieldReferenceId NonconformityOrderField = "REFERENCE_ID"
|
||||
)
|
||||
|
||||
func (p NonconformityOrderField) Column() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p NonconformityOrderField) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p NonconformityOrderField) MarshalText() ([]byte, error) {
|
||||
return []byte(p.String()), nil
|
||||
}
|
||||
|
||||
func (p *NonconformityOrderField) UnmarshalText(text []byte) error {
|
||||
val := string(text)
|
||||
switch val {
|
||||
case string(NonconformityOrderFieldCreatedAt),
|
||||
string(NonconformityOrderFieldDateIdentified),
|
||||
string(NonconformityOrderFieldDueDate),
|
||||
string(NonconformityOrderFieldStatus),
|
||||
string(NonconformityOrderFieldReferenceId):
|
||||
*p = NonconformityOrderField(val)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid NonconformityOrderField value: %q", val)
|
||||
}
|
||||
@@ -1,415 +0,0 @@
|
||||
// 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 (
|
||||
"context"
|
||||
"fmt"
|
||||
"maps"
|
||||
"time"
|
||||
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type (
|
||||
NonconformityRegistry struct {
|
||||
ID gid.GID `db:"id"`
|
||||
OrganizationID gid.GID `db:"organization_id"`
|
||||
SnapshotID *gid.GID `db:"snapshot_id"`
|
||||
SourceID *gid.GID `db:"source_id"`
|
||||
ReferenceID string `db:"reference_id"`
|
||||
Description *string `db:"description"`
|
||||
AuditID gid.GID `db:"audit_id"`
|
||||
DateIdentified *time.Time `db:"date_identified"`
|
||||
RootCause string `db:"root_cause"`
|
||||
CorrectiveAction *string `db:"corrective_action"`
|
||||
OwnerID gid.GID `db:"owner_id"`
|
||||
DueDate *time.Time `db:"due_date"`
|
||||
Status NonconformityRegistryStatus `db:"status"`
|
||||
EffectivenessCheck *string `db:"effectiveness_check"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
|
||||
NonconformityRegistries []*NonconformityRegistry
|
||||
)
|
||||
|
||||
func (nr *NonconformityRegistry) CursorKey(field NonconformityRegistryOrderField) page.CursorKey {
|
||||
switch field {
|
||||
case NonconformityRegistryOrderFieldCreatedAt:
|
||||
return page.NewCursorKey(nr.ID, nr.CreatedAt)
|
||||
case NonconformityRegistryOrderFieldDateIdentified:
|
||||
return page.NewCursorKey(nr.ID, nr.DateIdentified)
|
||||
case NonconformityRegistryOrderFieldDueDate:
|
||||
return page.NewCursorKey(nr.ID, nr.DueDate)
|
||||
case NonconformityRegistryOrderFieldStatus:
|
||||
return page.NewCursorKey(nr.ID, nr.Status)
|
||||
case NonconformityRegistryOrderFieldReferenceId:
|
||||
return page.NewCursorKey(nr.ID, nr.ReferenceID)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("unsupported order by: %s", field))
|
||||
}
|
||||
|
||||
func (nr *NonconformityRegistry) LoadByID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
nonconformityRegistryID gid.GID,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
reference_id,
|
||||
description,
|
||||
audit_id,
|
||||
date_identified,
|
||||
root_cause,
|
||||
corrective_action,
|
||||
owner_id,
|
||||
due_date,
|
||||
status,
|
||||
effectiveness_check,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
nonconformity_registries
|
||||
WHERE
|
||||
%s
|
||||
AND id = @nonconformity_registry_id
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"nonconformity_registry_id": nonconformityRegistryID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query nonconformity registry: %w", err)
|
||||
}
|
||||
|
||||
registry, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[NonconformityRegistry])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect nonconformity registry: %w", err)
|
||||
}
|
||||
|
||||
*nr = registry
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nrs *NonconformityRegistries) CountByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
filter *NonconformityRegistryFilter,
|
||||
) (int, error) {
|
||||
q := `
|
||||
SELECT
|
||||
COUNT(id)
|
||||
FROM
|
||||
nonconformity_registries
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
|
||||
var count int
|
||||
err := row.Scan(&count)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("cannot count nonconformity registries: %w", err)
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (nrs *NonconformityRegistries) LoadByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[NonconformityRegistryOrderField],
|
||||
filter *NonconformityRegistryFilter,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
reference_id,
|
||||
description,
|
||||
audit_id,
|
||||
date_identified,
|
||||
root_cause,
|
||||
corrective_action,
|
||||
owner_id,
|
||||
due_date,
|
||||
status,
|
||||
effectiveness_check,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
nonconformity_registries
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query nonconformity registries: %w", err)
|
||||
}
|
||||
|
||||
registries, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[NonconformityRegistry])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect nonconformity registries: %w", err)
|
||||
}
|
||||
|
||||
*nrs = registries
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nr *NonconformityRegistry) Insert(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
INSERT INTO nonconformity_registries (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
audit_id,
|
||||
date_identified,
|
||||
root_cause,
|
||||
corrective_action,
|
||||
owner_id,
|
||||
due_date,
|
||||
status,
|
||||
effectiveness_check,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
@id,
|
||||
@tenant_id,
|
||||
@organization_id,
|
||||
@reference_id,
|
||||
@description,
|
||||
@audit_id,
|
||||
@date_identified,
|
||||
@root_cause,
|
||||
@corrective_action,
|
||||
@owner_id,
|
||||
@due_date,
|
||||
@status,
|
||||
@effectiveness_check,
|
||||
@created_at,
|
||||
@updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": nr.ID,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"organization_id": nr.OrganizationID,
|
||||
"reference_id": nr.ReferenceID,
|
||||
"description": nr.Description,
|
||||
"audit_id": nr.AuditID,
|
||||
"date_identified": nr.DateIdentified,
|
||||
"root_cause": nr.RootCause,
|
||||
"corrective_action": nr.CorrectiveAction,
|
||||
"owner_id": nr.OwnerID,
|
||||
"due_date": nr.DueDate,
|
||||
"status": nr.Status,
|
||||
"effectiveness_check": nr.EffectivenessCheck,
|
||||
"created_at": nr.CreatedAt,
|
||||
"updated_at": nr.UpdatedAt,
|
||||
}
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert nonconformity registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nr *NonconformityRegistry) Update(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
UPDATE nonconformity_registries
|
||||
SET
|
||||
reference_id = @reference_id,
|
||||
description = @description,
|
||||
date_identified = @date_identified,
|
||||
root_cause = @root_cause,
|
||||
corrective_action = @corrective_action,
|
||||
due_date = @due_date,
|
||||
status = @status,
|
||||
effectiveness_check = @effectiveness_check,
|
||||
owner_id = @owner_id,
|
||||
audit_id = @audit_id,
|
||||
updated_at = @updated_at
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
AND snapshot_id IS NULL
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": nr.ID,
|
||||
"reference_id": nr.ReferenceID,
|
||||
"description": nr.Description,
|
||||
"date_identified": nr.DateIdentified,
|
||||
"root_cause": nr.RootCause,
|
||||
"corrective_action": nr.CorrectiveAction,
|
||||
"due_date": nr.DueDate,
|
||||
"status": nr.Status,
|
||||
"effectiveness_check": nr.EffectivenessCheck,
|
||||
"owner_id": nr.OwnerID,
|
||||
"audit_id": nr.AuditID,
|
||||
"updated_at": nr.UpdatedAt,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot update nonconformity registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nr *NonconformityRegistry) Delete(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM nonconformity_registries
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id AND snapshot_id IS NULL
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"id": nr.ID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete nonconformity registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nrs NonconformityRegistries) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
|
||||
query := `
|
||||
INSERT INTO nonconformity_registries (
|
||||
id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
description,
|
||||
audit_id,
|
||||
date_identified,
|
||||
root_cause,
|
||||
corrective_action,
|
||||
owner_id,
|
||||
due_date,
|
||||
status,
|
||||
effectiveness_check,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @nonconformity_registry_entity_type),
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
r.id,
|
||||
r.organization_id,
|
||||
r.reference_id,
|
||||
r.description,
|
||||
r.audit_id,
|
||||
r.date_identified,
|
||||
r.root_cause,
|
||||
r.corrective_action,
|
||||
r.owner_id,
|
||||
r.due_date,
|
||||
r.status,
|
||||
r.effectiveness_check,
|
||||
r.created_at,
|
||||
r.updated_at
|
||||
FROM nonconformity_registries r
|
||||
WHERE %s AND r.organization_id = @organization_id AND r.snapshot_id IS NULL
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"snapshot_id": snapshotID,
|
||||
"organization_id": organizationID,
|
||||
"nonconformity_registry_entity_type": NonconformityRegistryEntityType,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, query, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert data snapshots: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
// 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 (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type NonconformityRegistryOrderField string
|
||||
|
||||
const (
|
||||
NonconformityRegistryOrderFieldCreatedAt NonconformityRegistryOrderField = "CREATED_AT"
|
||||
NonconformityRegistryOrderFieldDateIdentified NonconformityRegistryOrderField = "DATE_IDENTIFIED"
|
||||
NonconformityRegistryOrderFieldDueDate NonconformityRegistryOrderField = "DUE_DATE"
|
||||
NonconformityRegistryOrderFieldStatus NonconformityRegistryOrderField = "STATUS"
|
||||
NonconformityRegistryOrderFieldReferenceId NonconformityRegistryOrderField = "REFERENCE_ID"
|
||||
)
|
||||
|
||||
func (p NonconformityRegistryOrderField) Column() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p NonconformityRegistryOrderField) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p NonconformityRegistryOrderField) MarshalText() ([]byte, error) {
|
||||
return []byte(p.String()), nil
|
||||
}
|
||||
|
||||
func (p *NonconformityRegistryOrderField) UnmarshalText(text []byte) error {
|
||||
val := string(text)
|
||||
switch val {
|
||||
case string(NonconformityRegistryOrderFieldCreatedAt),
|
||||
string(NonconformityRegistryOrderFieldDateIdentified),
|
||||
string(NonconformityRegistryOrderFieldDueDate),
|
||||
string(NonconformityRegistryOrderFieldStatus),
|
||||
string(NonconformityRegistryOrderFieldReferenceId):
|
||||
*p = NonconformityRegistryOrderField(val)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid NonconformityRegistryOrderField value: %q", val)
|
||||
}
|
||||
@@ -19,19 +19,19 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ComplianceRegistryStatus string
|
||||
type NonconformityStatus string
|
||||
|
||||
const (
|
||||
ComplianceRegistryStatusOpen ComplianceRegistryStatus = "OPEN"
|
||||
ComplianceRegistryStatusInProgress ComplianceRegistryStatus = "IN_PROGRESS"
|
||||
ComplianceRegistryStatusClosed ComplianceRegistryStatus = "CLOSED"
|
||||
NonconformityStatusOpen NonconformityStatus = "OPEN"
|
||||
NonconformityStatusInProgress NonconformityStatus = "IN_PROGRESS"
|
||||
NonconformityStatusClosed NonconformityStatus = "CLOSED"
|
||||
)
|
||||
|
||||
func (crs ComplianceRegistryStatus) String() string {
|
||||
return string(crs)
|
||||
func (ncs NonconformityStatus) String() string {
|
||||
return string(ncs)
|
||||
}
|
||||
|
||||
func (crs *ComplianceRegistryStatus) Scan(value any) error {
|
||||
func (ncs *NonconformityStatus) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
@@ -39,22 +39,22 @@ func (crs *ComplianceRegistryStatus) Scan(value any) error {
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ComplianceRegistryStatus: %T", value)
|
||||
return fmt.Errorf("unsupported type for NonconformityStatus: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "OPEN":
|
||||
*crs = ComplianceRegistryStatusOpen
|
||||
*ncs = NonconformityStatusOpen
|
||||
case "IN_PROGRESS":
|
||||
*crs = ComplianceRegistryStatusInProgress
|
||||
*ncs = NonconformityStatusInProgress
|
||||
case "CLOSED":
|
||||
*crs = ComplianceRegistryStatusClosed
|
||||
*ncs = NonconformityStatusClosed
|
||||
default:
|
||||
return fmt.Errorf("invalid ComplianceRegistryStatus value: %q", s)
|
||||
return fmt.Errorf("invalid NonconformityStatus value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (crs ComplianceRegistryStatus) Value() (driver.Value, error) {
|
||||
return crs.String(), nil
|
||||
func (ncs NonconformityStatus) Value() (driver.Value, error) {
|
||||
return ncs.String(), nil
|
||||
}
|
||||
421
pkg/coredata/obligation.go
Normal file
421
pkg/coredata/obligation.go
Normal file
@@ -0,0 +1,421 @@
|
||||
// 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 (
|
||||
"context"
|
||||
"fmt"
|
||||
"maps"
|
||||
"time"
|
||||
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type (
|
||||
Obligation struct {
|
||||
ID gid.GID `db:"id"`
|
||||
OrganizationID gid.GID `db:"organization_id"`
|
||||
ReferenceID string `db:"reference_id"`
|
||||
Area *string `db:"area"`
|
||||
Source *string `db:"source"`
|
||||
Requirement *string `db:"requirement"`
|
||||
ActionsToBeImplemented *string `db:"actions_to_be_implemented"`
|
||||
Regulator *string `db:"regulator"`
|
||||
OwnerID gid.GID `db:"owner_id"`
|
||||
LastReviewDate *time.Time `db:"last_review_date"`
|
||||
DueDate *time.Time `db:"due_date"`
|
||||
Status ObligationStatus `db:"status"`
|
||||
SnapshotID *gid.GID `db:"snapshot_id"`
|
||||
SourceID *gid.GID `db:"source_id"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
|
||||
Obligations []*Obligation
|
||||
)
|
||||
|
||||
func (o *Obligation) CursorKey(field ObligationOrderField) page.CursorKey {
|
||||
switch field {
|
||||
case ObligationOrderFieldCreatedAt:
|
||||
return page.NewCursorKey(o.ID, o.CreatedAt)
|
||||
case ObligationOrderFieldLastReviewDate:
|
||||
return page.NewCursorKey(o.ID, o.LastReviewDate)
|
||||
case ObligationOrderFieldDueDate:
|
||||
return page.NewCursorKey(o.ID, o.DueDate)
|
||||
case ObligationOrderFieldStatus:
|
||||
return page.NewCursorKey(o.ID, o.Status)
|
||||
case ObligationOrderFieldReferenceId:
|
||||
return page.NewCursorKey(o.ID, o.ReferenceID)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("unsupported order by: %s", field))
|
||||
}
|
||||
|
||||
func (o *Obligation) LoadByID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
obligationID gid.GID,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
reference_id,
|
||||
area,
|
||||
source,
|
||||
requirement,
|
||||
actions_to_be_implemented,
|
||||
regulator,
|
||||
owner_id,
|
||||
last_review_date,
|
||||
due_date,
|
||||
status,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
obligations
|
||||
WHERE
|
||||
%s
|
||||
AND id = @obligation_id
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"obligation_id": obligationID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query obligation: %w", err)
|
||||
}
|
||||
|
||||
obligation, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[Obligation])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect obligation: %w", err)
|
||||
}
|
||||
|
||||
*o = obligation
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (os *Obligations) CountByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
filter *ObligationFilter,
|
||||
) (int, error) {
|
||||
q := `
|
||||
SELECT
|
||||
COUNT(id)
|
||||
FROM
|
||||
obligations
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
|
||||
var count int
|
||||
err := row.Scan(&count)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("cannot count obligations: %w", err)
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (os *Obligations) LoadByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[ObligationOrderField],
|
||||
filter *ObligationFilter,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
area,
|
||||
source,
|
||||
requirement,
|
||||
actions_to_be_implemented,
|
||||
regulator,
|
||||
owner_id,
|
||||
last_review_date,
|
||||
due_date,
|
||||
status,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
obligations
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND %s
|
||||
AND %s
|
||||
`
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query obligations: %w", err)
|
||||
}
|
||||
|
||||
obligations, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Obligation])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect obligations: %w", err)
|
||||
}
|
||||
|
||||
*os = obligations
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Obligation) Insert(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
INSERT INTO obligations (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
area,
|
||||
source,
|
||||
requirement,
|
||||
actions_to_be_implemented,
|
||||
regulator,
|
||||
owner_id,
|
||||
last_review_date,
|
||||
due_date,
|
||||
status,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
@id,
|
||||
@tenant_id,
|
||||
@organization_id,
|
||||
@reference_id,
|
||||
@area,
|
||||
@source,
|
||||
@requirement,
|
||||
@actions_to_be_implemented,
|
||||
@regulator,
|
||||
@owner_id,
|
||||
@last_review_date,
|
||||
@due_date,
|
||||
@status,
|
||||
@snapshot_id,
|
||||
@source_id,
|
||||
@created_at,
|
||||
@updated_at
|
||||
)
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": o.ID,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"organization_id": o.OrganizationID,
|
||||
"reference_id": o.ReferenceID,
|
||||
"area": o.Area,
|
||||
"source": o.Source,
|
||||
"requirement": o.Requirement,
|
||||
"actions_to_be_implemented": o.ActionsToBeImplemented,
|
||||
"regulator": o.Regulator,
|
||||
"owner_id": o.OwnerID,
|
||||
"last_review_date": o.LastReviewDate,
|
||||
"due_date": o.DueDate,
|
||||
"status": o.Status,
|
||||
"snapshot_id": o.SnapshotID,
|
||||
"source_id": o.SourceID,
|
||||
"created_at": o.CreatedAt,
|
||||
"updated_at": o.UpdatedAt,
|
||||
}
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert obligation: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Obligation) Update(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
UPDATE obligations SET
|
||||
reference_id = @reference_id,
|
||||
area = @area,
|
||||
source = @source,
|
||||
requirement = @requirement,
|
||||
actions_to_be_implemented = @actions_to_be_implemented,
|
||||
regulator = @regulator,
|
||||
owner_id = @owner_id,
|
||||
last_review_date = @last_review_date,
|
||||
due_date = @due_date,
|
||||
status = @status,
|
||||
updated_at = @updated_at
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
AND snapshot_id IS NULL
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"id": o.ID,
|
||||
"reference_id": o.ReferenceID,
|
||||
"area": o.Area,
|
||||
"source": o.Source,
|
||||
"requirement": o.Requirement,
|
||||
"actions_to_be_implemented": o.ActionsToBeImplemented,
|
||||
"regulator": o.Regulator,
|
||||
"owner_id": o.OwnerID,
|
||||
"last_review_date": o.LastReviewDate,
|
||||
"due_date": o.DueDate,
|
||||
"status": o.Status,
|
||||
"updated_at": o.UpdatedAt,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot update obligation: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Obligation) Delete(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM obligations
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
AND snapshot_id IS NULL
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"id": o.ID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete obligation: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (os Obligations) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
|
||||
query := `
|
||||
INSERT INTO obligations (
|
||||
id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
source_id,
|
||||
organization_id,
|
||||
reference_id,
|
||||
area,
|
||||
source,
|
||||
requirement,
|
||||
actions_to_be_implemented,
|
||||
regulator,
|
||||
owner_id,
|
||||
last_review_date,
|
||||
due_date,
|
||||
status,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @obligation_entity_type),
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
o.id,
|
||||
o.organization_id,
|
||||
o.reference_id,
|
||||
o.area,
|
||||
o.source,
|
||||
o.requirement,
|
||||
o.actions_to_be_implemented,
|
||||
o.regulator,
|
||||
o.owner_id,
|
||||
o.last_review_date,
|
||||
o.due_date,
|
||||
o.status,
|
||||
o.created_at,
|
||||
o.updated_at
|
||||
FROM obligations o
|
||||
WHERE %s AND o.organization_id = @organization_id AND o.snapshot_id IS NULL
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"snapshot_id": snapshotID,
|
||||
"organization_id": organizationID,
|
||||
"obligation_entity_type": ObligationEntityType,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
_, err := conn.Exec(ctx, query, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert obligation snapshots: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -20,18 +20,18 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
ContinualImprovementRegistryFilter struct {
|
||||
ObligationFilter struct {
|
||||
snapshotID **gid.GID
|
||||
}
|
||||
)
|
||||
|
||||
func NewContinualImprovementRegistryFilter(snapshotID **gid.GID) *ContinualImprovementRegistryFilter {
|
||||
return &ContinualImprovementRegistryFilter{
|
||||
func NewObligationFilter(snapshotID **gid.GID) *ObligationFilter {
|
||||
return &ObligationFilter{
|
||||
snapshotID: snapshotID,
|
||||
}
|
||||
}
|
||||
|
||||
func (f *ContinualImprovementRegistryFilter) SQLArguments() pgx.NamedArgs {
|
||||
func (f *ObligationFilter) SQLArguments() pgx.NamedArgs {
|
||||
args := pgx.NamedArgs{}
|
||||
|
||||
if f.snapshotID != nil && *f.snapshotID != nil {
|
||||
@@ -41,7 +41,7 @@ func (f *ContinualImprovementRegistryFilter) SQLArguments() pgx.NamedArgs {
|
||||
return args
|
||||
}
|
||||
|
||||
func (f *ContinualImprovementRegistryFilter) SQLFragment() string {
|
||||
func (f *ObligationFilter) SQLFragment() string {
|
||||
if f.snapshotID == nil {
|
||||
return "TRUE"
|
||||
}
|
||||
55
pkg/coredata/obligation_order_field.go
Normal file
55
pkg/coredata/obligation_order_field.go
Normal file
@@ -0,0 +1,55 @@
|
||||
// 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 (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ObligationOrderField string
|
||||
|
||||
const (
|
||||
ObligationOrderFieldCreatedAt ObligationOrderField = "CREATED_AT"
|
||||
ObligationOrderFieldLastReviewDate ObligationOrderField = "LAST_REVIEW_DATE"
|
||||
ObligationOrderFieldDueDate ObligationOrderField = "DUE_DATE"
|
||||
ObligationOrderFieldStatus ObligationOrderField = "STATUS"
|
||||
ObligationOrderFieldReferenceId ObligationOrderField = "REFERENCE_ID"
|
||||
)
|
||||
|
||||
func (p ObligationOrderField) Column() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ObligationOrderField) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ObligationOrderField) MarshalText() ([]byte, error) {
|
||||
return []byte(p.String()), nil
|
||||
}
|
||||
|
||||
func (p *ObligationOrderField) UnmarshalText(text []byte) error {
|
||||
val := string(text)
|
||||
switch val {
|
||||
case string(ObligationOrderFieldCreatedAt),
|
||||
string(ObligationOrderFieldLastReviewDate),
|
||||
string(ObligationOrderFieldDueDate),
|
||||
string(ObligationOrderFieldStatus),
|
||||
string(ObligationOrderFieldReferenceId):
|
||||
*p = ObligationOrderField(val)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid ObligationOrderField value: %q", val)
|
||||
}
|
||||
@@ -19,19 +19,19 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ContinualImprovementRegistriesStatus string
|
||||
type ObligationStatus string
|
||||
|
||||
const (
|
||||
ContinualImprovementRegistriesStatusOpen ContinualImprovementRegistriesStatus = "OPEN"
|
||||
ContinualImprovementRegistriesStatusInProgress ContinualImprovementRegistriesStatus = "IN_PROGRESS"
|
||||
ContinualImprovementRegistriesStatusClosed ContinualImprovementRegistriesStatus = "CLOSED"
|
||||
ObligationStatusOpen ObligationStatus = "OPEN"
|
||||
ObligationStatusInProgress ObligationStatus = "IN_PROGRESS"
|
||||
ObligationStatusClosed ObligationStatus = "CLOSED"
|
||||
)
|
||||
|
||||
func (cirs ContinualImprovementRegistriesStatus) String() string {
|
||||
return string(cirs)
|
||||
func (os ObligationStatus) String() string {
|
||||
return string(os)
|
||||
}
|
||||
|
||||
func (cirs *ContinualImprovementRegistriesStatus) Scan(value any) error {
|
||||
func (os *ObligationStatus) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
@@ -39,22 +39,22 @@ func (cirs *ContinualImprovementRegistriesStatus) Scan(value any) error {
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ContinualImprovementRegistriesStatus: %T", value)
|
||||
return fmt.Errorf("unsupported type for ObligationStatus: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "OPEN":
|
||||
*cirs = ContinualImprovementRegistriesStatusOpen
|
||||
*os = ObligationStatusOpen
|
||||
case "IN_PROGRESS":
|
||||
*cirs = ContinualImprovementRegistriesStatusInProgress
|
||||
*os = ObligationStatusInProgress
|
||||
case "CLOSED":
|
||||
*cirs = ContinualImprovementRegistriesStatusClosed
|
||||
*os = ObligationStatusClosed
|
||||
default:
|
||||
return fmt.Errorf("invalid ContinualImprovementRegistriesStatus value: %q", s)
|
||||
return fmt.Errorf("invalid ObligationStatus value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cirs ContinualImprovementRegistriesStatus) Value() (driver.Value, error) {
|
||||
return cirs.String(), nil
|
||||
func (os ObligationStatus) Value() (driver.Value, error) {
|
||||
return os.String(), nil
|
||||
}
|
||||
@@ -27,49 +27,49 @@ 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"`
|
||||
DataSubjectCategory *string `db:"data_subject_category"`
|
||||
PersonalDataCategory *string `db:"personal_data_category"`
|
||||
SpecialOrCriminalData ProcessingActivityRegistrySpecialOrCriminalData `db:"special_or_criminal_data"`
|
||||
ConsentEvidenceLink *string `db:"consent_evidence_link"`
|
||||
LawfulBasis ProcessingActivityRegistryLawfulBasis `db:"lawful_basis"`
|
||||
Recipients *string `db:"recipients"`
|
||||
Location *string `db:"location"`
|
||||
InternationalTransfers bool `db:"international_transfers"`
|
||||
TransferSafeguards *ProcessingActivityRegistryTransferSafeguards `db:"transfer_safeguards"`
|
||||
RetentionPeriod *string `db:"retention_period"`
|
||||
SecurityMeasures *string `db:"security_measures"`
|
||||
DataProtectionImpactAssessment ProcessingActivityRegistryDataProtectionImpactAssessment `db:"data_protection_impact_assessment"`
|
||||
TransferImpactAssessment ProcessingActivityRegistryTransferImpactAssessment `db:"transfer_impact_assessment"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
ProcessingActivity 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"`
|
||||
DataSubjectCategory *string `db:"data_subject_category"`
|
||||
PersonalDataCategory *string `db:"personal_data_category"`
|
||||
SpecialOrCriminalData ProcessingActivitySpecialOrCriminalData `db:"special_or_criminal_data"`
|
||||
ConsentEvidenceLink *string `db:"consent_evidence_link"`
|
||||
LawfulBasis ProcessingActivityLawfulBasis `db:"lawful_basis"`
|
||||
Recipients *string `db:"recipients"`
|
||||
Location *string `db:"location"`
|
||||
InternationalTransfers bool `db:"international_transfers"`
|
||||
TransferSafeguards *ProcessingActivityTransferSafeguards `db:"transfer_safeguards"`
|
||||
RetentionPeriod *string `db:"retention_period"`
|
||||
SecurityMeasures *string `db:"security_measures"`
|
||||
DataProtectionImpactAssessment ProcessingActivityDataProtectionImpactAssessment `db:"data_protection_impact_assessment"`
|
||||
TransferImpactAssessment ProcessingActivityTransferImpactAssessment `db:"transfer_impact_assessment"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
|
||||
ProcessingActivityRegistries []*ProcessingActivityRegistry
|
||||
ProcessingActivities []*ProcessingActivity
|
||||
)
|
||||
|
||||
func (p *ProcessingActivityRegistry) CursorKey(field ProcessingActivityRegistryOrderField) page.CursorKey {
|
||||
func (p *ProcessingActivity) CursorKey(field ProcessingActivityOrderField) page.CursorKey {
|
||||
switch field {
|
||||
case ProcessingActivityRegistryOrderFieldCreatedAt:
|
||||
case ProcessingActivityOrderFieldCreatedAt:
|
||||
return page.NewCursorKey(p.ID, p.CreatedAt)
|
||||
case ProcessingActivityRegistryOrderFieldName:
|
||||
case ProcessingActivityOrderFieldName:
|
||||
return page.NewCursorKey(p.ID, p.Name)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("unsupported order by: %s", field))
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistry) LoadByID(
|
||||
func (p *ProcessingActivity) LoadByID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
processingActivityRegistryID gid.GID,
|
||||
processingActivityID gid.GID,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
@@ -95,45 +95,45 @@ SELECT
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
processing_activity_registries
|
||||
processing_activities
|
||||
WHERE
|
||||
%s
|
||||
AND id = @processing_activity_registry_id
|
||||
AND id = @processing_activity_id
|
||||
LIMIT 1;
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{"processing_activity_registry_id": processingActivityRegistryID}
|
||||
args := pgx.StrictNamedArgs{"processing_activity_id": processingActivityID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query processing activity registry: %w", err)
|
||||
return fmt.Errorf("cannot query processing activity: %w", err)
|
||||
}
|
||||
|
||||
processingActivityRegistry, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[ProcessingActivityRegistry])
|
||||
processingActivity, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[ProcessingActivity])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect processing activity registry: %w", err)
|
||||
return fmt.Errorf("cannot collect processing activity: %w", err)
|
||||
}
|
||||
|
||||
*p = processingActivityRegistry
|
||||
*p = processingActivity
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistries) CountByOrganizationID(
|
||||
func (p *ProcessingActivities) CountByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
filter *ProcessingActivityRegistryFilter,
|
||||
filter *ProcessingActivityFilter,
|
||||
) (int, error) {
|
||||
q := `
|
||||
SELECT
|
||||
COUNT(id)
|
||||
FROM
|
||||
processing_activity_registries
|
||||
processing_activities
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
@@ -151,19 +151,19 @@ WHERE
|
||||
var count int
|
||||
err := row.Scan(&count)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("cannot count processing activity registries: %w", err)
|
||||
return 0, fmt.Errorf("cannot count processing activities: %w", err)
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistries) LoadByOrganizationID(
|
||||
func (p *ProcessingActivities) LoadByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[ProcessingActivityRegistryOrderField],
|
||||
filter *ProcessingActivityRegistryFilter,
|
||||
cursor *page.Cursor[ProcessingActivityOrderField],
|
||||
filter *ProcessingActivityFilter,
|
||||
) error {
|
||||
q := `
|
||||
SELECT
|
||||
@@ -189,7 +189,7 @@ SELECT
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
processing_activity_registries
|
||||
processing_activities
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
@@ -206,26 +206,26 @@ WHERE
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query processing activity registries: %w", err)
|
||||
return fmt.Errorf("cannot query processing activities: %w", err)
|
||||
}
|
||||
|
||||
processingActivityRegistries, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[ProcessingActivityRegistry])
|
||||
processingActivities, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[ProcessingActivity])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect processing activity registries: %w", err)
|
||||
return fmt.Errorf("cannot collect processing activities: %w", err)
|
||||
}
|
||||
|
||||
*p = processingActivityRegistries
|
||||
*p = processingActivities
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistry) Insert(
|
||||
func (p *ProcessingActivity) Insert(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
INSERT INTO processing_activity_registries (
|
||||
INSERT INTO processing_activities (
|
||||
id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
@@ -301,19 +301,19 @@ INSERT INTO processing_activity_registries (
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot insert processing activity registry: %w", err)
|
||||
return fmt.Errorf("cannot insert processing activity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistry) Update(
|
||||
func (p *ProcessingActivity) Update(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
UPDATE processing_activity_registries
|
||||
UPDATE processing_activities
|
||||
SET
|
||||
name = @name,
|
||||
purpose = @purpose,
|
||||
@@ -362,19 +362,19 @@ WHERE
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot update processing activity registry: %w", err)
|
||||
return fmt.Errorf("cannot update processing activity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistry) Delete(
|
||||
func (p *ProcessingActivity) Delete(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM processing_activity_registries
|
||||
DELETE FROM processing_activities
|
||||
WHERE
|
||||
%s
|
||||
AND id = @id
|
||||
@@ -388,15 +388,15 @@ WHERE
|
||||
|
||||
_, err := conn.Exec(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete processing activity registry: %w", err)
|
||||
return fmt.Errorf("cannot delete processing activity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pars ProcessingActivityRegistries) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
|
||||
func (pas ProcessingActivities) Snapshot(ctx context.Context, conn pg.Conn, scope Scoper, organizationID, snapshotID gid.GID) error {
|
||||
query := `
|
||||
INSERT INTO processing_activity_registries (
|
||||
INSERT INTO processing_activities (
|
||||
id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
@@ -421,7 +421,7 @@ INSERT INTO processing_activity_registries (
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @processing_activity_registry_entity_type),
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @processing_activity_entity_type),
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
par.id,
|
||||
@@ -443,23 +443,23 @@ SELECT
|
||||
par.transfer_impact_assessment,
|
||||
par.created_at,
|
||||
par.updated_at
|
||||
FROM processing_activity_registries par
|
||||
FROM processing_activities 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,
|
||||
"tenant_id": scope.GetTenantID(),
|
||||
"snapshot_id": snapshotID,
|
||||
"organization_id": organizationID,
|
||||
"processing_activity_entity_type": ProcessingActivityEntityType,
|
||||
}
|
||||
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 fmt.Errorf("cannot insert processing activity snapshots: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -19,18 +19,18 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ProcessingActivityRegistryTransferImpactAssessment string
|
||||
type ProcessingActivityDataProtectionImpactAssessment string
|
||||
|
||||
const (
|
||||
ProcessingActivityRegistryTransferImpactAssessmentNeeded ProcessingActivityRegistryTransferImpactAssessment = "NEEDED"
|
||||
ProcessingActivityRegistryTransferImpactAssessmentNotNeeded ProcessingActivityRegistryTransferImpactAssessment = "NOT_NEEDED"
|
||||
ProcessingActivityDataProtectionImpactAssessmentNeeded ProcessingActivityDataProtectionImpactAssessment = "NEEDED"
|
||||
ProcessingActivityDataProtectionImpactAssessmentNotNeeded ProcessingActivityDataProtectionImpactAssessment = "NOT_NEEDED"
|
||||
)
|
||||
|
||||
func (p ProcessingActivityRegistryTransferImpactAssessment) String() string {
|
||||
func (p ProcessingActivityDataProtectionImpactAssessment) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistryTransferImpactAssessment) Scan(value any) error {
|
||||
func (p *ProcessingActivityDataProtectionImpactAssessment) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
@@ -38,20 +38,20 @@ func (p *ProcessingActivityRegistryTransferImpactAssessment) Scan(value any) err
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityRegistryTransferImpactAssessment: %T", value)
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityDataProtectionImpactAssessment: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "NEEDED":
|
||||
*p = ProcessingActivityRegistryTransferImpactAssessmentNeeded
|
||||
*p = ProcessingActivityDataProtectionImpactAssessmentNeeded
|
||||
case "NOT_NEEDED":
|
||||
*p = ProcessingActivityRegistryTransferImpactAssessmentNotNeeded
|
||||
*p = ProcessingActivityDataProtectionImpactAssessmentNotNeeded
|
||||
default:
|
||||
return fmt.Errorf("invalid ProcessingActivityRegistryTransferImpactAssessment value: %q", s)
|
||||
return fmt.Errorf("invalid ProcessingActivityDataProtectionImpactAssessment value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p ProcessingActivityRegistryTransferImpactAssessment) Value() (driver.Value, error) {
|
||||
func (p ProcessingActivityDataProtectionImpactAssessment) Value() (driver.Value, error) {
|
||||
return p.String(), nil
|
||||
}
|
||||
@@ -20,18 +20,18 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
ComplianceRegistryFilter struct {
|
||||
ProcessingActivityFilter struct {
|
||||
snapshotID **gid.GID
|
||||
}
|
||||
)
|
||||
|
||||
func NewComplianceRegistryFilter(snapshotID **gid.GID) *ComplianceRegistryFilter {
|
||||
return &ComplianceRegistryFilter{
|
||||
func NewProcessingActivityFilter(snapshotID **gid.GID) *ProcessingActivityFilter {
|
||||
return &ProcessingActivityFilter{
|
||||
snapshotID: snapshotID,
|
||||
}
|
||||
}
|
||||
|
||||
func (f *ComplianceRegistryFilter) SQLArguments() pgx.NamedArgs {
|
||||
func (f *ProcessingActivityFilter) SQLArguments() pgx.NamedArgs {
|
||||
args := pgx.NamedArgs{}
|
||||
|
||||
if f.snapshotID != nil && *f.snapshotID != nil {
|
||||
@@ -41,7 +41,7 @@ func (f *ComplianceRegistryFilter) SQLArguments() pgx.NamedArgs {
|
||||
return args
|
||||
}
|
||||
|
||||
func (f *ComplianceRegistryFilter) SQLFragment() string {
|
||||
func (f *ProcessingActivityFilter) SQLFragment() string {
|
||||
if f.snapshotID == nil {
|
||||
return "TRUE"
|
||||
}
|
||||
69
pkg/coredata/processing_activity_lawful_basis.go
Normal file
69
pkg/coredata/processing_activity_lawful_basis.go
Normal file
@@ -0,0 +1,69 @@
|
||||
// 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 (
|
||||
"database/sql/driver"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ProcessingActivityLawfulBasis string
|
||||
|
||||
const (
|
||||
ProcessingActivityLawfulBasisLegitimateInterest ProcessingActivityLawfulBasis = "LEGITIMATE_INTEREST"
|
||||
ProcessingActivityLawfulBasisConsent ProcessingActivityLawfulBasis = "CONSENT"
|
||||
ProcessingActivityLawfulBasisContractualNecessity ProcessingActivityLawfulBasis = "CONTRACTUAL_NECESSITY"
|
||||
ProcessingActivityLawfulBasisLegalObligation ProcessingActivityLawfulBasis = "LEGAL_OBLIGATION"
|
||||
ProcessingActivityLawfulBasisVitalInterests ProcessingActivityLawfulBasis = "VITAL_INTERESTS"
|
||||
ProcessingActivityLawfulBasisPublicTask ProcessingActivityLawfulBasis = "PUBLIC_TASK"
|
||||
)
|
||||
|
||||
func (p ProcessingActivityLawfulBasis) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityLawfulBasis) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
s = v
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityLawfulBasis: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "LEGITIMATE_INTEREST":
|
||||
*p = ProcessingActivityLawfulBasisLegitimateInterest
|
||||
case "CONSENT":
|
||||
*p = ProcessingActivityLawfulBasisConsent
|
||||
case "CONTRACTUAL_NECESSITY":
|
||||
*p = ProcessingActivityLawfulBasisContractualNecessity
|
||||
case "LEGAL_OBLIGATION":
|
||||
*p = ProcessingActivityLawfulBasisLegalObligation
|
||||
case "VITAL_INTERESTS":
|
||||
*p = ProcessingActivityLawfulBasisVitalInterests
|
||||
case "PUBLIC_TASK":
|
||||
*p = ProcessingActivityLawfulBasisPublicTask
|
||||
default:
|
||||
return fmt.Errorf("invalid ProcessingActivityLawfulBasis value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p ProcessingActivityLawfulBasis) Value() (driver.Value, error) {
|
||||
return p.String(), nil
|
||||
}
|
||||
@@ -18,32 +18,32 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ProcessingActivityRegistryOrderField string
|
||||
type ProcessingActivityOrderField string
|
||||
|
||||
const (
|
||||
ProcessingActivityRegistryOrderFieldCreatedAt ProcessingActivityRegistryOrderField = "CREATED_AT"
|
||||
ProcessingActivityRegistryOrderFieldName ProcessingActivityRegistryOrderField = "NAME"
|
||||
ProcessingActivityOrderFieldCreatedAt ProcessingActivityOrderField = "CREATED_AT"
|
||||
ProcessingActivityOrderFieldName ProcessingActivityOrderField = "NAME"
|
||||
)
|
||||
|
||||
func (p ProcessingActivityRegistryOrderField) Column() string {
|
||||
func (p ProcessingActivityOrderField) Column() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ProcessingActivityRegistryOrderField) String() string {
|
||||
func (p ProcessingActivityOrderField) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p ProcessingActivityRegistryOrderField) MarshalText() ([]byte, error) {
|
||||
func (p ProcessingActivityOrderField) MarshalText() ([]byte, error) {
|
||||
return []byte(p.String()), nil
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistryOrderField) UnmarshalText(text []byte) error {
|
||||
func (p *ProcessingActivityOrderField) UnmarshalText(text []byte) error {
|
||||
val := string(text)
|
||||
switch val {
|
||||
case string(ProcessingActivityRegistryOrderFieldCreatedAt),
|
||||
string(ProcessingActivityRegistryOrderFieldName):
|
||||
*p = ProcessingActivityRegistryOrderField(val)
|
||||
case string(ProcessingActivityOrderFieldCreatedAt),
|
||||
string(ProcessingActivityOrderFieldName):
|
||||
*p = ProcessingActivityOrderField(val)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid ProcessingActivityRegistryOrderField value: %q", val)
|
||||
return fmt.Errorf("invalid ProcessingActivityOrderField value: %q", val)
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
// 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 (
|
||||
"database/sql/driver"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ProcessingActivityRegistryLawfulBasis string
|
||||
|
||||
const (
|
||||
ProcessingActivityRegistryLawfulBasisLegitimateInterest ProcessingActivityRegistryLawfulBasis = "LEGITIMATE_INTEREST"
|
||||
ProcessingActivityRegistryLawfulBasisConsent ProcessingActivityRegistryLawfulBasis = "CONSENT"
|
||||
ProcessingActivityRegistryLawfulBasisContractualNecessity ProcessingActivityRegistryLawfulBasis = "CONTRACTUAL_NECESSITY"
|
||||
ProcessingActivityRegistryLawfulBasisLegalObligation ProcessingActivityRegistryLawfulBasis = "LEGAL_OBLIGATION"
|
||||
ProcessingActivityRegistryLawfulBasisVitalInterests ProcessingActivityRegistryLawfulBasis = "VITAL_INTERESTS"
|
||||
ProcessingActivityRegistryLawfulBasisPublicTask ProcessingActivityRegistryLawfulBasis = "PUBLIC_TASK"
|
||||
)
|
||||
|
||||
func (p ProcessingActivityRegistryLawfulBasis) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistryLawfulBasis) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
s = v
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityRegistryLawfulBasis: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "LEGITIMATE_INTEREST":
|
||||
*p = ProcessingActivityRegistryLawfulBasisLegitimateInterest
|
||||
case "CONSENT":
|
||||
*p = ProcessingActivityRegistryLawfulBasisConsent
|
||||
case "CONTRACTUAL_NECESSITY":
|
||||
*p = ProcessingActivityRegistryLawfulBasisContractualNecessity
|
||||
case "LEGAL_OBLIGATION":
|
||||
*p = ProcessingActivityRegistryLawfulBasisLegalObligation
|
||||
case "VITAL_INTERESTS":
|
||||
*p = ProcessingActivityRegistryLawfulBasisVitalInterests
|
||||
case "PUBLIC_TASK":
|
||||
*p = ProcessingActivityRegistryLawfulBasisPublicTask
|
||||
default:
|
||||
return fmt.Errorf("invalid ProcessingActivityRegistryLawfulBasis value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p ProcessingActivityRegistryLawfulBasis) Value() (driver.Value, error) {
|
||||
return p.String(), nil
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
// 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 (
|
||||
"database/sql/driver"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ProcessingActivityRegistryTransferSafeguards string
|
||||
|
||||
const (
|
||||
ProcessingActivityRegistryTransferSafeguardsStandardContractualClauses ProcessingActivityRegistryTransferSafeguards = "STANDARD_CONTRACTUAL_CLAUSES"
|
||||
ProcessingActivityRegistryTransferSafeguardsBindingCorporateRules ProcessingActivityRegistryTransferSafeguards = "BINDING_CORPORATE_RULES"
|
||||
ProcessingActivityRegistryTransferSafeguardsAdequacyDecision ProcessingActivityRegistryTransferSafeguards = "ADEQUACY_DECISION"
|
||||
ProcessingActivityRegistryTransferSafeguardsDerogations ProcessingActivityRegistryTransferSafeguards = "DEROGATIONS"
|
||||
ProcessingActivityRegistryTransferSafeguardsCodesOfConduct ProcessingActivityRegistryTransferSafeguards = "CODES_OF_CONDUCT"
|
||||
ProcessingActivityRegistryTransferSafeguardsCertificationMechanisms ProcessingActivityRegistryTransferSafeguards = "CERTIFICATION_MECHANISMS"
|
||||
)
|
||||
|
||||
func (p ProcessingActivityRegistryTransferSafeguards) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistryTransferSafeguards) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
s = v
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityRegistryTransferSafeguards: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "STANDARD_CONTRACTUAL_CLAUSES":
|
||||
*p = ProcessingActivityRegistryTransferSafeguardsStandardContractualClauses
|
||||
case "BINDING_CORPORATE_RULES":
|
||||
*p = ProcessingActivityRegistryTransferSafeguardsBindingCorporateRules
|
||||
case "ADEQUACY_DECISION":
|
||||
*p = ProcessingActivityRegistryTransferSafeguardsAdequacyDecision
|
||||
case "DEROGATIONS":
|
||||
*p = ProcessingActivityRegistryTransferSafeguardsDerogations
|
||||
case "CODES_OF_CONDUCT":
|
||||
*p = ProcessingActivityRegistryTransferSafeguardsCodesOfConduct
|
||||
case "CERTIFICATION_MECHANISMS":
|
||||
*p = ProcessingActivityRegistryTransferSafeguardsCertificationMechanisms
|
||||
default:
|
||||
return fmt.Errorf("invalid ProcessingActivityRegistryTransferSafeguards value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p ProcessingActivityRegistryTransferSafeguards) Value() (driver.Value, error) {
|
||||
return p.String(), nil
|
||||
}
|
||||
@@ -19,19 +19,19 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ProcessingActivityRegistrySpecialOrCriminalData string
|
||||
type ProcessingActivitySpecialOrCriminalData string
|
||||
|
||||
const (
|
||||
ProcessingActivityRegistrySpecialOrCriminalDataYes ProcessingActivityRegistrySpecialOrCriminalData = "YES"
|
||||
ProcessingActivityRegistrySpecialOrCriminalDataNo ProcessingActivityRegistrySpecialOrCriminalData = "NO"
|
||||
ProcessingActivityRegistrySpecialOrCriminalDataPossible ProcessingActivityRegistrySpecialOrCriminalData = "POSSIBLE"
|
||||
ProcessingActivitySpecialOrCriminalDataYes ProcessingActivitySpecialOrCriminalData = "YES"
|
||||
ProcessingActivitySpecialOrCriminalDataNo ProcessingActivitySpecialOrCriminalData = "NO"
|
||||
ProcessingActivitySpecialOrCriminalDataPossible ProcessingActivitySpecialOrCriminalData = "POSSIBLE"
|
||||
)
|
||||
|
||||
func (p ProcessingActivityRegistrySpecialOrCriminalData) String() string {
|
||||
func (p ProcessingActivitySpecialOrCriminalData) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistrySpecialOrCriminalData) Scan(value any) error {
|
||||
func (p *ProcessingActivitySpecialOrCriminalData) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
@@ -39,22 +39,22 @@ func (p *ProcessingActivityRegistrySpecialOrCriminalData) Scan(value any) error
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityRegistrySpecialOrCriminalData: %T", value)
|
||||
return fmt.Errorf("unsupported type for ProcessingActivitySpecialOrCriminalData: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "YES":
|
||||
*p = ProcessingActivityRegistrySpecialOrCriminalDataYes
|
||||
*p = ProcessingActivitySpecialOrCriminalDataYes
|
||||
case "NO":
|
||||
*p = ProcessingActivityRegistrySpecialOrCriminalDataNo
|
||||
*p = ProcessingActivitySpecialOrCriminalDataNo
|
||||
case "POSSIBLE":
|
||||
*p = ProcessingActivityRegistrySpecialOrCriminalDataPossible
|
||||
*p = ProcessingActivitySpecialOrCriminalDataPossible
|
||||
default:
|
||||
return fmt.Errorf("invalid ProcessingActivityRegistrySpecialOrCriminalData value: %q", s)
|
||||
return fmt.Errorf("invalid ProcessingActivitySpecialOrCriminalData value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p ProcessingActivityRegistrySpecialOrCriminalData) Value() (driver.Value, error) {
|
||||
func (p ProcessingActivitySpecialOrCriminalData) Value() (driver.Value, error) {
|
||||
return p.String(), nil
|
||||
}
|
||||
@@ -19,18 +19,18 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ProcessingActivityRegistryDataProtectionImpactAssessment string
|
||||
type ProcessingActivityTransferImpactAssessment string
|
||||
|
||||
const (
|
||||
ProcessingActivityRegistryDataProtectionImpactAssessmentNeeded ProcessingActivityRegistryDataProtectionImpactAssessment = "NEEDED"
|
||||
ProcessingActivityRegistryDataProtectionImpactAssessmentNotNeeded ProcessingActivityRegistryDataProtectionImpactAssessment = "NOT_NEEDED"
|
||||
ProcessingActivityTransferImpactAssessmentNeeded ProcessingActivityTransferImpactAssessment = "NEEDED"
|
||||
ProcessingActivityTransferImpactAssessmentNotNeeded ProcessingActivityTransferImpactAssessment = "NOT_NEEDED"
|
||||
)
|
||||
|
||||
func (p ProcessingActivityRegistryDataProtectionImpactAssessment) String() string {
|
||||
func (p ProcessingActivityTransferImpactAssessment) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityRegistryDataProtectionImpactAssessment) Scan(value any) error {
|
||||
func (p *ProcessingActivityTransferImpactAssessment) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
@@ -38,20 +38,20 @@ func (p *ProcessingActivityRegistryDataProtectionImpactAssessment) Scan(value an
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityRegistryDataProtectionImpactAssessment: %T", value)
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityTransferImpactAssessment: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "NEEDED":
|
||||
*p = ProcessingActivityRegistryDataProtectionImpactAssessmentNeeded
|
||||
*p = ProcessingActivityTransferImpactAssessmentNeeded
|
||||
case "NOT_NEEDED":
|
||||
*p = ProcessingActivityRegistryDataProtectionImpactAssessmentNotNeeded
|
||||
*p = ProcessingActivityTransferImpactAssessmentNotNeeded
|
||||
default:
|
||||
return fmt.Errorf("invalid ProcessingActivityRegistryDataProtectionImpactAssessment value: %q", s)
|
||||
return fmt.Errorf("invalid ProcessingActivityTransferImpactAssessment value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p ProcessingActivityRegistryDataProtectionImpactAssessment) Value() (driver.Value, error) {
|
||||
func (p ProcessingActivityTransferImpactAssessment) Value() (driver.Value, error) {
|
||||
return p.String(), nil
|
||||
}
|
||||
69
pkg/coredata/processing_activity_transfer_safeguards.go
Normal file
69
pkg/coredata/processing_activity_transfer_safeguards.go
Normal file
@@ -0,0 +1,69 @@
|
||||
// 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 (
|
||||
"database/sql/driver"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ProcessingActivityTransferSafeguards string
|
||||
|
||||
const (
|
||||
ProcessingActivityTransferSafeguardsStandardContractualClauses ProcessingActivityTransferSafeguards = "STANDARD_CONTRACTUAL_CLAUSES"
|
||||
ProcessingActivityTransferSafeguardsBindingCorporateRules ProcessingActivityTransferSafeguards = "BINDING_CORPORATE_RULES"
|
||||
ProcessingActivityTransferSafeguardsAdequacyDecision ProcessingActivityTransferSafeguards = "ADEQUACY_DECISION"
|
||||
ProcessingActivityTransferSafeguardsDerogations ProcessingActivityTransferSafeguards = "DEROGATIONS"
|
||||
ProcessingActivityTransferSafeguardsCodesOfConduct ProcessingActivityTransferSafeguards = "CODES_OF_CONDUCT"
|
||||
ProcessingActivityTransferSafeguardsCertificationMechanisms ProcessingActivityTransferSafeguards = "CERTIFICATION_MECHANISMS"
|
||||
)
|
||||
|
||||
func (p ProcessingActivityTransferSafeguards) String() string {
|
||||
return string(p)
|
||||
}
|
||||
|
||||
func (p *ProcessingActivityTransferSafeguards) Scan(value any) error {
|
||||
var s string
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
s = v
|
||||
case []byte:
|
||||
s = string(v)
|
||||
default:
|
||||
return fmt.Errorf("unsupported type for ProcessingActivityTransferSafeguards: %T", value)
|
||||
}
|
||||
|
||||
switch s {
|
||||
case "STANDARD_CONTRACTUAL_CLAUSES":
|
||||
*p = ProcessingActivityTransferSafeguardsStandardContractualClauses
|
||||
case "BINDING_CORPORATE_RULES":
|
||||
*p = ProcessingActivityTransferSafeguardsBindingCorporateRules
|
||||
case "ADEQUACY_DECISION":
|
||||
*p = ProcessingActivityTransferSafeguardsAdequacyDecision
|
||||
case "DEROGATIONS":
|
||||
*p = ProcessingActivityTransferSafeguardsDerogations
|
||||
case "CODES_OF_CONDUCT":
|
||||
*p = ProcessingActivityTransferSafeguardsCodesOfConduct
|
||||
case "CERTIFICATION_MECHANISMS":
|
||||
*p = ProcessingActivityTransferSafeguardsCertificationMechanisms
|
||||
default:
|
||||
return fmt.Errorf("invalid ProcessingActivityTransferSafeguards value: %q", s)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p ProcessingActivityTransferSafeguards) Value() (driver.Value, error) {
|
||||
return p.String(), nil
|
||||
}
|
||||
@@ -24,14 +24,14 @@ type (
|
||||
)
|
||||
|
||||
const (
|
||||
SnapshotsTypeRisks SnapshotsType = "RISKS"
|
||||
SnapshotsTypeVendors SnapshotsType = "VENDORS"
|
||||
SnapshotsTypeAssets SnapshotsType = "ASSETS"
|
||||
SnapshotsTypeData SnapshotsType = "DATA"
|
||||
SnapshotsTypeNonConformityRegistries SnapshotsType = "NONCONFORMITY_REGISTRIES"
|
||||
SnapshotsTypeComplianceRegistries SnapshotsType = "COMPLIANCE_REGISTRIES"
|
||||
SnapshotsTypeContinualImprovementRegistries SnapshotsType = "CONTINUAL_IMPROVEMENT_REGISTRIES"
|
||||
SnapshotsTypeProcessingActivityRegistries SnapshotsType = "PROCESSING_ACTIVITY_REGISTRIES"
|
||||
SnapshotsTypeRisks SnapshotsType = "RISKS"
|
||||
SnapshotsTypeVendors SnapshotsType = "VENDORS"
|
||||
SnapshotsTypeAssets SnapshotsType = "ASSETS"
|
||||
SnapshotsTypeData SnapshotsType = "DATA"
|
||||
SnapshotsTypeNonconformities SnapshotsType = "NONCONFORMITIES"
|
||||
SnapshotsTypeObligations SnapshotsType = "OBLIGATIONS"
|
||||
SnapshotsTypeContinualImprovements SnapshotsType = "CONTINUAL_IMPROVEMENTS"
|
||||
SnapshotsTypeProcessingActivities SnapshotsType = "PROCESSING_ACTIVITIES"
|
||||
)
|
||||
|
||||
func (st SnapshotsType) String() string {
|
||||
@@ -58,14 +58,14 @@ func (st *SnapshotsType) Scan(value any) error {
|
||||
*st = SnapshotsTypeAssets
|
||||
case SnapshotsTypeData.String():
|
||||
*st = SnapshotsTypeData
|
||||
case SnapshotsTypeNonConformityRegistries.String():
|
||||
*st = SnapshotsTypeNonConformityRegistries
|
||||
case SnapshotsTypeComplianceRegistries.String():
|
||||
*st = SnapshotsTypeComplianceRegistries
|
||||
case SnapshotsTypeContinualImprovementRegistries.String():
|
||||
*st = SnapshotsTypeContinualImprovementRegistries
|
||||
case SnapshotsTypeProcessingActivityRegistries.String():
|
||||
*st = SnapshotsTypeProcessingActivityRegistries
|
||||
case SnapshotsTypeNonconformities.String():
|
||||
*st = SnapshotsTypeNonconformities
|
||||
case SnapshotsTypeObligations.String():
|
||||
*st = SnapshotsTypeObligations
|
||||
case SnapshotsTypeContinualImprovements.String():
|
||||
*st = SnapshotsTypeContinualImprovements
|
||||
case SnapshotsTypeProcessingActivities.String():
|
||||
*st = SnapshotsTypeProcessingActivities
|
||||
default:
|
||||
return fmt.Errorf("invalid SnapshotsType value: %q", s)
|
||||
}
|
||||
|
||||
@@ -34,14 +34,14 @@ func GetSnapshottable(snapshotType SnapshotsType) (Snapshottable, error) {
|
||||
return Risks{}, nil
|
||||
case SnapshotsTypeData:
|
||||
return Data{}, nil
|
||||
case SnapshotsTypeNonConformityRegistries:
|
||||
return NonconformityRegistries{}, nil
|
||||
case SnapshotsTypeComplianceRegistries:
|
||||
return ComplianceRegistries{}, nil
|
||||
case SnapshotsTypeContinualImprovementRegistries:
|
||||
return ContinualImprovementRegistries{}, nil
|
||||
case SnapshotsTypeProcessingActivityRegistries:
|
||||
return ProcessingActivityRegistries{}, nil
|
||||
case SnapshotsTypeNonconformities:
|
||||
return Nonconformities{}, nil
|
||||
case SnapshotsTypeObligations:
|
||||
return Obligations{}, nil
|
||||
case SnapshotsTypeContinualImprovements:
|
||||
return ContinualImprovements{}, nil
|
||||
case SnapshotsTypeProcessingActivities:
|
||||
return ProcessingActivities{}, nil
|
||||
case SnapshotsTypeVendors:
|
||||
return Vendors{}, nil
|
||||
default:
|
||||
|
||||
@@ -25,45 +25,45 @@ import (
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type ContinualImprovementRegistriesService struct {
|
||||
type ContinualImprovementService struct {
|
||||
svc *TenantService
|
||||
}
|
||||
|
||||
type (
|
||||
CreateContinualImprovementRegistryRequest struct {
|
||||
CreateContinualImprovementRequest struct {
|
||||
OrganizationID gid.GID
|
||||
ReferenceID string
|
||||
Description *string
|
||||
Source *string
|
||||
OwnerID gid.GID
|
||||
TargetDate *time.Time
|
||||
Status *coredata.ContinualImprovementRegistriesStatus
|
||||
Priority *coredata.ContinualImprovementRegistriesPriority
|
||||
Status *coredata.ContinualImprovementStatus
|
||||
Priority *coredata.ContinualImprovementPriority
|
||||
}
|
||||
|
||||
UpdateContinualImprovementRegistryRequest struct {
|
||||
UpdateContinualImprovementRequest struct {
|
||||
ID gid.GID
|
||||
ReferenceID *string
|
||||
Description **string
|
||||
Source **string
|
||||
OwnerID *gid.GID
|
||||
TargetDate **time.Time
|
||||
Status *coredata.ContinualImprovementRegistriesStatus
|
||||
Priority *coredata.ContinualImprovementRegistriesPriority
|
||||
Status *coredata.ContinualImprovementStatus
|
||||
Priority *coredata.ContinualImprovementPriority
|
||||
}
|
||||
)
|
||||
|
||||
func (s ContinualImprovementRegistriesService) Get(
|
||||
func (s ContinualImprovementService) Get(
|
||||
ctx context.Context,
|
||||
continualImprovementRegistryID gid.GID,
|
||||
) (*coredata.ContinualImprovementRegistry, error) {
|
||||
registry := &coredata.ContinualImprovementRegistry{}
|
||||
continualImprovementID gid.GID,
|
||||
) (*coredata.ContinualImprovement, error) {
|
||||
improvement := &coredata.ContinualImprovement{}
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
if err := registry.LoadByID(ctx, conn, s.svc.scope, continualImprovementRegistryID); err != nil {
|
||||
return fmt.Errorf("cannot load continual improvement registry: %w", err)
|
||||
if err := improvement.LoadByID(ctx, conn, s.svc.scope, continualImprovementID); err != nil {
|
||||
return fmt.Errorf("cannot load continual improvement: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -74,17 +74,17 @@ func (s ContinualImprovementRegistriesService) Get(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return improvement, nil
|
||||
}
|
||||
|
||||
func (s *ContinualImprovementRegistriesService) Create(
|
||||
func (s *ContinualImprovementService) Create(
|
||||
ctx context.Context,
|
||||
req *CreateContinualImprovementRegistryRequest,
|
||||
) (*coredata.ContinualImprovementRegistry, error) {
|
||||
req *CreateContinualImprovementRequest,
|
||||
) (*coredata.ContinualImprovement, error) {
|
||||
now := time.Now()
|
||||
|
||||
registry := &coredata.ContinualImprovementRegistry{
|
||||
ID: gid.New(s.svc.scope.GetTenantID(), coredata.ContinualImprovementRegistryEntityType),
|
||||
improvement := &coredata.ContinualImprovement{
|
||||
ID: gid.New(s.svc.scope.GetTenantID(), coredata.ContinualImprovementEntityType),
|
||||
OrganizationID: req.OrganizationID,
|
||||
ReferenceID: req.ReferenceID,
|
||||
Description: req.Description,
|
||||
@@ -110,8 +110,8 @@ func (s *ContinualImprovementRegistriesService) Create(
|
||||
return fmt.Errorf("cannot load owner: %w", err)
|
||||
}
|
||||
|
||||
if err := registry.Insert(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot insert continual improvement registry: %w", err)
|
||||
if err := improvement.Insert(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot insert continual improvement: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -122,32 +122,32 @@ func (s *ContinualImprovementRegistriesService) Create(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return improvement, nil
|
||||
}
|
||||
|
||||
func (s *ContinualImprovementRegistriesService) Update(
|
||||
func (s *ContinualImprovementService) Update(
|
||||
ctx context.Context,
|
||||
req *UpdateContinualImprovementRegistryRequest,
|
||||
) (*coredata.ContinualImprovementRegistry, error) {
|
||||
registry := &coredata.ContinualImprovementRegistry{}
|
||||
req *UpdateContinualImprovementRequest,
|
||||
) (*coredata.ContinualImprovement, error) {
|
||||
improvement := &coredata.ContinualImprovement{}
|
||||
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
if err := registry.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
|
||||
return fmt.Errorf("cannot load continual improvement registry: %w", err)
|
||||
if err := improvement.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
|
||||
return fmt.Errorf("cannot load continual improvement: %w", err)
|
||||
}
|
||||
|
||||
if req.ReferenceID != nil {
|
||||
registry.ReferenceID = *req.ReferenceID
|
||||
improvement.ReferenceID = *req.ReferenceID
|
||||
}
|
||||
|
||||
if req.Description != nil {
|
||||
registry.Description = *req.Description
|
||||
improvement.Description = *req.Description
|
||||
}
|
||||
|
||||
if req.Source != nil {
|
||||
registry.Source = *req.Source
|
||||
improvement.Source = *req.Source
|
||||
}
|
||||
|
||||
if req.OwnerID != nil {
|
||||
@@ -155,25 +155,25 @@ func (s *ContinualImprovementRegistriesService) Update(
|
||||
if err := owner.LoadByID(ctx, conn, s.svc.scope, *req.OwnerID); err != nil {
|
||||
return fmt.Errorf("cannot load owner: %w", err)
|
||||
}
|
||||
registry.OwnerID = *req.OwnerID
|
||||
improvement.OwnerID = *req.OwnerID
|
||||
}
|
||||
|
||||
if req.TargetDate != nil {
|
||||
registry.TargetDate = *req.TargetDate
|
||||
improvement.TargetDate = *req.TargetDate
|
||||
}
|
||||
|
||||
if req.Status != nil {
|
||||
registry.Status = *req.Status
|
||||
improvement.Status = *req.Status
|
||||
}
|
||||
|
||||
if req.Priority != nil {
|
||||
registry.Priority = *req.Priority
|
||||
improvement.Priority = *req.Priority
|
||||
}
|
||||
|
||||
registry.UpdatedAt = time.Now()
|
||||
improvement.UpdatedAt = time.Now()
|
||||
|
||||
if err := registry.Update(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot update continual improvement registry: %w", err)
|
||||
if err := improvement.Update(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot update continual improvement: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -184,23 +184,23 @@ func (s *ContinualImprovementRegistriesService) Update(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return improvement, nil
|
||||
}
|
||||
|
||||
func (s *ContinualImprovementRegistriesService) Delete(
|
||||
func (s *ContinualImprovementService) Delete(
|
||||
ctx context.Context,
|
||||
continualImprovementRegistryID gid.GID,
|
||||
continualImprovementID gid.GID,
|
||||
) error {
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
registry := &coredata.ContinualImprovementRegistry{}
|
||||
if err := registry.LoadByID(ctx, conn, s.svc.scope, continualImprovementRegistryID); err != nil {
|
||||
return fmt.Errorf("cannot load continual improvement registry: %w", err)
|
||||
improvement := &coredata.ContinualImprovement{}
|
||||
if err := improvement.LoadByID(ctx, conn, s.svc.scope, continualImprovementID); err != nil {
|
||||
return fmt.Errorf("cannot load continual improvement: %w", err)
|
||||
}
|
||||
|
||||
if err := registry.Delete(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot delete continual improvement registry: %w", err)
|
||||
if err := improvement.Delete(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot delete continual improvement: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -210,20 +210,20 @@ func (s *ContinualImprovementRegistriesService) Delete(
|
||||
return err
|
||||
}
|
||||
|
||||
func (s ContinualImprovementRegistriesService) CountByOrganizationID(
|
||||
func (s ContinualImprovementService) CountByOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
filter *coredata.ContinualImprovementRegistryFilter,
|
||||
filter *coredata.ContinualImprovementFilter,
|
||||
) (int, error) {
|
||||
var count int
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) (err error) {
|
||||
registries := coredata.ContinualImprovementRegistries{}
|
||||
count, err = registries.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
|
||||
improvements := coredata.ContinualImprovements{}
|
||||
count, err = improvements.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot count continual improvement registries: %w", err)
|
||||
return fmt.Errorf("cannot count continual improvements: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -237,20 +237,20 @@ func (s ContinualImprovementRegistriesService) CountByOrganizationID(
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (s ContinualImprovementRegistriesService) ListForOrganizationID(
|
||||
func (s ContinualImprovementService) ListForOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[coredata.ContinualImprovementRegistriesOrderField],
|
||||
filter *coredata.ContinualImprovementRegistryFilter,
|
||||
) (*page.Page[*coredata.ContinualImprovementRegistry, coredata.ContinualImprovementRegistriesOrderField], error) {
|
||||
var registries coredata.ContinualImprovementRegistries
|
||||
cursor *page.Cursor[coredata.ContinualImprovementOrderField],
|
||||
filter *coredata.ContinualImprovementFilter,
|
||||
) (*page.Page[*coredata.ContinualImprovement, coredata.ContinualImprovementOrderField], error) {
|
||||
var improvements coredata.ContinualImprovements
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
err := registries.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor, filter)
|
||||
err := improvements.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot load continual improvement registries: %w", err)
|
||||
return fmt.Errorf("cannot load continual improvements: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -261,5 +261,5 @@ func (s ContinualImprovementRegistriesService) ListForOrganizationID(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return page.NewPage(registries, cursor), nil
|
||||
return page.NewPage(improvements, cursor), nil
|
||||
}
|
||||
@@ -25,12 +25,12 @@ import (
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type NonconformityRegistryService struct {
|
||||
type NonconformityService struct {
|
||||
svc *TenantService
|
||||
}
|
||||
|
||||
type (
|
||||
CreateNonconformityRegistryRequest struct {
|
||||
CreateNonconformityRequest struct {
|
||||
OrganizationID gid.GID
|
||||
ReferenceID string
|
||||
Description *string
|
||||
@@ -40,11 +40,11 @@ type (
|
||||
CorrectiveAction *string
|
||||
OwnerID gid.GID
|
||||
DueDate *time.Time
|
||||
Status *coredata.NonconformityRegistryStatus
|
||||
Status *coredata.NonconformityStatus
|
||||
EffectivenessCheck *string
|
||||
}
|
||||
|
||||
UpdateNonconformityRegistryRequest struct {
|
||||
UpdateNonconformityRequest struct {
|
||||
ID gid.GID
|
||||
ReferenceID *string
|
||||
Description **string
|
||||
@@ -54,21 +54,21 @@ type (
|
||||
OwnerID *gid.GID
|
||||
AuditID *gid.GID
|
||||
DueDate **time.Time
|
||||
Status *coredata.NonconformityRegistryStatus
|
||||
Status *coredata.NonconformityStatus
|
||||
EffectivenessCheck **string
|
||||
}
|
||||
)
|
||||
|
||||
func (s NonconformityRegistryService) Get(
|
||||
func (s NonconformityService) Get(
|
||||
ctx context.Context,
|
||||
nonconformityRegistryID gid.GID,
|
||||
) (*coredata.NonconformityRegistry, error) {
|
||||
registry := &coredata.NonconformityRegistry{}
|
||||
nonconformityID gid.GID,
|
||||
) (*coredata.Nonconformity, error) {
|
||||
nonconformity := &coredata.Nonconformity{}
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
return registry.LoadByID(ctx, conn, s.svc.scope, nonconformityRegistryID)
|
||||
return nonconformity.LoadByID(ctx, conn, s.svc.scope, nonconformityID)
|
||||
},
|
||||
)
|
||||
|
||||
@@ -76,17 +76,17 @@ func (s NonconformityRegistryService) Get(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return nonconformity, nil
|
||||
}
|
||||
|
||||
func (s *NonconformityRegistryService) Create(
|
||||
func (s *NonconformityService) Create(
|
||||
ctx context.Context,
|
||||
req *CreateNonconformityRegistryRequest,
|
||||
) (*coredata.NonconformityRegistry, error) {
|
||||
req *CreateNonconformityRequest,
|
||||
) (*coredata.Nonconformity, error) {
|
||||
now := time.Now()
|
||||
|
||||
registry := &coredata.NonconformityRegistry{
|
||||
ID: gid.New(s.svc.scope.GetTenantID(), coredata.NonconformityRegistryEntityType),
|
||||
nonconformity := &coredata.Nonconformity{
|
||||
ID: gid.New(s.svc.scope.GetTenantID(), coredata.NonconformityEntityType),
|
||||
OrganizationID: req.OrganizationID,
|
||||
ReferenceID: req.ReferenceID,
|
||||
Description: req.Description,
|
||||
@@ -96,14 +96,14 @@ func (s *NonconformityRegistryService) Create(
|
||||
CorrectiveAction: req.CorrectiveAction,
|
||||
OwnerID: req.OwnerID,
|
||||
DueDate: req.DueDate,
|
||||
Status: coredata.NonconformityRegistryStatusOpen,
|
||||
Status: coredata.NonconformityStatusOpen,
|
||||
EffectivenessCheck: req.EffectivenessCheck,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
}
|
||||
|
||||
if req.Status != nil {
|
||||
registry.Status = *req.Status
|
||||
nonconformity.Status = *req.Status
|
||||
}
|
||||
|
||||
err := s.svc.pg.WithTx(
|
||||
@@ -124,8 +124,8 @@ func (s *NonconformityRegistryService) Create(
|
||||
return fmt.Errorf("cannot load owner: %w", err)
|
||||
}
|
||||
|
||||
if err := registry.Insert(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot insert nonconformity registry: %w", err)
|
||||
if err := nonconformity.Insert(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot insert nonconformity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -136,57 +136,57 @@ func (s *NonconformityRegistryService) Create(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return nonconformity, nil
|
||||
}
|
||||
|
||||
func (s *NonconformityRegistryService) Update(
|
||||
func (s *NonconformityService) Update(
|
||||
ctx context.Context,
|
||||
req *UpdateNonconformityRegistryRequest,
|
||||
) (*coredata.NonconformityRegistry, error) {
|
||||
registry := &coredata.NonconformityRegistry{}
|
||||
req *UpdateNonconformityRequest,
|
||||
) (*coredata.Nonconformity, error) {
|
||||
nonconformity := &coredata.Nonconformity{}
|
||||
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
if err := registry.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
|
||||
return fmt.Errorf("cannot load nonconformity registry: %w", err)
|
||||
if err := nonconformity.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
|
||||
return fmt.Errorf("cannot load nonconformity: %w", err)
|
||||
}
|
||||
|
||||
if req.ReferenceID != nil {
|
||||
registry.ReferenceID = *req.ReferenceID
|
||||
nonconformity.ReferenceID = *req.ReferenceID
|
||||
}
|
||||
if req.Description != nil {
|
||||
registry.Description = *req.Description
|
||||
nonconformity.Description = *req.Description
|
||||
}
|
||||
if req.DateIdentified != nil {
|
||||
registry.DateIdentified = *req.DateIdentified
|
||||
nonconformity.DateIdentified = *req.DateIdentified
|
||||
}
|
||||
if req.RootCause != nil {
|
||||
registry.RootCause = *req.RootCause
|
||||
nonconformity.RootCause = *req.RootCause
|
||||
}
|
||||
if req.CorrectiveAction != nil {
|
||||
registry.CorrectiveAction = *req.CorrectiveAction
|
||||
nonconformity.CorrectiveAction = *req.CorrectiveAction
|
||||
}
|
||||
if req.OwnerID != nil {
|
||||
registry.OwnerID = *req.OwnerID
|
||||
nonconformity.OwnerID = *req.OwnerID
|
||||
}
|
||||
if req.AuditID != nil {
|
||||
registry.AuditID = *req.AuditID
|
||||
nonconformity.AuditID = *req.AuditID
|
||||
}
|
||||
if req.DueDate != nil {
|
||||
registry.DueDate = *req.DueDate
|
||||
nonconformity.DueDate = *req.DueDate
|
||||
}
|
||||
if req.Status != nil {
|
||||
registry.Status = *req.Status
|
||||
nonconformity.Status = *req.Status
|
||||
}
|
||||
if req.EffectivenessCheck != nil {
|
||||
registry.EffectivenessCheck = *req.EffectivenessCheck
|
||||
nonconformity.EffectivenessCheck = *req.EffectivenessCheck
|
||||
}
|
||||
|
||||
registry.UpdatedAt = time.Now()
|
||||
nonconformity.UpdatedAt = time.Now()
|
||||
|
||||
if err := registry.Update(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot update nonconformity registry: %w", err)
|
||||
if err := nonconformity.Update(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot update nonconformity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -197,40 +197,40 @@ func (s *NonconformityRegistryService) Update(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return nonconformity, nil
|
||||
}
|
||||
|
||||
func (s NonconformityRegistryService) Delete(
|
||||
func (s NonconformityService) Delete(
|
||||
ctx context.Context,
|
||||
nonconformityRegistryID gid.GID,
|
||||
nonconformityID gid.GID,
|
||||
) error {
|
||||
registry := coredata.NonconformityRegistry{ID: nonconformityRegistryID}
|
||||
nonconformity := coredata.Nonconformity{ID: nonconformityID}
|
||||
return s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
err := registry.Delete(ctx, conn, s.svc.scope)
|
||||
err := nonconformity.Delete(ctx, conn, s.svc.scope)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete nonconformity registry: %w", err)
|
||||
return fmt.Errorf("cannot delete nonconformity: %w", err)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func (s NonconformityRegistryService) ListForOrganizationID(
|
||||
func (s NonconformityService) ListForOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[coredata.NonconformityRegistryOrderField],
|
||||
filter *coredata.NonconformityRegistryFilter,
|
||||
) (*page.Page[*coredata.NonconformityRegistry, coredata.NonconformityRegistryOrderField], error) {
|
||||
var registries coredata.NonconformityRegistries
|
||||
cursor *page.Cursor[coredata.NonconformityOrderField],
|
||||
filter *coredata.NonconformityFilter,
|
||||
) (*page.Page[*coredata.Nonconformity, coredata.NonconformityOrderField], error) {
|
||||
var nonconformities coredata.Nonconformities
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
err := registries.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor, filter)
|
||||
err := nonconformities.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot load nonconformity registries: %w", err)
|
||||
return fmt.Errorf("cannot load nonconformities: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -241,23 +241,23 @@ func (s NonconformityRegistryService) ListForOrganizationID(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return page.NewPage(registries, cursor), nil
|
||||
return page.NewPage(nonconformities, cursor), nil
|
||||
}
|
||||
|
||||
func (s NonconformityRegistryService) CountForOrganizationID(
|
||||
func (s NonconformityService) CountForOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
filter *coredata.NonconformityRegistryFilter,
|
||||
filter *coredata.NonconformityFilter,
|
||||
) (int, error) {
|
||||
var count int
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) (err error) {
|
||||
registries := coredata.NonconformityRegistries{}
|
||||
count, err = registries.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
|
||||
nonconformities := coredata.Nonconformities{}
|
||||
count, err = nonconformities.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot count nonconformity registries: %w", err)
|
||||
return fmt.Errorf("cannot count nonconformities: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -25,12 +25,12 @@ import (
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type ComplianceRegistryService struct {
|
||||
type ObligationService struct {
|
||||
svc *TenantService
|
||||
}
|
||||
|
||||
type (
|
||||
CreateComplianceRegistryRequest struct {
|
||||
CreateObligationRequest struct {
|
||||
OrganizationID gid.GID
|
||||
ReferenceID string
|
||||
Area *string
|
||||
@@ -41,10 +41,10 @@ type (
|
||||
OwnerID gid.GID
|
||||
LastReviewDate *time.Time
|
||||
DueDate *time.Time
|
||||
Status *coredata.ComplianceRegistryStatus
|
||||
Status *coredata.ObligationStatus
|
||||
}
|
||||
|
||||
UpdateComplianceRegistryRequest struct {
|
||||
UpdateObligationRequest struct {
|
||||
ID gid.GID
|
||||
ReferenceID *string
|
||||
Area **string
|
||||
@@ -55,21 +55,21 @@ type (
|
||||
OwnerID *gid.GID
|
||||
LastReviewDate **time.Time
|
||||
DueDate **time.Time
|
||||
Status *coredata.ComplianceRegistryStatus
|
||||
Status *coredata.ObligationStatus
|
||||
}
|
||||
)
|
||||
|
||||
func (s ComplianceRegistryService) Get(
|
||||
func (s ObligationService) Get(
|
||||
ctx context.Context,
|
||||
complianceRegistryID gid.GID,
|
||||
) (*coredata.ComplianceRegistry, error) {
|
||||
registry := &coredata.ComplianceRegistry{}
|
||||
obligationID gid.GID,
|
||||
) (*coredata.Obligation, error) {
|
||||
obligation := &coredata.Obligation{}
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
if err := registry.LoadByID(ctx, conn, s.svc.scope, complianceRegistryID); err != nil {
|
||||
return fmt.Errorf("cannot load compliance registry: %w", err)
|
||||
if err := obligation.LoadByID(ctx, conn, s.svc.scope, obligationID); err != nil {
|
||||
return fmt.Errorf("cannot load obligation: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -80,17 +80,17 @@ func (s ComplianceRegistryService) Get(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return obligation, nil
|
||||
}
|
||||
|
||||
func (s *ComplianceRegistryService) Create(
|
||||
func (s *ObligationService) Create(
|
||||
ctx context.Context,
|
||||
req *CreateComplianceRegistryRequest,
|
||||
) (*coredata.ComplianceRegistry, error) {
|
||||
req *CreateObligationRequest,
|
||||
) (*coredata.Obligation, error) {
|
||||
now := time.Now()
|
||||
|
||||
registry := &coredata.ComplianceRegistry{
|
||||
ID: gid.New(s.svc.scope.GetTenantID(), coredata.ComplianceRegistryEntityType),
|
||||
obligation := &coredata.Obligation{
|
||||
ID: gid.New(s.svc.scope.GetTenantID(), coredata.ObligationEntityType),
|
||||
OrganizationID: req.OrganizationID,
|
||||
ReferenceID: req.ReferenceID,
|
||||
Area: req.Area,
|
||||
@@ -119,8 +119,8 @@ func (s *ComplianceRegistryService) Create(
|
||||
return fmt.Errorf("cannot load owner: %w", err)
|
||||
}
|
||||
|
||||
if err := registry.Insert(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot insert compliance registry: %w", err)
|
||||
if err := obligation.Insert(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot insert obligation: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -131,44 +131,44 @@ func (s *ComplianceRegistryService) Create(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return obligation, nil
|
||||
}
|
||||
|
||||
func (s *ComplianceRegistryService) Update(
|
||||
func (s *ObligationService) Update(
|
||||
ctx context.Context,
|
||||
req *UpdateComplianceRegistryRequest,
|
||||
) (*coredata.ComplianceRegistry, error) {
|
||||
registry := &coredata.ComplianceRegistry{}
|
||||
req *UpdateObligationRequest,
|
||||
) (*coredata.Obligation, error) {
|
||||
obligation := &coredata.Obligation{}
|
||||
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
if err := registry.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
|
||||
return fmt.Errorf("cannot load compliance registry: %w", err)
|
||||
if err := obligation.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
|
||||
return fmt.Errorf("cannot load obligation: %w", err)
|
||||
}
|
||||
|
||||
if req.ReferenceID != nil {
|
||||
registry.ReferenceID = *req.ReferenceID
|
||||
obligation.ReferenceID = *req.ReferenceID
|
||||
}
|
||||
|
||||
if req.Area != nil {
|
||||
registry.Area = *req.Area
|
||||
obligation.Area = *req.Area
|
||||
}
|
||||
|
||||
if req.Source != nil {
|
||||
registry.Source = *req.Source
|
||||
obligation.Source = *req.Source
|
||||
}
|
||||
|
||||
if req.Requirement != nil {
|
||||
registry.Requirement = *req.Requirement
|
||||
obligation.Requirement = *req.Requirement
|
||||
}
|
||||
|
||||
if req.ActionsToBeImplemented != nil {
|
||||
registry.ActionsToBeImplemented = *req.ActionsToBeImplemented
|
||||
obligation.ActionsToBeImplemented = *req.ActionsToBeImplemented
|
||||
}
|
||||
|
||||
if req.Regulator != nil {
|
||||
registry.Regulator = *req.Regulator
|
||||
obligation.Regulator = *req.Regulator
|
||||
}
|
||||
|
||||
if req.OwnerID != nil {
|
||||
@@ -176,25 +176,25 @@ func (s *ComplianceRegistryService) Update(
|
||||
if err := owner.LoadByID(ctx, conn, s.svc.scope, *req.OwnerID); err != nil {
|
||||
return fmt.Errorf("cannot load owner: %w", err)
|
||||
}
|
||||
registry.OwnerID = *req.OwnerID
|
||||
obligation.OwnerID = *req.OwnerID
|
||||
}
|
||||
|
||||
if req.LastReviewDate != nil {
|
||||
registry.LastReviewDate = *req.LastReviewDate
|
||||
obligation.LastReviewDate = *req.LastReviewDate
|
||||
}
|
||||
|
||||
if req.DueDate != nil {
|
||||
registry.DueDate = *req.DueDate
|
||||
obligation.DueDate = *req.DueDate
|
||||
}
|
||||
|
||||
if req.Status != nil {
|
||||
registry.Status = *req.Status
|
||||
obligation.Status = *req.Status
|
||||
}
|
||||
|
||||
registry.UpdatedAt = time.Now()
|
||||
obligation.UpdatedAt = time.Now()
|
||||
|
||||
if err := registry.Update(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot update compliance registry: %w", err)
|
||||
if err := obligation.Update(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot update obligation: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -205,23 +205,23 @@ func (s *ComplianceRegistryService) Update(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return registry, nil
|
||||
return obligation, nil
|
||||
}
|
||||
|
||||
func (s *ComplianceRegistryService) Delete(
|
||||
func (s *ObligationService) Delete(
|
||||
ctx context.Context,
|
||||
complianceRegistryID gid.GID,
|
||||
obligationID gid.GID,
|
||||
) error {
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
registry := &coredata.ComplianceRegistry{}
|
||||
if err := registry.LoadByID(ctx, conn, s.svc.scope, complianceRegistryID); err != nil {
|
||||
return fmt.Errorf("cannot load compliance registry: %w", err)
|
||||
obligation := &coredata.Obligation{}
|
||||
if err := obligation.LoadByID(ctx, conn, s.svc.scope, obligationID); err != nil {
|
||||
return fmt.Errorf("cannot load obligation: %w", err)
|
||||
}
|
||||
|
||||
if err := registry.Delete(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot delete compliance registry: %w", err)
|
||||
if err := obligation.Delete(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot delete obligation: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -231,20 +231,20 @@ func (s *ComplianceRegistryService) Delete(
|
||||
return err
|
||||
}
|
||||
|
||||
func (s ComplianceRegistryService) CountForOrganizationID(
|
||||
func (s ObligationService) CountForOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
filter *coredata.ComplianceRegistryFilter,
|
||||
filter *coredata.ObligationFilter,
|
||||
) (int, error) {
|
||||
var count int
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) (err error) {
|
||||
registries := coredata.ComplianceRegistries{}
|
||||
count, err = registries.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
|
||||
obligations := coredata.Obligations{}
|
||||
count, err = obligations.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot count compliance registries: %w", err)
|
||||
return fmt.Errorf("cannot count obligations: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -258,20 +258,20 @@ func (s ComplianceRegistryService) CountForOrganizationID(
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (s ComplianceRegistryService) ListForOrganizationID(
|
||||
func (s ObligationService) ListForOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[coredata.ComplianceRegistryOrderField],
|
||||
filter *coredata.ComplianceRegistryFilter,
|
||||
) (*page.Page[*coredata.ComplianceRegistry, coredata.ComplianceRegistryOrderField], error) {
|
||||
var registries coredata.ComplianceRegistries
|
||||
cursor *page.Cursor[coredata.ObligationOrderField],
|
||||
filter *coredata.ObligationFilter,
|
||||
) (*page.Page[*coredata.Obligation, coredata.ObligationOrderField], error) {
|
||||
var obligations coredata.Obligations
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
err := registries.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor, filter)
|
||||
err := obligations.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot load compliance registries: %w", err)
|
||||
return fmt.Errorf("cannot load obligations: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -282,5 +282,5 @@ func (s ComplianceRegistryService) ListForOrganizationID(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return page.NewPage(registries, cursor), nil
|
||||
return page.NewPage(obligations, cursor), nil
|
||||
}
|
||||
@@ -1,288 +0,0 @@
|
||||
// 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 probo
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/getprobo/probo/pkg/coredata"
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type ProcessingActivityRegistryService struct {
|
||||
svc *TenantService
|
||||
}
|
||||
|
||||
type (
|
||||
CreateProcessingActivityRegistryRequest struct {
|
||||
OrganizationID gid.GID
|
||||
Name string
|
||||
Purpose *string
|
||||
DataSubjectCategory *string
|
||||
PersonalDataCategory *string
|
||||
SpecialOrCriminalData coredata.ProcessingActivityRegistrySpecialOrCriminalData
|
||||
ConsentEvidenceLink *string
|
||||
LawfulBasis coredata.ProcessingActivityRegistryLawfulBasis
|
||||
Recipients *string
|
||||
Location *string
|
||||
InternationalTransfers bool
|
||||
TransferSafeguards *coredata.ProcessingActivityRegistryTransferSafeguards
|
||||
RetentionPeriod *string
|
||||
SecurityMeasures *string
|
||||
DataProtectionImpactAssessment coredata.ProcessingActivityRegistryDataProtectionImpactAssessment
|
||||
TransferImpactAssessment coredata.ProcessingActivityRegistryTransferImpactAssessment
|
||||
}
|
||||
|
||||
UpdateProcessingActivityRegistryRequest struct {
|
||||
ID gid.GID
|
||||
Name *string
|
||||
Purpose **string
|
||||
DataSubjectCategory **string
|
||||
PersonalDataCategory **string
|
||||
SpecialOrCriminalData *coredata.ProcessingActivityRegistrySpecialOrCriminalData
|
||||
ConsentEvidenceLink **string
|
||||
LawfulBasis *coredata.ProcessingActivityRegistryLawfulBasis
|
||||
Recipients **string
|
||||
Location **string
|
||||
InternationalTransfers *bool
|
||||
TransferSafeguards **coredata.ProcessingActivityRegistryTransferSafeguards
|
||||
RetentionPeriod **string
|
||||
SecurityMeasures **string
|
||||
DataProtectionImpactAssessment *coredata.ProcessingActivityRegistryDataProtectionImpactAssessment
|
||||
TransferImpactAssessment *coredata.ProcessingActivityRegistryTransferImpactAssessment
|
||||
}
|
||||
)
|
||||
|
||||
func (s ProcessingActivityRegistryService) Get(
|
||||
ctx context.Context,
|
||||
processingActivityRegistryID gid.GID,
|
||||
) (*coredata.ProcessingActivityRegistry, error) {
|
||||
processingActivityRegistry := &coredata.ProcessingActivityRegistry{}
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
return processingActivityRegistry.LoadByID(ctx, conn, s.svc.scope, processingActivityRegistryID)
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return processingActivityRegistry, nil
|
||||
}
|
||||
|
||||
func (s *ProcessingActivityRegistryService) Create(
|
||||
ctx context.Context,
|
||||
req *CreateProcessingActivityRegistryRequest,
|
||||
) (*coredata.ProcessingActivityRegistry, error) {
|
||||
now := time.Now()
|
||||
|
||||
processingActivityRegistry := &coredata.ProcessingActivityRegistry{
|
||||
ID: gid.New(s.svc.scope.GetTenantID(), coredata.ProcessingActivityRegistryEntityType),
|
||||
OrganizationID: req.OrganizationID,
|
||||
Name: req.Name,
|
||||
Purpose: req.Purpose,
|
||||
DataSubjectCategory: req.DataSubjectCategory,
|
||||
PersonalDataCategory: req.PersonalDataCategory,
|
||||
SpecialOrCriminalData: req.SpecialOrCriminalData,
|
||||
ConsentEvidenceLink: req.ConsentEvidenceLink,
|
||||
LawfulBasis: req.LawfulBasis,
|
||||
Recipients: req.Recipients,
|
||||
Location: req.Location,
|
||||
InternationalTransfers: req.InternationalTransfers,
|
||||
TransferSafeguards: req.TransferSafeguards,
|
||||
RetentionPeriod: req.RetentionPeriod,
|
||||
SecurityMeasures: req.SecurityMeasures,
|
||||
DataProtectionImpactAssessment: req.DataProtectionImpactAssessment,
|
||||
TransferImpactAssessment: req.TransferImpactAssessment,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
}
|
||||
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
organization := &coredata.Organization{}
|
||||
if err := organization.LoadByID(ctx, conn, s.svc.scope, req.OrganizationID); err != nil {
|
||||
return fmt.Errorf("cannot load organization: %w", err)
|
||||
}
|
||||
|
||||
if err := processingActivityRegistry.Insert(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot insert processing activity registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return processingActivityRegistry, nil
|
||||
}
|
||||
|
||||
func (s *ProcessingActivityRegistryService) Update(
|
||||
ctx context.Context,
|
||||
req *UpdateProcessingActivityRegistryRequest,
|
||||
) (*coredata.ProcessingActivityRegistry, error) {
|
||||
processingActivityRegistry := &coredata.ProcessingActivityRegistry{}
|
||||
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
if err := processingActivityRegistry.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
|
||||
return fmt.Errorf("cannot load processing activity registry: %w", err)
|
||||
}
|
||||
|
||||
if req.Name != nil {
|
||||
processingActivityRegistry.Name = *req.Name
|
||||
}
|
||||
if req.Purpose != nil {
|
||||
processingActivityRegistry.Purpose = *req.Purpose
|
||||
}
|
||||
if req.DataSubjectCategory != nil {
|
||||
processingActivityRegistry.DataSubjectCategory = *req.DataSubjectCategory
|
||||
}
|
||||
if req.PersonalDataCategory != nil {
|
||||
processingActivityRegistry.PersonalDataCategory = *req.PersonalDataCategory
|
||||
}
|
||||
if req.SpecialOrCriminalData != nil {
|
||||
processingActivityRegistry.SpecialOrCriminalData = *req.SpecialOrCriminalData
|
||||
}
|
||||
if req.ConsentEvidenceLink != nil {
|
||||
processingActivityRegistry.ConsentEvidenceLink = *req.ConsentEvidenceLink
|
||||
}
|
||||
if req.LawfulBasis != nil {
|
||||
processingActivityRegistry.LawfulBasis = *req.LawfulBasis
|
||||
}
|
||||
if req.Recipients != nil {
|
||||
processingActivityRegistry.Recipients = *req.Recipients
|
||||
}
|
||||
if req.Location != nil {
|
||||
processingActivityRegistry.Location = *req.Location
|
||||
}
|
||||
if req.InternationalTransfers != nil {
|
||||
processingActivityRegistry.InternationalTransfers = *req.InternationalTransfers
|
||||
}
|
||||
if req.TransferSafeguards != nil {
|
||||
processingActivityRegistry.TransferSafeguards = *req.TransferSafeguards
|
||||
}
|
||||
if req.RetentionPeriod != nil {
|
||||
processingActivityRegistry.RetentionPeriod = *req.RetentionPeriod
|
||||
}
|
||||
if req.SecurityMeasures != nil {
|
||||
processingActivityRegistry.SecurityMeasures = *req.SecurityMeasures
|
||||
}
|
||||
if req.DataProtectionImpactAssessment != nil {
|
||||
processingActivityRegistry.DataProtectionImpactAssessment = *req.DataProtectionImpactAssessment
|
||||
}
|
||||
if req.TransferImpactAssessment != nil {
|
||||
processingActivityRegistry.TransferImpactAssessment = *req.TransferImpactAssessment
|
||||
}
|
||||
|
||||
processingActivityRegistry.UpdatedAt = time.Now()
|
||||
|
||||
if err := processingActivityRegistry.Update(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot update processing activity registry: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return processingActivityRegistry, nil
|
||||
}
|
||||
|
||||
func (s ProcessingActivityRegistryService) Delete(
|
||||
ctx context.Context,
|
||||
processingActivityRegistryID gid.GID,
|
||||
) error {
|
||||
processingActivityRegistry := coredata.ProcessingActivityRegistry{ID: processingActivityRegistryID}
|
||||
return s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
err := processingActivityRegistry.Delete(ctx, conn, s.svc.scope)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete processing activity registry: %w", err)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
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, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot load processing activity registries: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return page.NewPage(processingActivityRegistries, cursor), nil
|
||||
}
|
||||
|
||||
func (s ProcessingActivityRegistryService) CountForOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
filter *coredata.ProcessingActivityRegistryFilter,
|
||||
) (int, error) {
|
||||
var count int
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) (err error) {
|
||||
processingActivityRegistries := coredata.ProcessingActivityRegistries{}
|
||||
count, err = processingActivityRegistries.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot count processing activity registries: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
288
pkg/probo/processing_activity_service.go
Normal file
288
pkg/probo/processing_activity_service.go
Normal file
@@ -0,0 +1,288 @@
|
||||
// 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 probo
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/getprobo/probo/pkg/coredata"
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
"go.gearno.de/kit/pg"
|
||||
)
|
||||
|
||||
type ProcessingActivityService struct {
|
||||
svc *TenantService
|
||||
}
|
||||
|
||||
type (
|
||||
CreateProcessingActivityRequest struct {
|
||||
OrganizationID gid.GID
|
||||
Name string
|
||||
Purpose *string
|
||||
DataSubjectCategory *string
|
||||
PersonalDataCategory *string
|
||||
SpecialOrCriminalData coredata.ProcessingActivitySpecialOrCriminalData
|
||||
ConsentEvidenceLink *string
|
||||
LawfulBasis coredata.ProcessingActivityLawfulBasis
|
||||
Recipients *string
|
||||
Location *string
|
||||
InternationalTransfers bool
|
||||
TransferSafeguards *coredata.ProcessingActivityTransferSafeguards
|
||||
RetentionPeriod *string
|
||||
SecurityMeasures *string
|
||||
DataProtectionImpactAssessment coredata.ProcessingActivityDataProtectionImpactAssessment
|
||||
TransferImpactAssessment coredata.ProcessingActivityTransferImpactAssessment
|
||||
}
|
||||
|
||||
UpdateProcessingActivityRequest struct {
|
||||
ID gid.GID
|
||||
Name *string
|
||||
Purpose **string
|
||||
DataSubjectCategory **string
|
||||
PersonalDataCategory **string
|
||||
SpecialOrCriminalData *coredata.ProcessingActivitySpecialOrCriminalData
|
||||
ConsentEvidenceLink **string
|
||||
LawfulBasis *coredata.ProcessingActivityLawfulBasis
|
||||
Recipients **string
|
||||
Location **string
|
||||
InternationalTransfers *bool
|
||||
TransferSafeguards **coredata.ProcessingActivityTransferSafeguards
|
||||
RetentionPeriod **string
|
||||
SecurityMeasures **string
|
||||
DataProtectionImpactAssessment *coredata.ProcessingActivityDataProtectionImpactAssessment
|
||||
TransferImpactAssessment *coredata.ProcessingActivityTransferImpactAssessment
|
||||
}
|
||||
)
|
||||
|
||||
func (s ProcessingActivityService) Get(
|
||||
ctx context.Context,
|
||||
processingActivityID gid.GID,
|
||||
) (*coredata.ProcessingActivity, error) {
|
||||
processingActivity := &coredata.ProcessingActivity{}
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
return processingActivity.LoadByID(ctx, conn, s.svc.scope, processingActivityID)
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return processingActivity, nil
|
||||
}
|
||||
|
||||
func (s *ProcessingActivityService) Create(
|
||||
ctx context.Context,
|
||||
req *CreateProcessingActivityRequest,
|
||||
) (*coredata.ProcessingActivity, error) {
|
||||
now := time.Now()
|
||||
|
||||
processingActivity := &coredata.ProcessingActivity{
|
||||
ID: gid.New(s.svc.scope.GetTenantID(), coredata.ProcessingActivityEntityType),
|
||||
OrganizationID: req.OrganizationID,
|
||||
Name: req.Name,
|
||||
Purpose: req.Purpose,
|
||||
DataSubjectCategory: req.DataSubjectCategory,
|
||||
PersonalDataCategory: req.PersonalDataCategory,
|
||||
SpecialOrCriminalData: req.SpecialOrCriminalData,
|
||||
ConsentEvidenceLink: req.ConsentEvidenceLink,
|
||||
LawfulBasis: req.LawfulBasis,
|
||||
Recipients: req.Recipients,
|
||||
Location: req.Location,
|
||||
InternationalTransfers: req.InternationalTransfers,
|
||||
TransferSafeguards: req.TransferSafeguards,
|
||||
RetentionPeriod: req.RetentionPeriod,
|
||||
SecurityMeasures: req.SecurityMeasures,
|
||||
DataProtectionImpactAssessment: req.DataProtectionImpactAssessment,
|
||||
TransferImpactAssessment: req.TransferImpactAssessment,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
}
|
||||
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
organization := &coredata.Organization{}
|
||||
if err := organization.LoadByID(ctx, conn, s.svc.scope, req.OrganizationID); err != nil {
|
||||
return fmt.Errorf("cannot load organization: %w", err)
|
||||
}
|
||||
|
||||
if err := processingActivity.Insert(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot insert processing activity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return processingActivity, nil
|
||||
}
|
||||
|
||||
func (s *ProcessingActivityService) Update(
|
||||
ctx context.Context,
|
||||
req *UpdateProcessingActivityRequest,
|
||||
) (*coredata.ProcessingActivity, error) {
|
||||
processingActivity := &coredata.ProcessingActivity{}
|
||||
|
||||
err := s.svc.pg.WithTx(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
if err := processingActivity.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
|
||||
return fmt.Errorf("cannot load processing activity: %w", err)
|
||||
}
|
||||
|
||||
if req.Name != nil {
|
||||
processingActivity.Name = *req.Name
|
||||
}
|
||||
if req.Purpose != nil {
|
||||
processingActivity.Purpose = *req.Purpose
|
||||
}
|
||||
if req.DataSubjectCategory != nil {
|
||||
processingActivity.DataSubjectCategory = *req.DataSubjectCategory
|
||||
}
|
||||
if req.PersonalDataCategory != nil {
|
||||
processingActivity.PersonalDataCategory = *req.PersonalDataCategory
|
||||
}
|
||||
if req.SpecialOrCriminalData != nil {
|
||||
processingActivity.SpecialOrCriminalData = *req.SpecialOrCriminalData
|
||||
}
|
||||
if req.ConsentEvidenceLink != nil {
|
||||
processingActivity.ConsentEvidenceLink = *req.ConsentEvidenceLink
|
||||
}
|
||||
if req.LawfulBasis != nil {
|
||||
processingActivity.LawfulBasis = *req.LawfulBasis
|
||||
}
|
||||
if req.Recipients != nil {
|
||||
processingActivity.Recipients = *req.Recipients
|
||||
}
|
||||
if req.Location != nil {
|
||||
processingActivity.Location = *req.Location
|
||||
}
|
||||
if req.InternationalTransfers != nil {
|
||||
processingActivity.InternationalTransfers = *req.InternationalTransfers
|
||||
}
|
||||
if req.TransferSafeguards != nil {
|
||||
processingActivity.TransferSafeguards = *req.TransferSafeguards
|
||||
}
|
||||
if req.RetentionPeriod != nil {
|
||||
processingActivity.RetentionPeriod = *req.RetentionPeriod
|
||||
}
|
||||
if req.SecurityMeasures != nil {
|
||||
processingActivity.SecurityMeasures = *req.SecurityMeasures
|
||||
}
|
||||
if req.DataProtectionImpactAssessment != nil {
|
||||
processingActivity.DataProtectionImpactAssessment = *req.DataProtectionImpactAssessment
|
||||
}
|
||||
if req.TransferImpactAssessment != nil {
|
||||
processingActivity.TransferImpactAssessment = *req.TransferImpactAssessment
|
||||
}
|
||||
|
||||
processingActivity.UpdatedAt = time.Now()
|
||||
|
||||
if err := processingActivity.Update(ctx, conn, s.svc.scope); err != nil {
|
||||
return fmt.Errorf("cannot update processing activity: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return processingActivity, nil
|
||||
}
|
||||
|
||||
func (s ProcessingActivityService) Delete(
|
||||
ctx context.Context,
|
||||
processingActivityID gid.GID,
|
||||
) error {
|
||||
processingActivity := coredata.ProcessingActivity{ID: processingActivityID}
|
||||
return s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
err := processingActivity.Delete(ctx, conn, s.svc.scope)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot delete processing activity: %w", err)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func (s ProcessingActivityService) ListForOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
cursor *page.Cursor[coredata.ProcessingActivityOrderField],
|
||||
filter *coredata.ProcessingActivityFilter,
|
||||
) (*page.Page[*coredata.ProcessingActivity, coredata.ProcessingActivityOrderField], error) {
|
||||
var processingActivities coredata.ProcessingActivities
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) error {
|
||||
err := processingActivities.LoadByOrganizationID(ctx, conn, s.svc.scope, organizationID, cursor, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot load processing activities: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return page.NewPage(processingActivities, cursor), nil
|
||||
}
|
||||
|
||||
func (s ProcessingActivityService) CountForOrganizationID(
|
||||
ctx context.Context,
|
||||
organizationID gid.GID,
|
||||
filter *coredata.ProcessingActivityFilter,
|
||||
) (int, error) {
|
||||
var count int
|
||||
|
||||
err := s.svc.pg.WithConn(
|
||||
ctx,
|
||||
func(conn pg.Conn) (err error) {
|
||||
processingActivities := coredata.ProcessingActivities{}
|
||||
count, err = processingActivities.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot count processing activities: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
@@ -85,11 +85,11 @@ type (
|
||||
Reports *ReportService
|
||||
TrustCenters *TrustCenterService
|
||||
TrustCenterAccesses *TrustCenterAccessService
|
||||
NonconformityRegistries *NonconformityRegistryService
|
||||
ComplianceRegistries *ComplianceRegistryService
|
||||
Nonconformities *NonconformityService
|
||||
Obligations *ObligationService
|
||||
Snapshots *SnapshotService
|
||||
ContinualImprovementRegistries *ContinualImprovementRegistriesService
|
||||
ProcessingActivityRegistries *ProcessingActivityRegistryService
|
||||
ContinualImprovements *ContinualImprovementService
|
||||
ProcessingActivities *ProcessingActivityService
|
||||
}
|
||||
)
|
||||
|
||||
@@ -183,11 +183,11 @@ func (s *Service) WithTenant(tenantID gid.TenantID) *TenantService {
|
||||
tenantService.Reports = &ReportService{svc: tenantService}
|
||||
tenantService.TrustCenters = &TrustCenterService{svc: tenantService}
|
||||
tenantService.TrustCenterAccesses = &TrustCenterAccessService{svc: tenantService, usrmgr: s.usrmgr}
|
||||
tenantService.NonconformityRegistries = &NonconformityRegistryService{svc: tenantService}
|
||||
tenantService.ComplianceRegistries = &ComplianceRegistryService{svc: tenantService}
|
||||
tenantService.Nonconformities = &NonconformityService{svc: tenantService}
|
||||
tenantService.Obligations = &ObligationService{svc: tenantService}
|
||||
tenantService.Snapshots = &SnapshotService{svc: tenantService}
|
||||
tenantService.ContinualImprovementRegistries = &ContinualImprovementRegistriesService{svc: tenantService}
|
||||
tenantService.ProcessingActivityRegistries = &ProcessingActivityRegistryService{svc: tenantService}
|
||||
tenantService.ContinualImprovements = &ContinualImprovementService{svc: tenantService}
|
||||
tenantService.ProcessingActivities = &ProcessingActivityService{svc: tenantService}
|
||||
return tenantService
|
||||
}
|
||||
|
||||
|
||||
@@ -151,163 +151,163 @@ enum AuditState
|
||||
)
|
||||
}
|
||||
|
||||
enum NonconformityRegistryStatus
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryStatus") {
|
||||
enum NonconformityStatus
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.NonconformityStatus") {
|
||||
OPEN
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryStatusOpen"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityStatusOpen"
|
||||
)
|
||||
IN_PROGRESS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryStatusInProgress"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityStatusInProgress"
|
||||
)
|
||||
CLOSED
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryStatusClosed"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityStatusClosed"
|
||||
)
|
||||
}
|
||||
|
||||
enum ComplianceRegistryStatus
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryStatus") {
|
||||
enum ObligationStatus
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ObligationStatus") {
|
||||
OPEN
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryStatusOpen"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ObligationStatusOpen"
|
||||
)
|
||||
IN_PROGRESS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryStatusInProgress"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ObligationStatusInProgress"
|
||||
)
|
||||
CLOSED
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryStatusClosed"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ObligationStatusClosed"
|
||||
)
|
||||
}
|
||||
|
||||
enum ContinualImprovementRegistriesStatus
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesStatus") {
|
||||
enum ContinualImprovementStatus
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementStatus") {
|
||||
OPEN
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesStatusOpen"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementStatusOpen"
|
||||
)
|
||||
IN_PROGRESS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesStatusInProgress"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementStatusInProgress"
|
||||
)
|
||||
CLOSED
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesStatusClosed"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementStatusClosed"
|
||||
)
|
||||
}
|
||||
|
||||
enum ContinualImprovementRegistriesPriority
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesPriority") {
|
||||
enum ContinualImprovementPriority
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementPriority") {
|
||||
LOW
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesPriorityLow"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementPriorityLow"
|
||||
)
|
||||
MEDIUM
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesPriorityMedium"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementPriorityMedium"
|
||||
)
|
||||
HIGH
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesPriorityHigh"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementPriorityHigh"
|
||||
)
|
||||
}
|
||||
|
||||
enum ProcessingActivityRegistrySpecialOrCriminalData
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistrySpecialOrCriminalData") {
|
||||
enum ProcessingActivitySpecialOrCriminalData
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivitySpecialOrCriminalData") {
|
||||
YES
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistrySpecialOrCriminalDataYes"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivitySpecialOrCriminalDataYes"
|
||||
)
|
||||
NO
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistrySpecialOrCriminalDataNo"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivitySpecialOrCriminalDataNo"
|
||||
)
|
||||
POSSIBLE
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistrySpecialOrCriminalDataPossible"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivitySpecialOrCriminalDataPossible"
|
||||
)
|
||||
}
|
||||
|
||||
enum ProcessingActivityRegistryLawfulBasis
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryLawfulBasis") {
|
||||
enum ProcessingActivityLawfulBasis
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityLawfulBasis") {
|
||||
LEGITIMATE_INTEREST
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryLawfulBasisLegitimateInterest"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityLawfulBasisLegitimateInterest"
|
||||
)
|
||||
CONSENT
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryLawfulBasisConsent"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityLawfulBasisConsent"
|
||||
)
|
||||
CONTRACTUAL_NECESSITY
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryLawfulBasisContractualNecessity"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityLawfulBasisContractualNecessity"
|
||||
)
|
||||
LEGAL_OBLIGATION
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryLawfulBasisLegalObligation"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityLawfulBasisLegalObligation"
|
||||
)
|
||||
VITAL_INTERESTS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryLawfulBasisVitalInterests"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityLawfulBasisVitalInterests"
|
||||
)
|
||||
PUBLIC_TASK
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryLawfulBasisPublicTask"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityLawfulBasisPublicTask"
|
||||
)
|
||||
}
|
||||
|
||||
enum ProcessingActivityRegistryTransferSafeguards
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferSafeguards") {
|
||||
enum ProcessingActivityTransferSafeguards
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferSafeguards") {
|
||||
STANDARD_CONTRACTUAL_CLAUSES
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferSafeguardsStandardContractualClauses"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferSafeguardsStandardContractualClauses"
|
||||
)
|
||||
BINDING_CORPORATE_RULES
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferSafeguardsBindingCorporateRules"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferSafeguardsBindingCorporateRules"
|
||||
)
|
||||
ADEQUACY_DECISION
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferSafeguardsAdequacyDecision"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferSafeguardsAdequacyDecision"
|
||||
)
|
||||
DEROGATIONS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferSafeguardsDerogations"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferSafeguardsDerogations"
|
||||
)
|
||||
CODES_OF_CONDUCT
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferSafeguardsCodesOfConduct"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferSafeguardsCodesOfConduct"
|
||||
)
|
||||
CERTIFICATION_MECHANISMS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferSafeguardsCertificationMechanisms"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferSafeguardsCertificationMechanisms"
|
||||
)
|
||||
}
|
||||
|
||||
enum ProcessingActivityRegistryDataProtectionImpactAssessment
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryDataProtectionImpactAssessment") {
|
||||
enum ProcessingActivityDataProtectionImpactAssessment
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityDataProtectionImpactAssessment") {
|
||||
NEEDED
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryDataProtectionImpactAssessmentNeeded"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityDataProtectionImpactAssessmentNeeded"
|
||||
)
|
||||
NOT_NEEDED
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryDataProtectionImpactAssessmentNotNeeded"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityDataProtectionImpactAssessmentNotNeeded"
|
||||
)
|
||||
}
|
||||
|
||||
enum ProcessingActivityRegistryTransferImpactAssessment
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferImpactAssessment") {
|
||||
enum ProcessingActivityTransferImpactAssessment
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferImpactAssessment") {
|
||||
NEEDED
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferImpactAssessmentNeeded"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferImpactAssessmentNeeded"
|
||||
)
|
||||
NOT_NEEDED
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryTransferImpactAssessmentNotNeeded"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityTransferImpactAssessmentNotNeeded"
|
||||
)
|
||||
}
|
||||
|
||||
@@ -758,87 +758,87 @@ enum AuditOrderField
|
||||
)
|
||||
}
|
||||
|
||||
enum NonconformityRegistryOrderField
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryOrderField") {
|
||||
enum NonconformityOrderField
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.NonconformityOrderField") {
|
||||
CREATED_AT
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryOrderFieldCreatedAt"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityOrderFieldCreatedAt"
|
||||
)
|
||||
REFERENCE_ID
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryOrderFieldReferenceId"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityOrderFieldReferenceId"
|
||||
)
|
||||
DATE_IDENTIFIED
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryOrderFieldDateIdentified"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityOrderFieldDateIdentified"
|
||||
)
|
||||
DUE_DATE
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryOrderFieldDueDate"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityOrderFieldDueDate"
|
||||
)
|
||||
STATUS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityRegistryOrderFieldStatus"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.NonconformityOrderFieldStatus"
|
||||
)
|
||||
}
|
||||
|
||||
enum ComplianceRegistryOrderField
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryOrderField") {
|
||||
enum ObligationOrderField
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ObligationOrderField") {
|
||||
CREATED_AT
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryOrderFieldCreatedAt"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ObligationOrderFieldCreatedAt"
|
||||
)
|
||||
REFERENCE_ID
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryOrderFieldReferenceId"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ObligationOrderFieldReferenceId"
|
||||
)
|
||||
LAST_REVIEW_DATE
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryOrderFieldLastReviewDate"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ObligationOrderFieldLastReviewDate"
|
||||
)
|
||||
DUE_DATE
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryOrderFieldDueDate"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ObligationOrderFieldDueDate"
|
||||
)
|
||||
STATUS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ComplianceRegistryOrderFieldStatus"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ObligationOrderFieldStatus"
|
||||
)
|
||||
}
|
||||
|
||||
enum ContinualImprovementRegistriesOrderField
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesOrderField") {
|
||||
enum ContinualImprovementOrderField
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementOrderField") {
|
||||
CREATED_AT
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesOrderFieldCreatedAt"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementOrderFieldCreatedAt"
|
||||
)
|
||||
REFERENCE_ID
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesOrderFieldReferenceId"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementOrderFieldReferenceId"
|
||||
)
|
||||
TARGET_DATE
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesOrderFieldTargetDate"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementOrderFieldTargetDate"
|
||||
)
|
||||
STATUS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesOrderFieldStatus"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementOrderFieldStatus"
|
||||
)
|
||||
PRIORITY
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementRegistriesOrderFieldPriority"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ContinualImprovementOrderFieldPriority"
|
||||
)
|
||||
}
|
||||
|
||||
enum ProcessingActivityRegistryOrderField
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryOrderField") {
|
||||
enum ProcessingActivityOrderField
|
||||
@goModel(model: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityOrderField") {
|
||||
CREATED_AT
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryOrderFieldCreatedAt"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityOrderFieldCreatedAt"
|
||||
)
|
||||
NAME
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityRegistryOrderFieldName"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.ProcessingActivityOrderFieldName"
|
||||
)
|
||||
}
|
||||
|
||||
@@ -868,21 +868,21 @@ enum SnapshotsType
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeData"
|
||||
)
|
||||
NONCONFORMITY_REGISTRIES
|
||||
NONCONFORMITIES
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeNonConformityRegistries"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeNonconformities"
|
||||
)
|
||||
COMPLIANCE_REGISTRIES
|
||||
OBLIGATIONS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeComplianceRegistries"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeObligations"
|
||||
)
|
||||
CONTINUAL_IMPROVEMENT_REGISTRIES
|
||||
CONTINUAL_IMPROVEMENTS
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeContinualImprovementRegistries"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeContinualImprovements"
|
||||
)
|
||||
PROCESSING_ACTIVITY_REGISTRIES
|
||||
PROCESSING_ACTIVITIES
|
||||
@goEnum(
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeProcessingActivityRegistries"
|
||||
value: "github.com/getprobo/probo/pkg/coredata.SnapshotsTypeProcessingActivities"
|
||||
)
|
||||
}
|
||||
|
||||
@@ -983,36 +983,36 @@ input AuditOrder
|
||||
field: AuditOrderField!
|
||||
}
|
||||
|
||||
input NonconformityRegistryOrder
|
||||
input NonconformityOrder
|
||||
@goModel(
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.NonconformityRegistryOrderBy"
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.NonconformityOrderBy"
|
||||
) {
|
||||
direction: OrderDirection!
|
||||
field: NonconformityRegistryOrderField!
|
||||
field: NonconformityOrderField!
|
||||
}
|
||||
|
||||
input ComplianceRegistryOrder
|
||||
input ObligationOrder
|
||||
@goModel(
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ComplianceRegistryOrderBy"
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ObligationOrderBy"
|
||||
) {
|
||||
direction: OrderDirection!
|
||||
field: ComplianceRegistryOrderField!
|
||||
field: ObligationOrderField!
|
||||
}
|
||||
|
||||
input ContinualImprovementRegistriesOrder
|
||||
input ContinualImprovementOrder
|
||||
@goModel(
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ContinualImprovementRegistriesOrderBy"
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ContinualImprovementOrderBy"
|
||||
) {
|
||||
direction: OrderDirection!
|
||||
field: ContinualImprovementRegistriesOrderField!
|
||||
field: ContinualImprovementOrderField!
|
||||
}
|
||||
|
||||
input ProcessingActivityRegistryOrder
|
||||
input ProcessingActivityOrder
|
||||
@goModel(
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ProcessingActivityRegistryOrderBy"
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ProcessingActivityOrderBy"
|
||||
) {
|
||||
direction: OrderDirection!
|
||||
field: ProcessingActivityRegistryOrderField!
|
||||
field: ProcessingActivityOrderField!
|
||||
}
|
||||
|
||||
input TrustCenterAccessOrder
|
||||
@@ -1115,19 +1115,19 @@ input DatumFilter {
|
||||
snapshotId: ID
|
||||
}
|
||||
|
||||
input NonconformityRegistryFilter {
|
||||
input NonconformityFilter {
|
||||
snapshotId: ID
|
||||
}
|
||||
|
||||
input ComplianceRegistryFilter {
|
||||
input ObligationFilter {
|
||||
snapshotId: ID
|
||||
}
|
||||
|
||||
input ContinualImprovementRegistryFilter {
|
||||
input ContinualImprovementFilter {
|
||||
snapshotId: ID
|
||||
}
|
||||
|
||||
input ProcessingActivityRegistryFilter {
|
||||
input ProcessingActivityFilter {
|
||||
snapshotId: ID
|
||||
}
|
||||
|
||||
@@ -1274,41 +1274,41 @@ type Organization implements Node {
|
||||
orderBy: AuditOrder
|
||||
): AuditConnection! @goField(forceResolver: true)
|
||||
|
||||
nonconformityRegistries(
|
||||
nonconformities(
|
||||
first: Int
|
||||
after: CursorKey
|
||||
last: Int
|
||||
before: CursorKey
|
||||
orderBy: NonconformityRegistryOrder
|
||||
filter: NonconformityRegistryFilter = { snapshotId: null }
|
||||
): NonconformityRegistryConnection! @goField(forceResolver: true)
|
||||
orderBy: NonconformityOrder
|
||||
filter: NonconformityFilter = { snapshotId: null }
|
||||
): NonconformityConnection! @goField(forceResolver: true)
|
||||
|
||||
complianceRegistries(
|
||||
obligations(
|
||||
first: Int
|
||||
after: CursorKey
|
||||
last: Int
|
||||
before: CursorKey
|
||||
orderBy: ComplianceRegistryOrder
|
||||
filter: ComplianceRegistryFilter = { snapshotId: null }
|
||||
): ComplianceRegistryConnection! @goField(forceResolver: true)
|
||||
orderBy: ObligationOrder
|
||||
filter: ObligationFilter = { snapshotId: null }
|
||||
): ObligationConnection! @goField(forceResolver: true)
|
||||
|
||||
continualImprovementRegistries(
|
||||
continualImprovements(
|
||||
first: Int
|
||||
after: CursorKey
|
||||
last: Int
|
||||
before: CursorKey
|
||||
orderBy: ContinualImprovementRegistriesOrder
|
||||
filter: ContinualImprovementRegistryFilter = { snapshotId: null }
|
||||
): ContinualImprovementRegistryConnection! @goField(forceResolver: true)
|
||||
orderBy: ContinualImprovementOrder
|
||||
filter: ContinualImprovementFilter = { snapshotId: null }
|
||||
): ContinualImprovementConnection! @goField(forceResolver: true)
|
||||
|
||||
processingActivityRegistries(
|
||||
processingActivities(
|
||||
first: Int
|
||||
after: CursorKey
|
||||
last: Int
|
||||
before: CursorKey
|
||||
orderBy: ProcessingActivityRegistryOrder
|
||||
filter: ProcessingActivityRegistryFilter = { snapshotId: null }
|
||||
): ProcessingActivityRegistryConnection! @goField(forceResolver: true)
|
||||
orderBy: ProcessingActivityOrder
|
||||
filter: ProcessingActivityFilter = { snapshotId: null }
|
||||
): ProcessingActivityConnection! @goField(forceResolver: true)
|
||||
|
||||
snapshots(
|
||||
first: Int
|
||||
@@ -1737,7 +1737,7 @@ type Audit implements Node {
|
||||
updatedAt: Datetime!
|
||||
}
|
||||
|
||||
type NonconformityRegistry implements Node {
|
||||
type Nonconformity implements Node {
|
||||
id: ID!
|
||||
snapshotId: ID
|
||||
organization: Organization! @goField(forceResolver: true)
|
||||
@@ -1749,13 +1749,13 @@ type NonconformityRegistry implements Node {
|
||||
correctiveAction: String
|
||||
owner: People! @goField(forceResolver: true)
|
||||
dueDate: Datetime
|
||||
status: NonconformityRegistryStatus!
|
||||
status: NonconformityStatus!
|
||||
effectivenessCheck: String
|
||||
createdAt: Datetime!
|
||||
updatedAt: Datetime!
|
||||
}
|
||||
|
||||
type ComplianceRegistry implements Node {
|
||||
type Obligation implements Node {
|
||||
id: ID!
|
||||
snapshotId: ID
|
||||
sourceId: ID
|
||||
@@ -1769,12 +1769,12 @@ type ComplianceRegistry implements Node {
|
||||
owner: People! @goField(forceResolver: true)
|
||||
lastReviewDate: Datetime
|
||||
dueDate: Datetime
|
||||
status: ComplianceRegistryStatus!
|
||||
status: ObligationStatus!
|
||||
createdAt: Datetime!
|
||||
updatedAt: Datetime!
|
||||
}
|
||||
|
||||
type ContinualImprovementRegistry implements Node {
|
||||
type ContinualImprovement implements Node {
|
||||
id: ID!
|
||||
snapshotId: ID
|
||||
sourceId: ID
|
||||
@@ -1784,13 +1784,13 @@ type ContinualImprovementRegistry implements Node {
|
||||
source: String
|
||||
owner: People! @goField(forceResolver: true)
|
||||
targetDate: Datetime
|
||||
status: ContinualImprovementRegistriesStatus!
|
||||
priority: ContinualImprovementRegistriesPriority!
|
||||
status: ContinualImprovementStatus!
|
||||
priority: ContinualImprovementPriority!
|
||||
createdAt: Datetime!
|
||||
updatedAt: Datetime!
|
||||
}
|
||||
|
||||
type ProcessingActivityRegistry implements Node {
|
||||
type ProcessingActivity implements Node {
|
||||
id: ID!
|
||||
snapshotId: ID
|
||||
sourceId: ID
|
||||
@@ -1799,17 +1799,17 @@ type ProcessingActivityRegistry implements Node {
|
||||
purpose: String
|
||||
dataSubjectCategory: String
|
||||
personalDataCategory: String
|
||||
specialOrCriminalData: ProcessingActivityRegistrySpecialOrCriminalData!
|
||||
specialOrCriminalData: ProcessingActivitySpecialOrCriminalData!
|
||||
consentEvidenceLink: String
|
||||
lawfulBasis: ProcessingActivityRegistryLawfulBasis!
|
||||
lawfulBasis: ProcessingActivityLawfulBasis!
|
||||
recipients: String
|
||||
location: String
|
||||
internationalTransfers: Boolean!
|
||||
transferSafeguards: ProcessingActivityRegistryTransferSafeguards
|
||||
transferSafeguards: ProcessingActivityTransferSafeguards
|
||||
retentionPeriod: String
|
||||
securityMeasures: String
|
||||
dataProtectionImpactAssessment: ProcessingActivityRegistryDataProtectionImpactAssessment!
|
||||
transferImpactAssessment: ProcessingActivityRegistryTransferImpactAssessment!
|
||||
dataProtectionImpactAssessment: ProcessingActivityDataProtectionImpactAssessment!
|
||||
transferImpactAssessment: ProcessingActivityTransferImpactAssessment!
|
||||
createdAt: Datetime!
|
||||
updatedAt: Datetime!
|
||||
}
|
||||
@@ -2127,60 +2127,59 @@ type AuditEdge {
|
||||
node: Audit!
|
||||
}
|
||||
|
||||
type NonconformityRegistryConnection
|
||||
type NonconformityConnection
|
||||
@goModel(
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.NonconformityRegistryConnection"
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.NonconformityConnection"
|
||||
) {
|
||||
totalCount: Int! @goField(forceResolver: true)
|
||||
edges: [NonconformityRegistryEdge!]!
|
||||
edges: [NonconformityEdge!]!
|
||||
pageInfo: PageInfo!
|
||||
}
|
||||
|
||||
type NonconformityRegistryEdge {
|
||||
type NonconformityEdge {
|
||||
cursor: CursorKey!
|
||||
node: NonconformityRegistry!
|
||||
node: Nonconformity!
|
||||
}
|
||||
|
||||
type ComplianceRegistryConnection
|
||||
type ObligationConnection
|
||||
@goModel(
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ComplianceRegistryConnection"
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ObligationConnection"
|
||||
) {
|
||||
totalCount: Int! @goField(forceResolver: true)
|
||||
edges: [ComplianceRegistryEdge!]!
|
||||
edges: [ObligationEdge!]!
|
||||
pageInfo: PageInfo!
|
||||
}
|
||||
|
||||
type ComplianceRegistryEdge {
|
||||
type ObligationEdge {
|
||||
cursor: CursorKey!
|
||||
node: ComplianceRegistry!
|
||||
node: Obligation!
|
||||
}
|
||||
|
||||
type ContinualImprovementRegistryConnection
|
||||
type ContinualImprovementConnection
|
||||
@goModel(
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ContinualImprovementRegistryConnection"
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ContinualImprovementConnection"
|
||||
) {
|
||||
totalCount: Int! @goField(forceResolver: true)
|
||||
edges: [ContinualImprovementRegistryEdge!]!
|
||||
edges: [ContinualImprovementEdge!]!
|
||||
pageInfo: PageInfo!
|
||||
}
|
||||
|
||||
type ContinualImprovementRegistryEdge {
|
||||
type ContinualImprovementEdge {
|
||||
cursor: CursorKey!
|
||||
node: ContinualImprovementRegistry!
|
||||
node: ContinualImprovement!
|
||||
}
|
||||
|
||||
type ProcessingActivityRegistryConnection
|
||||
type ProcessingActivityConnection
|
||||
@goModel(
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ProcessingActivityRegistryConnection"
|
||||
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ProcessingActivityConnection"
|
||||
) {
|
||||
totalCount: Int! @goField(forceResolver: true)
|
||||
edges: [ProcessingActivityRegistryEdge!]!
|
||||
edges: [ProcessingActivityEdge!]!
|
||||
pageInfo: PageInfo!
|
||||
}
|
||||
|
||||
type ProcessingActivityRegistryEdge {
|
||||
type ProcessingActivityEdge {
|
||||
cursor: CursorKey!
|
||||
node: ProcessingActivityRegistry!
|
||||
node: ProcessingActivity!
|
||||
}
|
||||
|
||||
type SnapshotConnection
|
||||
@@ -2426,49 +2425,49 @@ type Mutation {
|
||||
uploadAuditReport(input: UploadAuditReportInput!): UploadAuditReportPayload!
|
||||
deleteAuditReport(input: DeleteAuditReportInput!): DeleteAuditReportPayload!
|
||||
|
||||
# Nonconformity Registry mutations
|
||||
createNonconformityRegistry(
|
||||
input: CreateNonconformityRegistryInput!
|
||||
): CreateNonconformityRegistryPayload!
|
||||
updateNonconformityRegistry(
|
||||
input: UpdateNonconformityRegistryInput!
|
||||
): UpdateNonconformityRegistryPayload!
|
||||
deleteNonconformityRegistry(
|
||||
input: DeleteNonconformityRegistryInput!
|
||||
): DeleteNonconformityRegistryPayload!
|
||||
# Nonconformity mutations
|
||||
createNonconformity(
|
||||
input: CreateNonconformityInput!
|
||||
): CreateNonconformityPayload!
|
||||
updateNonconformity(
|
||||
input: UpdateNonconformityInput!
|
||||
): UpdateNonconformityPayload!
|
||||
deleteNonconformity(
|
||||
input: DeleteNonconformityInput!
|
||||
): DeleteNonconformityPayload!
|
||||
|
||||
# Compliance Registry mutations
|
||||
createComplianceRegistry(
|
||||
input: CreateComplianceRegistryInput!
|
||||
): CreateComplianceRegistryPayload!
|
||||
updateComplianceRegistry(
|
||||
input: UpdateComplianceRegistryInput!
|
||||
): UpdateComplianceRegistryPayload!
|
||||
deleteComplianceRegistry(
|
||||
input: DeleteComplianceRegistryInput!
|
||||
): DeleteComplianceRegistryPayload!
|
||||
# Obligation mutations
|
||||
createObligation(
|
||||
input: CreateObligationInput!
|
||||
): CreateObligationPayload!
|
||||
updateObligation(
|
||||
input: UpdateObligationInput!
|
||||
): UpdateObligationPayload!
|
||||
deleteObligation(
|
||||
input: DeleteObligationInput!
|
||||
): DeleteObligationPayload!
|
||||
|
||||
# Continual Improvement Registry mutations
|
||||
createContinualImprovementRegistry(
|
||||
input: CreateContinualImprovementRegistryInput!
|
||||
): CreateContinualImprovementRegistryPayload!
|
||||
updateContinualImprovementRegistry(
|
||||
input: UpdateContinualImprovementRegistryInput!
|
||||
): UpdateContinualImprovementRegistryPayload!
|
||||
deleteContinualImprovementRegistry(
|
||||
input: DeleteContinualImprovementRegistryInput!
|
||||
): DeleteContinualImprovementRegistryPayload!
|
||||
# Continual Improvement mutations
|
||||
createContinualImprovement(
|
||||
input: CreateContinualImprovementInput!
|
||||
): CreateContinualImprovementPayload!
|
||||
updateContinualImprovement(
|
||||
input: UpdateContinualImprovementInput!
|
||||
): UpdateContinualImprovementPayload!
|
||||
deleteContinualImprovement(
|
||||
input: DeleteContinualImprovementInput!
|
||||
): DeleteContinualImprovementPayload!
|
||||
|
||||
# Processing Activity Registry mutations
|
||||
createProcessingActivityRegistry(
|
||||
input: CreateProcessingActivityRegistryInput!
|
||||
): CreateProcessingActivityRegistryPayload!
|
||||
updateProcessingActivityRegistry(
|
||||
input: UpdateProcessingActivityRegistryInput!
|
||||
): UpdateProcessingActivityRegistryPayload!
|
||||
deleteProcessingActivityRegistry(
|
||||
input: DeleteProcessingActivityRegistryInput!
|
||||
): DeleteProcessingActivityRegistryPayload!
|
||||
# Processing Activity mutations
|
||||
createProcessingActivity(
|
||||
input: CreateProcessingActivityInput!
|
||||
): CreateProcessingActivityPayload!
|
||||
updateProcessingActivity(
|
||||
input: UpdateProcessingActivityInput!
|
||||
): UpdateProcessingActivityPayload!
|
||||
deleteProcessingActivity(
|
||||
input: DeleteProcessingActivityInput!
|
||||
): DeleteProcessingActivityPayload!
|
||||
|
||||
# Snapshot mutations
|
||||
createSnapshot(input: CreateSnapshotInput!): CreateSnapshotPayload!
|
||||
@@ -2975,8 +2974,8 @@ input DeleteAuditReportInput {
|
||||
auditId: ID!
|
||||
}
|
||||
|
||||
# Nonconformity Registry input types
|
||||
input CreateNonconformityRegistryInput {
|
||||
# Nonconformity input types
|
||||
input CreateNonconformityInput {
|
||||
organizationId: ID!
|
||||
referenceId: String!
|
||||
description: String
|
||||
@@ -2986,11 +2985,11 @@ input CreateNonconformityRegistryInput {
|
||||
correctiveAction: String
|
||||
ownerId: ID!
|
||||
dueDate: Datetime
|
||||
status: NonconformityRegistryStatus!
|
||||
status: NonconformityStatus!
|
||||
effectivenessCheck: String
|
||||
}
|
||||
|
||||
input UpdateNonconformityRegistryInput {
|
||||
input UpdateNonconformityInput {
|
||||
id: ID!
|
||||
referenceId: String
|
||||
description: String
|
||||
@@ -3000,15 +2999,15 @@ input UpdateNonconformityRegistryInput {
|
||||
ownerId: ID
|
||||
auditId: ID
|
||||
dueDate: Datetime
|
||||
status: NonconformityRegistryStatus
|
||||
status: NonconformityStatus
|
||||
effectivenessCheck: String
|
||||
}
|
||||
|
||||
input DeleteNonconformityRegistryInput {
|
||||
nonconformityRegistryId: ID!
|
||||
input DeleteNonconformityInput {
|
||||
nonconformityId: ID!
|
||||
}
|
||||
|
||||
input CreateComplianceRegistryInput {
|
||||
input CreateObligationInput {
|
||||
organizationId: ID!
|
||||
referenceId: String!
|
||||
area: String
|
||||
@@ -3019,10 +3018,10 @@ input CreateComplianceRegistryInput {
|
||||
ownerId: ID!
|
||||
lastReviewDate: Datetime
|
||||
dueDate: Datetime
|
||||
status: ComplianceRegistryStatus!
|
||||
status: ObligationStatus!
|
||||
}
|
||||
|
||||
input UpdateComplianceRegistryInput {
|
||||
input UpdateObligationInput {
|
||||
id: ID!
|
||||
referenceId: String
|
||||
area: String
|
||||
@@ -3033,79 +3032,79 @@ input UpdateComplianceRegistryInput {
|
||||
ownerId: ID
|
||||
lastReviewDate: Datetime
|
||||
dueDate: Datetime
|
||||
status: ComplianceRegistryStatus
|
||||
status: ObligationStatus
|
||||
}
|
||||
|
||||
input DeleteComplianceRegistryInput {
|
||||
complianceRegistryId: ID!
|
||||
input DeleteObligationInput {
|
||||
obligationId: ID!
|
||||
}
|
||||
|
||||
input CreateContinualImprovementRegistryInput {
|
||||
input CreateContinualImprovementInput {
|
||||
organizationId: ID!
|
||||
referenceId: String!
|
||||
description: String
|
||||
source: String
|
||||
ownerId: ID!
|
||||
targetDate: Datetime
|
||||
status: ContinualImprovementRegistriesStatus!
|
||||
priority: ContinualImprovementRegistriesPriority!
|
||||
status: ContinualImprovementStatus!
|
||||
priority: ContinualImprovementPriority!
|
||||
}
|
||||
|
||||
input UpdateContinualImprovementRegistryInput {
|
||||
input UpdateContinualImprovementInput {
|
||||
id: ID!
|
||||
referenceId: String
|
||||
description: String
|
||||
source: String
|
||||
ownerId: ID
|
||||
targetDate: Datetime
|
||||
status: ContinualImprovementRegistriesStatus
|
||||
priority: ContinualImprovementRegistriesPriority
|
||||
status: ContinualImprovementStatus
|
||||
priority: ContinualImprovementPriority
|
||||
}
|
||||
|
||||
input DeleteContinualImprovementRegistryInput {
|
||||
continualImprovementRegistryId: ID!
|
||||
input DeleteContinualImprovementInput {
|
||||
continualImprovementId: ID!
|
||||
}
|
||||
|
||||
input CreateProcessingActivityRegistryInput {
|
||||
input CreateProcessingActivityInput {
|
||||
organizationId: ID!
|
||||
name: String!
|
||||
purpose: String
|
||||
dataSubjectCategory: String
|
||||
personalDataCategory: String
|
||||
specialOrCriminalData: ProcessingActivityRegistrySpecialOrCriminalData!
|
||||
specialOrCriminalData: ProcessingActivitySpecialOrCriminalData!
|
||||
consentEvidenceLink: String
|
||||
lawfulBasis: ProcessingActivityRegistryLawfulBasis!
|
||||
lawfulBasis: ProcessingActivityLawfulBasis!
|
||||
recipients: String
|
||||
location: String
|
||||
internationalTransfers: Boolean!
|
||||
transferSafeguards: ProcessingActivityRegistryTransferSafeguards
|
||||
transferSafeguards: ProcessingActivityTransferSafeguards
|
||||
retentionPeriod: String
|
||||
securityMeasures: String
|
||||
dataProtectionImpactAssessment: ProcessingActivityRegistryDataProtectionImpactAssessment!
|
||||
transferImpactAssessment: ProcessingActivityRegistryTransferImpactAssessment!
|
||||
dataProtectionImpactAssessment: ProcessingActivityDataProtectionImpactAssessment!
|
||||
transferImpactAssessment: ProcessingActivityTransferImpactAssessment!
|
||||
}
|
||||
|
||||
input UpdateProcessingActivityRegistryInput {
|
||||
input UpdateProcessingActivityInput {
|
||||
id: ID!
|
||||
name: String
|
||||
purpose: String
|
||||
dataSubjectCategory: String
|
||||
personalDataCategory: String
|
||||
specialOrCriminalData: ProcessingActivityRegistrySpecialOrCriminalData
|
||||
specialOrCriminalData: ProcessingActivitySpecialOrCriminalData
|
||||
consentEvidenceLink: String
|
||||
lawfulBasis: ProcessingActivityRegistryLawfulBasis
|
||||
lawfulBasis: ProcessingActivityLawfulBasis
|
||||
recipients: String
|
||||
location: String
|
||||
internationalTransfers: Boolean
|
||||
transferSafeguards: ProcessingActivityRegistryTransferSafeguards
|
||||
transferSafeguards: ProcessingActivityTransferSafeguards
|
||||
retentionPeriod: String
|
||||
securityMeasures: String
|
||||
dataProtectionImpactAssessment: ProcessingActivityRegistryDataProtectionImpactAssessment
|
||||
transferImpactAssessment: ProcessingActivityRegistryTransferImpactAssessment
|
||||
dataProtectionImpactAssessment: ProcessingActivityDataProtectionImpactAssessment
|
||||
transferImpactAssessment: ProcessingActivityTransferImpactAssessment
|
||||
}
|
||||
|
||||
input DeleteProcessingActivityRegistryInput {
|
||||
processingActivityRegistryId: ID!
|
||||
input DeleteProcessingActivityInput {
|
||||
processingActivityId: ID!
|
||||
}
|
||||
|
||||
input CreateSnapshotInput {
|
||||
@@ -3818,53 +3817,53 @@ type DeleteAuditReportPayload {
|
||||
audit: Audit!
|
||||
}
|
||||
|
||||
# Nonconformity Registry payload types
|
||||
type CreateNonconformityRegistryPayload {
|
||||
nonconformityRegistryEdge: NonconformityRegistryEdge!
|
||||
# Nonconformity payload types
|
||||
type CreateNonconformityPayload {
|
||||
nonconformityEdge: NonconformityEdge!
|
||||
}
|
||||
|
||||
type UpdateNonconformityRegistryPayload {
|
||||
nonconformityRegistry: NonconformityRegistry!
|
||||
type UpdateNonconformityPayload {
|
||||
nonconformity: Nonconformity!
|
||||
}
|
||||
|
||||
type DeleteNonconformityRegistryPayload {
|
||||
deletedNonconformityRegistryId: ID!
|
||||
type DeleteNonconformityPayload {
|
||||
deletedNonconformityId: ID!
|
||||
}
|
||||
|
||||
type CreateComplianceRegistryPayload {
|
||||
complianceRegistryEdge: ComplianceRegistryEdge!
|
||||
type CreateObligationPayload {
|
||||
obligationEdge: ObligationEdge!
|
||||
}
|
||||
|
||||
type UpdateComplianceRegistryPayload {
|
||||
complianceRegistry: ComplianceRegistry!
|
||||
type UpdateObligationPayload {
|
||||
obligation: Obligation!
|
||||
}
|
||||
|
||||
type DeleteComplianceRegistryPayload {
|
||||
deletedComplianceRegistryId: ID!
|
||||
type DeleteObligationPayload {
|
||||
deletedObligationId: ID!
|
||||
}
|
||||
|
||||
type CreateContinualImprovementRegistryPayload {
|
||||
continualImprovementRegistryEdge: ContinualImprovementRegistryEdge!
|
||||
type CreateContinualImprovementPayload {
|
||||
continualImprovementEdge: ContinualImprovementEdge!
|
||||
}
|
||||
|
||||
type UpdateContinualImprovementRegistryPayload {
|
||||
continualImprovementRegistry: ContinualImprovementRegistry!
|
||||
type UpdateContinualImprovementPayload {
|
||||
continualImprovement: ContinualImprovement!
|
||||
}
|
||||
|
||||
type DeleteContinualImprovementRegistryPayload {
|
||||
deletedContinualImprovementRegistryId: ID!
|
||||
type DeleteContinualImprovementPayload {
|
||||
deletedContinualImprovementId: ID!
|
||||
}
|
||||
|
||||
type CreateProcessingActivityRegistryPayload {
|
||||
processingActivityRegistryEdge: ProcessingActivityRegistryEdge!
|
||||
type CreateProcessingActivityPayload {
|
||||
processingActivityEdge: ProcessingActivityEdge!
|
||||
}
|
||||
|
||||
type UpdateProcessingActivityRegistryPayload {
|
||||
processingActivityRegistry: ProcessingActivityRegistry!
|
||||
type UpdateProcessingActivityPayload {
|
||||
processingActivity: ProcessingActivity!
|
||||
}
|
||||
|
||||
type DeleteProcessingActivityRegistryPayload {
|
||||
deletedProcessingActivityRegistryId: ID!
|
||||
type DeleteProcessingActivityPayload {
|
||||
deletedProcessingActivityId: ID!
|
||||
}
|
||||
|
||||
type CreateSnapshotPayload {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
79
pkg/server/api/console/v1/types/continual_improvement.go
Normal file
79
pkg/server/api/console/v1/types/continual_improvement.go
Normal file
@@ -0,0 +1,79 @@
|
||||
// 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 types
|
||||
|
||||
import (
|
||||
"github.com/getprobo/probo/pkg/coredata"
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
)
|
||||
|
||||
type (
|
||||
ContinualImprovementOrderBy OrderBy[coredata.ContinualImprovementOrderField]
|
||||
|
||||
ContinualImprovementConnection struct {
|
||||
TotalCount int
|
||||
Edges []*ContinualImprovementEdge
|
||||
PageInfo PageInfo
|
||||
|
||||
Resolver any
|
||||
ParentID gid.GID
|
||||
Filter *ContinualImprovementFilter
|
||||
}
|
||||
)
|
||||
|
||||
func NewContinualImprovementConnection(
|
||||
p *page.Page[*coredata.ContinualImprovement, coredata.ContinualImprovementOrderField],
|
||||
parentType any,
|
||||
parentID gid.GID,
|
||||
filter *ContinualImprovementFilter,
|
||||
) *ContinualImprovementConnection {
|
||||
edges := make([]*ContinualImprovementEdge, len(p.Data))
|
||||
for i, improvement := range p.Data {
|
||||
edges[i] = NewContinualImprovementEdge(improvement, p.Cursor.OrderBy.Field)
|
||||
}
|
||||
|
||||
return &ContinualImprovementConnection{
|
||||
Edges: edges,
|
||||
PageInfo: *NewPageInfo(p),
|
||||
|
||||
Resolver: parentType,
|
||||
ParentID: parentID,
|
||||
Filter: filter,
|
||||
}
|
||||
}
|
||||
|
||||
func NewContinualImprovement(ci *coredata.ContinualImprovement) *ContinualImprovement {
|
||||
return &ContinualImprovement{
|
||||
ID: ci.ID,
|
||||
SnapshotID: ci.SnapshotID,
|
||||
SourceID: ci.SourceID,
|
||||
ReferenceID: ci.ReferenceID,
|
||||
Description: ci.Description,
|
||||
Source: ci.Source,
|
||||
TargetDate: ci.TargetDate,
|
||||
Status: ci.Status,
|
||||
Priority: ci.Priority,
|
||||
CreatedAt: ci.CreatedAt,
|
||||
UpdatedAt: ci.UpdatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
func NewContinualImprovementEdge(ci *coredata.ContinualImprovement, orderField coredata.ContinualImprovementOrderField) *ContinualImprovementEdge {
|
||||
return &ContinualImprovementEdge{
|
||||
Node: NewContinualImprovement(ci),
|
||||
Cursor: ci.CursorKey(orderField),
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
// 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 types
|
||||
|
||||
import (
|
||||
"github.com/getprobo/probo/pkg/coredata"
|
||||
"github.com/getprobo/probo/pkg/gid"
|
||||
"github.com/getprobo/probo/pkg/page"
|
||||
)
|
||||
|
||||
type (
|
||||
ContinualImprovementRegistriesOrderBy OrderBy[coredata.ContinualImprovementRegistriesOrderField]
|
||||
|
||||
ContinualImprovementRegistryConnection struct {
|
||||
TotalCount int
|
||||
Edges []*ContinualImprovementRegistryEdge
|
||||
PageInfo PageInfo
|
||||
|
||||
Resolver any
|
||||
ParentID gid.GID
|
||||
Filter *ContinualImprovementRegistryFilter
|
||||
}
|
||||
)
|
||||
|
||||
func NewContinualImprovementRegistryConnection(
|
||||
p *page.Page[*coredata.ContinualImprovementRegistry, coredata.ContinualImprovementRegistriesOrderField],
|
||||
parentType any,
|
||||
parentID gid.GID,
|
||||
filter *ContinualImprovementRegistryFilter,
|
||||
) *ContinualImprovementRegistryConnection {
|
||||
edges := make([]*ContinualImprovementRegistryEdge, len(p.Data))
|
||||
for i, registry := range p.Data {
|
||||
edges[i] = NewContinualImprovementRegistryEdge(registry, p.Cursor.OrderBy.Field)
|
||||
}
|
||||
|
||||
return &ContinualImprovementRegistryConnection{
|
||||
Edges: edges,
|
||||
PageInfo: *NewPageInfo(p),
|
||||
|
||||
Resolver: parentType,
|
||||
ParentID: parentID,
|
||||
Filter: filter,
|
||||
}
|
||||
}
|
||||
|
||||
func NewContinualImprovementRegistry(cir *coredata.ContinualImprovementRegistry) *ContinualImprovementRegistry {
|
||||
return &ContinualImprovementRegistry{
|
||||
ID: cir.ID,
|
||||
SnapshotID: cir.SnapshotID,
|
||||
SourceID: cir.SourceID,
|
||||
ReferenceID: cir.ReferenceID,
|
||||
Description: cir.Description,
|
||||
Source: cir.Source,
|
||||
TargetDate: cir.TargetDate,
|
||||
Status: cir.Status,
|
||||
Priority: cir.Priority,
|
||||
CreatedAt: cir.CreatedAt,
|
||||
UpdatedAt: cir.UpdatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
func NewContinualImprovementRegistryEdge(cir *coredata.ContinualImprovementRegistry, orderField coredata.ContinualImprovementRegistriesOrderField) *ContinualImprovementRegistryEdge {
|
||||
return &ContinualImprovementRegistryEdge{
|
||||
Node: NewContinualImprovementRegistry(cir),
|
||||
Cursor: cir.CursorKey(orderField),
|
||||
}
|
||||
}
|
||||
@@ -21,31 +21,31 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
NonconformityRegistryOrderBy OrderBy[coredata.NonconformityRegistryOrderField]
|
||||
NonconformityOrderBy OrderBy[coredata.NonconformityOrderField]
|
||||
|
||||
NonconformityRegistryConnection struct {
|
||||
NonconformityConnection struct {
|
||||
TotalCount int
|
||||
Edges []*NonconformityRegistryEdge
|
||||
Edges []*NonconformityEdge
|
||||
PageInfo PageInfo
|
||||
|
||||
Resolver any
|
||||
ParentID gid.GID
|
||||
Filter *NonconformityRegistryFilter
|
||||
Filter *NonconformityFilter
|
||||
}
|
||||
)
|
||||
|
||||
func NewNonconformityRegistryConnection(
|
||||
p *page.Page[*coredata.NonconformityRegistry, coredata.NonconformityRegistryOrderField],
|
||||
func NewNonconformityConnection(
|
||||
p *page.Page[*coredata.Nonconformity, coredata.NonconformityOrderField],
|
||||
parentType any,
|
||||
parentID gid.GID,
|
||||
filter *NonconformityRegistryFilter,
|
||||
) *NonconformityRegistryConnection {
|
||||
edges := make([]*NonconformityRegistryEdge, len(p.Data))
|
||||
for i, registry := range p.Data {
|
||||
edges[i] = NewNonconformityRegistryEdge(registry, p.Cursor.OrderBy.Field)
|
||||
filter *NonconformityFilter,
|
||||
) *NonconformityConnection {
|
||||
edges := make([]*NonconformityEdge, len(p.Data))
|
||||
for i, nonconformity := range p.Data {
|
||||
edges[i] = NewNonconformityEdge(nonconformity, p.Cursor.OrderBy.Field)
|
||||
}
|
||||
|
||||
return &NonconformityRegistryConnection{
|
||||
return &NonconformityConnection{
|
||||
Edges: edges,
|
||||
PageInfo: *NewPageInfo(p),
|
||||
|
||||
@@ -55,8 +55,8 @@ func NewNonconformityRegistryConnection(
|
||||
}
|
||||
}
|
||||
|
||||
func NewNonconformityRegistry(nr *coredata.NonconformityRegistry) *NonconformityRegistry {
|
||||
return &NonconformityRegistry{
|
||||
func NewNonconformity(nr *coredata.Nonconformity) *Nonconformity {
|
||||
return &Nonconformity{
|
||||
ID: nr.ID,
|
||||
ReferenceID: nr.ReferenceID,
|
||||
SnapshotID: nr.SnapshotID,
|
||||
@@ -72,9 +72,9 @@ func NewNonconformityRegistry(nr *coredata.NonconformityRegistry) *Nonconformity
|
||||
}
|
||||
}
|
||||
|
||||
func NewNonconformityRegistryEdge(nr *coredata.NonconformityRegistry, orderField coredata.NonconformityRegistryOrderField) *NonconformityRegistryEdge {
|
||||
return &NonconformityRegistryEdge{
|
||||
Node: NewNonconformityRegistry(nr),
|
||||
func NewNonconformityEdge(nr *coredata.Nonconformity, orderField coredata.NonconformityOrderField) *NonconformityEdge {
|
||||
return &NonconformityEdge{
|
||||
Node: NewNonconformity(nr),
|
||||
Cursor: nr.CursorKey(orderField),
|
||||
}
|
||||
}
|
||||
@@ -21,31 +21,31 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
ComplianceRegistryOrderBy OrderBy[coredata.ComplianceRegistryOrderField]
|
||||
ObligationOrderBy OrderBy[coredata.ObligationOrderField]
|
||||
|
||||
ComplianceRegistryConnection struct {
|
||||
ObligationConnection struct {
|
||||
TotalCount int
|
||||
Edges []*ComplianceRegistryEdge
|
||||
Edges []*ObligationEdge
|
||||
PageInfo PageInfo
|
||||
|
||||
Resolver any
|
||||
ParentID gid.GID
|
||||
Filter *ComplianceRegistryFilter
|
||||
Filter *ObligationFilter
|
||||
}
|
||||
)
|
||||
|
||||
func NewComplianceRegistryConnection(
|
||||
p *page.Page[*coredata.ComplianceRegistry, coredata.ComplianceRegistryOrderField],
|
||||
func NewObligationConnection(
|
||||
p *page.Page[*coredata.Obligation, coredata.ObligationOrderField],
|
||||
parentType any,
|
||||
parentID gid.GID,
|
||||
filter *ComplianceRegistryFilter,
|
||||
) *ComplianceRegistryConnection {
|
||||
edges := make([]*ComplianceRegistryEdge, len(p.Data))
|
||||
for i, registry := range p.Data {
|
||||
edges[i] = NewComplianceRegistryEdge(registry, p.Cursor.OrderBy.Field)
|
||||
filter *ObligationFilter,
|
||||
) *ObligationConnection {
|
||||
edges := make([]*ObligationEdge, len(p.Data))
|
||||
for i, obligation := range p.Data {
|
||||
edges[i] = NewObligationEdge(obligation, p.Cursor.OrderBy.Field)
|
||||
}
|
||||
|
||||
return &ComplianceRegistryConnection{
|
||||
return &ObligationConnection{
|
||||
Edges: edges,
|
||||
PageInfo: *NewPageInfo(p),
|
||||
|
||||
@@ -55,8 +55,8 @@ func NewComplianceRegistryConnection(
|
||||
}
|
||||
}
|
||||
|
||||
func NewComplianceRegistry(cr *coredata.ComplianceRegistry) *ComplianceRegistry {
|
||||
return &ComplianceRegistry{
|
||||
func NewObligation(cr *coredata.Obligation) *Obligation {
|
||||
return &Obligation{
|
||||
ID: cr.ID,
|
||||
SnapshotID: cr.SnapshotID,
|
||||
SourceID: cr.SourceID,
|
||||
@@ -74,9 +74,9 @@ func NewComplianceRegistry(cr *coredata.ComplianceRegistry) *ComplianceRegistry
|
||||
}
|
||||
}
|
||||
|
||||
func NewComplianceRegistryEdge(cr *coredata.ComplianceRegistry, orderField coredata.ComplianceRegistryOrderField) *ComplianceRegistryEdge {
|
||||
return &ComplianceRegistryEdge{
|
||||
Node: NewComplianceRegistry(cr),
|
||||
func NewObligationEdge(cr *coredata.Obligation, orderField coredata.ObligationOrderField) *ObligationEdge {
|
||||
return &ObligationEdge{
|
||||
Node: NewObligation(cr),
|
||||
Cursor: cr.CursorKey(orderField),
|
||||
}
|
||||
}
|
||||
@@ -21,31 +21,31 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
ProcessingActivityRegistryOrderBy OrderBy[coredata.ProcessingActivityRegistryOrderField]
|
||||
ProcessingActivityOrderBy OrderBy[coredata.ProcessingActivityOrderField]
|
||||
|
||||
ProcessingActivityRegistryConnection struct {
|
||||
ProcessingActivityConnection struct {
|
||||
TotalCount int
|
||||
Edges []*ProcessingActivityRegistryEdge
|
||||
Edges []*ProcessingActivityEdge
|
||||
PageInfo PageInfo
|
||||
|
||||
Resolver any
|
||||
ParentID gid.GID
|
||||
Filter *ProcessingActivityRegistryFilter
|
||||
Filter *ProcessingActivityFilter
|
||||
}
|
||||
)
|
||||
|
||||
func NewProcessingActivityRegistryConnection(
|
||||
p *page.Page[*coredata.ProcessingActivityRegistry, coredata.ProcessingActivityRegistryOrderField],
|
||||
func NewProcessingActivityConnection(
|
||||
p *page.Page[*coredata.ProcessingActivity, coredata.ProcessingActivityOrderField],
|
||||
parentType any,
|
||||
parentID gid.GID,
|
||||
filter *ProcessingActivityRegistryFilter,
|
||||
) *ProcessingActivityRegistryConnection {
|
||||
edges := make([]*ProcessingActivityRegistryEdge, len(p.Data))
|
||||
for i, registry := range p.Data {
|
||||
edges[i] = NewProcessingActivityRegistryEdge(registry, p.Cursor.OrderBy.Field)
|
||||
filter *ProcessingActivityFilter,
|
||||
) *ProcessingActivityConnection {
|
||||
edges := make([]*ProcessingActivityEdge, len(p.Data))
|
||||
for i, processingActivity := range p.Data {
|
||||
edges[i] = NewProcessingActivityEdge(processingActivity, p.Cursor.OrderBy.Field)
|
||||
}
|
||||
|
||||
return &ProcessingActivityRegistryConnection{
|
||||
return &ProcessingActivityConnection{
|
||||
Edges: edges,
|
||||
PageInfo: *NewPageInfo(p),
|
||||
|
||||
@@ -55,8 +55,8 @@ func NewProcessingActivityRegistryConnection(
|
||||
}
|
||||
}
|
||||
|
||||
func NewProcessingActivityRegistry(par *coredata.ProcessingActivityRegistry) *ProcessingActivityRegistry {
|
||||
return &ProcessingActivityRegistry{
|
||||
func NewProcessingActivity(par *coredata.ProcessingActivity) *ProcessingActivity {
|
||||
return &ProcessingActivity{
|
||||
ID: par.ID,
|
||||
SnapshotID: par.SnapshotID,
|
||||
Name: par.Name,
|
||||
@@ -79,9 +79,9 @@ func NewProcessingActivityRegistry(par *coredata.ProcessingActivityRegistry) *Pr
|
||||
}
|
||||
}
|
||||
|
||||
func NewProcessingActivityRegistryEdge(par *coredata.ProcessingActivityRegistry, orderField coredata.ProcessingActivityRegistryOrderField) *ProcessingActivityRegistryEdge {
|
||||
return &ProcessingActivityRegistryEdge{
|
||||
Node: NewProcessingActivityRegistry(par),
|
||||
func NewProcessingActivityEdge(par *coredata.ProcessingActivity, orderField coredata.ProcessingActivityOrderField) *ProcessingActivityEdge {
|
||||
return &ProcessingActivityEdge{
|
||||
Node: NewProcessingActivity(par),
|
||||
Cursor: par.CursorKey(orderField),
|
||||
}
|
||||
}
|
||||
@@ -112,37 +112,6 @@ type CancelSignatureRequestPayload struct {
|
||||
DeletedDocumentVersionSignatureID gid.GID `json:"deletedDocumentVersionSignatureId"`
|
||||
}
|
||||
|
||||
type ComplianceRegistry struct {
|
||||
ID gid.GID `json:"id"`
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
SourceID *gid.GID `json:"sourceId,omitempty"`
|
||||
Organization *Organization `json:"organization"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Area *string `json:"area,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
Requirement *string `json:"requirement,omitempty"`
|
||||
ActionsToBeImplemented *string `json:"actionsToBeImplemented,omitempty"`
|
||||
Regulator *string `json:"regulator,omitempty"`
|
||||
Owner *People `json:"owner"`
|
||||
LastReviewDate *time.Time `json:"lastReviewDate,omitempty"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status coredata.ComplianceRegistryStatus `json:"status"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
func (ComplianceRegistry) IsNode() {}
|
||||
func (this ComplianceRegistry) GetID() gid.GID { return this.ID }
|
||||
|
||||
type ComplianceRegistryEdge struct {
|
||||
Cursor page.CursorKey `json:"cursor"`
|
||||
Node *ComplianceRegistry `json:"node"`
|
||||
}
|
||||
|
||||
type ComplianceRegistryFilter struct {
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
}
|
||||
|
||||
type ConfirmEmailInput struct {
|
||||
Token string `json:"token"`
|
||||
}
|
||||
@@ -177,31 +146,31 @@ type ConnectorOrder struct {
|
||||
Direction page.OrderDirection `json:"direction"`
|
||||
}
|
||||
|
||||
type ContinualImprovementRegistry struct {
|
||||
ID gid.GID `json:"id"`
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
SourceID *gid.GID `json:"sourceId,omitempty"`
|
||||
Organization *Organization `json:"organization"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
Owner *People `json:"owner"`
|
||||
TargetDate *time.Time `json:"targetDate,omitempty"`
|
||||
Status coredata.ContinualImprovementRegistriesStatus `json:"status"`
|
||||
Priority coredata.ContinualImprovementRegistriesPriority `json:"priority"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
type ContinualImprovement struct {
|
||||
ID gid.GID `json:"id"`
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
SourceID *gid.GID `json:"sourceId,omitempty"`
|
||||
Organization *Organization `json:"organization"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
Owner *People `json:"owner"`
|
||||
TargetDate *time.Time `json:"targetDate,omitempty"`
|
||||
Status coredata.ContinualImprovementStatus `json:"status"`
|
||||
Priority coredata.ContinualImprovementPriority `json:"priority"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
func (ContinualImprovementRegistry) IsNode() {}
|
||||
func (this ContinualImprovementRegistry) GetID() gid.GID { return this.ID }
|
||||
func (ContinualImprovement) IsNode() {}
|
||||
func (this ContinualImprovement) GetID() gid.GID { return this.ID }
|
||||
|
||||
type ContinualImprovementRegistryEdge struct {
|
||||
Cursor page.CursorKey `json:"cursor"`
|
||||
Node *ContinualImprovementRegistry `json:"node"`
|
||||
type ContinualImprovementEdge struct {
|
||||
Cursor page.CursorKey `json:"cursor"`
|
||||
Node *ContinualImprovement `json:"node"`
|
||||
}
|
||||
|
||||
type ContinualImprovementRegistryFilter struct {
|
||||
type ContinualImprovementFilter struct {
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
}
|
||||
|
||||
@@ -261,37 +230,19 @@ type CreateAuditPayload struct {
|
||||
AuditEdge *AuditEdge `json:"auditEdge"`
|
||||
}
|
||||
|
||||
type CreateComplianceRegistryInput struct {
|
||||
OrganizationID gid.GID `json:"organizationId"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Area *string `json:"area,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
Requirement *string `json:"requirement,omitempty"`
|
||||
ActionsToBeImplemented *string `json:"actionsToBeImplemented,omitempty"`
|
||||
Regulator *string `json:"regulator,omitempty"`
|
||||
OwnerID gid.GID `json:"ownerId"`
|
||||
LastReviewDate *time.Time `json:"lastReviewDate,omitempty"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status coredata.ComplianceRegistryStatus `json:"status"`
|
||||
type CreateContinualImprovementInput struct {
|
||||
OrganizationID gid.GID `json:"organizationId"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
OwnerID gid.GID `json:"ownerId"`
|
||||
TargetDate *time.Time `json:"targetDate,omitempty"`
|
||||
Status coredata.ContinualImprovementStatus `json:"status"`
|
||||
Priority coredata.ContinualImprovementPriority `json:"priority"`
|
||||
}
|
||||
|
||||
type CreateComplianceRegistryPayload struct {
|
||||
ComplianceRegistryEdge *ComplianceRegistryEdge `json:"complianceRegistryEdge"`
|
||||
}
|
||||
|
||||
type CreateContinualImprovementRegistryInput struct {
|
||||
OrganizationID gid.GID `json:"organizationId"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
OwnerID gid.GID `json:"ownerId"`
|
||||
TargetDate *time.Time `json:"targetDate,omitempty"`
|
||||
Status coredata.ContinualImprovementRegistriesStatus `json:"status"`
|
||||
Priority coredata.ContinualImprovementRegistriesPriority `json:"priority"`
|
||||
}
|
||||
|
||||
type CreateContinualImprovementRegistryPayload struct {
|
||||
ContinualImprovementRegistryEdge *ContinualImprovementRegistryEdge `json:"continualImprovementRegistryEdge"`
|
||||
type CreateContinualImprovementPayload struct {
|
||||
ContinualImprovementEdge *ContinualImprovementEdge `json:"continualImprovementEdge"`
|
||||
}
|
||||
|
||||
type CreateControlAuditMappingInput struct {
|
||||
@@ -414,22 +365,40 @@ type CreateMeasurePayload struct {
|
||||
MeasureEdge *MeasureEdge `json:"measureEdge"`
|
||||
}
|
||||
|
||||
type CreateNonconformityRegistryInput struct {
|
||||
OrganizationID gid.GID `json:"organizationId"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
AuditID gid.GID `json:"auditId"`
|
||||
DateIdentified *time.Time `json:"dateIdentified,omitempty"`
|
||||
RootCause string `json:"rootCause"`
|
||||
CorrectiveAction *string `json:"correctiveAction,omitempty"`
|
||||
OwnerID gid.GID `json:"ownerId"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status coredata.NonconformityRegistryStatus `json:"status"`
|
||||
EffectivenessCheck *string `json:"effectivenessCheck,omitempty"`
|
||||
type CreateNonconformityInput struct {
|
||||
OrganizationID gid.GID `json:"organizationId"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
AuditID gid.GID `json:"auditId"`
|
||||
DateIdentified *time.Time `json:"dateIdentified,omitempty"`
|
||||
RootCause string `json:"rootCause"`
|
||||
CorrectiveAction *string `json:"correctiveAction,omitempty"`
|
||||
OwnerID gid.GID `json:"ownerId"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status coredata.NonconformityStatus `json:"status"`
|
||||
EffectivenessCheck *string `json:"effectivenessCheck,omitempty"`
|
||||
}
|
||||
|
||||
type CreateNonconformityRegistryPayload struct {
|
||||
NonconformityRegistryEdge *NonconformityRegistryEdge `json:"nonconformityRegistryEdge"`
|
||||
type CreateNonconformityPayload struct {
|
||||
NonconformityEdge *NonconformityEdge `json:"nonconformityEdge"`
|
||||
}
|
||||
|
||||
type CreateObligationInput struct {
|
||||
OrganizationID gid.GID `json:"organizationId"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Area *string `json:"area,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
Requirement *string `json:"requirement,omitempty"`
|
||||
ActionsToBeImplemented *string `json:"actionsToBeImplemented,omitempty"`
|
||||
Regulator *string `json:"regulator,omitempty"`
|
||||
OwnerID gid.GID `json:"ownerId"`
|
||||
LastReviewDate *time.Time `json:"lastReviewDate,omitempty"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status coredata.ObligationStatus `json:"status"`
|
||||
}
|
||||
|
||||
type CreateObligationPayload struct {
|
||||
ObligationEdge *ObligationEdge `json:"obligationEdge"`
|
||||
}
|
||||
|
||||
type CreateOrganizationInput struct {
|
||||
@@ -455,27 +424,27 @@ type CreatePeoplePayload struct {
|
||||
PeopleEdge *PeopleEdge `json:"peopleEdge"`
|
||||
}
|
||||
|
||||
type CreateProcessingActivityRegistryInput struct {
|
||||
OrganizationID gid.GID `json:"organizationId"`
|
||||
Name string `json:"name"`
|
||||
Purpose *string `json:"purpose,omitempty"`
|
||||
DataSubjectCategory *string `json:"dataSubjectCategory,omitempty"`
|
||||
PersonalDataCategory *string `json:"personalDataCategory,omitempty"`
|
||||
SpecialOrCriminalData coredata.ProcessingActivityRegistrySpecialOrCriminalData `json:"specialOrCriminalData"`
|
||||
ConsentEvidenceLink *string `json:"consentEvidenceLink,omitempty"`
|
||||
LawfulBasis coredata.ProcessingActivityRegistryLawfulBasis `json:"lawfulBasis"`
|
||||
Recipients *string `json:"recipients,omitempty"`
|
||||
Location *string `json:"location,omitempty"`
|
||||
InternationalTransfers bool `json:"internationalTransfers"`
|
||||
TransferSafeguards *coredata.ProcessingActivityRegistryTransferSafeguards `json:"transferSafeguards,omitempty"`
|
||||
RetentionPeriod *string `json:"retentionPeriod,omitempty"`
|
||||
SecurityMeasures *string `json:"securityMeasures,omitempty"`
|
||||
DataProtectionImpactAssessment coredata.ProcessingActivityRegistryDataProtectionImpactAssessment `json:"dataProtectionImpactAssessment"`
|
||||
TransferImpactAssessment coredata.ProcessingActivityRegistryTransferImpactAssessment `json:"transferImpactAssessment"`
|
||||
type CreateProcessingActivityInput struct {
|
||||
OrganizationID gid.GID `json:"organizationId"`
|
||||
Name string `json:"name"`
|
||||
Purpose *string `json:"purpose,omitempty"`
|
||||
DataSubjectCategory *string `json:"dataSubjectCategory,omitempty"`
|
||||
PersonalDataCategory *string `json:"personalDataCategory,omitempty"`
|
||||
SpecialOrCriminalData coredata.ProcessingActivitySpecialOrCriminalData `json:"specialOrCriminalData"`
|
||||
ConsentEvidenceLink *string `json:"consentEvidenceLink,omitempty"`
|
||||
LawfulBasis coredata.ProcessingActivityLawfulBasis `json:"lawfulBasis"`
|
||||
Recipients *string `json:"recipients,omitempty"`
|
||||
Location *string `json:"location,omitempty"`
|
||||
InternationalTransfers bool `json:"internationalTransfers"`
|
||||
TransferSafeguards *coredata.ProcessingActivityTransferSafeguards `json:"transferSafeguards,omitempty"`
|
||||
RetentionPeriod *string `json:"retentionPeriod,omitempty"`
|
||||
SecurityMeasures *string `json:"securityMeasures,omitempty"`
|
||||
DataProtectionImpactAssessment coredata.ProcessingActivityDataProtectionImpactAssessment `json:"dataProtectionImpactAssessment"`
|
||||
TransferImpactAssessment coredata.ProcessingActivityTransferImpactAssessment `json:"transferImpactAssessment"`
|
||||
}
|
||||
|
||||
type CreateProcessingActivityRegistryPayload struct {
|
||||
ProcessingActivityRegistryEdge *ProcessingActivityRegistryEdge `json:"processingActivityRegistryEdge"`
|
||||
type CreateProcessingActivityPayload struct {
|
||||
ProcessingActivityEdge *ProcessingActivityEdge `json:"processingActivityEdge"`
|
||||
}
|
||||
|
||||
type CreateRiskDocumentMappingInput struct {
|
||||
@@ -663,20 +632,12 @@ type DeleteAuditReportPayload struct {
|
||||
Audit *Audit `json:"audit"`
|
||||
}
|
||||
|
||||
type DeleteComplianceRegistryInput struct {
|
||||
ComplianceRegistryID gid.GID `json:"complianceRegistryId"`
|
||||
type DeleteContinualImprovementInput struct {
|
||||
ContinualImprovementID gid.GID `json:"continualImprovementId"`
|
||||
}
|
||||
|
||||
type DeleteComplianceRegistryPayload struct {
|
||||
DeletedComplianceRegistryID gid.GID `json:"deletedComplianceRegistryId"`
|
||||
}
|
||||
|
||||
type DeleteContinualImprovementRegistryInput struct {
|
||||
ContinualImprovementRegistryID gid.GID `json:"continualImprovementRegistryId"`
|
||||
}
|
||||
|
||||
type DeleteContinualImprovementRegistryPayload struct {
|
||||
DeletedContinualImprovementRegistryID gid.GID `json:"deletedContinualImprovementRegistryId"`
|
||||
type DeleteContinualImprovementPayload struct {
|
||||
DeletedContinualImprovementID gid.GID `json:"deletedContinualImprovementId"`
|
||||
}
|
||||
|
||||
type DeleteControlAuditMappingInput struct {
|
||||
@@ -775,12 +736,20 @@ type DeleteMeasurePayload struct {
|
||||
DeletedMeasureID gid.GID `json:"deletedMeasureId"`
|
||||
}
|
||||
|
||||
type DeleteNonconformityRegistryInput struct {
|
||||
NonconformityRegistryID gid.GID `json:"nonconformityRegistryId"`
|
||||
type DeleteNonconformityInput struct {
|
||||
NonconformityID gid.GID `json:"nonconformityId"`
|
||||
}
|
||||
|
||||
type DeleteNonconformityRegistryPayload struct {
|
||||
DeletedNonconformityRegistryID gid.GID `json:"deletedNonconformityRegistryId"`
|
||||
type DeleteNonconformityPayload struct {
|
||||
DeletedNonconformityID gid.GID `json:"deletedNonconformityId"`
|
||||
}
|
||||
|
||||
type DeleteObligationInput struct {
|
||||
ObligationID gid.GID `json:"obligationId"`
|
||||
}
|
||||
|
||||
type DeleteObligationPayload struct {
|
||||
DeletedObligationID gid.GID `json:"deletedObligationId"`
|
||||
}
|
||||
|
||||
type DeleteOrganizationInput struct {
|
||||
@@ -799,12 +768,12 @@ type DeletePeoplePayload struct {
|
||||
DeletedPeopleID gid.GID `json:"deletedPeopleId"`
|
||||
}
|
||||
|
||||
type DeleteProcessingActivityRegistryInput struct {
|
||||
ProcessingActivityRegistryID gid.GID `json:"processingActivityRegistryId"`
|
||||
type DeleteProcessingActivityInput struct {
|
||||
ProcessingActivityID gid.GID `json:"processingActivityId"`
|
||||
}
|
||||
|
||||
type DeleteProcessingActivityRegistryPayload struct {
|
||||
DeletedProcessingActivityRegistryID gid.GID `json:"deletedProcessingActivityRegistryId"`
|
||||
type DeleteProcessingActivityPayload struct {
|
||||
DeletedProcessingActivityID gid.GID `json:"deletedProcessingActivityId"`
|
||||
}
|
||||
|
||||
type DeleteRiskDocumentMappingInput struct {
|
||||
@@ -1139,61 +1108,92 @@ type MeasureFilter struct {
|
||||
type Mutation struct {
|
||||
}
|
||||
|
||||
type NonconformityRegistry struct {
|
||||
ID gid.GID `json:"id"`
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
Organization *Organization `json:"organization"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
Audit *Audit `json:"audit"`
|
||||
DateIdentified *time.Time `json:"dateIdentified,omitempty"`
|
||||
RootCause string `json:"rootCause"`
|
||||
CorrectiveAction *string `json:"correctiveAction,omitempty"`
|
||||
Owner *People `json:"owner"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status coredata.NonconformityRegistryStatus `json:"status"`
|
||||
EffectivenessCheck *string `json:"effectivenessCheck,omitempty"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
type Nonconformity struct {
|
||||
ID gid.GID `json:"id"`
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
Organization *Organization `json:"organization"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
Audit *Audit `json:"audit"`
|
||||
DateIdentified *time.Time `json:"dateIdentified,omitempty"`
|
||||
RootCause string `json:"rootCause"`
|
||||
CorrectiveAction *string `json:"correctiveAction,omitempty"`
|
||||
Owner *People `json:"owner"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status coredata.NonconformityStatus `json:"status"`
|
||||
EffectivenessCheck *string `json:"effectivenessCheck,omitempty"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
func (NonconformityRegistry) IsNode() {}
|
||||
func (this NonconformityRegistry) GetID() gid.GID { return this.ID }
|
||||
func (Nonconformity) IsNode() {}
|
||||
func (this Nonconformity) GetID() gid.GID { return this.ID }
|
||||
|
||||
type NonconformityRegistryEdge struct {
|
||||
Cursor page.CursorKey `json:"cursor"`
|
||||
Node *NonconformityRegistry `json:"node"`
|
||||
type NonconformityEdge struct {
|
||||
Cursor page.CursorKey `json:"cursor"`
|
||||
Node *Nonconformity `json:"node"`
|
||||
}
|
||||
|
||||
type NonconformityRegistryFilter struct {
|
||||
type NonconformityFilter struct {
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
}
|
||||
|
||||
type Obligation struct {
|
||||
ID gid.GID `json:"id"`
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
SourceID *gid.GID `json:"sourceId,omitempty"`
|
||||
Organization *Organization `json:"organization"`
|
||||
ReferenceID string `json:"referenceId"`
|
||||
Area *string `json:"area,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
Requirement *string `json:"requirement,omitempty"`
|
||||
ActionsToBeImplemented *string `json:"actionsToBeImplemented,omitempty"`
|
||||
Regulator *string `json:"regulator,omitempty"`
|
||||
Owner *People `json:"owner"`
|
||||
LastReviewDate *time.Time `json:"lastReviewDate,omitempty"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status coredata.ObligationStatus `json:"status"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
func (Obligation) IsNode() {}
|
||||
func (this Obligation) GetID() gid.GID { return this.ID }
|
||||
|
||||
type ObligationEdge struct {
|
||||
Cursor page.CursorKey `json:"cursor"`
|
||||
Node *Obligation `json:"node"`
|
||||
}
|
||||
|
||||
type ObligationFilter struct {
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
}
|
||||
|
||||
type Organization struct {
|
||||
ID gid.GID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
LogoURL *string `json:"logoUrl,omitempty"`
|
||||
Users *UserConnection `json:"users"`
|
||||
Connectors *ConnectorConnection `json:"connectors"`
|
||||
Frameworks *FrameworkConnection `json:"frameworks"`
|
||||
Controls *ControlConnection `json:"controls"`
|
||||
Vendors *VendorConnection `json:"vendors"`
|
||||
Peoples *PeopleConnection `json:"peoples"`
|
||||
Documents *DocumentConnection `json:"documents"`
|
||||
Measures *MeasureConnection `json:"measures"`
|
||||
Risks *RiskConnection `json:"risks"`
|
||||
Tasks *TaskConnection `json:"tasks"`
|
||||
Assets *AssetConnection `json:"assets"`
|
||||
Data *DatumConnection `json:"data"`
|
||||
Audits *AuditConnection `json:"audits"`
|
||||
NonconformityRegistries *NonconformityRegistryConnection `json:"nonconformityRegistries"`
|
||||
ComplianceRegistries *ComplianceRegistryConnection `json:"complianceRegistries"`
|
||||
ContinualImprovementRegistries *ContinualImprovementRegistryConnection `json:"continualImprovementRegistries"`
|
||||
ProcessingActivityRegistries *ProcessingActivityRegistryConnection `json:"processingActivityRegistries"`
|
||||
Snapshots *SnapshotConnection `json:"snapshots"`
|
||||
TrustCenter *TrustCenter `json:"trustCenter,omitempty"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
ID gid.GID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
LogoURL *string `json:"logoUrl,omitempty"`
|
||||
Users *UserConnection `json:"users"`
|
||||
Connectors *ConnectorConnection `json:"connectors"`
|
||||
Frameworks *FrameworkConnection `json:"frameworks"`
|
||||
Controls *ControlConnection `json:"controls"`
|
||||
Vendors *VendorConnection `json:"vendors"`
|
||||
Peoples *PeopleConnection `json:"peoples"`
|
||||
Documents *DocumentConnection `json:"documents"`
|
||||
Measures *MeasureConnection `json:"measures"`
|
||||
Risks *RiskConnection `json:"risks"`
|
||||
Tasks *TaskConnection `json:"tasks"`
|
||||
Assets *AssetConnection `json:"assets"`
|
||||
Data *DatumConnection `json:"data"`
|
||||
Audits *AuditConnection `json:"audits"`
|
||||
Nonconformities *NonconformityConnection `json:"nonconformities"`
|
||||
Obligations *ObligationConnection `json:"obligations"`
|
||||
ContinualImprovements *ContinualImprovementConnection `json:"continualImprovements"`
|
||||
ProcessingActivities *ProcessingActivityConnection `json:"processingActivities"`
|
||||
Snapshots *SnapshotConnection `json:"snapshots"`
|
||||
TrustCenter *TrustCenter `json:"trustCenter,omitempty"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
func (Organization) IsNode() {}
|
||||
@@ -1250,39 +1250,39 @@ type PeopleFilter struct {
|
||||
ExcludeContractEnded *bool `json:"excludeContractEnded,omitempty"`
|
||||
}
|
||||
|
||||
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"`
|
||||
DataSubjectCategory *string `json:"dataSubjectCategory,omitempty"`
|
||||
PersonalDataCategory *string `json:"personalDataCategory,omitempty"`
|
||||
SpecialOrCriminalData coredata.ProcessingActivityRegistrySpecialOrCriminalData `json:"specialOrCriminalData"`
|
||||
ConsentEvidenceLink *string `json:"consentEvidenceLink,omitempty"`
|
||||
LawfulBasis coredata.ProcessingActivityRegistryLawfulBasis `json:"lawfulBasis"`
|
||||
Recipients *string `json:"recipients,omitempty"`
|
||||
Location *string `json:"location,omitempty"`
|
||||
InternationalTransfers bool `json:"internationalTransfers"`
|
||||
TransferSafeguards *coredata.ProcessingActivityRegistryTransferSafeguards `json:"transferSafeguards,omitempty"`
|
||||
RetentionPeriod *string `json:"retentionPeriod,omitempty"`
|
||||
SecurityMeasures *string `json:"securityMeasures,omitempty"`
|
||||
DataProtectionImpactAssessment coredata.ProcessingActivityRegistryDataProtectionImpactAssessment `json:"dataProtectionImpactAssessment"`
|
||||
TransferImpactAssessment coredata.ProcessingActivityRegistryTransferImpactAssessment `json:"transferImpactAssessment"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
type ProcessingActivity 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"`
|
||||
DataSubjectCategory *string `json:"dataSubjectCategory,omitempty"`
|
||||
PersonalDataCategory *string `json:"personalDataCategory,omitempty"`
|
||||
SpecialOrCriminalData coredata.ProcessingActivitySpecialOrCriminalData `json:"specialOrCriminalData"`
|
||||
ConsentEvidenceLink *string `json:"consentEvidenceLink,omitempty"`
|
||||
LawfulBasis coredata.ProcessingActivityLawfulBasis `json:"lawfulBasis"`
|
||||
Recipients *string `json:"recipients,omitempty"`
|
||||
Location *string `json:"location,omitempty"`
|
||||
InternationalTransfers bool `json:"internationalTransfers"`
|
||||
TransferSafeguards *coredata.ProcessingActivityTransferSafeguards `json:"transferSafeguards,omitempty"`
|
||||
RetentionPeriod *string `json:"retentionPeriod,omitempty"`
|
||||
SecurityMeasures *string `json:"securityMeasures,omitempty"`
|
||||
DataProtectionImpactAssessment coredata.ProcessingActivityDataProtectionImpactAssessment `json:"dataProtectionImpactAssessment"`
|
||||
TransferImpactAssessment coredata.ProcessingActivityTransferImpactAssessment `json:"transferImpactAssessment"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
func (ProcessingActivityRegistry) IsNode() {}
|
||||
func (this ProcessingActivityRegistry) GetID() gid.GID { return this.ID }
|
||||
func (ProcessingActivity) IsNode() {}
|
||||
func (this ProcessingActivity) GetID() gid.GID { return this.ID }
|
||||
|
||||
type ProcessingActivityRegistryEdge struct {
|
||||
Cursor page.CursorKey `json:"cursor"`
|
||||
Node *ProcessingActivityRegistry `json:"node"`
|
||||
type ProcessingActivityEdge struct {
|
||||
Cursor page.CursorKey `json:"cursor"`
|
||||
Node *ProcessingActivity `json:"node"`
|
||||
}
|
||||
|
||||
type ProcessingActivityRegistryFilter struct {
|
||||
type ProcessingActivityFilter struct {
|
||||
SnapshotID *gid.GID `json:"snapshotId,omitempty"`
|
||||
}
|
||||
|
||||
@@ -1513,37 +1513,19 @@ type UpdateAuditPayload struct {
|
||||
Audit *Audit `json:"audit"`
|
||||
}
|
||||
|
||||
type UpdateComplianceRegistryInput struct {
|
||||
ID gid.GID `json:"id"`
|
||||
ReferenceID *string `json:"referenceId,omitempty"`
|
||||
Area *string `json:"area,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
Requirement *string `json:"requirement,omitempty"`
|
||||
ActionsToBeImplemented *string `json:"actionsToBeImplemented,omitempty"`
|
||||
Regulator *string `json:"regulator,omitempty"`
|
||||
OwnerID *gid.GID `json:"ownerId,omitempty"`
|
||||
LastReviewDate *time.Time `json:"lastReviewDate,omitempty"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status *coredata.ComplianceRegistryStatus `json:"status,omitempty"`
|
||||
type UpdateContinualImprovementInput struct {
|
||||
ID gid.GID `json:"id"`
|
||||
ReferenceID *string `json:"referenceId,omitempty"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
OwnerID *gid.GID `json:"ownerId,omitempty"`
|
||||
TargetDate *time.Time `json:"targetDate,omitempty"`
|
||||
Status *coredata.ContinualImprovementStatus `json:"status,omitempty"`
|
||||
Priority *coredata.ContinualImprovementPriority `json:"priority,omitempty"`
|
||||
}
|
||||
|
||||
type UpdateComplianceRegistryPayload struct {
|
||||
ComplianceRegistry *ComplianceRegistry `json:"complianceRegistry"`
|
||||
}
|
||||
|
||||
type UpdateContinualImprovementRegistryInput struct {
|
||||
ID gid.GID `json:"id"`
|
||||
ReferenceID *string `json:"referenceId,omitempty"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
OwnerID *gid.GID `json:"ownerId,omitempty"`
|
||||
TargetDate *time.Time `json:"targetDate,omitempty"`
|
||||
Status *coredata.ContinualImprovementRegistriesStatus `json:"status,omitempty"`
|
||||
Priority *coredata.ContinualImprovementRegistriesPriority `json:"priority,omitempty"`
|
||||
}
|
||||
|
||||
type UpdateContinualImprovementRegistryPayload struct {
|
||||
ContinualImprovementRegistry *ContinualImprovementRegistry `json:"continualImprovementRegistry"`
|
||||
type UpdateContinualImprovementPayload struct {
|
||||
ContinualImprovement *ContinualImprovement `json:"continualImprovement"`
|
||||
}
|
||||
|
||||
type UpdateControlInput struct {
|
||||
@@ -1616,22 +1598,40 @@ type UpdateMeasurePayload struct {
|
||||
Measure *Measure `json:"measure"`
|
||||
}
|
||||
|
||||
type UpdateNonconformityRegistryInput struct {
|
||||
ID gid.GID `json:"id"`
|
||||
ReferenceID *string `json:"referenceId,omitempty"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
DateIdentified *time.Time `json:"dateIdentified,omitempty"`
|
||||
RootCause *string `json:"rootCause,omitempty"`
|
||||
CorrectiveAction *string `json:"correctiveAction,omitempty"`
|
||||
OwnerID *gid.GID `json:"ownerId,omitempty"`
|
||||
AuditID *gid.GID `json:"auditId,omitempty"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status *coredata.NonconformityRegistryStatus `json:"status,omitempty"`
|
||||
EffectivenessCheck *string `json:"effectivenessCheck,omitempty"`
|
||||
type UpdateNonconformityInput struct {
|
||||
ID gid.GID `json:"id"`
|
||||
ReferenceID *string `json:"referenceId,omitempty"`
|
||||
Description *string `json:"description,omitempty"`
|
||||
DateIdentified *time.Time `json:"dateIdentified,omitempty"`
|
||||
RootCause *string `json:"rootCause,omitempty"`
|
||||
CorrectiveAction *string `json:"correctiveAction,omitempty"`
|
||||
OwnerID *gid.GID `json:"ownerId,omitempty"`
|
||||
AuditID *gid.GID `json:"auditId,omitempty"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status *coredata.NonconformityStatus `json:"status,omitempty"`
|
||||
EffectivenessCheck *string `json:"effectivenessCheck,omitempty"`
|
||||
}
|
||||
|
||||
type UpdateNonconformityRegistryPayload struct {
|
||||
NonconformityRegistry *NonconformityRegistry `json:"nonconformityRegistry"`
|
||||
type UpdateNonconformityPayload struct {
|
||||
Nonconformity *Nonconformity `json:"nonconformity"`
|
||||
}
|
||||
|
||||
type UpdateObligationInput struct {
|
||||
ID gid.GID `json:"id"`
|
||||
ReferenceID *string `json:"referenceId,omitempty"`
|
||||
Area *string `json:"area,omitempty"`
|
||||
Source *string `json:"source,omitempty"`
|
||||
Requirement *string `json:"requirement,omitempty"`
|
||||
ActionsToBeImplemented *string `json:"actionsToBeImplemented,omitempty"`
|
||||
Regulator *string `json:"regulator,omitempty"`
|
||||
OwnerID *gid.GID `json:"ownerId,omitempty"`
|
||||
LastReviewDate *time.Time `json:"lastReviewDate,omitempty"`
|
||||
DueDate *time.Time `json:"dueDate,omitempty"`
|
||||
Status *coredata.ObligationStatus `json:"status,omitempty"`
|
||||
}
|
||||
|
||||
type UpdateObligationPayload struct {
|
||||
Obligation *Obligation `json:"obligation"`
|
||||
}
|
||||
|
||||
type UpdateOrganizationInput struct {
|
||||
@@ -1659,27 +1659,27 @@ type UpdatePeoplePayload struct {
|
||||
People *People `json:"people"`
|
||||
}
|
||||
|
||||
type UpdateProcessingActivityRegistryInput struct {
|
||||
ID gid.GID `json:"id"`
|
||||
Name *string `json:"name,omitempty"`
|
||||
Purpose *string `json:"purpose,omitempty"`
|
||||
DataSubjectCategory *string `json:"dataSubjectCategory,omitempty"`
|
||||
PersonalDataCategory *string `json:"personalDataCategory,omitempty"`
|
||||
SpecialOrCriminalData *coredata.ProcessingActivityRegistrySpecialOrCriminalData `json:"specialOrCriminalData,omitempty"`
|
||||
ConsentEvidenceLink *string `json:"consentEvidenceLink,omitempty"`
|
||||
LawfulBasis *coredata.ProcessingActivityRegistryLawfulBasis `json:"lawfulBasis,omitempty"`
|
||||
Recipients *string `json:"recipients,omitempty"`
|
||||
Location *string `json:"location,omitempty"`
|
||||
InternationalTransfers *bool `json:"internationalTransfers,omitempty"`
|
||||
TransferSafeguards *coredata.ProcessingActivityRegistryTransferSafeguards `json:"transferSafeguards,omitempty"`
|
||||
RetentionPeriod *string `json:"retentionPeriod,omitempty"`
|
||||
SecurityMeasures *string `json:"securityMeasures,omitempty"`
|
||||
DataProtectionImpactAssessment *coredata.ProcessingActivityRegistryDataProtectionImpactAssessment `json:"dataProtectionImpactAssessment,omitempty"`
|
||||
TransferImpactAssessment *coredata.ProcessingActivityRegistryTransferImpactAssessment `json:"transferImpactAssessment,omitempty"`
|
||||
type UpdateProcessingActivityInput struct {
|
||||
ID gid.GID `json:"id"`
|
||||
Name *string `json:"name,omitempty"`
|
||||
Purpose *string `json:"purpose,omitempty"`
|
||||
DataSubjectCategory *string `json:"dataSubjectCategory,omitempty"`
|
||||
PersonalDataCategory *string `json:"personalDataCategory,omitempty"`
|
||||
SpecialOrCriminalData *coredata.ProcessingActivitySpecialOrCriminalData `json:"specialOrCriminalData,omitempty"`
|
||||
ConsentEvidenceLink *string `json:"consentEvidenceLink,omitempty"`
|
||||
LawfulBasis *coredata.ProcessingActivityLawfulBasis `json:"lawfulBasis,omitempty"`
|
||||
Recipients *string `json:"recipients,omitempty"`
|
||||
Location *string `json:"location,omitempty"`
|
||||
InternationalTransfers *bool `json:"internationalTransfers,omitempty"`
|
||||
TransferSafeguards *coredata.ProcessingActivityTransferSafeguards `json:"transferSafeguards,omitempty"`
|
||||
RetentionPeriod *string `json:"retentionPeriod,omitempty"`
|
||||
SecurityMeasures *string `json:"securityMeasures,omitempty"`
|
||||
DataProtectionImpactAssessment *coredata.ProcessingActivityDataProtectionImpactAssessment `json:"dataProtectionImpactAssessment,omitempty"`
|
||||
TransferImpactAssessment *coredata.ProcessingActivityTransferImpactAssessment `json:"transferImpactAssessment,omitempty"`
|
||||
}
|
||||
|
||||
type UpdateProcessingActivityRegistryPayload struct {
|
||||
ProcessingActivityRegistry *ProcessingActivityRegistry `json:"processingActivityRegistry"`
|
||||
type UpdateProcessingActivityPayload struct {
|
||||
ProcessingActivity *ProcessingActivity `json:"processingActivity"`
|
||||
}
|
||||
|
||||
type UpdateRiskInput struct {
|
||||
|
||||
@@ -226,108 +226,53 @@ func (r *auditConnectionResolver) TotalCount(ctx context.Context, obj *types.Aud
|
||||
}
|
||||
|
||||
// Organization is the resolver for the organization field.
|
||||
func (r *complianceRegistryResolver) Organization(ctx context.Context, obj *types.ComplianceRegistry) (*types.Organization, error) {
|
||||
func (r *continualImprovementResolver) Organization(ctx context.Context, obj *types.ContinualImprovement) (*types.Organization, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
registry, err := prb.ComplianceRegistries.Get(ctx, obj.ID)
|
||||
continualImprovement, err := prb.ContinualImprovements.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get compliance registry: %w", err))
|
||||
panic(fmt.Errorf("cannot get continual improvement: %w", err))
|
||||
}
|
||||
|
||||
organization, err := prb.Organizations.Get(ctx, registry.OrganizationID)
|
||||
organization, err := prb.Organizations.Get(ctx, continualImprovement.OrganizationID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get compliance registry organization: %w", err))
|
||||
panic(fmt.Errorf("cannot get continual improvement organization: %w", err))
|
||||
}
|
||||
|
||||
return types.NewOrganization(organization), nil
|
||||
}
|
||||
|
||||
// Owner is the resolver for the owner field.
|
||||
func (r *complianceRegistryResolver) Owner(ctx context.Context, obj *types.ComplianceRegistry) (*types.People, error) {
|
||||
func (r *continualImprovementResolver) Owner(ctx context.Context, obj *types.ContinualImprovement) (*types.People, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
registry, err := prb.ComplianceRegistries.Get(ctx, obj.ID)
|
||||
continualImprovement, err := prb.ContinualImprovements.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get compliance registry: %w", err))
|
||||
panic(fmt.Errorf("cannot get continual improvement: %w", err))
|
||||
}
|
||||
|
||||
people, err := prb.Peoples.Get(ctx, registry.OwnerID)
|
||||
people, err := prb.Peoples.Get(ctx, continualImprovement.OwnerID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get compliance registry owner: %w", err))
|
||||
panic(fmt.Errorf("cannot get continual improvement owner: %w", err))
|
||||
}
|
||||
|
||||
return types.NewPeople(people), nil
|
||||
}
|
||||
|
||||
// TotalCount is the resolver for the totalCount field.
|
||||
func (r *complianceRegistryConnectionResolver) TotalCount(ctx context.Context, obj *types.ComplianceRegistryConnection) (int, error) {
|
||||
func (r *continualImprovementConnectionResolver) TotalCount(ctx context.Context, obj *types.ContinualImprovementConnection) (int, error) {
|
||||
prb := r.ProboService(ctx, obj.ParentID.TenantID())
|
||||
|
||||
switch obj.Resolver.(type) {
|
||||
case *organizationResolver:
|
||||
complianceRegistryFilter := coredata.NewComplianceRegistryFilter(nil)
|
||||
continualImprovementFilter := coredata.NewContinualImprovementFilter(nil)
|
||||
if obj.Filter != nil {
|
||||
complianceRegistryFilter = coredata.NewComplianceRegistryFilter(&obj.Filter.SnapshotID)
|
||||
continualImprovementFilter = coredata.NewContinualImprovementFilter(&obj.Filter.SnapshotID)
|
||||
}
|
||||
|
||||
count, err := prb.ComplianceRegistries.CountForOrganizationID(ctx, obj.ParentID, complianceRegistryFilter)
|
||||
count, err := prb.ContinualImprovements.CountByOrganizationID(ctx, obj.ParentID, continualImprovementFilter)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot count compliance registries: %w", err))
|
||||
}
|
||||
return count, nil
|
||||
}
|
||||
|
||||
panic(fmt.Errorf("unsupported resolver: %T", obj.Resolver))
|
||||
}
|
||||
|
||||
// Organization is the resolver for the organization field.
|
||||
func (r *continualImprovementRegistryResolver) Organization(ctx context.Context, obj *types.ContinualImprovementRegistry) (*types.Organization, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
registry, err := prb.ContinualImprovementRegistries.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get continual improvement registry: %w", err))
|
||||
}
|
||||
|
||||
organization, err := prb.Organizations.Get(ctx, registry.OrganizationID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get continual improvement registry organization: %w", err))
|
||||
}
|
||||
|
||||
return types.NewOrganization(organization), nil
|
||||
}
|
||||
|
||||
// Owner is the resolver for the owner field.
|
||||
func (r *continualImprovementRegistryResolver) Owner(ctx context.Context, obj *types.ContinualImprovementRegistry) (*types.People, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
registry, err := prb.ContinualImprovementRegistries.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get continual improvement registry: %w", err))
|
||||
}
|
||||
|
||||
people, err := prb.Peoples.Get(ctx, registry.OwnerID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get continual improvement registry owner: %w", err))
|
||||
}
|
||||
|
||||
return types.NewPeople(people), nil
|
||||
}
|
||||
|
||||
// TotalCount is the resolver for the totalCount field.
|
||||
func (r *continualImprovementRegistryConnectionResolver) TotalCount(ctx context.Context, obj *types.ContinualImprovementRegistryConnection) (int, error) {
|
||||
prb := r.ProboService(ctx, obj.ParentID.TenantID())
|
||||
|
||||
switch obj.Resolver.(type) {
|
||||
case *organizationResolver:
|
||||
continualImprovementRegistryFilter := coredata.NewContinualImprovementRegistryFilter(nil)
|
||||
if obj.Filter != nil {
|
||||
continualImprovementRegistryFilter = coredata.NewContinualImprovementRegistryFilter(&obj.Filter.SnapshotID)
|
||||
}
|
||||
|
||||
count, err := prb.ContinualImprovementRegistries.CountByOrganizationID(ctx, obj.ParentID, continualImprovementRegistryFilter)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot count continual improvement registries: %w", err))
|
||||
panic(fmt.Errorf("cannot count continual improvements: %w", err))
|
||||
}
|
||||
return count, nil
|
||||
}
|
||||
@@ -2975,11 +2920,11 @@ func (r *mutationResolver) DeleteAuditReport(ctx context.Context, input types.De
|
||||
}, nil
|
||||
}
|
||||
|
||||
// CreateNonconformityRegistry is the resolver for the createNonconformityRegistry field.
|
||||
func (r *mutationResolver) CreateNonconformityRegistry(ctx context.Context, input types.CreateNonconformityRegistryInput) (*types.CreateNonconformityRegistryPayload, error) {
|
||||
// CreateNonconformity is the resolver for the createNonconformity field.
|
||||
func (r *mutationResolver) CreateNonconformity(ctx context.Context, input types.CreateNonconformityInput) (*types.CreateNonconformityPayload, error) {
|
||||
prb := r.ProboService(ctx, input.OrganizationID.TenantID())
|
||||
|
||||
req := probo.CreateNonconformityRegistryRequest{
|
||||
req := probo.CreateNonconformityRequest{
|
||||
OrganizationID: input.OrganizationID,
|
||||
ReferenceID: input.ReferenceID,
|
||||
Description: input.Description,
|
||||
@@ -2993,21 +2938,21 @@ func (r *mutationResolver) CreateNonconformityRegistry(ctx context.Context, inpu
|
||||
EffectivenessCheck: input.EffectivenessCheck,
|
||||
}
|
||||
|
||||
registry, err := prb.NonconformityRegistries.Create(ctx, &req)
|
||||
nonconformity, err := prb.Nonconformities.Create(ctx, &req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot create nonconformity registry: %w", err)
|
||||
panic(fmt.Errorf("cannot create nonconformity: %w", err))
|
||||
}
|
||||
|
||||
return &types.CreateNonconformityRegistryPayload{
|
||||
NonconformityRegistryEdge: types.NewNonconformityRegistryEdge(registry, coredata.NonconformityRegistryOrderFieldCreatedAt),
|
||||
return &types.CreateNonconformityPayload{
|
||||
NonconformityEdge: types.NewNonconformityEdge(nonconformity, coredata.NonconformityOrderFieldCreatedAt),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// UpdateNonconformityRegistry is the resolver for the updateNonconformityRegistry field.
|
||||
func (r *mutationResolver) UpdateNonconformityRegistry(ctx context.Context, input types.UpdateNonconformityRegistryInput) (*types.UpdateNonconformityRegistryPayload, error) {
|
||||
// UpdateNonconformity is the resolver for the updateNonconformity field.
|
||||
func (r *mutationResolver) UpdateNonconformity(ctx context.Context, input types.UpdateNonconformityInput) (*types.UpdateNonconformityPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ID.TenantID())
|
||||
|
||||
req := probo.UpdateNonconformityRegistryRequest{
|
||||
req := probo.UpdateNonconformityRequest{
|
||||
ID: input.ID,
|
||||
ReferenceID: input.ReferenceID,
|
||||
Description: &input.Description,
|
||||
@@ -3021,35 +2966,35 @@ func (r *mutationResolver) UpdateNonconformityRegistry(ctx context.Context, inpu
|
||||
EffectivenessCheck: &input.EffectivenessCheck,
|
||||
}
|
||||
|
||||
registry, err := prb.NonconformityRegistries.Update(ctx, &req)
|
||||
nonconformity, err := prb.Nonconformities.Update(ctx, &req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot update nonconformity registry: %w", err)
|
||||
panic(fmt.Errorf("cannot update nonconformity: %w", err))
|
||||
}
|
||||
|
||||
return &types.UpdateNonconformityRegistryPayload{
|
||||
NonconformityRegistry: types.NewNonconformityRegistry(registry),
|
||||
return &types.UpdateNonconformityPayload{
|
||||
Nonconformity: types.NewNonconformity(nonconformity),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// DeleteNonconformityRegistry is the resolver for the deleteNonconformityRegistry field.
|
||||
func (r *mutationResolver) DeleteNonconformityRegistry(ctx context.Context, input types.DeleteNonconformityRegistryInput) (*types.DeleteNonconformityRegistryPayload, error) {
|
||||
prb := r.ProboService(ctx, input.NonconformityRegistryID.TenantID())
|
||||
// DeleteNonconformity is the resolver for the deleteNonconformity field.
|
||||
func (r *mutationResolver) DeleteNonconformity(ctx context.Context, input types.DeleteNonconformityInput) (*types.DeleteNonconformityPayload, error) {
|
||||
prb := r.ProboService(ctx, input.NonconformityID.TenantID())
|
||||
|
||||
err := prb.NonconformityRegistries.Delete(ctx, input.NonconformityRegistryID)
|
||||
err := prb.Nonconformities.Delete(ctx, input.NonconformityID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot delete nonconformity registry: %w", err)
|
||||
return nil, fmt.Errorf("cannot delete nonconformity: %w", err)
|
||||
}
|
||||
|
||||
return &types.DeleteNonconformityRegistryPayload{
|
||||
DeletedNonconformityRegistryID: input.NonconformityRegistryID,
|
||||
return &types.DeleteNonconformityPayload{
|
||||
DeletedNonconformityID: input.NonconformityID,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// CreateComplianceRegistry is the resolver for the createComplianceRegistry field.
|
||||
func (r *mutationResolver) CreateComplianceRegistry(ctx context.Context, input types.CreateComplianceRegistryInput) (*types.CreateComplianceRegistryPayload, error) {
|
||||
// CreateObligation is the resolver for the createObligation field.
|
||||
func (r *mutationResolver) CreateObligation(ctx context.Context, input types.CreateObligationInput) (*types.CreateObligationPayload, error) {
|
||||
prb := r.ProboService(ctx, input.OrganizationID.TenantID())
|
||||
|
||||
req := probo.CreateComplianceRegistryRequest{
|
||||
req := probo.CreateObligationRequest{
|
||||
OrganizationID: input.OrganizationID,
|
||||
ReferenceID: input.ReferenceID,
|
||||
Area: input.Area,
|
||||
@@ -3063,21 +3008,21 @@ func (r *mutationResolver) CreateComplianceRegistry(ctx context.Context, input t
|
||||
Status: &input.Status,
|
||||
}
|
||||
|
||||
registry, err := prb.ComplianceRegistries.Create(ctx, &req)
|
||||
obligation, err := prb.Obligations.Create(ctx, &req)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot create compliance registry: %w", err))
|
||||
panic(fmt.Errorf("cannot create obligation: %w", err))
|
||||
}
|
||||
|
||||
return &types.CreateComplianceRegistryPayload{
|
||||
ComplianceRegistryEdge: types.NewComplianceRegistryEdge(registry, coredata.ComplianceRegistryOrderFieldCreatedAt),
|
||||
return &types.CreateObligationPayload{
|
||||
ObligationEdge: types.NewObligationEdge(obligation, coredata.ObligationOrderFieldCreatedAt),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// UpdateComplianceRegistry is the resolver for the updateComplianceRegistry field.
|
||||
func (r *mutationResolver) UpdateComplianceRegistry(ctx context.Context, input types.UpdateComplianceRegistryInput) (*types.UpdateComplianceRegistryPayload, error) {
|
||||
// UpdateObligation is the resolver for the updateObligation field.
|
||||
func (r *mutationResolver) UpdateObligation(ctx context.Context, input types.UpdateObligationInput) (*types.UpdateObligationPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ID.TenantID())
|
||||
|
||||
req := probo.UpdateComplianceRegistryRequest{
|
||||
req := probo.UpdateObligationRequest{
|
||||
ID: input.ID,
|
||||
ReferenceID: input.ReferenceID,
|
||||
Area: &input.Area,
|
||||
@@ -3091,35 +3036,35 @@ func (r *mutationResolver) UpdateComplianceRegistry(ctx context.Context, input t
|
||||
Status: input.Status,
|
||||
}
|
||||
|
||||
registry, err := prb.ComplianceRegistries.Update(ctx, &req)
|
||||
obligation, err := prb.Obligations.Update(ctx, &req)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot update compliance registry: %w", err))
|
||||
panic(fmt.Errorf("cannot update obligation: %w", err))
|
||||
}
|
||||
|
||||
return &types.UpdateComplianceRegistryPayload{
|
||||
ComplianceRegistry: types.NewComplianceRegistry(registry),
|
||||
return &types.UpdateObligationPayload{
|
||||
Obligation: types.NewObligation(obligation),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// DeleteComplianceRegistry is the resolver for the deleteComplianceRegistry field.
|
||||
func (r *mutationResolver) DeleteComplianceRegistry(ctx context.Context, input types.DeleteComplianceRegistryInput) (*types.DeleteComplianceRegistryPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ComplianceRegistryID.TenantID())
|
||||
// DeleteObligation is the resolver for the deleteObligation field.
|
||||
func (r *mutationResolver) DeleteObligation(ctx context.Context, input types.DeleteObligationInput) (*types.DeleteObligationPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ObligationID.TenantID())
|
||||
|
||||
err := prb.ComplianceRegistries.Delete(ctx, input.ComplianceRegistryID)
|
||||
err := prb.Obligations.Delete(ctx, input.ObligationID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot delete compliance registry: %w", err))
|
||||
panic(fmt.Errorf("cannot delete obligation: %w", err))
|
||||
}
|
||||
|
||||
return &types.DeleteComplianceRegistryPayload{
|
||||
DeletedComplianceRegistryID: input.ComplianceRegistryID,
|
||||
return &types.DeleteObligationPayload{
|
||||
DeletedObligationID: input.ObligationID,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// CreateContinualImprovementRegistry is the resolver for the createContinualImprovementRegistry field.
|
||||
func (r *mutationResolver) CreateContinualImprovementRegistry(ctx context.Context, input types.CreateContinualImprovementRegistryInput) (*types.CreateContinualImprovementRegistryPayload, error) {
|
||||
// CreateContinualImprovement is the resolver for the createContinualImprovement field.
|
||||
func (r *mutationResolver) CreateContinualImprovement(ctx context.Context, input types.CreateContinualImprovementInput) (*types.CreateContinualImprovementPayload, error) {
|
||||
prb := r.ProboService(ctx, input.OrganizationID.TenantID())
|
||||
|
||||
req := probo.CreateContinualImprovementRegistryRequest{
|
||||
req := probo.CreateContinualImprovementRequest{
|
||||
OrganizationID: input.OrganizationID,
|
||||
ReferenceID: input.ReferenceID,
|
||||
Description: input.Description,
|
||||
@@ -3130,21 +3075,21 @@ func (r *mutationResolver) CreateContinualImprovementRegistry(ctx context.Contex
|
||||
Priority: &input.Priority,
|
||||
}
|
||||
|
||||
registry, err := prb.ContinualImprovementRegistries.Create(ctx, &req)
|
||||
continualImprovement, err := prb.ContinualImprovements.Create(ctx, &req)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot create continual improvement registry: %w", err))
|
||||
panic(fmt.Errorf("cannot create continual improvement: %w", err))
|
||||
}
|
||||
|
||||
return &types.CreateContinualImprovementRegistryPayload{
|
||||
ContinualImprovementRegistryEdge: types.NewContinualImprovementRegistryEdge(registry, coredata.ContinualImprovementRegistriesOrderFieldCreatedAt),
|
||||
return &types.CreateContinualImprovementPayload{
|
||||
ContinualImprovementEdge: types.NewContinualImprovementEdge(continualImprovement, coredata.ContinualImprovementOrderFieldCreatedAt),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// UpdateContinualImprovementRegistry is the resolver for the updateContinualImprovementRegistry field.
|
||||
func (r *mutationResolver) UpdateContinualImprovementRegistry(ctx context.Context, input types.UpdateContinualImprovementRegistryInput) (*types.UpdateContinualImprovementRegistryPayload, error) {
|
||||
// UpdateContinualImprovement is the resolver for the updateContinualImprovement field.
|
||||
func (r *mutationResolver) UpdateContinualImprovement(ctx context.Context, input types.UpdateContinualImprovementInput) (*types.UpdateContinualImprovementPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ID.TenantID())
|
||||
|
||||
req := probo.UpdateContinualImprovementRegistryRequest{
|
||||
req := probo.UpdateContinualImprovementRequest{
|
||||
ID: input.ID,
|
||||
ReferenceID: input.ReferenceID,
|
||||
Description: &input.Description,
|
||||
@@ -3155,35 +3100,35 @@ func (r *mutationResolver) UpdateContinualImprovementRegistry(ctx context.Contex
|
||||
Priority: input.Priority,
|
||||
}
|
||||
|
||||
registry, err := prb.ContinualImprovementRegistries.Update(ctx, &req)
|
||||
continualImprovement, err := prb.ContinualImprovements.Update(ctx, &req)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot update continual improvement registry: %w", err))
|
||||
panic(fmt.Errorf("cannot update continual improvement: %w", err))
|
||||
}
|
||||
|
||||
return &types.UpdateContinualImprovementRegistryPayload{
|
||||
ContinualImprovementRegistry: types.NewContinualImprovementRegistry(registry),
|
||||
return &types.UpdateContinualImprovementPayload{
|
||||
ContinualImprovement: types.NewContinualImprovement(continualImprovement),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// DeleteContinualImprovementRegistry is the resolver for the deleteContinualImprovementRegistry field.
|
||||
func (r *mutationResolver) DeleteContinualImprovementRegistry(ctx context.Context, input types.DeleteContinualImprovementRegistryInput) (*types.DeleteContinualImprovementRegistryPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ContinualImprovementRegistryID.TenantID())
|
||||
// DeleteContinualImprovement is the resolver for the deleteContinualImprovement field.
|
||||
func (r *mutationResolver) DeleteContinualImprovement(ctx context.Context, input types.DeleteContinualImprovementInput) (*types.DeleteContinualImprovementPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ContinualImprovementID.TenantID())
|
||||
|
||||
err := prb.ContinualImprovementRegistries.Delete(ctx, input.ContinualImprovementRegistryID)
|
||||
err := prb.ContinualImprovements.Delete(ctx, input.ContinualImprovementID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot delete continual improvement registry: %w", err))
|
||||
panic(fmt.Errorf("cannot delete continual improvement: %w", err))
|
||||
}
|
||||
|
||||
return &types.DeleteContinualImprovementRegistryPayload{
|
||||
DeletedContinualImprovementRegistryID: input.ContinualImprovementRegistryID,
|
||||
return &types.DeleteContinualImprovementPayload{
|
||||
DeletedContinualImprovementID: input.ContinualImprovementID,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// CreateProcessingActivityRegistry is the resolver for the createProcessingActivityRegistry field.
|
||||
func (r *mutationResolver) CreateProcessingActivityRegistry(ctx context.Context, input types.CreateProcessingActivityRegistryInput) (*types.CreateProcessingActivityRegistryPayload, error) {
|
||||
// CreateProcessingActivity is the resolver for the createProcessingActivity field.
|
||||
func (r *mutationResolver) CreateProcessingActivity(ctx context.Context, input types.CreateProcessingActivityInput) (*types.CreateProcessingActivityPayload, error) {
|
||||
prb := r.ProboService(ctx, input.OrganizationID.TenantID())
|
||||
|
||||
req := probo.CreateProcessingActivityRegistryRequest{
|
||||
req := probo.CreateProcessingActivityRequest{
|
||||
OrganizationID: input.OrganizationID,
|
||||
Name: input.Name,
|
||||
Purpose: input.Purpose,
|
||||
@@ -3201,21 +3146,21 @@ func (r *mutationResolver) CreateProcessingActivityRegistry(ctx context.Context,
|
||||
TransferImpactAssessment: input.TransferImpactAssessment,
|
||||
}
|
||||
|
||||
registry, err := prb.ProcessingActivityRegistries.Create(ctx, &req)
|
||||
activity, err := prb.ProcessingActivities.Create(ctx, &req)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot create processing activity registry: %w", err))
|
||||
panic(fmt.Errorf("cannot create processing activity: %w", err))
|
||||
}
|
||||
|
||||
return &types.CreateProcessingActivityRegistryPayload{
|
||||
ProcessingActivityRegistryEdge: types.NewProcessingActivityRegistryEdge(registry, coredata.ProcessingActivityRegistryOrderFieldCreatedAt),
|
||||
return &types.CreateProcessingActivityPayload{
|
||||
ProcessingActivityEdge: types.NewProcessingActivityEdge(activity, coredata.ProcessingActivityOrderFieldCreatedAt),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// UpdateProcessingActivityRegistry is the resolver for the updateProcessingActivityRegistry field.
|
||||
func (r *mutationResolver) UpdateProcessingActivityRegistry(ctx context.Context, input types.UpdateProcessingActivityRegistryInput) (*types.UpdateProcessingActivityRegistryPayload, error) {
|
||||
// UpdateProcessingActivity is the resolver for the updateProcessingActivity field.
|
||||
func (r *mutationResolver) UpdateProcessingActivity(ctx context.Context, input types.UpdateProcessingActivityInput) (*types.UpdateProcessingActivityPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ID.TenantID())
|
||||
|
||||
req := probo.UpdateProcessingActivityRegistryRequest{
|
||||
req := probo.UpdateProcessingActivityRequest{
|
||||
ID: input.ID,
|
||||
Name: input.Name,
|
||||
Purpose: &input.Purpose,
|
||||
@@ -3233,27 +3178,27 @@ func (r *mutationResolver) UpdateProcessingActivityRegistry(ctx context.Context,
|
||||
TransferImpactAssessment: input.TransferImpactAssessment,
|
||||
}
|
||||
|
||||
registry, err := prb.ProcessingActivityRegistries.Update(ctx, &req)
|
||||
activity, err := prb.ProcessingActivities.Update(ctx, &req)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot update processing activity registry: %w", err))
|
||||
panic(fmt.Errorf("cannot update processing activity: %w", err))
|
||||
}
|
||||
|
||||
return &types.UpdateProcessingActivityRegistryPayload{
|
||||
ProcessingActivityRegistry: types.NewProcessingActivityRegistry(registry),
|
||||
return &types.UpdateProcessingActivityPayload{
|
||||
ProcessingActivity: types.NewProcessingActivity(activity),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// DeleteProcessingActivityRegistry is the resolver for the deleteProcessingActivityRegistry field.
|
||||
func (r *mutationResolver) DeleteProcessingActivityRegistry(ctx context.Context, input types.DeleteProcessingActivityRegistryInput) (*types.DeleteProcessingActivityRegistryPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ProcessingActivityRegistryID.TenantID())
|
||||
// DeleteProcessingActivity is the resolver for the deleteProcessingActivity field.
|
||||
func (r *mutationResolver) DeleteProcessingActivity(ctx context.Context, input types.DeleteProcessingActivityInput) (*types.DeleteProcessingActivityPayload, error) {
|
||||
prb := r.ProboService(ctx, input.ProcessingActivityID.TenantID())
|
||||
|
||||
err := prb.ProcessingActivityRegistries.Delete(ctx, input.ProcessingActivityRegistryID)
|
||||
err := prb.ProcessingActivities.Delete(ctx, input.ProcessingActivityID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot delete processing activity registry: %w", err))
|
||||
panic(fmt.Errorf("cannot delete processing activity: %w", err))
|
||||
}
|
||||
|
||||
return &types.DeleteProcessingActivityRegistryPayload{
|
||||
DeletedProcessingActivityRegistryID: input.ProcessingActivityRegistryID,
|
||||
return &types.DeleteProcessingActivityPayload{
|
||||
DeletedProcessingActivityID: input.ProcessingActivityID,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -3290,70 +3235,125 @@ func (r *mutationResolver) DeleteSnapshot(ctx context.Context, input types.Delet
|
||||
}
|
||||
|
||||
// Organization is the resolver for the organization field.
|
||||
func (r *nonconformityRegistryResolver) Organization(ctx context.Context, obj *types.NonconformityRegistry) (*types.Organization, error) {
|
||||
func (r *nonconformityResolver) Organization(ctx context.Context, obj *types.Nonconformity) (*types.Organization, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
registry, err := prb.NonconformityRegistries.Get(ctx, obj.ID)
|
||||
nonconformity, err := prb.Nonconformities.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get nonconformity registry: %w", err)
|
||||
return nil, fmt.Errorf("cannot get nonconformity: %w", err)
|
||||
}
|
||||
|
||||
organization, err := prb.Organizations.Get(ctx, registry.OrganizationID)
|
||||
organization, err := prb.Organizations.Get(ctx, nonconformity.OrganizationID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get nonconformity registry organization: %w", err)
|
||||
return nil, fmt.Errorf("cannot get nonconformity organization: %w", err)
|
||||
}
|
||||
|
||||
return types.NewOrganization(organization), nil
|
||||
}
|
||||
|
||||
// Audit is the resolver for the audit field.
|
||||
func (r *nonconformityRegistryResolver) Audit(ctx context.Context, obj *types.NonconformityRegistry) (*types.Audit, error) {
|
||||
func (r *nonconformityResolver) Audit(ctx context.Context, obj *types.Nonconformity) (*types.Audit, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
registry, err := prb.NonconformityRegistries.Get(ctx, obj.ID)
|
||||
nonconformity, err := prb.Nonconformities.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get nonconformity registry: %w", err)
|
||||
return nil, fmt.Errorf("cannot get nonconformity: %w", err)
|
||||
}
|
||||
|
||||
audit, err := prb.Audits.Get(ctx, registry.AuditID)
|
||||
audit, err := prb.Audits.Get(ctx, nonconformity.AuditID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get nonconformity registry audit: %w", err)
|
||||
return nil, fmt.Errorf("cannot get nonconformity audit: %w", err)
|
||||
}
|
||||
|
||||
return types.NewAudit(audit), nil
|
||||
}
|
||||
|
||||
// Owner is the resolver for the owner field.
|
||||
func (r *nonconformityRegistryResolver) Owner(ctx context.Context, obj *types.NonconformityRegistry) (*types.People, error) {
|
||||
func (r *nonconformityResolver) Owner(ctx context.Context, obj *types.Nonconformity) (*types.People, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
registry, err := prb.NonconformityRegistries.Get(ctx, obj.ID)
|
||||
nonconformity, err := prb.Nonconformities.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get nonconformity registry: %w", err)
|
||||
return nil, fmt.Errorf("cannot get nonconformity: %w", err)
|
||||
}
|
||||
|
||||
people, err := prb.Peoples.Get(ctx, registry.OwnerID)
|
||||
people, err := prb.Peoples.Get(ctx, nonconformity.OwnerID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get nonconformity registry owner: %w", err)
|
||||
return nil, fmt.Errorf("cannot get nonconformity owner: %w", err)
|
||||
}
|
||||
|
||||
return types.NewPeople(people), nil
|
||||
}
|
||||
|
||||
// TotalCount is the resolver for the totalCount field.
|
||||
func (r *nonconformityRegistryConnectionResolver) TotalCount(ctx context.Context, obj *types.NonconformityRegistryConnection) (int, error) {
|
||||
func (r *nonconformityConnectionResolver) TotalCount(ctx context.Context, obj *types.NonconformityConnection) (int, error) {
|
||||
prb := r.ProboService(ctx, obj.ParentID.TenantID())
|
||||
|
||||
switch obj.Resolver.(type) {
|
||||
case *organizationResolver:
|
||||
nonconformityRegistryFilter := coredata.NewNonconformityRegistryFilter(nil)
|
||||
nonconformityFilter := coredata.NewNonconformityFilter(nil)
|
||||
if obj.Filter != nil {
|
||||
nonconformityRegistryFilter = coredata.NewNonconformityRegistryFilter(&obj.Filter.SnapshotID)
|
||||
nonconformityFilter = coredata.NewNonconformityFilter(&obj.Filter.SnapshotID)
|
||||
}
|
||||
|
||||
count, err := prb.NonconformityRegistries.CountForOrganizationID(ctx, obj.ParentID, nonconformityRegistryFilter)
|
||||
count, err := prb.Nonconformities.CountForOrganizationID(ctx, obj.ParentID, nonconformityFilter)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("cannot count nonconformity registries: %w", err)
|
||||
return 0, fmt.Errorf("cannot count nonconformities: %w", err)
|
||||
}
|
||||
return count, nil
|
||||
}
|
||||
|
||||
return 0, fmt.Errorf("unsupported resolver: %T", obj.Resolver)
|
||||
}
|
||||
|
||||
// Organization is the resolver for the organization field.
|
||||
func (r *obligationResolver) Organization(ctx context.Context, obj *types.Obligation) (*types.Organization, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
obligation, err := prb.Obligations.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get obligation: %w", err)
|
||||
}
|
||||
|
||||
organization, err := prb.Organizations.Get(ctx, obligation.OrganizationID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get obligation organization: %w", err)
|
||||
}
|
||||
|
||||
return types.NewOrganization(organization), nil
|
||||
}
|
||||
|
||||
// Owner is the resolver for the owner field.
|
||||
func (r *obligationResolver) Owner(ctx context.Context, obj *types.Obligation) (*types.People, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
obligation, err := prb.Obligations.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get obligation: %w", err)
|
||||
}
|
||||
|
||||
people, err := prb.Peoples.Get(ctx, obligation.OwnerID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get obligation owner: %w", err)
|
||||
}
|
||||
|
||||
return types.NewPeople(people), nil
|
||||
}
|
||||
|
||||
// TotalCount is the resolver for the totalCount field.
|
||||
func (r *obligationConnectionResolver) TotalCount(ctx context.Context, obj *types.ObligationConnection) (int, error) {
|
||||
prb := r.ProboService(ctx, obj.ParentID.TenantID())
|
||||
|
||||
switch obj.Resolver.(type) {
|
||||
case *organizationResolver:
|
||||
obligationFilter := coredata.NewObligationFilter(nil)
|
||||
if obj.Filter != nil {
|
||||
obligationFilter = coredata.NewObligationFilter(&obj.Filter.SnapshotID)
|
||||
}
|
||||
|
||||
count, err := prb.Obligations.CountForOrganizationID(ctx, obj.ParentID, obligationFilter)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot count obligations: %w", err))
|
||||
}
|
||||
return count, nil
|
||||
}
|
||||
@@ -3731,16 +3731,17 @@ func (r *organizationResolver) Audits(ctx context.Context, obj *types.Organizati
|
||||
return types.NewAuditConnection(page, r, obj.ID), nil
|
||||
}
|
||||
|
||||
// NonconformityRegistries is the resolver for the nonconformityRegistries field.
|
||||
func (r *organizationResolver) 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) {
|
||||
// Nonconformities is the resolver for the nonconformities field.
|
||||
func (r *organizationResolver) Nonconformities(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.NonconformityOrderBy, filter *types.NonconformityFilter) (*types.NonconformityConnection, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
pageOrderBy := page.OrderBy[coredata.NonconformityRegistryOrderField]{
|
||||
Field: coredata.NonconformityRegistryOrderFieldCreatedAt,
|
||||
pageOrderBy := page.OrderBy[coredata.NonconformityOrderField]{
|
||||
Field: coredata.NonconformityOrderFieldCreatedAt,
|
||||
Direction: page.OrderDirectionDesc,
|
||||
}
|
||||
|
||||
if orderBy != nil {
|
||||
pageOrderBy = page.OrderBy[coredata.NonconformityRegistryOrderField]{
|
||||
pageOrderBy = page.OrderBy[coredata.NonconformityOrderField]{
|
||||
Field: orderBy.Field,
|
||||
Direction: orderBy.Direction,
|
||||
}
|
||||
@@ -3748,29 +3749,30 @@ func (r *organizationResolver) NonconformityRegistries(ctx context.Context, obj
|
||||
|
||||
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
|
||||
|
||||
nonconformityRegistryFilter := coredata.NewNonconformityRegistryFilter(nil)
|
||||
nonconformityFilter := coredata.NewNonconformityFilter(nil)
|
||||
if filter != nil {
|
||||
nonconformityRegistryFilter = coredata.NewNonconformityRegistryFilter(&filter.SnapshotID)
|
||||
nonconformityFilter = coredata.NewNonconformityFilter(&filter.SnapshotID)
|
||||
}
|
||||
|
||||
page, err := prb.NonconformityRegistries.ListForOrganizationID(ctx, obj.ID, cursor, nonconformityRegistryFilter)
|
||||
page, err := prb.Nonconformities.ListForOrganizationID(ctx, obj.ID, cursor, nonconformityFilter)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot list organization nonconformity registries: %w", err)
|
||||
panic(fmt.Errorf("cannot list organization nonconformities: %w", err))
|
||||
}
|
||||
|
||||
return types.NewNonconformityRegistryConnection(page, r, obj.ID, filter), nil
|
||||
return types.NewNonconformityConnection(page, r, obj.ID, filter), nil
|
||||
}
|
||||
|
||||
// ComplianceRegistries is the resolver for the complianceRegistries field.
|
||||
func (r *organizationResolver) 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) {
|
||||
// Obligations is the resolver for the obligations field.
|
||||
func (r *organizationResolver) Obligations(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ObligationOrderBy, filter *types.ObligationFilter) (*types.ObligationConnection, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
pageOrderBy := page.OrderBy[coredata.ComplianceRegistryOrderField]{
|
||||
Field: coredata.ComplianceRegistryOrderFieldCreatedAt,
|
||||
pageOrderBy := page.OrderBy[coredata.ObligationOrderField]{
|
||||
Field: coredata.ObligationOrderFieldCreatedAt,
|
||||
Direction: page.OrderDirectionDesc,
|
||||
}
|
||||
|
||||
if orderBy != nil {
|
||||
pageOrderBy = page.OrderBy[coredata.ComplianceRegistryOrderField]{
|
||||
pageOrderBy = page.OrderBy[coredata.ObligationOrderField]{
|
||||
Field: orderBy.Field,
|
||||
Direction: orderBy.Direction,
|
||||
}
|
||||
@@ -3778,30 +3780,30 @@ func (r *organizationResolver) ComplianceRegistries(ctx context.Context, obj *ty
|
||||
|
||||
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
|
||||
|
||||
complianceRegistryFilter := coredata.NewComplianceRegistryFilter(nil)
|
||||
obligationFilter := coredata.NewObligationFilter(nil)
|
||||
if filter != nil {
|
||||
complianceRegistryFilter = coredata.NewComplianceRegistryFilter(&filter.SnapshotID)
|
||||
obligationFilter = coredata.NewObligationFilter(&filter.SnapshotID)
|
||||
}
|
||||
|
||||
page, err := prb.ComplianceRegistries.ListForOrganizationID(ctx, obj.ID, cursor, complianceRegistryFilter)
|
||||
page, err := prb.Obligations.ListForOrganizationID(ctx, obj.ID, cursor, obligationFilter)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot list organization compliance registries: %w", err))
|
||||
panic(fmt.Errorf("cannot list organization obligations: %w", err))
|
||||
}
|
||||
|
||||
return types.NewComplianceRegistryConnection(page, r, obj.ID, filter), nil
|
||||
return types.NewObligationConnection(page, r, obj.ID, filter), nil
|
||||
}
|
||||
|
||||
// ContinualImprovementRegistries is the resolver for the continualImprovementRegistries field.
|
||||
func (r *organizationResolver) 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) {
|
||||
// ContinualImprovements is the resolver for the continualImprovements field.
|
||||
func (r *organizationResolver) ContinualImprovements(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ContinualImprovementOrderBy, filter *types.ContinualImprovementFilter) (*types.ContinualImprovementConnection, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
pageOrderBy := page.OrderBy[coredata.ContinualImprovementRegistriesOrderField]{
|
||||
Field: coredata.ContinualImprovementRegistriesOrderFieldCreatedAt,
|
||||
pageOrderBy := page.OrderBy[coredata.ContinualImprovementOrderField]{
|
||||
Field: coredata.ContinualImprovementOrderFieldCreatedAt,
|
||||
Direction: page.OrderDirectionDesc,
|
||||
}
|
||||
|
||||
if orderBy != nil {
|
||||
pageOrderBy = page.OrderBy[coredata.ContinualImprovementRegistriesOrderField]{
|
||||
pageOrderBy = page.OrderBy[coredata.ContinualImprovementOrderField]{
|
||||
Field: orderBy.Field,
|
||||
Direction: orderBy.Direction,
|
||||
}
|
||||
@@ -3809,30 +3811,30 @@ func (r *organizationResolver) ContinualImprovementRegistries(ctx context.Contex
|
||||
|
||||
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
|
||||
|
||||
continualImprovementRegistryFilter := coredata.NewContinualImprovementRegistryFilter(nil)
|
||||
continualImprovementFilter := coredata.NewContinualImprovementFilter(nil)
|
||||
if filter != nil {
|
||||
continualImprovementRegistryFilter = coredata.NewContinualImprovementRegistryFilter(&filter.SnapshotID)
|
||||
continualImprovementFilter = coredata.NewContinualImprovementFilter(&filter.SnapshotID)
|
||||
}
|
||||
|
||||
page, err := prb.ContinualImprovementRegistries.ListForOrganizationID(ctx, obj.ID, cursor, continualImprovementRegistryFilter)
|
||||
page, err := prb.ContinualImprovements.ListForOrganizationID(ctx, obj.ID, cursor, continualImprovementFilter)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot list organization continual improvement registries: %w", err))
|
||||
panic(fmt.Errorf("cannot list organization continual improvements: %w", err))
|
||||
}
|
||||
|
||||
return types.NewContinualImprovementRegistryConnection(page, r, obj.ID, filter), nil
|
||||
return types.NewContinualImprovementConnection(page, r, obj.ID, filter), nil
|
||||
}
|
||||
|
||||
// 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, filter *types.ProcessingActivityRegistryFilter) (*types.ProcessingActivityRegistryConnection, error) {
|
||||
// ProcessingActivities is the resolver for the processingActivities field.
|
||||
func (r *organizationResolver) ProcessingActivities(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ProcessingActivityOrderBy, filter *types.ProcessingActivityFilter) (*types.ProcessingActivityConnection, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
pageOrderBy := page.OrderBy[coredata.ProcessingActivityRegistryOrderField]{
|
||||
Field: coredata.ProcessingActivityRegistryOrderFieldCreatedAt,
|
||||
pageOrderBy := page.OrderBy[coredata.ProcessingActivityOrderField]{
|
||||
Field: coredata.ProcessingActivityOrderFieldCreatedAt,
|
||||
Direction: page.OrderDirectionDesc,
|
||||
}
|
||||
|
||||
if orderBy != nil {
|
||||
pageOrderBy = page.OrderBy[coredata.ProcessingActivityRegistryOrderField]{
|
||||
pageOrderBy = page.OrderBy[coredata.ProcessingActivityOrderField]{
|
||||
Field: orderBy.Field,
|
||||
Direction: orderBy.Direction,
|
||||
}
|
||||
@@ -3840,17 +3842,17 @@ func (r *organizationResolver) ProcessingActivityRegistries(ctx context.Context,
|
||||
|
||||
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
|
||||
|
||||
processingActivityRegistryFilter := coredata.NewProcessingActivityRegistryFilter(nil)
|
||||
processingActivityFilter := coredata.NewProcessingActivityFilter(nil)
|
||||
if filter != nil {
|
||||
processingActivityRegistryFilter = coredata.NewProcessingActivityRegistryFilter(&filter.SnapshotID)
|
||||
processingActivityFilter = coredata.NewProcessingActivityFilter(&filter.SnapshotID)
|
||||
}
|
||||
|
||||
page, err := prb.ProcessingActivityRegistries.ListForOrganizationID(ctx, obj.ID, cursor, processingActivityRegistryFilter)
|
||||
page, err := prb.ProcessingActivities.ListForOrganizationID(ctx, obj.ID, cursor, processingActivityFilter)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot list organization processing activity registries: %w", err))
|
||||
panic(fmt.Errorf("cannot list organization processing activities: %w", err))
|
||||
}
|
||||
|
||||
return types.NewProcessingActivityRegistryConnection(page, r, obj.ID, filter), nil
|
||||
return types.NewProcessingActivityConnection(page, r, obj.ID, filter), nil
|
||||
}
|
||||
|
||||
// Snapshots is the resolver for the snapshots field.
|
||||
@@ -3907,15 +3909,15 @@ func (r *peopleConnectionResolver) TotalCount(ctx context.Context, obj *types.Pe
|
||||
}
|
||||
|
||||
// Organization is the resolver for the organization field.
|
||||
func (r *processingActivityRegistryResolver) Organization(ctx context.Context, obj *types.ProcessingActivityRegistry) (*types.Organization, error) {
|
||||
func (r *processingActivityResolver) Organization(ctx context.Context, obj *types.ProcessingActivity) (*types.Organization, error) {
|
||||
prb := r.ProboService(ctx, obj.ID.TenantID())
|
||||
|
||||
processingActivityRegistry, err := prb.ProcessingActivityRegistries.Get(ctx, obj.ID)
|
||||
processingActivity, err := prb.ProcessingActivities.Get(ctx, obj.ID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get processing activity registry: %w", err))
|
||||
panic(fmt.Errorf("cannot get processing activity: %w", err))
|
||||
}
|
||||
|
||||
organization, err := prb.Organizations.Get(ctx, processingActivityRegistry.OrganizationID)
|
||||
organization, err := prb.Organizations.Get(ctx, processingActivity.OrganizationID)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get organization: %w", err))
|
||||
}
|
||||
@@ -3924,19 +3926,19 @@ func (r *processingActivityRegistryResolver) Organization(ctx context.Context, o
|
||||
}
|
||||
|
||||
// TotalCount is the resolver for the totalCount field.
|
||||
func (r *processingActivityRegistryConnectionResolver) TotalCount(ctx context.Context, obj *types.ProcessingActivityRegistryConnection) (int, error) {
|
||||
func (r *processingActivityConnectionResolver) TotalCount(ctx context.Context, obj *types.ProcessingActivityConnection) (int, error) {
|
||||
prb := r.ProboService(ctx, obj.ParentID.TenantID())
|
||||
|
||||
switch obj.Resolver.(type) {
|
||||
case *organizationResolver:
|
||||
processingActivityRegistryFilter := coredata.NewProcessingActivityRegistryFilter(nil)
|
||||
processingActivityFilter := coredata.NewProcessingActivityFilter(nil)
|
||||
if obj.Filter != nil {
|
||||
processingActivityRegistryFilter = coredata.NewProcessingActivityRegistryFilter(&obj.Filter.SnapshotID)
|
||||
processingActivityFilter = coredata.NewProcessingActivityFilter(&obj.Filter.SnapshotID)
|
||||
}
|
||||
|
||||
count, err := prb.ProcessingActivityRegistries.CountForOrganizationID(ctx, obj.ParentID, processingActivityRegistryFilter)
|
||||
count, err := prb.ProcessingActivities.CountForOrganizationID(ctx, obj.ParentID, processingActivityFilter)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot count organization processing activity registries: %w", err))
|
||||
panic(fmt.Errorf("cannot count organization processing activities: %w", err))
|
||||
}
|
||||
return count, nil
|
||||
}
|
||||
@@ -4065,36 +4067,36 @@ func (r *queryResolver) Node(ctx context.Context, id gid.GID) (types.Node, error
|
||||
panic(fmt.Errorf("cannot get audit: %w", err))
|
||||
}
|
||||
return types.NewAudit(audit), nil
|
||||
case coredata.NonconformityRegistryEntityType:
|
||||
nonconformityRegistry, err := prb.NonconformityRegistries.Get(ctx, id)
|
||||
case coredata.NonconformityEntityType:
|
||||
nonconformity, err := prb.Nonconformities.Get(ctx, id)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get nonconformity registry: %w", err))
|
||||
panic(fmt.Errorf("cannot get nonconformity: %w", err))
|
||||
}
|
||||
return types.NewNonconformityRegistry(nonconformityRegistry), nil
|
||||
case coredata.ComplianceRegistryEntityType:
|
||||
complianceRegistry, err := prb.ComplianceRegistries.Get(ctx, id)
|
||||
return types.NewNonconformity(nonconformity), nil
|
||||
case coredata.ObligationEntityType:
|
||||
obligation, err := prb.Obligations.Get(ctx, id)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get compliance registry: %w", err))
|
||||
panic(fmt.Errorf("cannot get obligation: %w", err))
|
||||
}
|
||||
return types.NewComplianceRegistry(complianceRegistry), nil
|
||||
case coredata.ContinualImprovementRegistryEntityType:
|
||||
continualImprovementRegistry, err := prb.ContinualImprovementRegistries.Get(ctx, id)
|
||||
return types.NewObligation(obligation), nil
|
||||
case coredata.ContinualImprovementEntityType:
|
||||
continualImprovement, err := prb.ContinualImprovements.Get(ctx, id)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get continual improvement registry: %w", err))
|
||||
panic(fmt.Errorf("cannot get continual improvement: %w", err))
|
||||
}
|
||||
return types.NewContinualImprovementRegistry(continualImprovementRegistry), nil
|
||||
return types.NewContinualImprovement(continualImprovement), nil
|
||||
case coredata.ReportEntityType:
|
||||
report, err := prb.Reports.Get(ctx, id)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get report: %w", err))
|
||||
}
|
||||
return types.NewReport(report), nil
|
||||
case coredata.ProcessingActivityRegistryEntityType:
|
||||
processingActivityRegistry, err := prb.ProcessingActivityRegistries.Get(ctx, id)
|
||||
case coredata.ProcessingActivityEntityType:
|
||||
processingActivity, err := prb.ProcessingActivities.Get(ctx, id)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("cannot get processing activity registry: %w", err))
|
||||
panic(fmt.Errorf("cannot get processing activity: %w", err))
|
||||
}
|
||||
return types.NewProcessingActivityRegistry(processingActivityRegistry), nil
|
||||
return types.NewProcessingActivity(processingActivity), nil
|
||||
case coredata.SnapshotEntityType:
|
||||
snapshot, err := prb.Snapshots.Get(ctx, id)
|
||||
if err != nil {
|
||||
@@ -4894,24 +4896,14 @@ func (r *Resolver) AuditConnection() schema.AuditConnectionResolver {
|
||||
return &auditConnectionResolver{r}
|
||||
}
|
||||
|
||||
// ComplianceRegistry returns schema.ComplianceRegistryResolver implementation.
|
||||
func (r *Resolver) ComplianceRegistry() schema.ComplianceRegistryResolver {
|
||||
return &complianceRegistryResolver{r}
|
||||
// ContinualImprovement returns schema.ContinualImprovementResolver implementation.
|
||||
func (r *Resolver) ContinualImprovement() schema.ContinualImprovementResolver {
|
||||
return &continualImprovementResolver{r}
|
||||
}
|
||||
|
||||
// ComplianceRegistryConnection returns schema.ComplianceRegistryConnectionResolver implementation.
|
||||
func (r *Resolver) ComplianceRegistryConnection() schema.ComplianceRegistryConnectionResolver {
|
||||
return &complianceRegistryConnectionResolver{r}
|
||||
}
|
||||
|
||||
// ContinualImprovementRegistry returns schema.ContinualImprovementRegistryResolver implementation.
|
||||
func (r *Resolver) ContinualImprovementRegistry() schema.ContinualImprovementRegistryResolver {
|
||||
return &continualImprovementRegistryResolver{r}
|
||||
}
|
||||
|
||||
// ContinualImprovementRegistryConnection returns schema.ContinualImprovementRegistryConnectionResolver implementation.
|
||||
func (r *Resolver) ContinualImprovementRegistryConnection() schema.ContinualImprovementRegistryConnectionResolver {
|
||||
return &continualImprovementRegistryConnectionResolver{r}
|
||||
// ContinualImprovementConnection returns schema.ContinualImprovementConnectionResolver implementation.
|
||||
func (r *Resolver) ContinualImprovementConnection() schema.ContinualImprovementConnectionResolver {
|
||||
return &continualImprovementConnectionResolver{r}
|
||||
}
|
||||
|
||||
// Control returns schema.ControlResolver implementation.
|
||||
@@ -4975,14 +4967,20 @@ func (r *Resolver) MeasureConnection() schema.MeasureConnectionResolver {
|
||||
// Mutation returns schema.MutationResolver implementation.
|
||||
func (r *Resolver) Mutation() schema.MutationResolver { return &mutationResolver{r} }
|
||||
|
||||
// NonconformityRegistry returns schema.NonconformityRegistryResolver implementation.
|
||||
func (r *Resolver) NonconformityRegistry() schema.NonconformityRegistryResolver {
|
||||
return &nonconformityRegistryResolver{r}
|
||||
// Nonconformity returns schema.NonconformityResolver implementation.
|
||||
func (r *Resolver) Nonconformity() schema.NonconformityResolver { return &nonconformityResolver{r} }
|
||||
|
||||
// NonconformityConnection returns schema.NonconformityConnectionResolver implementation.
|
||||
func (r *Resolver) NonconformityConnection() schema.NonconformityConnectionResolver {
|
||||
return &nonconformityConnectionResolver{r}
|
||||
}
|
||||
|
||||
// NonconformityRegistryConnection returns schema.NonconformityRegistryConnectionResolver implementation.
|
||||
func (r *Resolver) NonconformityRegistryConnection() schema.NonconformityRegistryConnectionResolver {
|
||||
return &nonconformityRegistryConnectionResolver{r}
|
||||
// Obligation returns schema.ObligationResolver implementation.
|
||||
func (r *Resolver) Obligation() schema.ObligationResolver { return &obligationResolver{r} }
|
||||
|
||||
// ObligationConnection returns schema.ObligationConnectionResolver implementation.
|
||||
func (r *Resolver) ObligationConnection() schema.ObligationConnectionResolver {
|
||||
return &obligationConnectionResolver{r}
|
||||
}
|
||||
|
||||
// Organization returns schema.OrganizationResolver implementation.
|
||||
@@ -4993,14 +4991,14 @@ func (r *Resolver) PeopleConnection() schema.PeopleConnectionResolver {
|
||||
return &peopleConnectionResolver{r}
|
||||
}
|
||||
|
||||
// ProcessingActivityRegistry returns schema.ProcessingActivityRegistryResolver implementation.
|
||||
func (r *Resolver) ProcessingActivityRegistry() schema.ProcessingActivityRegistryResolver {
|
||||
return &processingActivityRegistryResolver{r}
|
||||
// ProcessingActivity returns schema.ProcessingActivityResolver implementation.
|
||||
func (r *Resolver) ProcessingActivity() schema.ProcessingActivityResolver {
|
||||
return &processingActivityResolver{r}
|
||||
}
|
||||
|
||||
// ProcessingActivityRegistryConnection returns schema.ProcessingActivityRegistryConnectionResolver implementation.
|
||||
func (r *Resolver) ProcessingActivityRegistryConnection() schema.ProcessingActivityRegistryConnectionResolver {
|
||||
return &processingActivityRegistryConnectionResolver{r}
|
||||
// ProcessingActivityConnection returns schema.ProcessingActivityConnectionResolver implementation.
|
||||
func (r *Resolver) ProcessingActivityConnection() schema.ProcessingActivityConnectionResolver {
|
||||
return &processingActivityConnectionResolver{r}
|
||||
}
|
||||
|
||||
// Query returns schema.QueryResolver implementation.
|
||||
@@ -5076,10 +5074,8 @@ type assetResolver struct{ *Resolver }
|
||||
type assetConnectionResolver struct{ *Resolver }
|
||||
type auditResolver struct{ *Resolver }
|
||||
type auditConnectionResolver struct{ *Resolver }
|
||||
type complianceRegistryResolver struct{ *Resolver }
|
||||
type complianceRegistryConnectionResolver struct{ *Resolver }
|
||||
type continualImprovementRegistryResolver struct{ *Resolver }
|
||||
type continualImprovementRegistryConnectionResolver struct{ *Resolver }
|
||||
type continualImprovementResolver struct{ *Resolver }
|
||||
type continualImprovementConnectionResolver struct{ *Resolver }
|
||||
type controlResolver struct{ *Resolver }
|
||||
type controlConnectionResolver struct{ *Resolver }
|
||||
type datumResolver struct{ *Resolver }
|
||||
@@ -5095,12 +5091,14 @@ type frameworkConnectionResolver struct{ *Resolver }
|
||||
type measureResolver struct{ *Resolver }
|
||||
type measureConnectionResolver struct{ *Resolver }
|
||||
type mutationResolver struct{ *Resolver }
|
||||
type nonconformityRegistryResolver struct{ *Resolver }
|
||||
type nonconformityRegistryConnectionResolver struct{ *Resolver }
|
||||
type nonconformityResolver struct{ *Resolver }
|
||||
type nonconformityConnectionResolver struct{ *Resolver }
|
||||
type obligationResolver struct{ *Resolver }
|
||||
type obligationConnectionResolver struct{ *Resolver }
|
||||
type organizationResolver struct{ *Resolver }
|
||||
type peopleConnectionResolver struct{ *Resolver }
|
||||
type processingActivityRegistryResolver struct{ *Resolver }
|
||||
type processingActivityRegistryConnectionResolver struct{ *Resolver }
|
||||
type processingActivityResolver struct{ *Resolver }
|
||||
type processingActivityConnectionResolver struct{ *Resolver }
|
||||
type queryResolver struct{ *Resolver }
|
||||
type reportResolver struct{ *Resolver }
|
||||
type riskResolver struct{ *Resolver }
|
||||
|
||||
Reference in New Issue
Block a user