Compare commits

...
Author SHA1 Message Date
prastoin cdcfea1385 fix attempt for tests 2026-04-02 17:59:32 +02:00
prastoin 5e7663b27a try catch job for runSync test 2026-04-02 17:43:03 +02:00
prastoin 5cdd5c1b75 modules 2026-04-02 16:27:31 +02:00
prastoin abd3c40e90 feat(server): job to generate sdk client 2026-04-02 16:15:31 +02:00
6 changed files with 69 additions and 20 deletions
@@ -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 {
@@ -0,0 +1,26 @@
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 {
constructor(
private readonly sdkClientGenerationService: SdkClientGenerationService,
) {}
@Process(GenerateSdkClientJob.name)
async handle(data: GenerateSdkClientJobData): Promise<void> {
await this.sdkClientGenerationService.generateSdkClientForApplication({
workspaceId: data.workspaceId,
applicationId: data.applicationId,
applicationUniversalIdentifier: data.applicationUniversalIdentifier,
});
}
}
@@ -19,7 +19,8 @@ import {
SdkClientException,
SdkClientExceptionCode,
} from 'src/engine/core-modules/sdk-client/exceptions/sdk-client.exception';
import { FlatWorkspace } from 'src/engine/core-modules/workspace/types/flat-workspace.type';
import { fromWorkspaceEntityToFlat } from 'src/engine/core-modules/workspace/utils/from-workspace-entity-to-flat.util';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
const SDK_CLIENT_ARCHIVE_NAME = 'twenty-client-sdk.zip';
@@ -32,6 +33,8 @@ export class SdkClientGenerationService {
private readonly fileStorageService: FileStorageService,
@InjectRepository(ApplicationEntity)
private readonly applicationRepository: Repository<ApplicationEntity>,
@InjectRepository(WorkspaceEntity)
private readonly workspaceRepository: Repository<WorkspaceEntity>,
private readonly workspaceCacheService: WorkspaceCacheService,
private readonly workspaceSchemaFactory: WorkspaceSchemaFactory,
) {}
@@ -45,8 +48,11 @@ export class SdkClientGenerationService {
applicationId: string;
applicationUniversalIdentifier: string;
}): Promise<Buffer> {
const workspaceEntity =
await this.workspaceRepository.findOneByOrFail({ id: workspaceId });
const graphqlSchema = await this.workspaceSchemaFactory.createGraphQLSchema(
{ id: workspaceId } as FlatWorkspace,
fromWorkspaceEntityToFlat(workspaceEntity),
applicationId,
);
@@ -6,11 +6,12 @@ import { ApplicationEntity } from 'src/engine/core-modules/application/applicati
import { SdkClientController } from 'src/engine/core-modules/sdk-client/controllers/sdk-client.controller';
import { SdkClientArchiveService } from 'src/engine/core-modules/sdk-client/sdk-client-archive.service';
import { SdkClientGenerationService } from 'src/engine/core-modules/sdk-client/sdk-client-generation.service';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module';
@Module({
imports: [
TypeOrmModule.forFeature([ApplicationEntity]),
TypeOrmModule.forFeature([ApplicationEntity, WorkspaceEntity]),
WorkspaceCacheModule,
CoreGraphQLApiModule,
],
@@ -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,
@@ -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<RoleEntity>,
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<GenerateSdkClientJobData>(
GenerateSdkClientJob.name,
{
workspaceId,
applicationId: twentyStandardFlatApplication.id,
applicationUniversalIdentifier:
twentyStandardFlatApplication.universalIdentifier,
},
),
this.messageQueueService.add<GenerateSdkClientJobData>(
GenerateSdkClientJob.name,
{
workspaceId,
applicationId: workspaceCustomFlatApplication.id,
applicationUniversalIdentifier:
workspaceCustomFlatApplication.universalIdentifier,
},
),
]);
await this.setupDefaultRoles({
workspaceId,