Rename n8n trust center actions

Replace the trustCenter resource with
compliancePortal so the community node tracks
the renamed GraphQL operations.

Signed-off-by: Bryan Frimin <bryan@probo.com>
This commit is contained in:
Bryan Frimin
2026-07-20 18:08:34 +02:00
parent bb2f55574f
commit f90aa136ba
37 changed files with 128 additions and 128 deletions

View File

@@ -0,0 +1,161 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
const commitmentIconOptions = [
{ name: 'Lock Key', value: 'LOCK_KEY' },
{ name: 'Eye Slash', value: 'EYE_SLASH' },
{ name: 'Fingerprint', value: 'FINGERPRINT' },
{ name: 'Shield Warning', value: 'SHIELD_WARNING' },
{ name: 'Shield Check', value: 'SHIELD_CHECK' },
{ name: 'Siren', value: 'SIREN' },
{ name: 'Key', value: 'KEY' },
{ name: 'Lock', value: 'LOCK' },
{ name: 'Cloud', value: 'CLOUD' },
{ name: 'Database', value: 'DATABASE' },
{ name: 'Globe', value: 'GLOBE' },
{ name: 'Eye', value: 'EYE' },
{ name: 'Users', value: 'USERS' },
{ name: 'Certificate', value: 'CERTIFICATE' },
{ name: 'Gavel', value: 'GAVEL' },
{ name: 'Heartbeat', value: 'HEARTBEAT' },
{ name: 'Bell', value: 'BELL' },
{ name: 'Bug', value: 'BUG' },
{ name: 'Code', value: 'CODE' },
{ name: 'Server', value: 'SERVER' },
];
export const description: INodeProperties[] = [
{
displayName: 'Commitment Group ID',
name: 'groupId',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['createCommitment'],
},
},
default: '',
description: 'The ID of the commitment group',
required: true,
},
{
displayName: 'Icon',
name: 'icon',
type: 'options',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['createCommitment'],
},
},
options: commitmentIconOptions,
default: 'LOCK_KEY',
description: 'The icon of the commitment',
required: true,
},
{
displayName: 'Eyebrow',
name: 'eyebrow',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['createCommitment'],
},
},
default: '',
description: 'The eyebrow text of the commitment',
required: true,
},
{
displayName: 'Title',
name: 'title',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['createCommitment'],
},
},
default: '',
description: 'The title of the commitment',
required: true,
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 4,
},
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['createCommitment'],
},
},
default: '',
description: 'The description of the commitment',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const groupId = this.getNodeParameter('groupId', itemIndex) as string;
const icon = this.getNodeParameter('icon', itemIndex) as string;
const eyebrow = this.getNodeParameter('eyebrow', itemIndex) as string;
const title = this.getNodeParameter('title', itemIndex) as string;
const description = this.getNodeParameter('description', itemIndex) as string;
const query = `
mutation CreateCompliancePortalCommitment($input: CreateCompliancePortalCommitmentInput!) {
createCompliancePortalCommitment(input: $input) {
compliancePortalCommitmentEdge {
node {
id
icon
eyebrow
title
description
rank
createdAt
updatedAt
}
}
}
}
`;
const responseData = await proboApiRequest.call(this, query, {
input: { groupId, icon, eyebrow, title, description },
});
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,105 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Trust Center ID',
name: 'trustCenterId',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['createCommitmentGroup'],
},
},
default: '',
description: 'The ID of the trust center',
required: true,
},
{
displayName: 'Title',
name: 'title',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['createCommitmentGroup'],
},
},
default: '',
description: 'The title of the commitment group',
required: true,
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 4,
},
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['createCommitmentGroup'],
},
},
default: '',
description: 'The description of the commitment group',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const trustCenterId = this.getNodeParameter('trustCenterId', itemIndex) as string;
const title = this.getNodeParameter('title', itemIndex) as string;
const description = this.getNodeParameter('description', itemIndex) as string;
const query = `
mutation CreateCompliancePortalCommitmentGroup($input: CreateCompliancePortalCommitmentGroupInput!) {
createCompliancePortalCommitmentGroup(input: $input) {
compliancePortalCommitmentGroupEdge {
node {
id
title
description
rank
createdAt
updatedAt
}
}
}
}
`;
const responseData = await proboApiRequest.call(this, query, {
input: { trustCenterId, title, description },
});
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,102 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Compliance Portal ID',
name: 'compliancePortalId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['createCustomLink'],
},
},
default: '',
description: 'The ID of the compliance portal',
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['createCustomLink'],
},
},
default: '',
description: 'The name of the custom link',
required: true,
},
{
displayName: 'URL',
name: 'url',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['createCustomLink'],
},
},
default: '',
description: 'The custom link',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const compliancePortalId = this.getNodeParameter('compliancePortalId', itemIndex) as string;
const name = this.getNodeParameter('name', itemIndex) as string;
const url = this.getNodeParameter('url', itemIndex) as string;
const query = `
mutation CreateComplianceCustomLink($input: CreateComplianceCustomLinkInput!) {
createComplianceCustomLink(input: $input) {
complianceCustomLinkEdge {
node {
id
name
url
rank
createdAt
updatedAt
}
}
}
}
`;
const responseData = await proboApiRequest.call(this, query, {
input: { compliancePortalId, name, url },
});
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,121 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Compliance Portal ID',
name: 'compliancePortalId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['createReference'],
},
},
default: '',
description: 'The ID of the compliance portal',
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['createReference'],
},
},
default: '',
description: 'The name of the reference',
required: true,
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 4,
},
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['createReference'],
},
},
default: '',
description: 'The description of the reference',
},
{
displayName: 'Website URL',
name: 'websiteUrl',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['createReference'],
},
},
default: '',
description: 'The website URL of the reference',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const compliancePortalId = this.getNodeParameter('compliancePortalId', itemIndex) as string;
const name = this.getNodeParameter('name', itemIndex) as string;
const description = this.getNodeParameter('description', itemIndex, '') as string;
const websiteUrl = this.getNodeParameter('websiteUrl', itemIndex, '') as string;
const query = `
mutation CreateCompliancePortalReference($input: CreateCompliancePortalReferenceInput!) {
createCompliancePortalReference(input: $input) {
compliancePortalReferenceEdge {
node {
id
name
description
websiteUrl
rank
createdAt
updatedAt
}
}
}
}
`;
const input: Record<string, unknown> = { compliancePortalId, name };
if (description) input.description = description;
if (websiteUrl) input.websiteUrl = websiteUrl;
const responseData = await proboApiRequest.call(this, query, { input });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,61 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Commitment ID',
name: 'commitmentId',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['deleteCommitment'],
},
},
default: '',
description: 'The ID of the commitment to delete',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const commitmentId = this.getNodeParameter('commitmentId', itemIndex) as string;
const query = `
mutation DeleteCompliancePortalCommitment($input: DeleteCompliancePortalCommitmentInput!) {
deleteCompliancePortalCommitment(input: $input) {
deletedCompliancePortalCommitmentId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { id: commitmentId } });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,61 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Commitment Group ID',
name: 'commitmentGroupId',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['deleteCommitmentGroup'],
},
},
default: '',
description: 'The ID of the commitment group to delete',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const commitmentGroupId = this.getNodeParameter('commitmentGroupId', itemIndex) as string;
const query = `
mutation DeleteCompliancePortalCommitmentGroup($input: DeleteCompliancePortalCommitmentGroupInput!) {
deleteCompliancePortalCommitmentGroup(input: $input) {
deletedCompliancePortalCommitmentGroupId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { id: commitmentGroupId } });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,61 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Compliance Custom Link ID',
name: 'complianceCustomLinkId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['deleteCustomLink'],
},
},
default: '',
description: 'The ID of the compliance custom link to delete',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const complianceCustomLinkId = this.getNodeParameter('complianceCustomLinkId', itemIndex) as string;
const query = `
mutation DeleteComplianceCustomLink($input: DeleteComplianceCustomLinkInput!) {
deleteComplianceCustomLink(input: $input) {
deletedComplianceCustomLinkId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { id: complianceCustomLinkId } });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,61 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Compliance Portal File ID',
name: 'compliancePortalFileId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['deleteFile'],
},
},
default: '',
description: 'The ID of the compliance portal file to delete',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const compliancePortalFileId = this.getNodeParameter('compliancePortalFileId', itemIndex) as string;
const query = `
mutation DeleteCompliancePortalFile($input: DeleteCompliancePortalFileInput!) {
deleteCompliancePortalFile(input: $input) {
deletedCompliancePortalFileId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { id: compliancePortalFileId } });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,61 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Compliance Portal Reference ID',
name: 'compliancePortalReferenceId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['deleteReference'],
},
},
default: '',
description: 'The ID of the compliance portal reference to delete',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const compliancePortalReferenceId = this.getNodeParameter('compliancePortalReferenceId', itemIndex) as string;
const query = `
mutation DeleteCompliancePortalReference($input: DeleteCompliancePortalReferenceInput!) {
deleteCompliancePortalReference(input: $input) {
deletedCompliancePortalReferenceId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { id: compliancePortalReferenceId } });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,73 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Organization ID',
name: 'organizationId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['get'],
},
},
default: '',
description: 'The ID of the organization',
required: true,
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const organizationId = this.getNodeParameter('organizationId', itemIndex) as string;
const query = `
query GetCompliancePortal($organizationId: ID!) {
node(id: $organizationId) {
... on Organization {
compliancePortal {
id
active
searchEngineIndexing
logoFileUrl
darkLogoFileUrl
ndaFileName
ndaFileUrl
createdAt
updatedAt
}
}
}
}
`;
const responseData = await proboApiRequest.call(this, query, { organizationId });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,124 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData, IDataObject } from 'n8n-workflow';
import { proboApiRequestAllItems } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Organization ID',
name: 'organizationId',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['getAllCommitmentGroups'],
},
},
default: '',
description: 'The ID of the organization',
required: true,
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['getAllCommitmentGroups'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['getAllCommitmentGroups'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
},
default: 50,
description: 'Max number of results to return',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const organizationId = this.getNodeParameter('organizationId', itemIndex) as string;
const returnAll = this.getNodeParameter('returnAll', itemIndex) as boolean;
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const query = `
query GetCompliancePortalCommitmentGroups($organizationId: ID!, $first: Int, $after: CursorKey) {
node(id: $organizationId) {
... on Organization {
trustCenter {
commitmentGroups(first: $first, after: $after) {
edges {
node {
id
title
description
rank
createdAt
updatedAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
}
}
`;
const commitmentGroups = await proboApiRequestAllItems.call(
this,
query,
{ organizationId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
const trustCenter = node?.trustCenter as IDataObject | undefined;
return trustCenter?.commitmentGroups as IDataObject | undefined;
},
returnAll,
limit,
);
return {
json: { commitmentGroups },
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,123 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData, IDataObject } from 'n8n-workflow';
import { proboApiRequestAllItems } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Commitment Group ID',
name: 'groupId',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['getAllCommitments'],
},
},
default: '',
description: 'The ID of the commitment group',
required: true,
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['getAllCommitments'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['getAllCommitments'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
},
default: 50,
description: 'Max number of results to return',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const groupId = this.getNodeParameter('groupId', itemIndex) as string;
const returnAll = this.getNodeParameter('returnAll', itemIndex) as boolean;
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const query = `
query GetCompliancePortalCommitments($groupId: ID!, $first: Int, $after: CursorKey) {
node(id: $groupId) {
... on CompliancePortalCommitmentGroup {
commitments(first: $first, after: $after) {
edges {
node {
id
icon
eyebrow
title
description
rank
createdAt
updatedAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
}
`;
const commitments = await proboApiRequestAllItems.call(
this,
query,
{ groupId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
return node?.commitments as IDataObject | undefined;
},
returnAll,
limit,
);
return {
json: { commitments },
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,121 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData, IDataObject } from 'n8n-workflow';
import { proboApiRequestAllItems } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Organization ID',
name: 'organizationId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['getAllFiles'],
},
},
default: '',
description: 'The ID of the organization',
required: true,
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['getAllFiles'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['getAllFiles'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
},
default: 50,
description: 'Max number of results to return',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const organizationId = this.getNodeParameter('organizationId', itemIndex) as string;
const returnAll = this.getNodeParameter('returnAll', itemIndex) as boolean;
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const query = `
query GetCompliancePortalFiles($organizationId: ID!, $first: Int, $after: CursorKey) {
node(id: $organizationId) {
... on Organization {
compliancePortalFiles(first: $first, after: $after) {
edges {
node {
id
name
category
compliancePortalVisibility
createdAt
updatedAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
}
`;
const compliancePortalFiles = await proboApiRequestAllItems.call(
this,
query,
{ organizationId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
return node?.compliancePortalFiles as IDataObject | undefined;
},
returnAll,
limit,
);
return {
json: { compliancePortalFiles },
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,125 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData, IDataObject } from 'n8n-workflow';
import { proboApiRequestAllItems } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Organization ID',
name: 'organizationId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['getAllReferences'],
},
},
default: '',
description: 'The ID of the organization',
required: true,
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['getAllReferences'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['getAllReferences'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
},
default: 50,
description: 'Max number of results to return',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const organizationId = this.getNodeParameter('organizationId', itemIndex) as string;
const returnAll = this.getNodeParameter('returnAll', itemIndex) as boolean;
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const query = `
query GetCompliancePortalReferences($organizationId: ID!, $first: Int, $after: CursorKey) {
node(id: $organizationId) {
... on Organization {
compliancePortal {
references(first: $first, after: $after) {
edges {
node {
id
name
description
websiteUrl
rank
createdAt
updatedAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
}
}
`;
const references = await proboApiRequestAllItems.call(
this,
query,
{ organizationId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
const compliancePortal = node?.compliancePortal as IDataObject | undefined;
return compliancePortal?.references as IDataObject | undefined;
},
returnAll,
limit,
);
return {
json: { references },
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,194 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties } from 'n8n-workflow';
import * as getOp from './get.operation';
import * as updateOp from './update.operation';
import * as getAllReferencesOp from './getAllReferences.operation';
import * as createReferenceOp from './createReference.operation';
import * as deleteReferenceOp from './deleteReference.operation';
import * as getAllFilesOp from './getAllFiles.operation';
import * as deleteFileOp from './deleteFile.operation';
import * as createCustomLinkOp from './createCustomLink.operation';
import * as deleteCustomLinkOp from './deleteCustomLink.operation';
import * as getAllCommitmentGroupsOp from './getAllCommitmentGroups.operation';
import * as createCommitmentGroupOp from './createCommitmentGroup.operation';
import * as updateCommitmentGroupOp from './updateCommitmentGroup.operation';
import * as deleteCommitmentGroupOp from './deleteCommitmentGroup.operation';
import * as getAllCommitmentsOp from './getAllCommitments.operation';
import * as createCommitmentOp from './createCommitment.operation';
import * as updateCommitmentOp from './updateCommitment.operation';
import * as deleteCommitmentOp from './deleteCommitment.operation';
export const description: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['compliancePortal'],
},
},
options: [
{
name: 'Create Commitment',
value: 'createCommitment',
description: 'Create a new compliance portal commitment',
action: 'Create a compliance portal commitment',
},
{
name: 'Create Commitment Group',
value: 'createCommitmentGroup',
description: 'Create a new compliance portal commitment group',
action: 'Create a compliance portal commitment group',
},
{
name: 'Create Custom Link',
value: 'createCustomLink',
description: 'Create a new compliance custom link',
action: 'Create a compliance custom link',
},
{
name: 'Create Reference',
value: 'createReference',
description: 'Create a new compliance portal reference',
action: 'Create a compliance portal reference',
},
{
name: 'Delete Commitment',
value: 'deleteCommitment',
description: 'Delete a compliance portal commitment',
action: 'Delete a compliance portal commitment',
},
{
name: 'Delete Commitment Group',
value: 'deleteCommitmentGroup',
description: 'Delete a compliance portal commitment group',
action: 'Delete a compliance portal commitment group',
},
{
name: 'Delete Custom Link',
value: 'deleteCustomLink',
description: 'Delete a compliance custom link',
action: 'Delete a compliance custom link',
},
{
name: 'Delete File',
value: 'deleteFile',
description: 'Delete a compliance portal file',
action: 'Delete a compliance portal file',
},
{
name: 'Delete Reference',
value: 'deleteReference',
description: 'Delete a compliance portal reference',
action: 'Delete a compliance portal reference',
},
{
name: 'Get',
value: 'get',
description: 'Get compliance portal settings',
action: 'Get compliance portal settings',
},
{
name: 'Get Many Commitment Groups',
value: 'getAllCommitmentGroups',
description: 'Get many compliance portal commitment groups',
action: 'Get many compliance portal commitment groups',
},
{
name: 'Get Many Commitments',
value: 'getAllCommitments',
description: 'Get many compliance portal commitments',
action: 'Get many compliance portal commitments',
},
{
name: 'Get Many Files',
value: 'getAllFiles',
description: 'Get many compliance portal files',
action: 'Get many compliance portal files',
},
{
name: 'Get Many References',
value: 'getAllReferences',
description: 'Get many compliance portal references',
action: 'Get many compliance portal references',
},
{
name: 'Update',
value: 'update',
description: 'Update compliance portal settings',
action: 'Update compliance portal settings',
},
{
name: 'Update Commitment',
value: 'updateCommitment',
description: 'Update a compliance portal commitment',
action: 'Update a compliance portal commitment',
},
{
name: 'Update Commitment Group',
value: 'updateCommitmentGroup',
description: 'Update a compliance portal commitment group',
action: 'Update a compliance portal commitment group',
},
],
default: 'get',
},
...getOp.description,
...updateOp.description,
...getAllReferencesOp.description,
...createReferenceOp.description,
...deleteReferenceOp.description,
...getAllFilesOp.description,
...deleteFileOp.description,
...createCustomLinkOp.description,
...deleteCustomLinkOp.description,
...getAllCommitmentGroupsOp.description,
...createCommitmentGroupOp.description,
...updateCommitmentGroupOp.description,
...deleteCommitmentGroupOp.description,
...getAllCommitmentsOp.description,
...createCommitmentOp.description,
...updateCommitmentOp.description,
...deleteCommitmentOp.description,
];
export {
getOp as get,
updateOp as update,
getAllReferencesOp as getAllReferences,
createReferenceOp as createReference,
deleteReferenceOp as deleteReference,
getAllFilesOp as getAllFiles,
deleteFileOp as deleteFile,
createCustomLinkOp as createCustomLink,
deleteCustomLinkOp as deleteCustomLink,
getAllCommitmentGroupsOp as getAllCommitmentGroups,
createCommitmentGroupOp as createCommitmentGroup,
updateCommitmentGroupOp as updateCommitmentGroup,
deleteCommitmentGroupOp as deleteCommitmentGroup,
getAllCommitmentsOp as getAllCommitments,
createCommitmentOp as createCommitment,
updateCommitmentOp as updateCommitment,
deleteCommitmentOp as deleteCommitment,
};

View File

@@ -0,0 +1,196 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Compliance Portal ID',
name: 'compliancePortalId',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['update'],
},
},
default: '',
description: 'The ID of the compliance portal to update',
required: true,
},
{
displayName: 'Active',
name: 'active',
type: 'boolean',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['update'],
},
},
default: false,
description: 'Whether the compliance portal is active',
},
{
displayName: 'Search Engine Indexing',
name: 'searchEngineIndexing',
type: 'options',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['update'],
},
},
options: [
{
name: '(Unchanged)',
value: '',
},
{
name: 'Indexable',
value: 'INDEXABLE',
},
{
name: 'Not Indexable',
value: 'NOT_INDEXABLE',
},
],
default: '',
description: 'Whether search engines should index the compliance portal',
},
{
displayName: 'Title',
name: 'title',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['update'],
},
},
default: '',
description: 'The title shown on the public compliance page',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['update'],
},
},
default: '',
description: 'The description shown on the compliance page',
},
{
displayName: 'Website URL',
name: 'websiteUrl',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['update'],
},
},
default: '',
description: 'The website URL shown on the compliance page',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
placeholder: 'name@example.com',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['update'],
},
},
default: '',
description: 'The contact email shown on the compliance page',
},
{
displayName: 'Headquarter Address',
name: 'headquarterAddress',
type: 'string',
displayOptions: {
show: {
resource: ['compliancePortal'],
operation: ['update'],
},
},
default: '',
description: 'The headquarter address shown on the compliance page',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const compliancePortalId = this.getNodeParameter('compliancePortalId', itemIndex) as string;
const active = this.getNodeParameter('active', itemIndex) as boolean | undefined;
const searchEngineIndexing = this.getNodeParameter('searchEngineIndexing', itemIndex, '') as string;
const description = this.getNodeParameter('description', itemIndex, '') as string;
const websiteUrl = this.getNodeParameter('websiteUrl', itemIndex, '') as string;
const email = this.getNodeParameter('email', itemIndex, '') as string;
const headquarterAddress = this.getNodeParameter('headquarterAddress', itemIndex, '') as string;
const title = this.getNodeParameter('title', itemIndex, '') as string;
const query = `
mutation UpdateCompliancePortal($input: UpdateCompliancePortalInput!) {
updateCompliancePortal(input: $input) {
compliancePortal {
id
active
searchEngineIndexing
title
description
websiteUrl
email
headquarterAddress
createdAt
updatedAt
}
}
}
`;
const input: Record<string, unknown> = {
compliancePortalId,
title,
description,
websiteUrl,
email,
headquarterAddress,
};
if (active !== undefined) input.active = active;
if (searchEngineIndexing) input.searchEngineIndexing = searchEngineIndexing;
const responseData = await proboApiRequest.call(this, query, { input });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,175 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
const commitmentIconOptions = [
{ name: '(Unchanged)', value: '' },
{ name: 'Lock Key', value: 'LOCK_KEY' },
{ name: 'Eye Slash', value: 'EYE_SLASH' },
{ name: 'Fingerprint', value: 'FINGERPRINT' },
{ name: 'Shield Warning', value: 'SHIELD_WARNING' },
{ name: 'Shield Check', value: 'SHIELD_CHECK' },
{ name: 'Siren', value: 'SIREN' },
{ name: 'Key', value: 'KEY' },
{ name: 'Lock', value: 'LOCK' },
{ name: 'Cloud', value: 'CLOUD' },
{ name: 'Database', value: 'DATABASE' },
{ name: 'Globe', value: 'GLOBE' },
{ name: 'Eye', value: 'EYE' },
{ name: 'Users', value: 'USERS' },
{ name: 'Certificate', value: 'CERTIFICATE' },
{ name: 'Gavel', value: 'GAVEL' },
{ name: 'Heartbeat', value: 'HEARTBEAT' },
{ name: 'Bell', value: 'BELL' },
{ name: 'Bug', value: 'BUG' },
{ name: 'Code', value: 'CODE' },
{ name: 'Server', value: 'SERVER' },
];
export const description: INodeProperties[] = [
{
displayName: 'Commitment ID',
name: 'commitmentId',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitment'],
},
},
default: '',
description: 'The ID of the commitment to update',
required: true,
},
{
displayName: 'Icon',
name: 'icon',
type: 'options',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitment'],
},
},
options: commitmentIconOptions,
default: '',
description: 'The icon of the commitment',
},
{
displayName: 'Eyebrow',
name: 'eyebrow',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitment'],
},
},
default: '',
description: 'The eyebrow text of the commitment',
},
{
displayName: 'Title',
name: 'title',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitment'],
},
},
default: '',
description: 'The title of the commitment',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 4,
},
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitment'],
},
},
default: '',
description: 'The description of the commitment',
},
{
displayName: 'Rank',
name: 'rank',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitment'],
},
},
default: '',
description: 'The rank of the commitment for ordering',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const commitmentId = this.getNodeParameter('commitmentId', itemIndex) as string;
const icon = this.getNodeParameter('icon', itemIndex, '') as string;
const eyebrow = this.getNodeParameter('eyebrow', itemIndex, '') as string;
const title = this.getNodeParameter('title', itemIndex, '') as string;
const description = this.getNodeParameter('description', itemIndex, '') as string;
const rank = this.getNodeParameter('rank', itemIndex, '') as string;
const query = `
mutation UpdateCompliancePortalCommitment($input: UpdateCompliancePortalCommitmentInput!) {
updateCompliancePortalCommitment(input: $input) {
compliancePortalCommitment {
id
icon
eyebrow
title
description
rank
createdAt
updatedAt
}
}
}
`;
const input: Record<string, unknown> = { id: commitmentId };
if (icon) input.icon = icon;
if (eyebrow) input.eyebrow = eyebrow;
if (title) input.title = title;
if (description) input.description = description;
if (rank) input.rank = Number(rank);
const responseData = await proboApiRequest.call(this, query, { input });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,118 @@
// Copyright (c) 2025-2026 Probo Inc <hello@probo.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Commitment Group ID',
name: 'commitmentGroupId',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitmentGroup'],
},
},
default: '',
description: 'The ID of the commitment group to update',
required: true,
},
{
displayName: 'Title',
name: 'title',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitmentGroup'],
},
},
default: '',
description: 'The title of the commitment group',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 4,
},
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitmentGroup'],
},
},
default: '',
description: 'The description of the commitment group',
},
{
displayName: 'Rank',
name: 'rank',
type: 'string',
displayOptions: {
show: {
resource: ['trustCenter'],
operation: ['updateCommitmentGroup'],
},
},
default: '',
description: 'The rank of the commitment group for ordering',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const commitmentGroupId = this.getNodeParameter('commitmentGroupId', itemIndex) as string;
const title = this.getNodeParameter('title', itemIndex, '') as string;
const description = this.getNodeParameter('description', itemIndex, '') as string;
const rank = this.getNodeParameter('rank', itemIndex, '') as string;
const query = `
mutation UpdateCompliancePortalCommitmentGroup($input: UpdateCompliancePortalCommitmentGroupInput!) {
updateCompliancePortalCommitmentGroup(input: $input) {
compliancePortalCommitmentGroup {
id
title
description
rank
createdAt
updatedAt
}
}
}
`;
const input: Record<string, unknown> = { id: commitmentGroupId };
if (title) input.title = title;
if (description) input.description = description;
if (rank) input.rank = Number(rank);
const responseData = await proboApiRequest.call(this, query, { input });
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}