The compliance portal home page rendered security-commitment cards from a hardcoded placeholder POJO. Back them with real, per-organization data that admins configure in the console and the portal loads over the trust center GraphQL API. Model two entities under the trust center: a commitment group (title, description, rank) and a commitment card (icon, eyebrow, title, description, rank). The card icon is a curated enum mapped to a Phosphor icon in the portal. New entities adopt the compliance_portal_ prefix as the start of the broader rename away from trust_center_ naming. Expose the groups and cards read-only on the public trust API and with full CRUD on the console API, add a Commitments tab to the compliance page, and replace the placeholder section with a Relay-driven one. Signed-off-by: Émile Ré <emile@probo.com>
547 lines
14 KiB
GraphQL
547 lines
14 KiB
GraphQL
type TrustCenter implements Node {
|
|
id: ID!
|
|
active: Boolean!
|
|
slug: String!
|
|
logo: File @goField(forceResolver: true)
|
|
darkLogo: File @goField(forceResolver: true)
|
|
|
|
nonDisclosureAgreement: NonDisclosureAgreement @goField(forceResolver: true)
|
|
|
|
viewerSubscription: MailingListSubscriber @goField(forceResolver: true)
|
|
|
|
organization: Organization! @goField(forceResolver: true)
|
|
|
|
documents(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
filter: TrustCenterVisibilityFilter
|
|
): DocumentConnection! @goField(forceResolver: true)
|
|
|
|
audits(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
filter: TrustCenterVisibilityFilter
|
|
): AuditConnection! @goField(forceResolver: true)
|
|
|
|
subprocessors(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
filter: SubprocessorFilter
|
|
): SubprocessorConnection! @goField(forceResolver: true)
|
|
|
|
subprocessorCategories: [SubprocessorCategory!]!
|
|
@goField(forceResolver: true)
|
|
|
|
subprocessorCountries: [CountryCode!]! @goField(forceResolver: true)
|
|
|
|
references(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
): TrustCenterReferenceConnection! @goField(forceResolver: true)
|
|
|
|
commitmentGroups(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
): CompliancePortalCommitmentGroupConnection! @goField(forceResolver: true)
|
|
|
|
trustCenterFiles(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
filter: TrustCenterVisibilityFilter
|
|
): TrustCenterFileConnection! @goField(forceResolver: true)
|
|
|
|
complianceFrameworks(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
): ComplianceFrameworkConnection! @goField(forceResolver: true)
|
|
|
|
externalUrls(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
): ComplianceExternalURLConnection! @goField(forceResolver: true)
|
|
|
|
updates(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
): MailingListUpdateConnection! @goField(forceResolver: true)
|
|
}
|
|
|
|
enum DocumentType
|
|
@goModel(model: "go.probo.inc/probo/pkg/coredata.DocumentType") {
|
|
OTHER @goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypeOther")
|
|
GOVERNANCE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypeGovernance")
|
|
POLICY @goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypePolicy")
|
|
PROCEDURE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypeProcedure")
|
|
PLAN @goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypePlan")
|
|
REGISTER
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypeRegister")
|
|
RECORD @goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypeRecord")
|
|
REPORT @goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypeReport")
|
|
TEMPLATE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.DocumentTypeTemplate")
|
|
STATEMENT_OF_APPLICABILITY
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.DocumentTypeStatementOfApplicability"
|
|
)
|
|
}
|
|
|
|
enum TrustCenterVisibility
|
|
@goModel(model: "go.probo.inc/probo/pkg/coredata.TrustCenterVisibility") {
|
|
PRIVATE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.TrustCenterVisibilityPrivate")
|
|
PUBLIC
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.TrustCenterVisibilityPublic")
|
|
}
|
|
|
|
input TrustCenterVisibilityFilter {
|
|
visibility: TrustCenterVisibility
|
|
}
|
|
|
|
type Document implements Node @nda {
|
|
id: ID!
|
|
title: String!
|
|
documentType: DocumentType!
|
|
alias: String @goField(forceResolver: true)
|
|
isUserAuthorized: Boolean! @goField(forceResolver: true)
|
|
access: DocumentAccess @goField(forceResolver: true)
|
|
}
|
|
|
|
type DocumentConnection @nda {
|
|
edges: [DocumentEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type DocumentEdge @nda {
|
|
cursor: CursorKey!
|
|
node: Document!
|
|
}
|
|
|
|
type Framework implements Node @nda {
|
|
id: ID!
|
|
name: String!
|
|
lightLogo: File @goField(forceResolver: true)
|
|
darkLogo: File @goField(forceResolver: true)
|
|
}
|
|
|
|
type AuditReport implements Node @nda {
|
|
id: ID!
|
|
fileName: String!
|
|
alias: String @goField(forceResolver: true)
|
|
isUserAuthorized: Boolean! @goField(forceResolver: true)
|
|
access: DocumentAccess @goField(forceResolver: true)
|
|
}
|
|
|
|
type Audit implements Node @nda {
|
|
id: ID!
|
|
name: String
|
|
framework: Framework! @goField(forceResolver: true)
|
|
reportFile: AuditReport @goField(forceResolver: true)
|
|
}
|
|
|
|
type AuditConnection @nda {
|
|
edges: [AuditEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type AuditEdge @nda {
|
|
cursor: CursorKey!
|
|
node: Audit!
|
|
}
|
|
|
|
type ComplianceFramework implements Node
|
|
@goModel(
|
|
model: "go.probo.inc/probo/pkg/server/api/trust/v1/types.ComplianceFramework"
|
|
) {
|
|
id: ID!
|
|
framework: Framework! @goField(forceResolver: true)
|
|
}
|
|
|
|
type ComplianceFrameworkConnection
|
|
@goModel(
|
|
model: "go.probo.inc/probo/pkg/server/api/trust/v1/types.ComplianceFrameworkConnection"
|
|
) {
|
|
edges: [ComplianceFrameworkEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type ComplianceFrameworkEdge
|
|
@goModel(
|
|
model: "go.probo.inc/probo/pkg/server/api/trust/v1/types.ComplianceFrameworkEdge"
|
|
) {
|
|
cursor: CursorKey!
|
|
node: ComplianceFramework!
|
|
}
|
|
|
|
enum SubprocessorCategory
|
|
@goModel(model: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategory") {
|
|
ANALYTICS
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryAnalytics")
|
|
CLOUD_MONITORING
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryCloudMonitoring"
|
|
)
|
|
CLOUD_PROVIDER
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryCloudProvider"
|
|
)
|
|
COLLABORATION
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryCollaboration"
|
|
)
|
|
CUSTOMER_SUPPORT
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryCustomerSupport"
|
|
)
|
|
DATA_STORAGE_AND_PROCESSING
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryDataStorageAndProcessing"
|
|
)
|
|
DOCUMENT_MANAGEMENT
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryDocumentManagement"
|
|
)
|
|
EMPLOYEE_MANAGEMENT
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryEmployeeManagement"
|
|
)
|
|
ENGINEERING
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryEngineering")
|
|
FINANCE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryFinance")
|
|
IDENTITY_PROVIDER
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryIdentityProvider"
|
|
)
|
|
IT @goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryIT")
|
|
MARKETING
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryMarketing")
|
|
OFFICE_OPERATIONS
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryOfficeOperations"
|
|
)
|
|
OTHER @goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryOther")
|
|
PASSWORD_MANAGEMENT
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryPasswordManagement"
|
|
)
|
|
PRODUCT_AND_DESIGN
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryProductAndDesign"
|
|
)
|
|
PROFESSIONAL_SERVICES
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryProfessionalServices"
|
|
)
|
|
RECRUITING
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryRecruiting")
|
|
SALES @goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategorySales")
|
|
SECURITY
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategorySecurity")
|
|
VERSION_CONTROL
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyCategoryVersionControl"
|
|
)
|
|
}
|
|
|
|
type Subprocessor implements Node @nda {
|
|
id: ID!
|
|
name: String!
|
|
description: String
|
|
category: SubprocessorCategory!
|
|
websiteUrl: String
|
|
privacyPolicyUrl: String
|
|
countries: [CountryCode!]!
|
|
}
|
|
|
|
input SubprocessorFilter {
|
|
query: String
|
|
category: SubprocessorCategory
|
|
country: CountryCode
|
|
}
|
|
|
|
type SubprocessorConnection
|
|
@goModel(
|
|
model: "go.probo.inc/probo/pkg/server/api/trust/v1/types.SubprocessorConnection"
|
|
) @nda {
|
|
edges: [SubprocessorEdge!]!
|
|
pageInfo: PageInfo!
|
|
totalCount: Int! @goField(forceResolver: true)
|
|
}
|
|
|
|
type SubprocessorEdge @nda {
|
|
cursor: CursorKey!
|
|
node: Subprocessor!
|
|
}
|
|
|
|
type TrustCenterReference implements Node @nda {
|
|
id: ID!
|
|
name: String!
|
|
description: String
|
|
websiteUrl: String!
|
|
logo: File! @goField(forceResolver: true)
|
|
}
|
|
|
|
type TrustCenterReferenceConnection @nda {
|
|
edges: [TrustCenterReferenceEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type TrustCenterReferenceEdge @nda {
|
|
cursor: CursorKey!
|
|
node: TrustCenterReference!
|
|
}
|
|
|
|
enum CompliancePortalCommitmentIcon
|
|
@goModel(model: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIcon") {
|
|
LOCK_KEY
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconLockKey")
|
|
EYE_SLASH
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconEyeSlash")
|
|
FINGERPRINT
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconFingerprint")
|
|
SHIELD_WARNING
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconShieldWarning")
|
|
SHIELD_CHECK
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconShieldCheck")
|
|
SIREN
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconSiren")
|
|
KEY
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconKey")
|
|
LOCK
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconLock")
|
|
CLOUD
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconCloud")
|
|
DATABASE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconDatabase")
|
|
GLOBE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconGlobe")
|
|
EYE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconEye")
|
|
USERS
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconUsers")
|
|
CERTIFICATE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconCertificate")
|
|
GAVEL
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconGavel")
|
|
HEARTBEAT
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconHeartbeat")
|
|
BELL
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconBell")
|
|
BUG
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconBug")
|
|
CODE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconCode")
|
|
SERVER
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.CompliancePortalCommitmentIconServer")
|
|
}
|
|
|
|
type CompliancePortalCommitmentGroup implements Node {
|
|
id: ID!
|
|
title: String!
|
|
description: String!
|
|
|
|
commitments(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
): CompliancePortalCommitmentConnection! @goField(forceResolver: true)
|
|
}
|
|
|
|
type CompliancePortalCommitmentGroupConnection {
|
|
edges: [CompliancePortalCommitmentGroupEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type CompliancePortalCommitmentGroupEdge {
|
|
cursor: CursorKey!
|
|
node: CompliancePortalCommitmentGroup!
|
|
}
|
|
|
|
type CompliancePortalCommitment implements Node {
|
|
id: ID!
|
|
icon: CompliancePortalCommitmentIcon!
|
|
eyebrow: String!
|
|
title: String!
|
|
description: String!
|
|
}
|
|
|
|
type CompliancePortalCommitmentConnection {
|
|
edges: [CompliancePortalCommitmentEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type CompliancePortalCommitmentEdge {
|
|
cursor: CursorKey!
|
|
node: CompliancePortalCommitment!
|
|
}
|
|
|
|
type TrustCenterFile implements Node @nda {
|
|
id: ID!
|
|
name: String!
|
|
category: String!
|
|
alias: String @goField(forceResolver: true)
|
|
isUserAuthorized: Boolean! @goField(forceResolver: true)
|
|
access: DocumentAccess @goField(forceResolver: true)
|
|
}
|
|
|
|
type TrustCenterFileConnection @nda {
|
|
edges: [TrustCenterFileEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type TrustCenterFileEdge @nda {
|
|
cursor: CursorKey!
|
|
node: TrustCenterFile!
|
|
}
|
|
|
|
type ComplianceExternalURL implements Node {
|
|
id: ID!
|
|
name: String!
|
|
url: String!
|
|
rank: Int!
|
|
}
|
|
|
|
type ComplianceExternalURLConnection {
|
|
edges: [ComplianceExternalURLEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type ComplianceExternalURLEdge {
|
|
cursor: CursorKey!
|
|
node: ComplianceExternalURL!
|
|
}
|
|
|
|
type TrustCenterAccess implements Node {
|
|
id: ID!
|
|
email: EmailAddr!
|
|
name: String!
|
|
createdAt: Datetime!
|
|
updatedAt: Datetime!
|
|
}
|
|
|
|
enum DocumentAccessStatus
|
|
@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"
|
|
)
|
|
}
|
|
|
|
type DocumentAccess implements Node {
|
|
id: ID!
|
|
status: DocumentAccessStatus!
|
|
}
|
|
|
|
extend type Mutation {
|
|
requestAllAccesses: RequestAccessesPayload! @authentication(required: PRESENT) @nda
|
|
|
|
exportDocumentPDF(input: ExportDocumentPDFInput!): ExportDocumentPDFPayload!
|
|
@authentication(required: OPTIONAL) @nda
|
|
|
|
exportReportPDF(input: ExportReportPDFInput!): ExportReportPDFPayload!
|
|
@authentication(required: OPTIONAL) @nda
|
|
|
|
exportTrustCenterFile(
|
|
input: ExportTrustCenterFileInput!
|
|
): ExportTrustCenterFilePayload! @authentication(required: OPTIONAL) @nda
|
|
|
|
requestDocumentAccess(
|
|
input: RequestDocumentAccessInput!
|
|
): RequestDocumentAccessPayload! @authentication(required: PRESENT) @nda
|
|
|
|
requestReportAccess(
|
|
input: RequestReportAccessInput!
|
|
): RequestReportAccessPayload! @authentication(required: PRESENT) @nda
|
|
|
|
requestTrustCenterFileAccess(
|
|
input: RequestTrustCenterFileAccessInput!
|
|
): RequestFileAccessPayload! @authentication(required: PRESENT) @nda
|
|
}
|
|
|
|
type RequestDocumentAccessPayload {
|
|
document: Document
|
|
}
|
|
|
|
type RequestReportAccessPayload {
|
|
audit: Audit
|
|
}
|
|
|
|
type RequestFileAccessPayload {
|
|
file: TrustCenterFile
|
|
}
|
|
|
|
type RequestAccessesPayload {
|
|
trustCenterAccess: TrustCenterAccess!
|
|
}
|
|
|
|
input ExportDocumentPDFInput {
|
|
documentId: ID!
|
|
}
|
|
|
|
input ExportReportPDFInput {
|
|
reportId: ID!
|
|
}
|
|
|
|
input RequestDocumentAccessInput {
|
|
documentId: ID!
|
|
}
|
|
|
|
input RequestReportAccessInput {
|
|
reportId: ID!
|
|
}
|
|
|
|
input RequestTrustCenterFileAccessInput {
|
|
trustCenterFileId: ID!
|
|
}
|
|
|
|
input ExportTrustCenterFileInput {
|
|
trustCenterFileId: ID!
|
|
}
|
|
|
|
type ExportDocumentPDFPayload {
|
|
data: String!
|
|
}
|
|
|
|
type ExportReportPDFPayload {
|
|
data: String!
|
|
}
|
|
|
|
type ExportTrustCenterFilePayload {
|
|
data: String!
|
|
}
|