From a53b9cb68ae475c8a6e48d19b5d0850e5644980c Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:53:56 +0200 Subject: [PATCH] On workspace creation generate sdk client through a job (#19271) Avoid overloading the workspace creation with the standard and custom app sdk generation, do through a job ```ts [Nest] 90397 - 04/02/2026, 4:44:20 PM LOG [CoreEntityCacheService] Cache stats: localCacheSize=0 memoizerCacheSize=0 memoizerPendingSize=0 entriesByKey={} versionsByKey={} [Nest] 90397 - 04/02/2026, 4:45:03 PM LOG [BullMQDriver] Processing job 4325 with name CallWebhookJobsForMetadataJob on queue webhook-queue [Nest] 90397 - 04/02/2026, 4:45:03 PM LOG [BullMQDriver] Processing job 1 with name GenerateSdkClientJob on queue workspace-queue [Nest] 90397 - 04/02/2026, 4:45:03 PM LOG [BullMQDriver] Job 1 with name GenerateSdkClientJob processed on queue workspace-queue in 0.64ms [Nest] 90397 - 04/02/2026, 4:45:03 PM LOG [BullMQDriver] Processing job 2 with name GenerateSdkClientJob on queue workspace-queue [Nest] 90397 - 04/02/2026, 4:45:03 PM LOG [BullMQDriver] Job 2 with name GenerateSdkClientJob processed on queue workspace-queue in 0.06ms [Nest] 90397 - 04/02/2026, 4:45:03 PM LOG [BullMQDriver] Job 4325 with name CallWebhookJobsForMetadataJob processed on queue webhook-queue in 17.47ms [Nest] 90397 - 04/02/2026, 4:45:03 PM LOG [BullMQDriver] Processing job 4326 with name CallWebhookJobsForMetadataJob on queue webhook-queue ``` --- .../core-modules/message-queue/jobs.module.ts | 4 ++ .../jobs/generate-sdk-client.job.ts | 37 ++++++++++++++++ .../workspace-manager.module.ts | 2 - .../workspace-manager.service.ts | 44 ++++++++++++------- 4 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 packages/twenty-server/src/engine/core-modules/sdk-client/jobs/generate-sdk-client.job.ts diff --git a/packages/twenty-server/src/engine/core-modules/message-queue/jobs.module.ts b/packages/twenty-server/src/engine/core-modules/message-queue/jobs.module.ts index d9d207c6c5..2aee51b776 100644 --- a/packages/twenty-server/src/engine/core-modules/message-queue/jobs.module.ts +++ b/packages/twenty-server/src/engine/core-modules/message-queue/jobs.module.ts @@ -29,6 +29,8 @@ import { WebhookJobModule } from 'src/engine/metadata-modules/webhook/jobs/webho import { SubscriptionsModule } from 'src/engine/subscriptions/subscriptions.module'; import { CleanOnboardingWorkspacesJob } from 'src/engine/workspace-manager/workspace-cleaner/crons/clean-onboarding-workspaces.job'; import { CleanSuspendedWorkspacesJob } from 'src/engine/workspace-manager/workspace-cleaner/crons/clean-suspended-workspaces.job'; +import { GenerateSdkClientJob } from 'src/engine/core-modules/sdk-client/jobs/generate-sdk-client.job'; +import { SdkClientModule } from 'src/engine/core-modules/sdk-client/sdk-client.module'; import { CleanWorkspaceDeletionWarningUserVarsJob } from 'src/engine/workspace-manager/workspace-cleaner/jobs/clean-workspace-deletion-warning-user-vars.job'; import { WorkspaceCleanerModule } from 'src/engine/workspace-manager/workspace-cleaner/workspace-cleaner.module'; import { CalendarEventParticipantManagerModule } from 'src/modules/calendar/calendar-event-participant-manager/calendar-event-participant-manager.module'; @@ -64,6 +66,7 @@ import { WorkflowModule } from 'src/modules/workflow/workflow.module'; WorkflowModule, FavoriteModule, NavigationMenuItemModule, + SdkClientModule, WorkspaceCleanerModule, SubscriptionsModule, AuditJobModule, @@ -80,6 +83,7 @@ import { WorkflowModule } from 'src/modules/workflow/workflow.module'; HandleWorkspaceMemberDeletedJob, CleanWorkspaceDeletionWarningUserVarsJob, UpdateWorkspaceMemberEmailJob, + GenerateSdkClientJob, ], }) export class JobsModule { diff --git a/packages/twenty-server/src/engine/core-modules/sdk-client/jobs/generate-sdk-client.job.ts b/packages/twenty-server/src/engine/core-modules/sdk-client/jobs/generate-sdk-client.job.ts new file mode 100644 index 0000000000..754dc3fd53 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/sdk-client/jobs/generate-sdk-client.job.ts @@ -0,0 +1,37 @@ +import { Logger } from '@nestjs/common'; + +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 { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; +import { SdkClientGenerationService } from 'src/engine/core-modules/sdk-client/sdk-client-generation.service'; + +export type GenerateSdkClientJobData = { + workspaceId: string; + applicationId: string; + applicationUniversalIdentifier: string; +}; + +@Processor(MessageQueue.workspaceQueue) +export class GenerateSdkClientJob { + private readonly logger = new Logger(GenerateSdkClientJob.name); + + constructor( + private readonly sdkClientGenerationService: SdkClientGenerationService, + ) {} + + @Process(GenerateSdkClientJob.name) + async handle(data: GenerateSdkClientJobData): Promise { + try { + await this.sdkClientGenerationService.generateSdkClientForApplication({ + workspaceId: data.workspaceId, + applicationId: data.applicationId, + applicationUniversalIdentifier: data.applicationUniversalIdentifier, + }); + } catch (error) { + this.logger.error( + `Failed to generate SDK client for application "${data.applicationUniversalIdentifier}" in workspace "${data.workspaceId}"`, + error instanceof Error ? error.stack : String(error), + ); + } + } +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.module.ts index 2eba9f24ad..31557fc4be 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.module.ts @@ -3,7 +3,6 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { ApplicationModule } from 'src/engine/core-modules/application/application.module'; import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; -import { SdkClientModule } from 'src/engine/core-modules/sdk-client/sdk-client.module'; import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { AiAgentModule } from 'src/engine/metadata-modules/ai/ai-agent/ai-agent.module'; @@ -40,7 +39,6 @@ import { WorkspaceManagerService } from './workspace-manager.service'; RoleModule, UserRoleModule, ApplicationModule, - SdkClientModule, TypeOrmModule.forFeature([ FieldMetadataEntity, RoleTargetEntity, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts index 23bd6c23c6..cb218f9f36 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts @@ -5,7 +5,13 @@ import { Repository } from 'typeorm'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; import { FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; -import { SdkClientGenerationService } from 'src/engine/core-modules/sdk-client/sdk-client-generation.service'; +import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; +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 { + GenerateSdkClientJob, + GenerateSdkClientJobData, +} from 'src/engine/core-modules/sdk-client/jobs/generate-sdk-client.job'; import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; @@ -33,7 +39,8 @@ export class WorkspaceManagerService { @InjectRepository(RoleEntity) private readonly roleRepository: Repository, private readonly applicationService: ApplicationService, - private readonly sdkClientGenerationService: SdkClientGenerationService, + @InjectMessageQueue(MessageQueue.workspaceQueue) + private readonly messageQueueService: MessageQueueService, ) {} public async init({ @@ -86,19 +93,26 @@ export class WorkspaceManagerService { }, ); - await this.sdkClientGenerationService.generateSdkClientForApplication({ - workspaceId, - applicationId: twentyStandardFlatApplication.id, - applicationUniversalIdentifier: - twentyStandardFlatApplication.universalIdentifier, - }); - - await this.sdkClientGenerationService.generateSdkClientForApplication({ - workspaceId, - applicationId: workspaceCustomFlatApplication.id, - applicationUniversalIdentifier: - workspaceCustomFlatApplication.universalIdentifier, - }); + await Promise.all([ + this.messageQueueService.add( + GenerateSdkClientJob.name, + { + workspaceId, + applicationId: twentyStandardFlatApplication.id, + applicationUniversalIdentifier: + twentyStandardFlatApplication.universalIdentifier, + }, + ), + this.messageQueueService.add( + GenerateSdkClientJob.name, + { + workspaceId, + applicationId: workspaceCustomFlatApplication.id, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, + }, + ), + ]); await this.setupDefaultRoles({ workspaceId,