diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/0-54/0-54-created-by-default-value.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/0-54/0-54-created-by-default-value.command.ts index 61970ed7f8d3..f29f6bbbbd8e 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/0-54/0-54-created-by-default-value.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/0-54/0-54-created-by-default-value.command.ts @@ -14,7 +14,7 @@ import { generateDefaultValue } from 'src/engine/metadata-modules/field-metadata import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { computeTableName } from 'src/engine/utils/compute-table-name.util'; -import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; @Command({ name: 'upgrade:0-54:0-54-created-by-default-value', @@ -27,7 +27,6 @@ export class FixCreatedByDefaultValueCommand extends ActiveOrSuspendedWorkspaces protected readonly twentyORMGlobalManager: TwentyORMGlobalManager, @InjectRepository(ObjectMetadataEntity, 'core') private readonly objectMetadataRepository: Repository, - private readonly workspaceDataSourceService: WorkspaceDataSourceService, ) { super(workspaceRepository, twentyORMGlobalManager); } @@ -50,8 +49,7 @@ export class FixCreatedByDefaultValueCommand extends ActiveOrSuspendedWorkspaces continue; } - const schemaName = - this.workspaceDataSourceService.getSchemaName(workspaceId); + const schemaName = getWorkspaceSchemaName(workspaceId); const tableName = computeTableName( objectMetadataItem.nameSingular, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-add-enqueued-status-to-workflow-run.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-add-enqueued-status-to-workflow-run.command.ts index b59229566b1a..98edb3a5c57f 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-add-enqueued-status-to-workflow-run.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-add-enqueued-status-to-workflow-run.command.ts @@ -10,6 +10,7 @@ import { import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { WORKFLOW_RUN_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { WorkflowRunStatus } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity'; @@ -86,8 +87,7 @@ export class AddEnqueuedStatusToWorkflowRunCommand extends ActiveOrSuspendedWork ); } - const schemaName = - this.workspaceDataSourceService.getSchemaName(workspaceId); + const schemaName = getWorkspaceSchemaName(workspaceId); const mainDataSource = await this.workspaceDataSourceService.connectToMainDataSource(); diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-fix-schema-array-type.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-fix-schema-array-type.command.ts index 46ff838c4b41..9bf3996600b5 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-fix-schema-array-type.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-fix-schema-array-type.command.ts @@ -14,7 +14,7 @@ import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/ import { computeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; -import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { DatabaseStructureService } from 'src/engine/workspace-manager/workspace-health/services/database-structure.service'; @Command({ @@ -27,7 +27,6 @@ export class FixSchemaArrayTypeCommand extends ActiveOrSuspendedWorkspacesMigrat protected readonly workspaceRepository: Repository, protected readonly twentyORMGlobalManager: TwentyORMGlobalManager, private readonly databaseStructureService: DatabaseStructureService, - private readonly workspaceDataSourceService: WorkspaceDataSourceService, private readonly typeORMService: TypeORMService, @InjectRepository(FieldMetadataEntity, 'core') private readonly fieldMetadataRepository: Repository, @@ -61,8 +60,7 @@ export class FixSchemaArrayTypeCommand extends ActiveOrSuspendedWorkspacesMigrat const object = field.object; const tableName = computeObjectTargetTable(object); - const schemaName = - this.workspaceDataSourceService.getSchemaName(workspaceId); + const schemaName = getWorkspaceSchemaName(workspaceId); const columns = await this.databaseStructureService.getWorkspaceTableColumns( schemaName, diff --git a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/fetch-table-columns.util.ts b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/fetch-table-columns.util.ts index d1cd1524db5a..3a22c3e84026 100644 --- a/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/fetch-table-columns.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/fetch-table-columns.util.ts @@ -1,4 +1,5 @@ import { PostgresTableSchemaColumn } from 'src/engine/metadata-modules/remote-server/types/postgres-table-schema-column'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; export const fetchTableColumns = async ( @@ -6,7 +7,7 @@ export const fetchTableColumns = async ( workspaceId: string, tableName: string, ): Promise => { - const schemaName = workspaceDataSourceService.getSchemaName(workspaceId); + const schemaName = getWorkspaceSchemaName(workspaceId); // TODO: executeRawQuery is deprecated and will throw const res = await workspaceDataSourceService.executeRawQuery( diff --git a/packages/twenty-server/src/engine/workspace-datasource/utils/get-workspace-schema-name.util.ts b/packages/twenty-server/src/engine/workspace-datasource/utils/get-workspace-schema-name.util.ts new file mode 100644 index 000000000000..02d2f9f54aec --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-datasource/utils/get-workspace-schema-name.util.ts @@ -0,0 +1,5 @@ +import { uuidToBase36 } from 'twenty-shared/utils'; + +export const getWorkspaceSchemaName = (workspaceId: string): string => { + return `workspace_${uuidToBase36(workspaceId)}`; +}; diff --git a/packages/twenty-server/src/engine/workspace-datasource/workspace-datasource.service.ts b/packages/twenty-server/src/engine/workspace-datasource/workspace-datasource.service.ts index 41661ab3dc93..eae885d932e5 100644 --- a/packages/twenty-server/src/engine/workspace-datasource/workspace-datasource.service.ts +++ b/packages/twenty-server/src/engine/workspace-datasource/workspace-datasource.service.ts @@ -8,6 +8,7 @@ import { PermissionsException, PermissionsExceptionCode, } from 'src/engine/metadata-modules/permissions/permissions.exception'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; @Injectable() export class WorkspaceDataSourceService { @@ -50,7 +51,7 @@ export class WorkspaceDataSourceService { * @returns */ public async createWorkspaceDBSchema(workspaceId: string): Promise { - const schemaName = this.getSchemaName(workspaceId); + const schemaName = getWorkspaceSchemaName(workspaceId); return await this.typeormService.createSchema(schemaName); } @@ -63,45 +64,11 @@ export class WorkspaceDataSourceService { * @returns */ public async deleteWorkspaceDBSchema(workspaceId: string): Promise { - const schemaName = this.getSchemaName(workspaceId); + const schemaName = getWorkspaceSchemaName(workspaceId); return await this.typeormService.deleteSchema(schemaName); } - /** - * - * Get the schema name for a workspace - * Note: This is assuming that the workspace only has one schema but we should prefer querying the metadata table instead. - * - * @param workspaceId - * @returns string - */ - public getSchemaName(workspaceId: string): string { - return `workspace_${this.uuidToBase36(workspaceId)}`; - } - - /** - * - * Convert a uuid to base36 - * - * @param uuid - * @returns string - */ - private uuidToBase36(uuid: string): string { - let devId = false; - - if (uuid.startsWith('twenty-')) { - devId = true; - // Clean dev uuids (twenty-) - uuid = uuid.replace('twenty-', ''); - } - const hexString = uuid.replace(/-/g, ''); - const base10Number = BigInt('0x' + hexString); - const base36String = base10Number.toString(36); - - return `${devId ? 'twenty_' : ''}${base36String}`; - } - public async executeRawQuery( _query: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-health/workspace-health.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-health/workspace-health.service.ts index 34c52d4b0250..37c776885730 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-health/workspace-health.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-health/workspace-health.service.ts @@ -14,7 +14,7 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data- import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; -import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { DatabaseStructureService } from 'src/engine/workspace-manager/workspace-health/services/database-structure.service'; import { FieldMetadataHealthService } from 'src/engine/workspace-manager/workspace-health/services/field-metadata-health.service'; import { ObjectMetadataHealthService } from 'src/engine/workspace-manager/workspace-health/services/object-metadata-health.service'; @@ -31,7 +31,6 @@ export class WorkspaceHealthService { private readonly dataSourceService: DataSourceService, private readonly objectMetadataService: ObjectMetadataService, private readonly databaseStructureService: DatabaseStructureService, - private readonly workspaceDataSourceService: WorkspaceDataSourceService, private readonly objectMetadataHealthService: ObjectMetadataHealthService, private readonly fieldMetadataHealthService: FieldMetadataHealthService, private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, @@ -42,8 +41,7 @@ export class WorkspaceHealthService { workspaceId: string, options: WorkspaceHealthOptions = { mode: WorkspaceHealthMode.All }, ): Promise { - const schemaName = - this.workspaceDataSourceService.getSchemaName(workspaceId); + const schemaName = getWorkspaceSchemaName(workspaceId); const issues: WorkspaceHealthIssue[] = []; const dataSourceMetadata = diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts index 9284d9d351fc..07333e3d342e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts @@ -15,6 +15,7 @@ import { WorkspaceMigrationTableActionType, } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.service'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { WorkspaceMigrationColumnService } from 'src/engine/workspace-manager/workspace-migration-runner/services/workspace-migration-column.service'; import { PostgresQueryRunner } from 'src/engine/workspace-manager/workspace-migration-runner/types/postgres-query-runner.type'; @@ -54,8 +55,7 @@ export class WorkspaceMigrationRunnerService { })), ); - const schemaName = - this.workspaceDataSourceService.getSchemaName(workspaceId); + const schemaName = getWorkspaceSchemaName(workspaceId); await transactionQueryRunner.query( `SET LOCAL search_path TO ${schemaName}`, diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts index e88329b399d1..92dec6af7efa 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts @@ -11,7 +11,7 @@ import { Processor } from 'src/engine/core-modules/message-queue/decorators/proc 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 { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { CalendarEventListFetchJob, @@ -30,7 +30,6 @@ export class CalendarEventListFetchCronJob { private readonly workspaceRepository: Repository, @InjectMessageQueue(MessageQueue.calendarQueue) private readonly messageQueueService: MessageQueueService, - private readonly twentyORMGlobalManager: TwentyORMGlobalManager, private readonly exceptionHandlerService: ExceptionHandlerService, private readonly workspaceDataSourceService: WorkspaceDataSourceService, ) {} @@ -52,9 +51,7 @@ export class CalendarEventListFetchCronJob { for (const activeWorkspace of activeWorkspaces) { try { - const schemaName = this.workspaceDataSourceService.getSchemaName( - activeWorkspace.id, - ); + const schemaName = getWorkspaceSchemaName(activeWorkspace.id); const calendarChannels = await mainDataSource.query( `SELECT * FROM ${schemaName}."calendarChannel" WHERE "isSyncEnabled" = true AND "syncStage" IN ('${CalendarChannelSyncStage.FULL_CALENDAR_EVENT_LIST_FETCH_PENDING}', '${CalendarChannelSyncStage.PARTIAL_CALENDAR_EVENT_LIST_FETCH_PENDING}')`, diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts index 7e7398228674..5b7a75cf41c7 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts @@ -11,6 +11,7 @@ import { Processor } from 'src/engine/core-modules/message-queue/decorators/proc 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 { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { CalendarEventListFetchJobData } from 'src/modules/calendar/calendar-event-import-manager/jobs/calendar-event-list-fetch.job'; import { CalendarEventsImportJob } from 'src/modules/calendar/calendar-event-import-manager/jobs/calendar-events-import.job'; @@ -47,9 +48,7 @@ export class CalendarEventsImportCronJob { for (const activeWorkspace of activeWorkspaces) { try { - const schemaName = this.workspaceDataSourceService.getSchemaName( - activeWorkspace.id, - ); + const schemaName = getWorkspaceSchemaName(activeWorkspace.id); const calendarChannels = await mainDataSource.query( `SELECT * FROM ${schemaName}."calendarChannel" WHERE "isSyncEnabled" = true AND "syncStage" = '${CalendarChannelSyncStage.CALENDAR_EVENTS_IMPORT_PENDING}'`, diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant.listener.ts b/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant.listener.ts index e9e5ac12d3de..a35426c9f6b6 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant.listener.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-participant-manager/listeners/calendar-event-participant.listener.ts @@ -6,7 +6,7 @@ import { Repository } from 'typeorm'; import { OnCustomBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-custom-batch-event.decorator'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; -import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type'; import { CalendarEventParticipantWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity'; import { TimelineActivityRepository } from 'src/modules/timeline/repositories/timeline-activity.repository'; @@ -17,7 +17,6 @@ export class CalendarEventParticipantListener { constructor( @InjectObjectMetadataRepository(TimelineActivityWorkspaceEntity) private readonly timelineActivityRepository: TimelineActivityRepository, - private readonly workspaceDataSourceService: WorkspaceDataSourceService, @InjectRepository(ObjectMetadataEntity, 'core') private readonly objectMetadataRepository: Repository, ) {} @@ -38,8 +37,7 @@ export class CalendarEventParticipantListener { // TODO: move to a job? - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); + const dataSourceSchema = getWorkspaceSchemaName(workspaceId); const calendarEventObjectMetadata = await this.objectMetadataRepository.findOneOrFail({ diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-message-list-fetch.cron.job.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-message-list-fetch.cron.job.ts index 896f121b8d51..e92f678146e8 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-message-list-fetch.cron.job.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-message-list-fetch.cron.job.ts @@ -11,6 +11,7 @@ import { Processor } from 'src/engine/core-modules/message-queue/decorators/proc 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 { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { MessageChannelSyncStage } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; import { @@ -48,9 +49,7 @@ export class MessagingMessageListFetchCronJob { for (const activeWorkspace of activeWorkspaces) { try { - const schemaName = this.workspaceDataSourceService.getSchemaName( - activeWorkspace.id, - ); + const schemaName = getWorkspaceSchemaName(activeWorkspace.id); // TODO: deprecate looking for FULL_MESSAGE_LIST_FETCH_PENDING as we introduce MESSAGE_LIST_FETCH_PENDING const messageChannels = await mainDataSource.query( diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-messages-import.cron.job.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-messages-import.cron.job.ts index a7181a15f6f0..08ea8122fedf 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-messages-import.cron.job.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-messages-import.cron.job.ts @@ -11,6 +11,7 @@ import { Processor } from 'src/engine/core-modules/message-queue/decorators/proc 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 { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { MessageChannelSyncStage } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; import { @@ -48,9 +49,7 @@ export class MessagingMessagesImportCronJob { for (const activeWorkspace of activeWorkspaces) { try { - const schemaName = this.workspaceDataSourceService.getSchemaName( - activeWorkspace.id, - ); + const schemaName = getWorkspaceSchemaName(activeWorkspace.id); const messageChannels = await mainDataSource.query( `SELECT * FROM ${schemaName}."messageChannel" WHERE "isSyncEnabled" = true AND "syncStage" = '${MessageChannelSyncStage.MESSAGES_IMPORT_PENDING}'`, diff --git a/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant.listener.ts b/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant.listener.ts index a8c8168c3163..ddea63bb8a2d 100644 --- a/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant.listener.ts +++ b/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant.listener.ts @@ -6,7 +6,7 @@ import { Repository } from 'typeorm'; import { OnCustomBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-custom-batch-event.decorator'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; -import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type'; import { MessageParticipantWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-participant.workspace-entity'; import { TimelineActivityRepository } from 'src/modules/timeline/repositories/timeline-activity.repository'; @@ -17,7 +17,6 @@ export class MessageParticipantListener { constructor( @InjectObjectMetadataRepository(TimelineActivityWorkspaceEntity) private readonly timelineActivityRepository: TimelineActivityRepository, - private readonly workspaceDataSourceService: WorkspaceDataSourceService, @InjectRepository(ObjectMetadataEntity, 'core') private readonly objectMetadataRepository: Repository, ) {} @@ -35,9 +34,7 @@ export class MessageParticipantListener { // TODO: move to a job? - const dataSourceSchema = this.workspaceDataSourceService.getSchemaName( - batchEvent.workspaceId, - ); + const dataSourceSchema = getWorkspaceSchemaName(batchEvent.workspaceId); const messageObjectMetadata = await this.objectMetadataRepository.findOneOrFail({ diff --git a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-run-queue/cron/jobs/workflow-run-enqueue.cron.job.ts b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-run-queue/cron/jobs/workflow-run-enqueue.cron.job.ts index 8a8f440a09de..0bc3429ab709 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-run-queue/cron/jobs/workflow-run-enqueue.cron.job.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-run-queue/cron/jobs/workflow-run-enqueue.cron.job.ts @@ -14,6 +14,7 @@ import { MetricsService } from 'src/engine/core-modules/metrics/metrics.service' import { MetricsKeys } from 'src/engine/core-modules/metrics/types/metrics-keys.type'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { WorkflowRunStatus, @@ -70,9 +71,7 @@ export class WorkflowRunEnqueueJob { continue; } - const schemaName = this.workspaceDataSourceService.getSchemaName( - activeWorkspace.id, - ); + const schemaName = getWorkspaceSchemaName(activeWorkspace.id); // Using raw query to avoid storing repository in cache const workflowRuns = await mainDataSource.query( diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/crons/jobs/cron-trigger.cron.job.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/crons/jobs/cron-trigger.cron.job.ts index fad9137f92ba..a9ec36c8a099 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/crons/jobs/cron-trigger.cron.job.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/automated-trigger/crons/jobs/cron-trigger.cron.job.ts @@ -12,6 +12,8 @@ import { Processor } from 'src/engine/core-modules/message-queue/decorators/proc 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 { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; +import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { AutomatedTriggerType } from 'src/modules/workflow/common/standard-objects/workflow-automated-trigger.workspace-entity'; import { CronTriggerSettings } from 'src/modules/workflow/workflow-trigger/automated-trigger/constants/automated-trigger-settings'; import { shouldRunNow } from 'src/modules/workflow/workflow-trigger/automated-trigger/crons/utils/should-run-now.utils'; @@ -19,7 +21,6 @@ import { WorkflowTriggerJob, WorkflowTriggerJobData, } from 'src/modules/workflow/workflow-trigger/jobs/workflow-trigger.job'; -import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; export const CRON_TRIGGER_CRON_PATTERN = '* * * * *'; @@ -50,9 +51,7 @@ export class CronTriggerCronJob { for (const activeWorkspace of activeWorkspaces) { try { - const schemaName = this.workspaceDataSourceService.getSchemaName( - activeWorkspace.id, - ); + const schemaName = getWorkspaceSchemaName(activeWorkspace.id); const workflowAutomatedCronTriggers = await mainDataSource.query( `SELECT * FROM ${schemaName}."workflowAutomatedTrigger" WHERE type = '${AutomatedTriggerType.CRON}'`, diff --git a/packages/twenty-shared/src/utils/index.ts b/packages/twenty-shared/src/utils/index.ts index acfb641fbfde..0ba5dad80f89 100644 --- a/packages/twenty-shared/src/utils/index.ts +++ b/packages/twenty-shared/src/utils/index.ts @@ -28,6 +28,7 @@ export { getUrlHostnameOrThrow } from './url/getUrlHostnameOrThrow'; export { isValidHostname } from './url/isValidHostname'; export { isValidUrl } from './url/isValidUrl'; export { lowercaseUrlOriginAndRemoveTrailingSlash } from './url/lowercaseUrlOriginAndRemoveTrailingSlash'; +export { uuidToBase36 } from './uuidToBase36'; export { isDefined } from './validation/isDefined'; export { isLabelIdentifierFieldMetadataTypes } from './validation/isLabelIdentifierFieldMetadataTypes'; export { isValidLocale } from './validation/isValidLocale'; diff --git a/packages/twenty-shared/src/utils/uuidToBase36.ts b/packages/twenty-shared/src/utils/uuidToBase36.ts new file mode 100644 index 000000000000..a1a2dfe8b9f1 --- /dev/null +++ b/packages/twenty-shared/src/utils/uuidToBase36.ts @@ -0,0 +1,7 @@ +export const uuidToBase36 = (uuid: string): string => { + const hexString = uuid.replace(/-/g, ''); + const base10Number = BigInt('0x' + hexString); + const base36String = base10Number.toString(36); + + return base36String; +};