From 6451b7b5e3eb64c0ac1e37a91b7c3f423ebb8221 Mon Sep 17 00:00:00 2001 From: Guillim Date: Mon, 7 Apr 2025 17:13:13 +0200 Subject: [PATCH] Fix-messaging-calendar-issues (#11424) - fixing Event Calendar bug due to TypeORM limitations - avoid systematic crash on contact creation jobs, simply logging --- .../calendar-events-import.service.ts | 17 ++++--- .../create-company-and-contact.service.ts | 46 +++++++++++-------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-events-import.service.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-events-import.service.ts index 826a73a82..dfe0e9154 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-events-import.service.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-events-import.service.ts @@ -106,13 +106,18 @@ export class CalendarEventsImportService { (event) => event.externalId, ); - await this.calendarSaveEventsService.saveCalendarEventsAndEnqueueContactCreationJob( - filteredEvents, - calendarChannel, - connectedAccount, - workspaceId, - ); + const BATCH_SIZE = 1000; + for (let i = 0; i < filteredEvents.length; i = i + BATCH_SIZE) { + const eventsBatch = filteredEvents.slice(i, i + BATCH_SIZE); + + await this.calendarSaveEventsService.saveCalendarEventsAndEnqueueContactCreationJob( + eventsBatch, + calendarChannel, + connectedAccount, + workspaceId, + ); + } const calendarChannelEventAssociationRepository = await this.twentyORMManager.getRepository( 'calendarChannelEventAssociation', diff --git a/packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts b/packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts index a0c113483..3a9488a7b 100644 --- a/packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts +++ b/packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts @@ -6,6 +6,7 @@ import compact from 'lodash.compact'; import { Any, EntityManager, Repository } from 'typeorm'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; +import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service'; import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; @@ -36,6 +37,7 @@ export class CreateCompanyAndContactService { @InjectRepository(ObjectMetadataEntity, 'metadata') private readonly objectMetadataRepository: Repository, private readonly twentyORMGlobalManager: TwentyORMGlobalManager, + private readonly exceptionHandlerService: ExceptionHandlerService, ) {} private async createCompaniesAndPeople( @@ -205,26 +207,34 @@ export class CreateCompanyAndContactService { } for (const contactsBatch of contactsBatches) { - const createdPeople = await this.createCompaniesAndPeople( - connectedAccount, - contactsBatch, - workspaceId, - source, - ); + try { + const createdPeople = await this.createCompaniesAndPeople( + connectedAccount, + contactsBatch, + workspaceId, + source, + ); - this.workspaceEventEmitter.emitDatabaseBatchEvent({ - objectMetadataNameSingular: 'person', - action: DatabaseEventAction.CREATED, - events: createdPeople.map((createdPerson) => ({ - // Fix ' as string': TypeORM typing issue... id is always returned when using save - recordId: createdPerson.id as string, - objectMetadata, - properties: { - after: createdPerson, + this.workspaceEventEmitter.emitDatabaseBatchEvent({ + objectMetadataNameSingular: 'person', + action: DatabaseEventAction.CREATED, + events: createdPeople.map((createdPerson) => ({ + // Fix ' as string': TypeORM typing issue... id is always returned when using save + recordId: createdPerson.id as string, + objectMetadata, + properties: { + after: createdPerson, + }, + })), + workspaceId, + }); + } catch (error) { + this.exceptionHandlerService.captureExceptions([error], { + workspace: { + id: workspaceId, }, - })), - workspaceId, - }); + }); + } } } }