Files
twenty_crm/packages/twenty-server/src/modules/webhook/jobs/call-webhook.job.ts
martmull 695991881f 6071 return only updated fields of records in zapier update trigger (#8193)
- move webhook triggers into `entity-events-to-db.listener.ts`
- refactor event management
- add a `@OnDatabaseEvent` decorator to manage database events
- add updatedFields in updated events
- update openApi webhooks docs
- update zapier integration
2024-11-04 17:44:36 +01:00

69 lines
2.0 KiB
TypeScript

import { HttpService } from '@nestjs/axios';
import { Logger } from '@nestjs/common';
import { AnalyticsService } from 'src/engine/core-modules/analytics/analytics.service';
import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator';
import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator';
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
export type CallWebhookJobData = {
targetUrl: string;
eventName: string;
objectMetadata: { id: string; nameSingular: string };
workspaceId: string;
webhookId: string;
eventDate: Date;
record: any;
updatedFields?: string[];
};
@Processor(MessageQueue.webhookQueue)
export class CallWebhookJob {
private readonly logger = new Logger(CallWebhookJob.name);
constructor(
private readonly httpService: HttpService,
private readonly analyticsService: AnalyticsService,
) {}
@Process(CallWebhookJob.name)
async handle(data: CallWebhookJobData): Promise<void> {
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,
success,
...commonPayload,
},
};
this.analyticsService.create(eventInput, 'webhook', data.workspaceId);
} catch (err) {
const eventInput = {
action: 'webhook.response',
payload: {
success: false,
...commonPayload,
...(err.response && { status: err.response.status }),
},
};
this.analyticsService.create(eventInput, 'webhook', data.workspaceId);
this.logger.error(
`Error calling webhook on targetUrl '${data.targetUrl}': ${err}`,
);
}
}
}