From 18cfe79b802370c73988d842440699b0561b1326 Mon Sep 17 00:00:00 2001 From: Ana Sofia Marin Alexandre <61988046+anamarn@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:48:11 -0300 Subject: [PATCH] bug fix webhook response not sending data to tinybird (#7952) Solves https://github.com/twentyhq/private-issues/issues/118 **TLDR** Fix webhook response not sending data to tinybird when the url is not a link. **Changes in Tinybird:** - Add column Success to webhook payload (boolean) - Changed the parameter WebhookIdRequest to WebhookId in the getWebhooksResponse api point. - Those changes can be seen in the tinybird workspace twenty_analytics_playground **In order to test** 1. Set ANALYTICS_ENABLED to true 2. Set TINYBIRD_INGEST_TOKEN to your token from the workspace twenty_analytics_playground 3. Set TINYBIRD_GENERATE_JWT_TOKEN to the admin kwt token from the workspace twenty_analytics_playground 4. Set TINYBIRD_WORKSPACE_UUID to the UUID of twenty_analytics_playground 5. Create a Webhook in twenty and set wich events it needs to track 6. Run twenty-worker in order to make the webhooks work. 7. Do your tasks in order to populate the data 8. Look at your webhooks in settings>api and webhooks> your webhook and the statistics should be displayed --- .../__tests__/fetchGraphDataOrThrow.test.js | 6 +++++- .../webhook/utils/fetchGraphDataOrThrow.ts | 2 +- .../jobs/call-webhook.job.ts | 19 ++++++++++++------- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/twenty-front/src/modules/settings/developers/webhook/utils/__tests__/fetchGraphDataOrThrow.test.js b/packages/twenty-front/src/modules/settings/developers/webhook/utils/__tests__/fetchGraphDataOrThrow.test.js index 365c964d2c97..89e493e65afb 100644 --- a/packages/twenty-front/src/modules/settings/developers/webhook/utils/__tests__/fetchGraphDataOrThrow.test.js +++ b/packages/twenty-front/src/modules/settings/developers/webhook/utils/__tests__/fetchGraphDataOrThrow.test.js @@ -7,6 +7,7 @@ global.fetch = jest.fn(); describe('fetchGraphDataOrThrow', () => { const mockWebhookId = 'test-webhook-id'; const mockWindowLength = '7D'; + const mockTinybirdJwt = 'test-jwt'; beforeEach(() => { jest.resetAllMocks(); @@ -27,6 +28,7 @@ describe('fetchGraphDataOrThrow', () => { const result = await fetchGraphDataOrThrow({ webhookId: mockWebhookId, windowLength: mockWindowLength, + tinybirdJwt: mockTinybirdJwt, }); expect(global.fetch).toHaveBeenCalledWith( @@ -71,6 +73,7 @@ describe('fetchGraphDataOrThrow', () => { fetchGraphDataOrThrow({ webhookId: mockWebhookId, windowLength: mockWindowLength, + tinybirdJwt: mockTinybirdJwt, }), ).rejects.toThrow('Something went wrong while fetching webhook usage'); }); @@ -85,13 +88,14 @@ describe('fetchGraphDataOrThrow', () => { await fetchGraphDataOrThrow({ webhookId: mockWebhookId, windowLength: '1D', + tinybirdJwt: mockTinybirdJwt, }); expect(global.fetch).toHaveBeenCalledWith( expect.stringContaining( new URLSearchParams({ ...WEBHOOK_GRAPH_API_OPTIONS_MAP['1D'], - webhookIdRequest: mockWebhookId, + webhookId: mockWebhookId, }).toString(), ), expect.any(Object), diff --git a/packages/twenty-front/src/modules/settings/developers/webhook/utils/fetchGraphDataOrThrow.ts b/packages/twenty-front/src/modules/settings/developers/webhook/utils/fetchGraphDataOrThrow.ts index 4b66c4b9b0d4..083b061da8db 100644 --- a/packages/twenty-front/src/modules/settings/developers/webhook/utils/fetchGraphDataOrThrow.ts +++ b/packages/twenty-front/src/modules/settings/developers/webhook/utils/fetchGraphDataOrThrow.ts @@ -14,7 +14,7 @@ export const fetchGraphDataOrThrow = async ({ }: fetchGraphDataOrThrowProps) => { const queryString = new URLSearchParams({ ...WEBHOOK_GRAPH_API_OPTIONS_MAP[windowLength], - webhookIdRequest: webhookId, + webhookId, }).toString(); const response = await fetch( diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/call-webhook.job.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/call-webhook.job.ts index e03c83204e85..f0ec8317a622 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/call-webhook.job.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/call-webhook.job.ts @@ -26,18 +26,24 @@ export class CallWebhookJob { @Process(CallWebhookJob.name) async handle(data: CallWebhookJobData): Promise { + const commonPayload = { + url: data.targetUrl, + webhookId: data.webhookId, + eventName: data.eventName, + }; + try { const response = await this.httpService.axiosRef.post( data.targetUrl, data, ); + const success = response.status >= 200 && response.status < 300; const eventInput = { action: 'webhook.response', payload: { status: response.status, - url: data.targetUrl, - webhookId: data.webhookId, - eventName: data.eventName, + success, + ...commonPayload, }, }; @@ -46,10 +52,9 @@ export class CallWebhookJob { const eventInput = { action: 'webhook.response', payload: { - status: err.response.status, - url: data.targetUrl, - webhookId: data.webhookId, - eventName: data.eventName, + success: false, + ...commonPayload, + ...(err.response && { status: err.response.status }), }, };