Add enum to handle rejected status of trust center document access

Signed-off-by: Émile Ré <nemile.re@gmail.com>
This commit is contained in:
Émile Ré
2025-12-05 22:42:27 +04:00
parent c8471cd48d
commit 19d850e90a
10 changed files with 635 additions and 189 deletions

View File

@@ -0,0 +1,21 @@
CREATE TYPE trust_center_document_access_status AS ENUM ('REQUESTED', 'GRANTED', 'REJECTED', 'REVOKED');
ALTER TABLE
trust_center_document_accesses
ADD
COLUMN status trust_center_document_access_status;
UPDATE
trust_center_document_accesses
SET
status = CASE
WHEN active = 'T' THEN 'GRANTED' :: trust_center_document_access_status
ELSE 'REQUESTED' :: trust_center_document_access_status
END;
ALTER TABLE
trust_center_document_accesses
ALTER COLUMN
status
SET
NOT NULL;

View File

@@ -30,16 +30,17 @@ import (
type (
TrustCenterDocumentAccess struct {
ID gid.GID `db:"id"`
OrganizationID gid.GID `db:"organization_id"`
TrustCenterAccessID gid.GID `db:"trust_center_access_id"`
DocumentID *gid.GID `db:"document_id"`
ReportID *gid.GID `db:"report_id"`
TrustCenterFileID *gid.GID `db:"trust_center_file_id"`
Active bool `db:"active"`
Requested bool `db:"requested"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
ID gid.GID `db:"id"`
OrganizationID gid.GID `db:"organization_id"`
TrustCenterAccessID gid.GID `db:"trust_center_access_id"`
DocumentID *gid.GID `db:"document_id"`
ReportID *gid.GID `db:"report_id"`
TrustCenterFileID *gid.GID `db:"trust_center_file_id"`
Active bool `db:"active"`
Status TrustCenterDocumentAccessStatus `db:"status"`
Requested bool `db:"requested"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
TrustCenterDocumentAccesses []*TrustCenterDocumentAccess
@@ -85,6 +86,7 @@ SELECT
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
@@ -135,6 +137,7 @@ SELECT
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
@@ -186,6 +189,7 @@ SELECT
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
@@ -236,6 +240,7 @@ INSERT INTO trust_center_document_accesses (
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
@@ -248,6 +253,7 @@ INSERT INTO trust_center_document_accesses (
@report_id,
@trust_center_file_id,
@active,
@status::trust_center_document_access_status,
@requested,
@created_at,
@updated_at
@@ -262,6 +268,7 @@ INSERT INTO trust_center_document_accesses (
"document_id": tcda.DocumentID,
"report_id": tcda.ReportID,
"trust_center_file_id": tcda.TrustCenterFileID,
"status": tcda.Status,
"active": tcda.Active,
"requested": tcda.Requested,
"created_at": tcda.CreatedAt,
@@ -302,7 +309,7 @@ func (tcda *TrustCenterDocumentAccess) Update(
) error {
q := `
UPDATE trust_center_document_accesses SET
active = @active,
status = @status::trust_center_document_access_status,
updated_at = @updated_at
WHERE
%s
@@ -313,7 +320,7 @@ WHERE
args := pgx.StrictNamedArgs{
"id": tcda.ID,
"active": tcda.Active,
"status": tcda.Status,
"updated_at": tcda.UpdatedAt,
}
maps.Copy(args, scope.SQLArguments())
@@ -401,7 +408,7 @@ WHERE
%s
AND trust_center_access_id = @trust_center_access_id
AND requested = true
AND active = false
AND status = 'REQUESTED'::trust_center_document_access_status
`
q = fmt.Sprintf(q, scope.SQLFragment())
@@ -435,7 +442,7 @@ FROM
WHERE
%s
AND trust_center_access_id = @trust_center_access_id
AND active = true
AND status = 'GRANTED'::trust_center_document_access_status
`
q = fmt.Sprintf(q, scope.SQLFragment())
@@ -525,6 +532,7 @@ final_items AS (
ai.report_id,
ai.trust_center_file_id,
COALESCE(tcda.active, false) AS active,
COALESCE(tcda.status, 'REQUESTED'::trust_center_document_access_status) AS status,
COALESCE(tcda.requested, false) AS requested,
COALESCE(tcda.created_at, ai.item_created_at) AS created_at,
COALESCE(tcda.updated_at, ai.item_updated_at) AS updated_at
@@ -546,6 +554,7 @@ SELECT
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
@@ -591,6 +600,7 @@ SELECT
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
@@ -623,7 +633,7 @@ WHERE
return nil
}
func DeactivateByTrustCenterAccessID(
func DeleteByTrustCenterAccessID(
ctx context.Context,
conn pg.Conn,
scope Scoper,
@@ -631,8 +641,7 @@ func DeactivateByTrustCenterAccessID(
updatedAt time.Time,
) error {
q := `
UPDATE trust_center_document_accesses
SET active = false, updated_at = @updated_at
DELETE FROM trust_center_document_accesses
WHERE
%s
AND trust_center_access_id = @trust_center_access_id
@@ -648,7 +657,7 @@ WHERE
_, err := conn.Exec(ctx, q, args)
if err != nil {
return fmt.Errorf("cannot deactivate trust center document accesses: %w", err)
return fmt.Errorf("cannot delete trust center document accesses: %w", err)
}
return nil
@@ -664,7 +673,7 @@ func ActivateByDocumentIDs(
) error {
q := `
UPDATE trust_center_document_accesses
SET active = true, updated_at = @updated_at
SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at
WHERE
%s
AND trust_center_access_id = @trust_center_access_id
@@ -688,7 +697,7 @@ WHERE
return nil
}
func DeleteByDocumentIDs(
func RejectByDocumentIDs(
ctx context.Context,
conn pg.Conn,
scope Scoper,
@@ -696,7 +705,8 @@ func DeleteByDocumentIDs(
documentIDs []gid.GID,
) error {
q := `
DELETE FROM trust_center_document_accesses
UPDATE trust_center_document_accesses
SET status = 'REJECTED'::trust_center_document_access_status
WHERE
%s
AND trust_center_access_id = @trust_center_access_id
@@ -713,7 +723,7 @@ WHERE
_, err := conn.Exec(ctx, q, args)
if err != nil {
return fmt.Errorf("cannot delete trust center document accesses by document IDs: %w", err)
return fmt.Errorf("cannot reject trust center document accesses by document IDs: %w", err)
}
return nil
@@ -729,7 +739,7 @@ func ActivateByReportIDs(
) error {
q := `
UPDATE trust_center_document_accesses
SET active = true, updated_at = @updated_at
SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at
WHERE
%s
AND trust_center_access_id = @trust_center_access_id
@@ -753,7 +763,7 @@ WHERE
return nil
}
func DeleteByReportIDs(
func RejectByReportIDs(
ctx context.Context,
conn pg.Conn,
scope Scoper,
@@ -761,7 +771,8 @@ func DeleteByReportIDs(
reportIDs []gid.GID,
) error {
q := `
DELETE FROM trust_center_document_accesses
UPDATE trust_center_document_accesses
SET status = 'REJECTED'::trust_center_document_access_status
WHERE
%s
AND trust_center_access_id = @trust_center_access_id
@@ -778,7 +789,7 @@ WHERE
_, err := conn.Exec(ctx, q, args)
if err != nil {
return fmt.Errorf("cannot delete trust center document accesses by report IDs: %w", err)
return fmt.Errorf("cannot reject trust center document accesses by report IDs: %w", err)
}
return nil
@@ -809,12 +820,24 @@ WITH document_access_data AS (
null::text AS report_id,
null::text AS trust_center_file_id,
false AS active,
'REQUESTED'::trust_center_document_access_status AS status,
@requested::boolean AS requested,
@created_at::timestamptz AS created_at,
@updated_at::timestamptz AS updated_at
)
INSERT INTO trust_center_document_accesses (
id, tenant_id, organization_id, trust_center_access_id, document_id, report_id, trust_center_file_id, active, requested, created_at, updated_at
id,
tenant_id,
organization_id,
trust_center_access_id,
document_id,
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
)
SELECT * FROM document_access_data
ON CONFLICT DO NOTHING
@@ -907,6 +930,7 @@ SELECT
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
@@ -952,7 +976,7 @@ func ActivateByTrustCenterFileIDs(
) error {
q := `
UPDATE trust_center_document_accesses
SET active = true, updated_at = @updated_at
SET status = 'GRANTED'::trust_center_document_access_status, updated_at = @updated_at
WHERE
%s
AND trust_center_access_id = @trust_center_access_id
@@ -976,7 +1000,7 @@ WHERE
return nil
}
func DeleteByTrustCenterFileIDs(
func RejectByTrustCenterFileIDs(
ctx context.Context,
conn pg.Conn,
scope Scoper,
@@ -984,7 +1008,8 @@ func DeleteByTrustCenterFileIDs(
trustCenterFileIDs []gid.GID,
) error {
q := `
DELETE FROM trust_center_document_accesses
UPDATE trust_center_document_accesses
SET status = 'REJECTED'::trust_center_document_access_status
WHERE
%s
AND trust_center_access_id = @trust_center_access_id
@@ -1001,7 +1026,7 @@ WHERE
_, err := conn.Exec(ctx, q, args)
if err != nil {
return fmt.Errorf("cannot delete trust center document accesses by trust center file IDs: %w", err)
return fmt.Errorf("cannot reject trust center document accesses by trust center file IDs: %w", err)
}
return nil
@@ -1028,12 +1053,24 @@ WITH trust_center_file_access_data AS (
null::text AS report_id,
unnest(@trust_center_file_ids::text[]) AS trust_center_file_id,
false AS active,
'REQUESTED'::trust_center_document_access_status AS status,
@requested::boolean AS requested,
@created_at::timestamptz AS created_at,
@updated_at::timestamptz AS updated_at
)
INSERT INTO trust_center_document_accesses (
id, tenant_id, organization_id, trust_center_access_id, document_id, report_id, trust_center_file_id, active, requested, created_at, updated_at
id,
tenant_id,
organization_id,
trust_center_access_id,
document_id,
report_id,
trust_center_file_id,
active,
status,
requested,
created_at,
updated_at
)
SELECT * FROM trust_center_file_access_data
ON CONFLICT DO NOTHING

View File

@@ -0,0 +1,49 @@
package coredata
import (
"database/sql/driver"
"fmt"
)
type TrustCenterDocumentAccessStatus string
const (
TrustCenterDocumentAccessStatusRequested TrustCenterDocumentAccessStatus = "REQUESTED"
TrustCenterDocumentAccessStatusGranted TrustCenterDocumentAccessStatus = "GRANTED"
TrustCenterDocumentAccessStatusRejected TrustCenterDocumentAccessStatus = "REJECTED"
TrustCenterDocumentAccessStatusRevoked TrustCenterDocumentAccessStatus = "REVOKED"
)
func (tcdas TrustCenterDocumentAccessStatus) String() string {
return string(tcdas)
}
func (tcdas *TrustCenterDocumentAccessStatus) 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 TrustCenterDocumentAccessStatus: %T", value)
}
switch s {
case "REQUESTED":
*tcdas = TrustCenterDocumentAccessStatusRequested
case "GRANTED":
*tcdas = TrustCenterDocumentAccessStatusGranted
case "REJECTED":
*tcdas = TrustCenterDocumentAccessStatusRejected
case "REVOKED":
*tcdas = TrustCenterDocumentAccessStatusRevoked
default:
return fmt.Errorf("invalid TrustCenterDocumentAccessStatus value: %q", s)
}
return nil
}
func (tcdas TrustCenterDocumentAccessStatus) Value() (driver.Value, error) {
return tcdas.String(), nil
}

View File

@@ -397,8 +397,8 @@ func (s TrustCenterAccessService) upsertDocumentAccesses(
return nil
}
if err := coredata.DeactivateByTrustCenterAccessID(ctx, tx, s.svc.scope, accessID, now); err != nil {
return fmt.Errorf("cannot deactivate existing document accesses: %w", err)
if err := coredata.DeleteByTrustCenterAccessID(ctx, tx, s.svc.scope, accessID, now); err != nil {
return fmt.Errorf("cannot delete existing document accesses: %w", err)
}
if documentIDs != nil {

View File

@@ -91,10 +91,12 @@ enum InvitationStatus
@goEnum(value: "go.probo.inc/probo/pkg/coredata.InvitationStatusExpired")
}
enum MembershipRole @goModel(model: "go.probo.inc/probo/pkg/coredata.MembershipRole") {
enum MembershipRole
@goModel(model: "go.probo.inc/probo/pkg/coredata.MembershipRole") {
OWNER @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleOwner")
ADMIN @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleAdmin")
EMPLOYEE @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleEmployee")
EMPLOYEE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleEmployee")
VIEWER @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleViewer")
}
@@ -102,7 +104,6 @@ enum APIRole @goModel(model: "go.probo.inc/probo/pkg/coredata.APIRole") {
FULL @goEnum(value: "go.probo.inc/probo/pkg/coredata.APIRoleFull")
}
enum DocumentStatus
@goModel(model: "go.probo.inc/probo/pkg/coredata.DocumentStatus") {
DRAFT @goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentStatusDraft")
@@ -172,6 +173,28 @@ enum TrustCenterVisibility
)
}
enum TrustCenterDocumentAccessStatus
@goModel(
model: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatus"
) {
REQUESTED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatusRequested"
)
GRANTED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatusGranted"
)
REJECTED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatusRejected"
)
REVOKED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatusRevoked"
)
}
enum NonconformityStatus
@goModel(model: "go.probo.inc/probo/pkg/coredata.NonconformityStatus") {
OPEN @goEnum(value: "go.probo.inc/probo/pkg/coredata.NonconformityStatusOpen")
@@ -1740,7 +1763,7 @@ type Vendor implements Node {
): VendorComplianceReportConnection! @goField(forceResolver: true)
businessAssociateAgreement: VendorBusinessAssociateAgreement
@goField(forceResolver: true)
@goField(forceResolver: true)
dataPrivacyAgreement: VendorDataPrivacyAgreement @goField(forceResolver: true)
contacts(
@@ -1864,7 +1887,8 @@ type Framework implements Node {
updatedAt: Datetime!
}
type Control implements Node @goModel(
type Control implements Node
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.Control"
) {
id: ID!
@@ -2032,9 +2056,10 @@ type Document implements Node {
updatedAt: Datetime!
}
type SignableDocument @goModel(
type SignableDocument
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.SignableDocument"
){
) {
id: ID!
title: String!
description: String
@@ -2339,6 +2364,7 @@ type TrustCenterDocumentAccess
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.TrustCenterDocumentAccess"
) {
active: Boolean!
status: TrustCenterDocumentAccessStatus!
requested: Boolean!
document: Document @goField(forceResolver: true)
report: Report @goField(forceResolver: true)
@@ -2784,7 +2810,8 @@ type Mutation {
# Organization mutations
createOrganization(
input: CreateOrganizationInput!
): CreateOrganizationPayload! updateOrganization(
): CreateOrganizationPayload!
updateOrganization(
input: UpdateOrganizationInput!
): UpdateOrganizationPayload!
updateOrganizationContext(
@@ -2792,7 +2819,8 @@ type Mutation {
): UpdateOrganizationContextPayload!
deleteOrganizationHorizontalLogo(
input: DeleteOrganizationHorizontalLogoInput!
): DeleteOrganizationHorizontalLogoPayload! deleteOrganization(
): DeleteOrganizationHorizontalLogoPayload!
deleteOrganization(
input: DeleteOrganizationInput!
): DeleteOrganizationPayload!
updateTrustCenter(input: UpdateTrustCenterInput!): UpdateTrustCenterPayload!
@@ -2839,96 +2867,138 @@ type Mutation {
confirmEmail(input: ConfirmEmailInput!): ConfirmEmailPayload!
inviteUser(input: InviteUserInput!): InviteUserPayload!
acceptInvitation(input: AcceptInvitationInput!): AcceptInvitationPayload!
deleteInvitation(input: DeleteInvitationInput!): DeleteInvitationPayload! removeMember(input: RemoveMemberInput!): RemoveMemberPayload!
deleteInvitation(input: DeleteInvitationInput!): DeleteInvitationPayload!
removeMember(input: RemoveMemberInput!): RemoveMemberPayload!
updateMembership(input: UpdateMembershipInput!): UpdateMembershipPayload!
# People mutations
createPeople(input: CreatePeopleInput!): CreatePeoplePayload! updatePeople(input: UpdatePeopleInput!): UpdatePeoplePayload! deletePeople(input: DeletePeopleInput!): DeletePeoplePayload!
createPeople(input: CreatePeopleInput!): CreatePeoplePayload!
updatePeople(input: UpdatePeopleInput!): UpdatePeoplePayload!
deletePeople(input: DeletePeopleInput!): DeletePeoplePayload!
# Vendor mutations
createVendor(input: CreateVendorInput!): CreateVendorPayload! updateVendor(input: UpdateVendorInput!): UpdateVendorPayload! deleteVendor(input: DeleteVendorInput!): DeleteVendorPayload!
createVendor(input: CreateVendorInput!): CreateVendorPayload!
updateVendor(input: UpdateVendorInput!): UpdateVendorPayload!
deleteVendor(input: DeleteVendorInput!): DeleteVendorPayload!
# Vendor Contact mutations
createVendorContact(
input: CreateVendorContactInput!
): CreateVendorContactPayload! updateVendorContact(
): CreateVendorContactPayload!
updateVendorContact(
input: UpdateVendorContactInput!
): UpdateVendorContactPayload! deleteVendorContact(
): UpdateVendorContactPayload!
deleteVendorContact(
input: DeleteVendorContactInput!
): DeleteVendorContactPayload!
# Vendor Service mutations
createVendorService(
input: CreateVendorServiceInput!
): CreateVendorServicePayload! updateVendorService(
): CreateVendorServicePayload!
updateVendorService(
input: UpdateVendorServiceInput!
): UpdateVendorServicePayload! deleteVendorService(
): UpdateVendorServicePayload!
deleteVendorService(
input: DeleteVendorServiceInput!
): DeleteVendorServicePayload!
# Framework mutations
createFramework(input: CreateFrameworkInput!): CreateFrameworkPayload! updateFramework(input: UpdateFrameworkInput!): UpdateFrameworkPayload! importFramework(input: ImportFrameworkInput!): ImportFrameworkPayload! deleteFramework(input: DeleteFrameworkInput!): DeleteFrameworkPayload! generateFrameworkStateOfApplicability(
createFramework(input: CreateFrameworkInput!): CreateFrameworkPayload!
updateFramework(input: UpdateFrameworkInput!): UpdateFrameworkPayload!
importFramework(input: ImportFrameworkInput!): ImportFrameworkPayload!
deleteFramework(input: DeleteFrameworkInput!): DeleteFrameworkPayload!
generateFrameworkStateOfApplicability(
input: GenerateFrameworkStateOfApplicabilityInput!
): GenerateFrameworkStateOfApplicabilityPayload! exportFramework(input: ExportFrameworkInput!): ExportFrameworkPayload!
): GenerateFrameworkStateOfApplicabilityPayload!
exportFramework(input: ExportFrameworkInput!): ExportFrameworkPayload!
# Control mutations
createControl(input: CreateControlInput!): CreateControlPayload! updateControl(input: UpdateControlInput!): UpdateControlPayload! deleteControl(input: DeleteControlInput!): DeleteControlPayload!
createControl(input: CreateControlInput!): CreateControlPayload!
updateControl(input: UpdateControlInput!): UpdateControlPayload!
deleteControl(input: DeleteControlInput!): DeleteControlPayload!
# Measure mutations
createMeasure(input: CreateMeasureInput!): CreateMeasurePayload! updateMeasure(input: UpdateMeasureInput!): UpdateMeasurePayload! importMeasure(input: ImportMeasureInput!): ImportMeasurePayload! deleteMeasure(input: DeleteMeasureInput!): DeleteMeasurePayload!
createMeasure(input: CreateMeasureInput!): CreateMeasurePayload!
updateMeasure(input: UpdateMeasureInput!): UpdateMeasurePayload!
importMeasure(input: ImportMeasureInput!): ImportMeasurePayload!
deleteMeasure(input: DeleteMeasureInput!): DeleteMeasurePayload!
# Control mutations
createControlMeasureMapping(
input: CreateControlMeasureMappingInput!
): CreateControlMeasureMappingPayload! createControlDocumentMapping(
): CreateControlMeasureMappingPayload!
createControlDocumentMapping(
input: CreateControlDocumentMappingInput!
): CreateControlDocumentMappingPayload! deleteControlMeasureMapping(
): CreateControlDocumentMappingPayload!
deleteControlMeasureMapping(
input: DeleteControlMeasureMappingInput!
): DeleteControlMeasureMappingPayload! deleteControlDocumentMapping(
): DeleteControlMeasureMappingPayload!
deleteControlDocumentMapping(
input: DeleteControlDocumentMappingInput!
): DeleteControlDocumentMappingPayload! createControlAuditMapping(
): DeleteControlDocumentMappingPayload!
createControlAuditMapping(
input: CreateControlAuditMappingInput!
): CreateControlAuditMappingPayload! deleteControlAuditMapping(
): CreateControlAuditMappingPayload!
deleteControlAuditMapping(
input: DeleteControlAuditMappingInput!
): DeleteControlAuditMappingPayload! createControlSnapshotMapping(
): DeleteControlAuditMappingPayload!
createControlSnapshotMapping(
input: CreateControlSnapshotMappingInput!
): CreateControlSnapshotMappingPayload! deleteControlSnapshotMapping(
): CreateControlSnapshotMappingPayload!
deleteControlSnapshotMapping(
input: DeleteControlSnapshotMappingInput!
): DeleteControlSnapshotMappingPayload!
# Task mutations
createTask(input: CreateTaskInput!): CreateTaskPayload! updateTask(input: UpdateTaskInput!): UpdateTaskPayload! deleteTask(input: DeleteTaskInput!): DeleteTaskPayload! assignTask(input: AssignTaskInput!): AssignTaskPayload! unassignTask(input: UnassignTaskInput!): UnassignTaskPayload!
createTask(input: CreateTaskInput!): CreateTaskPayload!
updateTask(input: UpdateTaskInput!): UpdateTaskPayload!
deleteTask(input: DeleteTaskInput!): DeleteTaskPayload!
assignTask(input: AssignTaskInput!): AssignTaskPayload!
unassignTask(input: UnassignTaskInput!): UnassignTaskPayload!
# Risk mutations
createRisk(input: CreateRiskInput!): CreateRiskPayload! updateRisk(input: UpdateRiskInput!): UpdateRiskPayload! deleteRisk(input: DeleteRiskInput!): DeleteRiskPayload! createRiskMeasureMapping(
createRisk(input: CreateRiskInput!): CreateRiskPayload!
updateRisk(input: UpdateRiskInput!): UpdateRiskPayload!
deleteRisk(input: DeleteRiskInput!): DeleteRiskPayload!
createRiskMeasureMapping(
input: CreateRiskMeasureMappingInput!
): CreateRiskMeasureMappingPayload! deleteRiskMeasureMapping(
): CreateRiskMeasureMappingPayload!
deleteRiskMeasureMapping(
input: DeleteRiskMeasureMappingInput!
): DeleteRiskMeasureMappingPayload!
createRiskDocumentMapping(
input: CreateRiskDocumentMappingInput!
): CreateRiskDocumentMappingPayload! deleteRiskDocumentMapping(
): CreateRiskDocumentMappingPayload!
deleteRiskDocumentMapping(
input: DeleteRiskDocumentMappingInput!
): DeleteRiskDocumentMappingPayload!
createRiskObligationMapping(
input: CreateRiskObligationMappingInput!
): CreateRiskObligationMappingPayload! deleteRiskObligationMapping(
): CreateRiskObligationMappingPayload!
deleteRiskObligationMapping(
input: DeleteRiskObligationMappingInput!
): DeleteRiskObligationMappingPayload!
# Evidence mutations
deleteEvidence(input: DeleteEvidenceInput!): DeleteEvidencePayload! uploadMeasureEvidence(
deleteEvidence(input: DeleteEvidenceInput!): DeleteEvidencePayload!
uploadMeasureEvidence(
input: UploadMeasureEvidenceInput!
): UploadMeasureEvidencePayload!
# Vendor Compliance Report mutations
uploadVendorComplianceReport(
input: UploadVendorComplianceReportInput!
): UploadVendorComplianceReportPayload! deleteVendorComplianceReport(
): UploadVendorComplianceReportPayload!
deleteVendorComplianceReport(
input: DeleteVendorComplianceReportInput!
): DeleteVendorComplianceReportPayload!
# Vendor Business Associate Agreement mutations
uploadVendorBusinessAssociateAgreement(
input: UploadVendorBusinessAssociateAgreementInput!
): UploadVendorBusinessAssociateAgreementPayload! updateVendorBusinessAssociateAgreement(
): UploadVendorBusinessAssociateAgreementPayload!
updateVendorBusinessAssociateAgreement(
input: UpdateVendorBusinessAssociateAgreementInput!
): UpdateVendorBusinessAssociateAgreementPayload! deleteVendorBusinessAssociateAgreement(
): UpdateVendorBusinessAssociateAgreementPayload!
deleteVendorBusinessAssociateAgreement(
input: DeleteVendorBusinessAssociateAgreementInput!
): DeleteVendorBusinessAssociateAgreementPayload!
# Vendor Data Privacy Agreement mutations
uploadVendorDataPrivacyAgreement(
input: UploadVendorDataPrivacyAgreementInput!
): UploadVendorDataPrivacyAgreementPayload! updateVendorDataPrivacyAgreement(
): UploadVendorDataPrivacyAgreementPayload!
updateVendorDataPrivacyAgreement(
input: UpdateVendorDataPrivacyAgreementInput!
): UpdateVendorDataPrivacyAgreementPayload! deleteVendorDataPrivacyAgreement(
): UpdateVendorDataPrivacyAgreementPayload!
deleteVendorDataPrivacyAgreement(
input: DeleteVendorDataPrivacyAgreementInput!
): DeleteVendorDataPrivacyAgreementPayload!
# Document mutations
@@ -2941,30 +3011,39 @@ type Mutation {
deleteMeeting(input: DeleteMeetingInput!): DeleteMeetingPayload!
publishDocumentVersion(
input: PublishDocumentVersionInput!
): PublishDocumentVersionPayload! bulkPublishDocumentVersions(
): PublishDocumentVersionPayload!
bulkPublishDocumentVersions(
input: BulkPublishDocumentVersionsInput!
): BulkPublishDocumentVersionsPayload! bulkDeleteDocuments(
): BulkPublishDocumentVersionsPayload!
bulkDeleteDocuments(
input: BulkDeleteDocumentsInput!
): BulkDeleteDocumentsPayload! bulkExportDocuments(
): BulkDeleteDocumentsPayload!
bulkExportDocuments(
input: BulkExportDocumentsInput!
): BulkExportDocumentsPayload! generateDocumentChangelog(
): BulkExportDocumentsPayload!
generateDocumentChangelog(
input: GenerateDocumentChangelogInput!
): GenerateDocumentChangelogPayload! createDraftDocumentVersion(
): GenerateDocumentChangelogPayload!
createDraftDocumentVersion(
input: CreateDraftDocumentVersionInput!
): CreateDraftDocumentVersionPayload! deleteDraftDocumentVersion(
): CreateDraftDocumentVersionPayload!
deleteDraftDocumentVersion(
input: DeleteDraftDocumentVersionInput!
): DeleteDraftDocumentVersionPayload! updateDocumentVersion(
): DeleteDraftDocumentVersionPayload!
updateDocumentVersion(
input: UpdateDocumentVersionInput!
): UpdateDocumentVersionPayload! requestSignature(input: RequestSignatureInput!): RequestSignaturePayload! bulkRequestSignatures(
): UpdateDocumentVersionPayload!
requestSignature(input: RequestSignatureInput!): RequestSignaturePayload!
bulkRequestSignatures(
input: BulkRequestSignaturesInput!
): BulkRequestSignaturesPayload! sendSigningNotifications(
): BulkRequestSignaturesPayload!
sendSigningNotifications(
input: SendSigningNotificationsInput!
): SendSigningNotificationsPayload! cancelSignatureRequest(
): SendSigningNotificationsPayload!
cancelSignatureRequest(
input: CancelSignatureRequestInput!
): CancelSignatureRequestPayload!
signDocument(
input: SignDocumentInput!
): SignDocumentPayload!
signDocument(input: SignDocumentInput!): SignDocumentPayload!
exportDocumentVersionPDF(
input: ExportDocumentVersionPDFInput!
): ExportDocumentVersionPDFPayload!
@@ -2975,41 +3054,59 @@ type Mutation {
input: CreateVendorRiskAssessmentInput!
): CreateVendorRiskAssessmentPayload!
assessVendor(input: AssessVendorInput!): AssessVendorPayload!
createAsset(input: CreateAssetInput!): CreateAssetPayload! updateAsset(input: UpdateAssetInput!): UpdateAssetPayload! deleteAsset(input: DeleteAssetInput!): DeleteAssetPayload!
createDatum(input: CreateDatumInput!): CreateDatumPayload! updateDatum(input: UpdateDatumInput!): UpdateDatumPayload! deleteDatum(input: DeleteDatumInput!): DeleteDatumPayload!
createAudit(input: CreateAuditInput!): CreateAuditPayload! updateAudit(input: UpdateAuditInput!): UpdateAuditPayload! deleteAudit(input: DeleteAuditInput!): DeleteAuditPayload! uploadAuditReport(input: UploadAuditReportInput!): UploadAuditReportPayload! deleteAuditReport(input: DeleteAuditReportInput!): DeleteAuditReportPayload!
createAsset(input: CreateAssetInput!): CreateAssetPayload!
updateAsset(input: UpdateAssetInput!): UpdateAssetPayload!
deleteAsset(input: DeleteAssetInput!): DeleteAssetPayload!
createDatum(input: CreateDatumInput!): CreateDatumPayload!
updateDatum(input: UpdateDatumInput!): UpdateDatumPayload!
deleteDatum(input: DeleteDatumInput!): DeleteDatumPayload!
createAudit(input: CreateAuditInput!): CreateAuditPayload!
updateAudit(input: UpdateAuditInput!): UpdateAuditPayload!
deleteAudit(input: DeleteAuditInput!): DeleteAuditPayload!
uploadAuditReport(input: UploadAuditReportInput!): UploadAuditReportPayload!
deleteAuditReport(input: DeleteAuditReportInput!): DeleteAuditReportPayload!
# Nonconformity mutations
createNonconformity(
input: CreateNonconformityInput!
): CreateNonconformityPayload! updateNonconformity(
): CreateNonconformityPayload!
updateNonconformity(
input: UpdateNonconformityInput!
): UpdateNonconformityPayload! deleteNonconformity(
): UpdateNonconformityPayload!
deleteNonconformity(
input: DeleteNonconformityInput!
): DeleteNonconformityPayload!
# Obligation mutations
createObligation(input: CreateObligationInput!): CreateObligationPayload! updateObligation(input: UpdateObligationInput!): UpdateObligationPayload! deleteObligation(input: DeleteObligationInput!): DeleteObligationPayload!
createObligation(input: CreateObligationInput!): CreateObligationPayload!
updateObligation(input: UpdateObligationInput!): UpdateObligationPayload!
deleteObligation(input: DeleteObligationInput!): DeleteObligationPayload!
# Continual Improvement mutations
createContinualImprovement(
input: CreateContinualImprovementInput!
): CreateContinualImprovementPayload! updateContinualImprovement(
): CreateContinualImprovementPayload!
updateContinualImprovement(
input: UpdateContinualImprovementInput!
): UpdateContinualImprovementPayload! deleteContinualImprovement(
): UpdateContinualImprovementPayload!
deleteContinualImprovement(
input: DeleteContinualImprovementInput!
): DeleteContinualImprovementPayload!
# Processing Activity mutations
createProcessingActivity(
input: CreateProcessingActivityInput!
): CreateProcessingActivityPayload! updateProcessingActivity(
): CreateProcessingActivityPayload!
updateProcessingActivity(
input: UpdateProcessingActivityInput!
): UpdateProcessingActivityPayload! deleteProcessingActivity(
): UpdateProcessingActivityPayload!
deleteProcessingActivity(
input: DeleteProcessingActivityInput!
): DeleteProcessingActivityPayload!
# Snapshot mutations
createSnapshot(input: CreateSnapshotInput!): CreateSnapshotPayload! deleteSnapshot(input: DeleteSnapshotInput!): DeleteSnapshotPayload!
createSnapshot(input: CreateSnapshotInput!): CreateSnapshotPayload!
deleteSnapshot(input: DeleteSnapshotInput!): DeleteSnapshotPayload!
# Custom Domain mutations
createCustomDomain(
input: CreateCustomDomainInput!
): CreateCustomDomainPayload! deleteCustomDomain(
): CreateCustomDomainPayload!
deleteCustomDomain(
input: DeleteCustomDomainInput!
): DeleteCustomDomainPayload!
# SAML Configuration mutations (OWNER/ADMIN only)
@@ -3022,11 +3119,16 @@ type Mutation {
# Step 3: Configure SAML (only allowed after domain is verified)
createSAMLConfiguration(
input: CreateSAMLConfigurationInput!
): CreateSAMLConfigurationPayload! updateSAMLConfiguration(
): CreateSAMLConfigurationPayload!
updateSAMLConfiguration(
input: UpdateSAMLConfigurationInput!
): UpdateSAMLConfigurationPayload! deleteSAMLConfiguration(
): UpdateSAMLConfigurationPayload!
deleteSAMLConfiguration(
input: DeleteSAMLConfigurationInput!
): DeleteSAMLConfigurationPayload! enableSAML(input: EnableSAMLInput!): EnableSAMLPayload! disableSAML(input: DisableSAMLInput!): DisableSAMLPayload!}
): DeleteSAMLConfigurationPayload!
enableSAML(input: EnableSAMLInput!): EnableSAMLPayload!
disableSAML(input: DisableSAMLInput!): DisableSAMLPayload!
}
# Input Types
input GenerateFrameworkStateOfApplicabilityInput {
@@ -4228,7 +4330,10 @@ type DeleteMeasurePayload {
deletedMeasureId: ID!
}
type DocumentVersion implements Node @goModel(model: "go.probo.inc/probo/pkg/server/api/console/v1/types.DocumentVersion") {
type DocumentVersion implements Node
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.DocumentVersion"
) {
id: ID!
document: Document! @goField(forceResolver: true)
status: DocumentStatus!
@@ -4523,7 +4628,8 @@ type DeleteAssetPayload {
deletedAssetId: ID!
}
type Datum implements Node @goModel(model: "go.probo.inc/probo/pkg/server/api/console/v1/types.Datum") {
type Datum implements Node
@goModel(model: "go.probo.inc/probo/pkg/server/api/console/v1/types.Datum") {
id: ID!
snapshotId: ID
name: String!

View File

@@ -1456,6 +1456,7 @@ type ComplexityRoot struct {
Document func(childComplexity int) int
Report func(childComplexity int) int
Requested func(childComplexity int) int
Status func(childComplexity int) int
TrustCenterFile func(childComplexity int) int
}
@@ -2223,6 +2224,8 @@ type TrustCenterAccessResolver interface {
AvailableDocumentAccesses(ctx context.Context, obj *types.TrustCenterAccess, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.OrderBy[coredata.TrustCenterDocumentAccessOrderField]) (*types.TrustCenterDocumentAccessConnection, error)
}
type TrustCenterDocumentAccessResolver interface {
Status(ctx context.Context, obj *types.TrustCenterDocumentAccess) (coredata.TrustCenterDocumentAccessStatus, error)
Document(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.Document, error)
Report(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.Report, error)
TrustCenterFile(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.TrustCenterFile, error)
@@ -8033,6 +8036,12 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
}
return e.complexity.TrustCenterDocumentAccess.Requested(childComplexity), true
case "TrustCenterDocumentAccess.status":
if e.complexity.TrustCenterDocumentAccess.Status == nil {
break
}
return e.complexity.TrustCenterDocumentAccess.Status(childComplexity), true
case "TrustCenterDocumentAccess.trustCenterFile":
if e.complexity.TrustCenterDocumentAccess.TrustCenterFile == nil {
break
@@ -9644,10 +9653,12 @@ enum InvitationStatus
@goEnum(value: "go.probo.inc/probo/pkg/coredata.InvitationStatusExpired")
}
enum MembershipRole @goModel(model: "go.probo.inc/probo/pkg/coredata.MembershipRole") {
enum MembershipRole
@goModel(model: "go.probo.inc/probo/pkg/coredata.MembershipRole") {
OWNER @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleOwner")
ADMIN @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleAdmin")
EMPLOYEE @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleEmployee")
EMPLOYEE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleEmployee")
VIEWER @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipRoleViewer")
}
@@ -9655,7 +9666,6 @@ enum APIRole @goModel(model: "go.probo.inc/probo/pkg/coredata.APIRole") {
FULL @goEnum(value: "go.probo.inc/probo/pkg/coredata.APIRoleFull")
}
enum DocumentStatus
@goModel(model: "go.probo.inc/probo/pkg/coredata.DocumentStatus") {
DRAFT @goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentStatusDraft")
@@ -9725,6 +9735,28 @@ enum TrustCenterVisibility
)
}
enum TrustCenterDocumentAccessStatus
@goModel(
model: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatus"
) {
REQUESTED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatusRequested"
)
GRANTED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatusGranted"
)
REJECTED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatusRejected"
)
REVOKED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.TrustCenterDocumentAccessStatusRevoked"
)
}
enum NonconformityStatus
@goModel(model: "go.probo.inc/probo/pkg/coredata.NonconformityStatus") {
OPEN @goEnum(value: "go.probo.inc/probo/pkg/coredata.NonconformityStatusOpen")
@@ -11293,7 +11325,7 @@ type Vendor implements Node {
): VendorComplianceReportConnection! @goField(forceResolver: true)
businessAssociateAgreement: VendorBusinessAssociateAgreement
@goField(forceResolver: true)
@goField(forceResolver: true)
dataPrivacyAgreement: VendorDataPrivacyAgreement @goField(forceResolver: true)
contacts(
@@ -11417,7 +11449,8 @@ type Framework implements Node {
updatedAt: Datetime!
}
type Control implements Node @goModel(
type Control implements Node
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.Control"
) {
id: ID!
@@ -11585,9 +11618,10 @@ type Document implements Node {
updatedAt: Datetime!
}
type SignableDocument @goModel(
type SignableDocument
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.SignableDocument"
){
) {
id: ID!
title: String!
description: String
@@ -11892,6 +11926,7 @@ type TrustCenterDocumentAccess
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.TrustCenterDocumentAccess"
) {
active: Boolean!
status: TrustCenterDocumentAccessStatus!
requested: Boolean!
document: Document @goField(forceResolver: true)
report: Report @goField(forceResolver: true)
@@ -12337,7 +12372,8 @@ type Mutation {
# Organization mutations
createOrganization(
input: CreateOrganizationInput!
): CreateOrganizationPayload! updateOrganization(
): CreateOrganizationPayload!
updateOrganization(
input: UpdateOrganizationInput!
): UpdateOrganizationPayload!
updateOrganizationContext(
@@ -12345,7 +12381,8 @@ type Mutation {
): UpdateOrganizationContextPayload!
deleteOrganizationHorizontalLogo(
input: DeleteOrganizationHorizontalLogoInput!
): DeleteOrganizationHorizontalLogoPayload! deleteOrganization(
): DeleteOrganizationHorizontalLogoPayload!
deleteOrganization(
input: DeleteOrganizationInput!
): DeleteOrganizationPayload!
updateTrustCenter(input: UpdateTrustCenterInput!): UpdateTrustCenterPayload!
@@ -12392,96 +12429,138 @@ type Mutation {
confirmEmail(input: ConfirmEmailInput!): ConfirmEmailPayload!
inviteUser(input: InviteUserInput!): InviteUserPayload!
acceptInvitation(input: AcceptInvitationInput!): AcceptInvitationPayload!
deleteInvitation(input: DeleteInvitationInput!): DeleteInvitationPayload! removeMember(input: RemoveMemberInput!): RemoveMemberPayload!
deleteInvitation(input: DeleteInvitationInput!): DeleteInvitationPayload!
removeMember(input: RemoveMemberInput!): RemoveMemberPayload!
updateMembership(input: UpdateMembershipInput!): UpdateMembershipPayload!
# People mutations
createPeople(input: CreatePeopleInput!): CreatePeoplePayload! updatePeople(input: UpdatePeopleInput!): UpdatePeoplePayload! deletePeople(input: DeletePeopleInput!): DeletePeoplePayload!
createPeople(input: CreatePeopleInput!): CreatePeoplePayload!
updatePeople(input: UpdatePeopleInput!): UpdatePeoplePayload!
deletePeople(input: DeletePeopleInput!): DeletePeoplePayload!
# Vendor mutations
createVendor(input: CreateVendorInput!): CreateVendorPayload! updateVendor(input: UpdateVendorInput!): UpdateVendorPayload! deleteVendor(input: DeleteVendorInput!): DeleteVendorPayload!
createVendor(input: CreateVendorInput!): CreateVendorPayload!
updateVendor(input: UpdateVendorInput!): UpdateVendorPayload!
deleteVendor(input: DeleteVendorInput!): DeleteVendorPayload!
# Vendor Contact mutations
createVendorContact(
input: CreateVendorContactInput!
): CreateVendorContactPayload! updateVendorContact(
): CreateVendorContactPayload!
updateVendorContact(
input: UpdateVendorContactInput!
): UpdateVendorContactPayload! deleteVendorContact(
): UpdateVendorContactPayload!
deleteVendorContact(
input: DeleteVendorContactInput!
): DeleteVendorContactPayload!
# Vendor Service mutations
createVendorService(
input: CreateVendorServiceInput!
): CreateVendorServicePayload! updateVendorService(
): CreateVendorServicePayload!
updateVendorService(
input: UpdateVendorServiceInput!
): UpdateVendorServicePayload! deleteVendorService(
): UpdateVendorServicePayload!
deleteVendorService(
input: DeleteVendorServiceInput!
): DeleteVendorServicePayload!
# Framework mutations
createFramework(input: CreateFrameworkInput!): CreateFrameworkPayload! updateFramework(input: UpdateFrameworkInput!): UpdateFrameworkPayload! importFramework(input: ImportFrameworkInput!): ImportFrameworkPayload! deleteFramework(input: DeleteFrameworkInput!): DeleteFrameworkPayload! generateFrameworkStateOfApplicability(
createFramework(input: CreateFrameworkInput!): CreateFrameworkPayload!
updateFramework(input: UpdateFrameworkInput!): UpdateFrameworkPayload!
importFramework(input: ImportFrameworkInput!): ImportFrameworkPayload!
deleteFramework(input: DeleteFrameworkInput!): DeleteFrameworkPayload!
generateFrameworkStateOfApplicability(
input: GenerateFrameworkStateOfApplicabilityInput!
): GenerateFrameworkStateOfApplicabilityPayload! exportFramework(input: ExportFrameworkInput!): ExportFrameworkPayload!
): GenerateFrameworkStateOfApplicabilityPayload!
exportFramework(input: ExportFrameworkInput!): ExportFrameworkPayload!
# Control mutations
createControl(input: CreateControlInput!): CreateControlPayload! updateControl(input: UpdateControlInput!): UpdateControlPayload! deleteControl(input: DeleteControlInput!): DeleteControlPayload!
createControl(input: CreateControlInput!): CreateControlPayload!
updateControl(input: UpdateControlInput!): UpdateControlPayload!
deleteControl(input: DeleteControlInput!): DeleteControlPayload!
# Measure mutations
createMeasure(input: CreateMeasureInput!): CreateMeasurePayload! updateMeasure(input: UpdateMeasureInput!): UpdateMeasurePayload! importMeasure(input: ImportMeasureInput!): ImportMeasurePayload! deleteMeasure(input: DeleteMeasureInput!): DeleteMeasurePayload!
createMeasure(input: CreateMeasureInput!): CreateMeasurePayload!
updateMeasure(input: UpdateMeasureInput!): UpdateMeasurePayload!
importMeasure(input: ImportMeasureInput!): ImportMeasurePayload!
deleteMeasure(input: DeleteMeasureInput!): DeleteMeasurePayload!
# Control mutations
createControlMeasureMapping(
input: CreateControlMeasureMappingInput!
): CreateControlMeasureMappingPayload! createControlDocumentMapping(
): CreateControlMeasureMappingPayload!
createControlDocumentMapping(
input: CreateControlDocumentMappingInput!
): CreateControlDocumentMappingPayload! deleteControlMeasureMapping(
): CreateControlDocumentMappingPayload!
deleteControlMeasureMapping(
input: DeleteControlMeasureMappingInput!
): DeleteControlMeasureMappingPayload! deleteControlDocumentMapping(
): DeleteControlMeasureMappingPayload!
deleteControlDocumentMapping(
input: DeleteControlDocumentMappingInput!
): DeleteControlDocumentMappingPayload! createControlAuditMapping(
): DeleteControlDocumentMappingPayload!
createControlAuditMapping(
input: CreateControlAuditMappingInput!
): CreateControlAuditMappingPayload! deleteControlAuditMapping(
): CreateControlAuditMappingPayload!
deleteControlAuditMapping(
input: DeleteControlAuditMappingInput!
): DeleteControlAuditMappingPayload! createControlSnapshotMapping(
): DeleteControlAuditMappingPayload!
createControlSnapshotMapping(
input: CreateControlSnapshotMappingInput!
): CreateControlSnapshotMappingPayload! deleteControlSnapshotMapping(
): CreateControlSnapshotMappingPayload!
deleteControlSnapshotMapping(
input: DeleteControlSnapshotMappingInput!
): DeleteControlSnapshotMappingPayload!
# Task mutations
createTask(input: CreateTaskInput!): CreateTaskPayload! updateTask(input: UpdateTaskInput!): UpdateTaskPayload! deleteTask(input: DeleteTaskInput!): DeleteTaskPayload! assignTask(input: AssignTaskInput!): AssignTaskPayload! unassignTask(input: UnassignTaskInput!): UnassignTaskPayload!
createTask(input: CreateTaskInput!): CreateTaskPayload!
updateTask(input: UpdateTaskInput!): UpdateTaskPayload!
deleteTask(input: DeleteTaskInput!): DeleteTaskPayload!
assignTask(input: AssignTaskInput!): AssignTaskPayload!
unassignTask(input: UnassignTaskInput!): UnassignTaskPayload!
# Risk mutations
createRisk(input: CreateRiskInput!): CreateRiskPayload! updateRisk(input: UpdateRiskInput!): UpdateRiskPayload! deleteRisk(input: DeleteRiskInput!): DeleteRiskPayload! createRiskMeasureMapping(
createRisk(input: CreateRiskInput!): CreateRiskPayload!
updateRisk(input: UpdateRiskInput!): UpdateRiskPayload!
deleteRisk(input: DeleteRiskInput!): DeleteRiskPayload!
createRiskMeasureMapping(
input: CreateRiskMeasureMappingInput!
): CreateRiskMeasureMappingPayload! deleteRiskMeasureMapping(
): CreateRiskMeasureMappingPayload!
deleteRiskMeasureMapping(
input: DeleteRiskMeasureMappingInput!
): DeleteRiskMeasureMappingPayload!
createRiskDocumentMapping(
input: CreateRiskDocumentMappingInput!
): CreateRiskDocumentMappingPayload! deleteRiskDocumentMapping(
): CreateRiskDocumentMappingPayload!
deleteRiskDocumentMapping(
input: DeleteRiskDocumentMappingInput!
): DeleteRiskDocumentMappingPayload!
createRiskObligationMapping(
input: CreateRiskObligationMappingInput!
): CreateRiskObligationMappingPayload! deleteRiskObligationMapping(
): CreateRiskObligationMappingPayload!
deleteRiskObligationMapping(
input: DeleteRiskObligationMappingInput!
): DeleteRiskObligationMappingPayload!
# Evidence mutations
deleteEvidence(input: DeleteEvidenceInput!): DeleteEvidencePayload! uploadMeasureEvidence(
deleteEvidence(input: DeleteEvidenceInput!): DeleteEvidencePayload!
uploadMeasureEvidence(
input: UploadMeasureEvidenceInput!
): UploadMeasureEvidencePayload!
# Vendor Compliance Report mutations
uploadVendorComplianceReport(
input: UploadVendorComplianceReportInput!
): UploadVendorComplianceReportPayload! deleteVendorComplianceReport(
): UploadVendorComplianceReportPayload!
deleteVendorComplianceReport(
input: DeleteVendorComplianceReportInput!
): DeleteVendorComplianceReportPayload!
# Vendor Business Associate Agreement mutations
uploadVendorBusinessAssociateAgreement(
input: UploadVendorBusinessAssociateAgreementInput!
): UploadVendorBusinessAssociateAgreementPayload! updateVendorBusinessAssociateAgreement(
): UploadVendorBusinessAssociateAgreementPayload!
updateVendorBusinessAssociateAgreement(
input: UpdateVendorBusinessAssociateAgreementInput!
): UpdateVendorBusinessAssociateAgreementPayload! deleteVendorBusinessAssociateAgreement(
): UpdateVendorBusinessAssociateAgreementPayload!
deleteVendorBusinessAssociateAgreement(
input: DeleteVendorBusinessAssociateAgreementInput!
): DeleteVendorBusinessAssociateAgreementPayload!
# Vendor Data Privacy Agreement mutations
uploadVendorDataPrivacyAgreement(
input: UploadVendorDataPrivacyAgreementInput!
): UploadVendorDataPrivacyAgreementPayload! updateVendorDataPrivacyAgreement(
): UploadVendorDataPrivacyAgreementPayload!
updateVendorDataPrivacyAgreement(
input: UpdateVendorDataPrivacyAgreementInput!
): UpdateVendorDataPrivacyAgreementPayload! deleteVendorDataPrivacyAgreement(
): UpdateVendorDataPrivacyAgreementPayload!
deleteVendorDataPrivacyAgreement(
input: DeleteVendorDataPrivacyAgreementInput!
): DeleteVendorDataPrivacyAgreementPayload!
# Document mutations
@@ -12494,30 +12573,39 @@ type Mutation {
deleteMeeting(input: DeleteMeetingInput!): DeleteMeetingPayload!
publishDocumentVersion(
input: PublishDocumentVersionInput!
): PublishDocumentVersionPayload! bulkPublishDocumentVersions(
): PublishDocumentVersionPayload!
bulkPublishDocumentVersions(
input: BulkPublishDocumentVersionsInput!
): BulkPublishDocumentVersionsPayload! bulkDeleteDocuments(
): BulkPublishDocumentVersionsPayload!
bulkDeleteDocuments(
input: BulkDeleteDocumentsInput!
): BulkDeleteDocumentsPayload! bulkExportDocuments(
): BulkDeleteDocumentsPayload!
bulkExportDocuments(
input: BulkExportDocumentsInput!
): BulkExportDocumentsPayload! generateDocumentChangelog(
): BulkExportDocumentsPayload!
generateDocumentChangelog(
input: GenerateDocumentChangelogInput!
): GenerateDocumentChangelogPayload! createDraftDocumentVersion(
): GenerateDocumentChangelogPayload!
createDraftDocumentVersion(
input: CreateDraftDocumentVersionInput!
): CreateDraftDocumentVersionPayload! deleteDraftDocumentVersion(
): CreateDraftDocumentVersionPayload!
deleteDraftDocumentVersion(
input: DeleteDraftDocumentVersionInput!
): DeleteDraftDocumentVersionPayload! updateDocumentVersion(
): DeleteDraftDocumentVersionPayload!
updateDocumentVersion(
input: UpdateDocumentVersionInput!
): UpdateDocumentVersionPayload! requestSignature(input: RequestSignatureInput!): RequestSignaturePayload! bulkRequestSignatures(
): UpdateDocumentVersionPayload!
requestSignature(input: RequestSignatureInput!): RequestSignaturePayload!
bulkRequestSignatures(
input: BulkRequestSignaturesInput!
): BulkRequestSignaturesPayload! sendSigningNotifications(
): BulkRequestSignaturesPayload!
sendSigningNotifications(
input: SendSigningNotificationsInput!
): SendSigningNotificationsPayload! cancelSignatureRequest(
): SendSigningNotificationsPayload!
cancelSignatureRequest(
input: CancelSignatureRequestInput!
): CancelSignatureRequestPayload!
signDocument(
input: SignDocumentInput!
): SignDocumentPayload!
signDocument(input: SignDocumentInput!): SignDocumentPayload!
exportDocumentVersionPDF(
input: ExportDocumentVersionPDFInput!
): ExportDocumentVersionPDFPayload!
@@ -12528,41 +12616,59 @@ type Mutation {
input: CreateVendorRiskAssessmentInput!
): CreateVendorRiskAssessmentPayload!
assessVendor(input: AssessVendorInput!): AssessVendorPayload!
createAsset(input: CreateAssetInput!): CreateAssetPayload! updateAsset(input: UpdateAssetInput!): UpdateAssetPayload! deleteAsset(input: DeleteAssetInput!): DeleteAssetPayload!
createDatum(input: CreateDatumInput!): CreateDatumPayload! updateDatum(input: UpdateDatumInput!): UpdateDatumPayload! deleteDatum(input: DeleteDatumInput!): DeleteDatumPayload!
createAudit(input: CreateAuditInput!): CreateAuditPayload! updateAudit(input: UpdateAuditInput!): UpdateAuditPayload! deleteAudit(input: DeleteAuditInput!): DeleteAuditPayload! uploadAuditReport(input: UploadAuditReportInput!): UploadAuditReportPayload! deleteAuditReport(input: DeleteAuditReportInput!): DeleteAuditReportPayload!
createAsset(input: CreateAssetInput!): CreateAssetPayload!
updateAsset(input: UpdateAssetInput!): UpdateAssetPayload!
deleteAsset(input: DeleteAssetInput!): DeleteAssetPayload!
createDatum(input: CreateDatumInput!): CreateDatumPayload!
updateDatum(input: UpdateDatumInput!): UpdateDatumPayload!
deleteDatum(input: DeleteDatumInput!): DeleteDatumPayload!
createAudit(input: CreateAuditInput!): CreateAuditPayload!
updateAudit(input: UpdateAuditInput!): UpdateAuditPayload!
deleteAudit(input: DeleteAuditInput!): DeleteAuditPayload!
uploadAuditReport(input: UploadAuditReportInput!): UploadAuditReportPayload!
deleteAuditReport(input: DeleteAuditReportInput!): DeleteAuditReportPayload!
# Nonconformity mutations
createNonconformity(
input: CreateNonconformityInput!
): CreateNonconformityPayload! updateNonconformity(
): CreateNonconformityPayload!
updateNonconformity(
input: UpdateNonconformityInput!
): UpdateNonconformityPayload! deleteNonconformity(
): UpdateNonconformityPayload!
deleteNonconformity(
input: DeleteNonconformityInput!
): DeleteNonconformityPayload!
# Obligation mutations
createObligation(input: CreateObligationInput!): CreateObligationPayload! updateObligation(input: UpdateObligationInput!): UpdateObligationPayload! deleteObligation(input: DeleteObligationInput!): DeleteObligationPayload!
createObligation(input: CreateObligationInput!): CreateObligationPayload!
updateObligation(input: UpdateObligationInput!): UpdateObligationPayload!
deleteObligation(input: DeleteObligationInput!): DeleteObligationPayload!
# Continual Improvement mutations
createContinualImprovement(
input: CreateContinualImprovementInput!
): CreateContinualImprovementPayload! updateContinualImprovement(
): CreateContinualImprovementPayload!
updateContinualImprovement(
input: UpdateContinualImprovementInput!
): UpdateContinualImprovementPayload! deleteContinualImprovement(
): UpdateContinualImprovementPayload!
deleteContinualImprovement(
input: DeleteContinualImprovementInput!
): DeleteContinualImprovementPayload!
# Processing Activity mutations
createProcessingActivity(
input: CreateProcessingActivityInput!
): CreateProcessingActivityPayload! updateProcessingActivity(
): CreateProcessingActivityPayload!
updateProcessingActivity(
input: UpdateProcessingActivityInput!
): UpdateProcessingActivityPayload! deleteProcessingActivity(
): UpdateProcessingActivityPayload!
deleteProcessingActivity(
input: DeleteProcessingActivityInput!
): DeleteProcessingActivityPayload!
# Snapshot mutations
createSnapshot(input: CreateSnapshotInput!): CreateSnapshotPayload! deleteSnapshot(input: DeleteSnapshotInput!): DeleteSnapshotPayload!
createSnapshot(input: CreateSnapshotInput!): CreateSnapshotPayload!
deleteSnapshot(input: DeleteSnapshotInput!): DeleteSnapshotPayload!
# Custom Domain mutations
createCustomDomain(
input: CreateCustomDomainInput!
): CreateCustomDomainPayload! deleteCustomDomain(
): CreateCustomDomainPayload!
deleteCustomDomain(
input: DeleteCustomDomainInput!
): DeleteCustomDomainPayload!
# SAML Configuration mutations (OWNER/ADMIN only)
@@ -12575,11 +12681,16 @@ type Mutation {
# Step 3: Configure SAML (only allowed after domain is verified)
createSAMLConfiguration(
input: CreateSAMLConfigurationInput!
): CreateSAMLConfigurationPayload! updateSAMLConfiguration(
): CreateSAMLConfigurationPayload!
updateSAMLConfiguration(
input: UpdateSAMLConfigurationInput!
): UpdateSAMLConfigurationPayload! deleteSAMLConfiguration(
): UpdateSAMLConfigurationPayload!
deleteSAMLConfiguration(
input: DeleteSAMLConfigurationInput!
): DeleteSAMLConfigurationPayload! enableSAML(input: EnableSAMLInput!): EnableSAMLPayload! disableSAML(input: DisableSAMLInput!): DisableSAMLPayload!}
): DeleteSAMLConfigurationPayload!
enableSAML(input: EnableSAMLInput!): EnableSAMLPayload!
disableSAML(input: DisableSAMLInput!): DisableSAMLPayload!
}
# Input Types
input GenerateFrameworkStateOfApplicabilityInput {
@@ -13781,7 +13892,10 @@ type DeleteMeasurePayload {
deletedMeasureId: ID!
}
type DocumentVersion implements Node @goModel(model: "go.probo.inc/probo/pkg/server/api/console/v1/types.DocumentVersion") {
type DocumentVersion implements Node
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.DocumentVersion"
) {
id: ID!
document: Document! @goField(forceResolver: true)
status: DocumentStatus!
@@ -14076,7 +14190,8 @@ type DeleteAssetPayload {
deletedAssetId: ID!
}
type Datum implements Node @goModel(model: "go.probo.inc/probo/pkg/server/api/console/v1/types.Datum") {
type Datum implements Node
@goModel(model: "go.probo.inc/probo/pkg/server/api/console/v1/types.Datum") {
id: ID!
snapshotId: ID
name: String!
@@ -47039,6 +47154,35 @@ func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_active(_ cont
return fc, nil
}
func (ec *executionContext) _TrustCenterDocumentAccess_status(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) {
return graphql.ResolveField(
ctx,
ec.OperationContext,
field,
ec.fieldContext_TrustCenterDocumentAccess_status,
func(ctx context.Context) (any, error) {
return ec.resolvers.TrustCenterDocumentAccess().Status(ctx, obj)
},
nil,
ec.marshalNTrustCenterDocumentAccessStatus2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessStatus,
true,
true,
)
}
func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_status(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "TrustCenterDocumentAccess",
Field: field,
IsMethod: true,
IsResolver: true,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
return nil, errors.New("field of type TrustCenterDocumentAccessStatus does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _TrustCenterDocumentAccess_requested(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) {
return graphql.ResolveField(
ctx,
@@ -47379,6 +47523,8 @@ func (ec *executionContext) fieldContext_TrustCenterDocumentAccessEdge_node(_ co
switch field.Name {
case "active":
return ec.fieldContext_TrustCenterDocumentAccess_active(ctx, field)
case "status":
return ec.fieldContext_TrustCenterDocumentAccess_status(ctx, field)
case "requested":
return ec.fieldContext_TrustCenterDocumentAccess_requested(ctx, field)
case "document":
@@ -78680,6 +78826,42 @@ func (ec *executionContext) _TrustCenterDocumentAccess(ctx context.Context, sel
if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1)
}
case "status":
field := field
innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._TrustCenterDocumentAccess_status(ctx, field, obj)
if res == graphql.Null {
atomic.AddUint32(&fs.Invalids, 1)
}
return res
}
if field.Deferrable != nil {
dfs, ok := deferred[field.Deferrable.Label]
di := 0
if ok {
dfs.AddField(field)
di = len(dfs.Values) - 1
} else {
dfs = graphql.NewFieldSet([]graphql.CollectedField{field})
deferred[field.Deferrable.Label] = dfs
}
dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler {
return innerFunc(ctx, dfs)
})
// don't run the out.Concurrently() call below
out.Values[i] = graphql.Null
continue
}
out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
case "requested":
out.Values[i] = ec._TrustCenterDocumentAccess_requested(ctx, field, obj)
if out.Values[i] == graphql.Null {
@@ -89705,6 +89887,38 @@ var (
}
)
func (ec *executionContext) unmarshalNTrustCenterDocumentAccessStatus2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessStatus(ctx context.Context, v any) (coredata.TrustCenterDocumentAccessStatus, error) {
tmp, err := graphql.UnmarshalString(v)
res := unmarshalNTrustCenterDocumentAccessStatus2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessStatus[tmp]
return res, graphql.ErrorOnPath(ctx, err)
}
func (ec *executionContext) marshalNTrustCenterDocumentAccessStatus2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessStatus(ctx context.Context, sel ast.SelectionSet, v coredata.TrustCenterDocumentAccessStatus) graphql.Marshaler {
_ = sel
res := graphql.MarshalString(marshalNTrustCenterDocumentAccessStatus2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessStatus[v])
if res == graphql.Null {
if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
ec.Errorf(ctx, "the requested element is null which the schema does not allow")
}
}
return res
}
var (
unmarshalNTrustCenterDocumentAccessStatus2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessStatus = map[string]coredata.TrustCenterDocumentAccessStatus{
"REQUESTED": coredata.TrustCenterDocumentAccessStatusRequested,
"GRANTED": coredata.TrustCenterDocumentAccessStatusGranted,
"REJECTED": coredata.TrustCenterDocumentAccessStatusRejected,
"REVOKED": coredata.TrustCenterDocumentAccessStatusRevoked,
}
marshalNTrustCenterDocumentAccessStatus2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessStatus = map[coredata.TrustCenterDocumentAccessStatus]string{
coredata.TrustCenterDocumentAccessStatusRequested: "REQUESTED",
coredata.TrustCenterDocumentAccessStatusGranted: "GRANTED",
coredata.TrustCenterDocumentAccessStatusRejected: "REJECTED",
coredata.TrustCenterDocumentAccessStatusRevoked: "REVOKED",
}
)
func (ec *executionContext) marshalNTrustCenterEdge2ᚕᚖgoᚗproboᚗincᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterEdgeᚄ(ctx context.Context, sel ast.SelectionSet, v []*types.TrustCenterEdge) graphql.Marshaler {
ret := make(graphql.Array, len(v))
var wg sync.WaitGroup

View File

@@ -6492,6 +6492,11 @@ func (r *trustCenterAccessResolver) AvailableDocumentAccesses(ctx context.Contex
return types.NewTrustCenterDocumentAccessConnection(result, obj, obj.ID), nil
}
// Status is the resolver for the status field.
func (r *trustCenterDocumentAccessResolver) Status(ctx context.Context, obj *types.TrustCenterDocumentAccess) (coredata.TrustCenterDocumentAccessStatus, error) {
panic(fmt.Errorf("not implemented: Status - status"))
}
// Document is the resolver for the document field.
func (r *trustCenterDocumentAccessResolver) Document(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.Document, error) {
r.MustBeAuthorized(ctx, obj.ID, authz.ActionGet)

View File

@@ -22,11 +22,11 @@ import (
"fmt"
"time"
"go.gearno.de/kit/pg"
"go.probo.inc/probo/pkg/baseurl"
"go.probo.inc/probo/pkg/coredata"
"go.probo.inc/probo/pkg/gid"
"go.probo.inc/probo/pkg/slack"
"go.gearno.de/kit/pg"
)
const (
@@ -40,23 +40,23 @@ type (
}
SlackMessageDocument struct {
ID string
Title string
Granted bool
ID string
Title string
Status string
}
SlackMessageReport struct {
ID string
Title string
AuditID string
Granted bool
Status string
}
SlackMessageFile struct {
ID string
Name string
Category string
Granted bool
Status string
}
SlackMessageMetadata struct {
@@ -336,9 +336,9 @@ func (s *SlackMessageService) loadDocumentsReportsAndFilesFromAccesses(
return nil, nil, nil, fmt.Errorf("cannot load document: %w", err)
}
documents = append(documents, SlackMessageDocument{
ID: access.DocumentID.String(),
Title: doc.Title,
Granted: access.Active,
ID: access.DocumentID.String(),
Title: doc.Title,
Status: access.Status.String(),
})
}
@@ -366,7 +366,7 @@ func (s *SlackMessageService) loadDocumentsReportsAndFilesFromAccesses(
ID: access.ReportID.String(),
Title: label,
AuditID: audit.ID.String(),
Granted: access.Active,
Status: access.Status.String(),
})
}
@@ -379,7 +379,7 @@ func (s *SlackMessageService) loadDocumentsReportsAndFilesFromAccesses(
ID: access.TrustCenterFileID.String(),
Name: file.Name,
Category: file.Category,
Granted: access.Active,
Status: access.Status.String(),
})
}
}

View File

@@ -66,14 +66,28 @@
"type": "mrkdwn",
"text": "<https://{{$.Domain}}/organizations/{{$.OrganizationID}}/documents/{{.ID}}|{{jsonEscape .Title}}>"
},
"accessory": {{if .Granted}}{
"accessory": {{if eq .Status "GRANTED"}}{
"type": "button",
"text": {
"type": "plain_text",
"text": "✓ Granted"
},
"url": "https://{{$.Domain}}/organizations/{{$.OrganizationID}}/trust-center/access"
}{{else}}{
}{{else if eq .Status "REJECTED"}}{
"type": "button",
"text": {
"type": "plain_text",
"text": "✗ Rejected"
},
"url": "https://{{$.Domain}}/organizations/{{$.OrganizationID}}/trust-center/access"
}{{else if eq .Status "REVOKED"}}{
"type": "button",
"text": {
"type": "plain_text",
"text": "✗ Revoked"
},
"url": "https://{{$.Domain}}/organizations/{{$.OrganizationID}}/trust-center/access"
}{{else if eq .Status "REQUESTED"}}{
"type": "button",
"text": {
"type": "plain_text",

View File

@@ -572,20 +572,20 @@ func (s *TrustCenterAccessService) RejectByIDs(
if len(documentIDs) > 0 {
shouldSendEmail = true
if err := coredata.DeleteByDocumentIDs(ctx, tx, s.svc.scope, access.ID, documentIDs); err != nil {
return fmt.Errorf("cannot delete document accesses: %w", err)
if err := coredata.RejectByDocumentIDs(ctx, tx, s.svc.scope, access.ID, documentIDs); err != nil {
return fmt.Errorf("cannot reject document accesses: %w", err)
}
}
if len(reportIDs) > 0 {
shouldSendEmail = true
if err := coredata.DeleteByReportIDs(ctx, tx, s.svc.scope, access.ID, reportIDs); err != nil {
return fmt.Errorf("cannot delete report accesses: %w", err)
if err := coredata.RejectByReportIDs(ctx, tx, s.svc.scope, access.ID, reportIDs); err != nil {
return fmt.Errorf("cannot reject report accesses: %w", err)
}
}
if len(fileIDs) > 0 {
shouldSendEmail = true
if err := coredata.DeleteByTrustCenterFileIDs(ctx, tx, s.svc.scope, access.ID, fileIDs); err != nil {
return fmt.Errorf("cannot delete trust center file accesses: %w", err)
if err := coredata.RejectByTrustCenterFileIDs(ctx, tx, s.svc.scope, access.ID, fileIDs); err != nil {
return fmt.Errorf("cannot reject trust center file accesses: %w", err)
}
}