From 8bb07c4a4ff4354659076ed517d3b7cd64f32dc3 Mon Sep 17 00:00:00 2001 From: martmull Date: Tue, 29 Oct 2024 13:56:01 +0100 Subject: [PATCH] 8130 creating a new company in twenty doesnt activate on zapier (#8166) - fix webhook.operation format change from august 2024 not spread in twenty-zapier - added a comment so it does not happen again - add a fix for the new webhook.operations column that would produce another issue --- ...bhook-operation-into-operations-command.ts | 17 ++++++-- .../jobs/call-webhook-jobs.job.ts | 3 ++ .../src/triggers/trigger_record.ts | 4 +- .../src/utils/triggers/triggers.utils.ts | 43 +++++++++++++------ 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-32/0-32-copy-webhook-operation-into-operations-command.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-32/0-32-copy-webhook-operation-into-operations-command.ts index 44d044fde..51f1300c2 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-32/0-32-copy-webhook-operation-into-operations-command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-32/0-32-copy-webhook-operation-into-operations-command.ts @@ -1,13 +1,14 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Command } from 'nest-commander'; -import { Repository } from 'typeorm'; +import { ObjectLiteral, Repository } from 'typeorm'; import chalk from 'chalk'; import { ActiveWorkspacesCommandRunner } from 'src/database/commands/active-workspaces.command'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { BaseCommandOptions } from 'src/database/commands/base.command'; +import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository'; @Command({ name: 'upgrade-0.32:copy-webhook-operation-into-operations', @@ -43,11 +44,21 @@ export class CopyWebhookOperationIntoOperationsCommand extends ActiveWorkspacesC for (const webhook of webhooks) { if ('operation' in webhook) { + let newOperation = webhook.operation; + + const [firstWebhookPart, lastWebhookPart] = newOperation.split('.'); + + if (['created', 'updated', 'deleted'].includes(firstWebhookPart)) { + newOperation = `${lastWebhookPart}.${firstWebhookPart}`; + } + await webhookRepository.update(webhook.id, { - operations: [webhook.operation], + operation: newOperation, + operations: [newOperation], }); + this.logger.log( - chalk.yellow(`Copied webhook operation to operations`), + chalk.yellow(`Handled webhook operation updates for ${webhook.id}`), ); } } diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/call-webhook-jobs.job.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/call-webhook-jobs.job.ts index 8705d3554..2b3729b60 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/call-webhook-jobs.job.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/call-webhook-jobs.job.ts @@ -42,6 +42,9 @@ export class CallWebhookJobsJob { @Process(CallWebhookJobsJob.name) async handle(data: CallWebhookJobsJobData): Promise { + // If you change that function, double check it does not break Zapier + // trigger in packages/twenty-zapier/src/triggers/trigger_record.ts + const webhookRepository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( data.workspaceId, diff --git a/packages/twenty-zapier/src/triggers/trigger_record.ts b/packages/twenty-zapier/src/triggers/trigger_record.ts index 8f408e371..f5b1b83f1 100644 --- a/packages/twenty-zapier/src/triggers/trigger_record.ts +++ b/packages/twenty-zapier/src/triggers/trigger_record.ts @@ -21,7 +21,8 @@ export default { noun: 'Record', display: { label: 'Record Trigger', - description: 'Triggers when a Record is created, updated or deleted.', + description: + 'Triggers when a Record is created, updated, deleted or destroyed.', }, operation: { inputFields: [ @@ -40,6 +41,7 @@ export default { [Operation.create]: Operation.create, [Operation.update]: Operation.update, [Operation.delete]: Operation.delete, + [Operation.destroy]: Operation.destroy, }, altersDynamicFields: true, }, diff --git a/packages/twenty-zapier/src/utils/triggers/triggers.utils.ts b/packages/twenty-zapier/src/utils/triggers/triggers.utils.ts index 0fc456a7f..9fa1188a1 100644 --- a/packages/twenty-zapier/src/utils/triggers/triggers.utils.ts +++ b/packages/twenty-zapier/src/utils/triggers/triggers.utils.ts @@ -11,6 +11,7 @@ export enum Operation { create = 'create', update = 'update', delete = 'delete', + destroy = 'destroy', } export const subscribe = async ( @@ -18,18 +19,36 @@ export const subscribe = async ( bundle: Bundle, operation: Operation, ) => { - const data = { - targetUrl: bundle.targetUrl, - operation: `${operation}.${bundle.inputData.nameSingular}`, - }; - const result = await requestDb( - z, - bundle, - `mutation createWebhook {createWebhook(data:{${handleQueryParams( - data, - )}}) {id}}`, - ); - return result.data.createWebhook; + try { + const data = { + targetUrl: bundle.targetUrl, + operations: [`${bundle.inputData.nameSingular}.${operation}`], + }; + const result = await requestDb( + z, + bundle, + `mutation createWebhook {createWebhook(data:{${handleQueryParams( + data, + )}}) {id}}`, + ); + return result.data.createWebhook; + } catch (e) { + // Remove that catch code when VERSION 0.32 is deployed + // probably removable after 01/11/2024 + // (ie: when operations column exists in all active workspace schemas) + const data = { + targetUrl: bundle.targetUrl, + operation: `${bundle.inputData.nameSingular}.${operation}`, + }; + const result = await requestDb( + z, + bundle, + `mutation createWebhook {createWebhook(data:{${handleQueryParams( + data, + )}}) {id}}`, + ); + return result.data.createWebhook; + } }; export const performUnsubscribe = async (z: ZObject, bundle: Bundle) => {