Fix webhook size too big (#12749)
This commit is contained in:
@ -6,8 +6,8 @@ import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metad
|
|||||||
import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action';
|
import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action';
|
||||||
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
|
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
|
||||||
import { objectRecordChangedValues } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-values';
|
import { objectRecordChangedValues } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-values';
|
||||||
import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter';
|
|
||||||
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
|
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
|
||||||
|
import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ApiEventEmitterService {
|
export class ApiEventEmitterService {
|
||||||
|
|||||||
@ -17,6 +17,7 @@ import { SubscriptionsJob } from 'src/engine/subscriptions/subscriptions.job';
|
|||||||
import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type';
|
import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type';
|
||||||
import { UpsertTimelineActivityFromInternalEvent } from 'src/modules/timeline/jobs/upsert-timeline-activity-from-internal-event.job';
|
import { UpsertTimelineActivityFromInternalEvent } from 'src/modules/timeline/jobs/upsert-timeline-activity-from-internal-event.job';
|
||||||
import { CallWebhookJobsJob } from 'src/modules/webhook/jobs/call-webhook-jobs.job';
|
import { CallWebhookJobsJob } from 'src/modules/webhook/jobs/call-webhook-jobs.job';
|
||||||
|
import { ObjectRecordEventForWebhook } from 'src/modules/webhook/types/object-record-event-for-webhook.type';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class EntityEventsToDbListener {
|
export class EntityEventsToDbListener {
|
||||||
@ -66,15 +67,26 @@ export class EntityEventsToDbListener {
|
|||||||
(event) => event.objectMetadata?.isAuditLogged,
|
(event) => event.objectMetadata?.isAuditLogged,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const batchEventEventsForWebhook: ObjectRecordEventForWebhook[] =
|
||||||
|
batchEvent.events.map((event) => ({
|
||||||
|
...event,
|
||||||
|
objectMetadata: {
|
||||||
|
id: event.objectMetadata.id,
|
||||||
|
nameSingular: event.objectMetadata.nameSingular,
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
this.subscriptionsQueueService.add<WorkspaceEventBatch<T>>(
|
this.subscriptionsQueueService.add<WorkspaceEventBatch<T>>(
|
||||||
SubscriptionsJob.name,
|
SubscriptionsJob.name,
|
||||||
batchEvent,
|
batchEvent,
|
||||||
{ retryLimit: 3 },
|
{ retryLimit: 3 },
|
||||||
),
|
),
|
||||||
this.webhookQueueService.add<WorkspaceEventBatch<T>>(
|
this.webhookQueueService.add<
|
||||||
|
WorkspaceEventBatch<ObjectRecordEventForWebhook>
|
||||||
|
>(
|
||||||
CallWebhookJobsJob.name,
|
CallWebhookJobsJob.name,
|
||||||
batchEvent,
|
{ ...batchEvent, events: batchEventEventsForWebhook },
|
||||||
{
|
{
|
||||||
retryLimit: 3,
|
retryLimit: 3,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,14 +1,12 @@
|
|||||||
import { Logger } from '@nestjs/common';
|
|
||||||
|
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
import { ArrayContains } from 'typeorm';
|
import { ArrayContains } from 'typeorm';
|
||||||
|
|
||||||
import { ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event';
|
|
||||||
import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator';
|
import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator';
|
||||||
import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator';
|
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 { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator';
|
||||||
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
|
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
|
||||||
import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
|
import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
|
||||||
|
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||||
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
|
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
|
||||||
import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type';
|
import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type';
|
||||||
import {
|
import {
|
||||||
@ -17,11 +15,10 @@ import {
|
|||||||
} from 'src/modules/webhook/jobs/call-webhook.job';
|
} from 'src/modules/webhook/jobs/call-webhook.job';
|
||||||
import { WebhookWorkspaceEntity } from 'src/modules/webhook/standard-objects/webhook.workspace-entity';
|
import { WebhookWorkspaceEntity } from 'src/modules/webhook/standard-objects/webhook.workspace-entity';
|
||||||
import { removeSecretFromWebhookRecord } from 'src/utils/remove-secret-from-webhook-record';
|
import { removeSecretFromWebhookRecord } from 'src/utils/remove-secret-from-webhook-record';
|
||||||
|
import { ObjectRecordEventForWebhook } from 'src/modules/webhook/types/object-record-event-for-webhook.type';
|
||||||
|
|
||||||
@Processor(MessageQueue.webhookQueue)
|
@Processor(MessageQueue.webhookQueue)
|
||||||
export class CallWebhookJobsJob {
|
export class CallWebhookJobsJob {
|
||||||
private readonly logger = new Logger(CallWebhookJobsJob.name);
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@InjectMessageQueue(MessageQueue.webhookQueue)
|
@InjectMessageQueue(MessageQueue.webhookQueue)
|
||||||
private readonly messageQueueService: MessageQueueService,
|
private readonly messageQueueService: MessageQueueService,
|
||||||
@ -30,7 +27,7 @@ export class CallWebhookJobsJob {
|
|||||||
|
|
||||||
@Process(CallWebhookJobsJob.name)
|
@Process(CallWebhookJobsJob.name)
|
||||||
async handle(
|
async handle(
|
||||||
workspaceEventBatch: WorkspaceEventBatch<ObjectRecordEvent>,
|
workspaceEventBatch: WorkspaceEventBatch<ObjectRecordEventForWebhook>,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
// If you change that function, double check it does not break Zapier
|
// If you change that function, double check it does not break Zapier
|
||||||
// trigger in packages/twenty-zapier/src/triggers/trigger_record.ts
|
// trigger in packages/twenty-zapier/src/triggers/trigger_record.ts
|
||||||
@ -56,10 +53,11 @@ export class CallWebhookJobsJob {
|
|||||||
|
|
||||||
for (const eventData of workspaceEventBatch.events) {
|
for (const eventData of workspaceEventBatch.events) {
|
||||||
const eventName = workspaceEventBatch.name;
|
const eventName = workspaceEventBatch.name;
|
||||||
const objectMetadata = {
|
const objectMetadata: Pick<ObjectMetadataEntity, 'id' | 'nameSingular'> =
|
||||||
id: eventData.objectMetadata.id,
|
{
|
||||||
nameSingular: eventData.objectMetadata.nameSingular,
|
id: eventData.objectMetadata.id,
|
||||||
};
|
nameSingular: eventData.objectMetadata.nameSingular,
|
||||||
|
};
|
||||||
const workspaceId = workspaceEventBatch.workspaceId;
|
const workspaceId = workspaceEventBatch.workspaceId;
|
||||||
const record =
|
const record =
|
||||||
'after' in eventData.properties && isDefined(eventData.properties.after)
|
'after' in eventData.properties && isDefined(eventData.properties.after)
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import { HttpService } from '@nestjs/axios';
|
import { HttpService } from '@nestjs/axios';
|
||||||
import { Logger } from '@nestjs/common';
|
|
||||||
|
|
||||||
import crypto from 'crypto';
|
import crypto from 'crypto';
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ export type CallWebhookJobData = {
|
|||||||
|
|
||||||
@Processor(MessageQueue.webhookQueue)
|
@Processor(MessageQueue.webhookQueue)
|
||||||
export class CallWebhookJob {
|
export class CallWebhookJob {
|
||||||
private readonly logger = new Logger(CallWebhookJob.name);
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly httpService: HttpService,
|
private readonly httpService: HttpService,
|
||||||
private readonly auditService: AuditService,
|
private readonly auditService: AuditService,
|
||||||
|
|||||||
@ -0,0 +1,10 @@
|
|||||||
|
import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface';
|
||||||
|
|
||||||
|
import { ObjectRecordEvent } from 'src/engine/core-modules/event-emitter/types/object-record-event.event';
|
||||||
|
|
||||||
|
export type ObjectRecordEventForWebhook = Omit<
|
||||||
|
ObjectRecordEvent,
|
||||||
|
'objectMetadata'
|
||||||
|
> & {
|
||||||
|
objectMetadata: Pick<ObjectMetadataInterface, 'id' | 'nameSingular'>;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user