Files
probo/pkg/server/api/console/v1/graphql/third_party.graphql
Sacha Al Himdani 6e7c96732f Add async third-party vetting
Queue vetting on third_parties with PENDING, PROCESSING,
COMPLETED, and FAILED states. Expose enqueue and status through
GraphQL, MCP, CLI, and n8n, validate vet requests, tune the
worker via config, and poll the detail page while vetting runs.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-06-02 11:39:51 +02:00

776 lines
22 KiB
GraphQL

enum ThirdPartyVettingStatus
@goModel(model: "go.probo.inc/probo/pkg/coredata.ThirdPartyVettingStatus") {
PENDING
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyVettingStatusPending"
)
PROCESSING
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyVettingStatusProcessing"
)
COMPLETED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyVettingStatusCompleted"
)
FAILED
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyVettingStatusFailed"
)
}
enum ThirdPartyCategory
@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"
)
}
enum DataSensitivity
@goModel(model: "go.probo.inc/probo/pkg/coredata.DataSensitivity") {
NONE @goEnum(value: "go.probo.inc/probo/pkg/coredata.DataSensitivityNone")
LOW @goEnum(value: "go.probo.inc/probo/pkg/coredata.DataSensitivityLow")
MEDIUM
@goEnum(value: "go.probo.inc/probo/pkg/coredata.DataSensitivityMedium")
HIGH @goEnum(value: "go.probo.inc/probo/pkg/coredata.DataSensitivityHigh")
CRITICAL
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.DataSensitivityCritical"
)
}
enum BusinessImpact
@goModel(model: "go.probo.inc/probo/pkg/coredata.BusinessImpact") {
LOW @goEnum(value: "go.probo.inc/probo/pkg/coredata.BusinessImpactLow")
MEDIUM
@goEnum(value: "go.probo.inc/probo/pkg/coredata.BusinessImpactMedium")
HIGH @goEnum(value: "go.probo.inc/probo/pkg/coredata.BusinessImpactHigh")
CRITICAL
@goEnum(value: "go.probo.inc/probo/pkg/coredata.BusinessImpactCritical")
}
enum ThirdPartyOrderField
@goModel(model: "go.probo.inc/probo/pkg/coredata.ThirdPartyOrderField") {
NAME @goEnum(value: "go.probo.inc/probo/pkg/coredata.ThirdPartyOrderFieldName")
CREATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyOrderFieldCreatedAt"
)
UPDATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyOrderFieldUpdatedAt"
)
}
enum ThirdPartyComplianceReportOrderField
@goModel(
model: "go.probo.inc/probo/pkg/coredata.ThirdPartyComplianceReportOrderField"
) {
REPORT_DATE
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyComplianceReportOrderFieldReportDate"
)
CREATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyComplianceReportOrderFieldCreatedAt"
)
}
enum ThirdPartyContactOrderField
@goModel(model: "go.probo.inc/probo/pkg/coredata.ThirdPartyContactOrderField") {
CREATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyContactOrderFieldCreatedAt"
)
FULL_NAME
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyContactOrderFieldFullName"
)
EMAIL
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyContactOrderFieldEmail"
)
}
enum ThirdPartyServiceOrderField
@goModel(model: "go.probo.inc/probo/pkg/coredata.ThirdPartyServiceOrderField") {
CREATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyServiceOrderFieldCreatedAt"
)
NAME
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyServiceOrderFieldName"
)
}
enum ThirdPartyRiskAssessmentOrderField
@goModel(
model: "go.probo.inc/probo/pkg/coredata.ThirdPartyRiskAssessmentOrderField"
) {
CREATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyRiskAssessmentOrderFieldCreatedAt"
)
EXPIRES_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ThirdPartyRiskAssessmentOrderFieldExpiresAt"
)
}
input ThirdPartyOrder
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.ThirdPartyOrderBy"
) {
direction: OrderDirection!
field: ThirdPartyOrderField!
}
input ThirdPartyFilter {
firstLevel: Boolean
query: String
}
input ThirdPartyComplianceReportOrder
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.ThirdPartyComplianceReportOrderBy"
) {
direction: OrderDirection!
field: ThirdPartyComplianceReportOrderField!
}
input ThirdPartyContactOrder
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.ThirdPartyContactOrderBy"
) {
direction: OrderDirection!
field: ThirdPartyContactOrderField!
}
input ThirdPartyServiceOrder
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.ThirdPartyServiceOrderBy"
) {
direction: OrderDirection!
field: ThirdPartyServiceOrderField!
}
input ThirdPartyRiskAssessmentOrder {
field: ThirdPartyRiskAssessmentOrderField!
direction: OrderDirection!
}
type ThirdParty implements Node {
id: ID!
name: String!
category: ThirdPartyCategory!
description: String
organization: Organization! @goField(forceResolver: true)
complianceReports(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: ThirdPartyComplianceReportOrder
): ThirdPartyComplianceReportConnection! @goField(forceResolver: true)
businessAssociateAgreement: ThirdPartyBusinessAssociateAgreement
@goField(forceResolver: true)
dataPrivacyAgreement: ThirdPartyDataPrivacyAgreement
@goField(forceResolver: true)
contacts(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: ThirdPartyContactOrder
): ThirdPartyContactConnection! @goField(forceResolver: true)
services(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: ThirdPartyServiceOrder
): ThirdPartyServiceConnection! @goField(forceResolver: true)
riskAssessments(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: ThirdPartyRiskAssessmentOrder
): ThirdPartyRiskAssessmentConnection! @goField(forceResolver: true)
measures(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: MeasureOrder
filter: MeasureFilter
): MeasureConnection! @goField(forceResolver: true)
businessOwner: Profile @goField(forceResolver: true)
securityOwner: Profile @goField(forceResolver: true)
statusPageUrl: String
termsOfServiceUrl: String
privacyPolicyUrl: String
serviceLevelAgreementUrl: String
dataProcessingAgreementUrl: String
businessAssociateAgreementUrl: String
subprocessorsListUrl: String
certifications: [String!]!
countries: [CountryCode!]!
securityPageUrl: String
trustPageUrl: String
headquarterAddress: String
legalName: String
websiteUrl: String
showOnTrustCenter: Boolean!
firstLevel: Boolean!
childThirdParties(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: ThirdPartyOrder
): ThirdPartyConnection! @goField(forceResolver: true)
vettingStatus: ThirdPartyVettingStatus @goField(forceResolver: true)
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type ThirdPartyComplianceReport implements Node {
id: ID!
thirdParty: ThirdParty! @goField(forceResolver: true)
reportDate: Datetime!
validUntil: Datetime
reportName: String!
file: File @goField(forceResolver: true)
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type ThirdPartyBusinessAssociateAgreement implements Node {
id: ID!
thirdParty: ThirdParty! @goField(forceResolver: true)
validFrom: Datetime
validUntil: Datetime
fileName: String!
fileUrl: String! @goField(forceResolver: true)
fileSize: BigInt!
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type ThirdPartyContact implements Node {
id: ID!
thirdParty: ThirdParty! @goField(forceResolver: true)
fullName: String
email: EmailAddr
phone: String
role: String
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type ThirdPartyService implements Node {
id: ID!
thirdParty: ThirdParty! @goField(forceResolver: true)
name: String!
description: String
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type ThirdPartyDataPrivacyAgreement implements Node {
id: ID!
thirdParty: ThirdParty! @goField(forceResolver: true)
validFrom: Datetime
validUntil: Datetime
fileName: String!
fileUrl: String! @goField(forceResolver: true)
fileSize: BigInt!
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type ThirdPartyRiskAssessment implements Node {
id: ID!
thirdParty: ThirdParty! @goField(forceResolver: true)
expiresAt: Datetime!
dataSensitivity: DataSensitivity!
businessImpact: BusinessImpact!
notes: String
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type ThirdPartyConnection
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.ThirdPartyConnection"
) {
totalCount: Int! @goField(forceResolver: true)
edges: [ThirdPartyEdge!]!
pageInfo: PageInfo!
}
type ThirdPartyEdge {
cursor: CursorKey!
node: ThirdParty!
}
type ThirdPartyComplianceReportConnection {
edges: [ThirdPartyComplianceReportEdge!]!
pageInfo: PageInfo!
}
type ThirdPartyComplianceReportEdge {
cursor: CursorKey!
node: ThirdPartyComplianceReport!
}
type ThirdPartyContactConnection {
edges: [ThirdPartyContactEdge!]!
pageInfo: PageInfo!
}
type ThirdPartyContactEdge {
cursor: CursorKey!
node: ThirdPartyContact!
}
type ThirdPartyServiceConnection {
edges: [ThirdPartyServiceEdge!]!
pageInfo: PageInfo!
}
type ThirdPartyServiceEdge {
cursor: CursorKey!
node: ThirdPartyService!
}
type ThirdPartyRiskAssessmentConnection {
edges: [ThirdPartyRiskAssessmentEdge!]!
pageInfo: PageInfo!
}
type ThirdPartyRiskAssessmentEdge {
cursor: CursorKey!
node: ThirdPartyRiskAssessment!
}
extend type Mutation {
createThirdParty(input: CreateThirdPartyInput!): CreateThirdPartyPayload!
updateThirdParty(input: UpdateThirdPartyInput!): UpdateThirdPartyPayload!
deleteThirdParty(input: DeleteThirdPartyInput!): DeleteThirdPartyPayload!
createThirdPartyContact(
input: CreateThirdPartyContactInput!
): CreateThirdPartyContactPayload!
updateThirdPartyContact(
input: UpdateThirdPartyContactInput!
): UpdateThirdPartyContactPayload!
deleteThirdPartyContact(
input: DeleteThirdPartyContactInput!
): DeleteThirdPartyContactPayload!
createThirdPartyService(
input: CreateThirdPartyServiceInput!
): CreateThirdPartyServicePayload!
updateThirdPartyService(
input: UpdateThirdPartyServiceInput!
): UpdateThirdPartyServicePayload!
deleteThirdPartyService(
input: DeleteThirdPartyServiceInput!
): DeleteThirdPartyServicePayload!
uploadThirdPartyComplianceReport(
input: UploadThirdPartyComplianceReportInput!
): UploadThirdPartyComplianceReportPayload!
deleteThirdPartyComplianceReport(
input: DeleteThirdPartyComplianceReportInput!
): DeleteThirdPartyComplianceReportPayload!
uploadThirdPartyBusinessAssociateAgreement(
input: UploadThirdPartyBusinessAssociateAgreementInput!
): UploadThirdPartyBusinessAssociateAgreementPayload!
updateThirdPartyBusinessAssociateAgreement(
input: UpdateThirdPartyBusinessAssociateAgreementInput!
): UpdateThirdPartyBusinessAssociateAgreementPayload!
deleteThirdPartyBusinessAssociateAgreement(
input: DeleteThirdPartyBusinessAssociateAgreementInput!
): DeleteThirdPartyBusinessAssociateAgreementPayload!
uploadThirdPartyDataPrivacyAgreement(
input: UploadThirdPartyDataPrivacyAgreementInput!
): UploadThirdPartyDataPrivacyAgreementPayload!
updateThirdPartyDataPrivacyAgreement(
input: UpdateThirdPartyDataPrivacyAgreementInput!
): UpdateThirdPartyDataPrivacyAgreementPayload!
deleteThirdPartyDataPrivacyAgreement(
input: DeleteThirdPartyDataPrivacyAgreementInput!
): DeleteThirdPartyDataPrivacyAgreementPayload!
createThirdPartyRiskAssessment(
input: CreateThirdPartyRiskAssessmentInput!
): CreateThirdPartyRiskAssessmentPayload!
vetThirdParty(input: VetThirdPartyInput!): VetThirdPartyPayload!
publishThirdPartyList(
input: PublishThirdPartyListInput!
): PublishThirdPartyListPayload!
createThirdPartyThirdPartyMapping(
input: CreateThirdPartyThirdPartyMappingInput!
): CreateThirdPartyThirdPartyMappingPayload!
deleteThirdPartyThirdPartyMapping(
input: DeleteThirdPartyThirdPartyMappingInput!
): DeleteThirdPartyThirdPartyMappingPayload!
}
input PublishThirdPartyListInput {
organizationId: ID!
approverIds: [ID!]
minor: Boolean!
}
type PublishThirdPartyListPayload {
documentEdge: DocumentEdge!
documentVersionEdge: DocumentVersionEdge!
}
input CreateThirdPartyInput {
organizationId: ID!
name: String!
description: String
headquarterAddress: String
legalName: String
websiteUrl: String
privacyPolicyUrl: String
category: ThirdPartyCategory
serviceLevelAgreementUrl: String
dataProcessingAgreementUrl: String
businessAssociateAgreementUrl: String
subprocessorsListUrl: String
certifications: [String!]
countries: [CountryCode!]
securityPageUrl: String
trustPageUrl: String
statusPageUrl: String
termsOfServiceUrl: String
businessOwnerId: ID
securityOwnerId: ID
firstLevel: Boolean
}
input UpdateThirdPartyInput {
id: ID!
name: String
description: String @goField(omittable: true)
statusPageUrl: String @goField(omittable: true)
termsOfServiceUrl: String @goField(omittable: true)
privacyPolicyUrl: String @goField(omittable: true)
serviceLevelAgreementUrl: String @goField(omittable: true)
dataProcessingAgreementUrl: String @goField(omittable: true)
businessAssociateAgreementUrl: String @goField(omittable: true)
subprocessorsListUrl: String @goField(omittable: true)
websiteUrl: String @goField(omittable: true)
legalName: String @goField(omittable: true)
headquarterAddress: String @goField(omittable: true)
category: ThirdPartyCategory
certifications: [String!]
countries: [CountryCode!]
securityPageUrl: String @goField(omittable: true)
trustPageUrl: String @goField(omittable: true)
businessOwnerId: ID @goField(omittable: true)
securityOwnerId: ID @goField(omittable: true)
showOnTrustCenter: Boolean
firstLevel: Boolean
}
input DeleteThirdPartyInput {
thirdPartyId: ID!
}
input CreateThirdPartyContactInput {
thirdPartyId: ID!
fullName: String
email: EmailAddr
phone: String
role: String
}
input UpdateThirdPartyContactInput {
id: ID!
fullName: String @goField(omittable: true)
email: EmailAddr @goField(omittable: true)
phone: String @goField(omittable: true)
role: String @goField(omittable: true)
}
input DeleteThirdPartyContactInput {
thirdPartyContactId: ID!
}
input CreateThirdPartyServiceInput {
thirdPartyId: ID!
name: String!
description: String
url: String
type: String
}
input UpdateThirdPartyServiceInput {
id: ID!
name: String
description: String @goField(omittable: true)
url: String
type: String
}
input DeleteThirdPartyServiceInput {
thirdPartyServiceId: ID!
}
input UploadThirdPartyComplianceReportInput {
thirdPartyId: ID!
reportDate: Datetime!
validUntil: Datetime
reportName: String!
file: Upload!
}
input DeleteThirdPartyComplianceReportInput {
reportId: ID!
}
input UploadThirdPartyBusinessAssociateAgreementInput {
thirdPartyId: ID!
validFrom: Datetime
validUntil: Datetime
fileName: String!
file: Upload!
}
input UpdateThirdPartyBusinessAssociateAgreementInput {
thirdPartyId: ID!
validFrom: Datetime @goField(omittable: true)
validUntil: Datetime @goField(omittable: true)
}
input DeleteThirdPartyBusinessAssociateAgreementInput {
thirdPartyId: ID!
}
input UploadThirdPartyDataPrivacyAgreementInput {
thirdPartyId: ID!
validFrom: Datetime
validUntil: Datetime
fileName: String!
file: Upload!
}
input UpdateThirdPartyDataPrivacyAgreementInput {
thirdPartyId: ID!
validFrom: Datetime @goField(omittable: true)
validUntil: Datetime @goField(omittable: true)
}
input DeleteThirdPartyDataPrivacyAgreementInput {
thirdPartyId: ID!
}
input CreateThirdPartyRiskAssessmentInput {
thirdPartyId: ID!
expiresAt: Datetime!
dataSensitivity: DataSensitivity!
businessImpact: BusinessImpact!
notes: String
}
input VetThirdPartyInput {
id: ID!
websiteUrl: String!
procedure: String
}
type CreateThirdPartyPayload {
thirdPartyEdge: ThirdPartyEdge!
}
type UpdateThirdPartyPayload {
thirdParty: ThirdParty!
}
type DeleteThirdPartyPayload {
deletedThirdPartyId: ID!
}
type CreateThirdPartyContactPayload {
thirdPartyContactEdge: ThirdPartyContactEdge!
}
type UpdateThirdPartyContactPayload {
thirdPartyContact: ThirdPartyContact!
}
type DeleteThirdPartyContactPayload {
deletedThirdPartyContactId: ID!
}
type CreateThirdPartyServicePayload {
thirdPartyServiceEdge: ThirdPartyServiceEdge!
}
type UpdateThirdPartyServicePayload {
thirdPartyService: ThirdPartyService!
}
type DeleteThirdPartyServicePayload {
deletedThirdPartyServiceId: ID!
}
type UploadThirdPartyComplianceReportPayload {
thirdPartyComplianceReportEdge: ThirdPartyComplianceReportEdge!
}
type DeleteThirdPartyComplianceReportPayload {
deletedThirdPartyComplianceReportId: ID!
}
type UploadThirdPartyBusinessAssociateAgreementPayload {
thirdPartyBusinessAssociateAgreement: ThirdPartyBusinessAssociateAgreement!
}
type UpdateThirdPartyBusinessAssociateAgreementPayload {
thirdPartyBusinessAssociateAgreement: ThirdPartyBusinessAssociateAgreement!
}
type DeleteThirdPartyBusinessAssociateAgreementPayload {
deletedThirdPartyId: ID!
}
type UploadThirdPartyDataPrivacyAgreementPayload {
thirdPartyDataPrivacyAgreement: ThirdPartyDataPrivacyAgreement!
}
type UpdateThirdPartyDataPrivacyAgreementPayload {
thirdPartyDataPrivacyAgreement: ThirdPartyDataPrivacyAgreement!
}
type DeleteThirdPartyDataPrivacyAgreementPayload {
deletedThirdPartyId: ID!
}
type CreateThirdPartyRiskAssessmentPayload {
thirdPartyRiskAssessmentEdge: ThirdPartyRiskAssessmentEdge!
}
type VetThirdPartyPayload {
thirdParty: ThirdParty!
}
input CreateThirdPartyThirdPartyMappingInput {
parentThirdPartyId: ID!
childThirdPartyId: ID!
}
type CreateThirdPartyThirdPartyMappingPayload {
thirdPartyEdge: ThirdPartyEdge!
}
input DeleteThirdPartyThirdPartyMappingInput {
parentThirdPartyId: ID!
childThirdPartyId: ID!
}
type DeleteThirdPartyThirdPartyMappingPayload {
removedThirdPartyId: ID!
}