Skip to content

Commit 0ef7e6d

Browse files
authored
Move getSchemaName to util (#13357)
## Context The method was very simple and deterministic, I'm moving its logic to a util so we don't have to import a service to use it.
1 parent 2730b3e commit 0ef7e6d

File tree

18 files changed

+45
-83
lines changed

18 files changed

+45
-83
lines changed

packages/twenty-server/src/database/commands/upgrade-version-command/0-54/0-54-created-by-default-value.command.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { generateDefaultValue } from 'src/engine/metadata-modules/field-metadata
1414
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
1515
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
1616
import { computeTableName } from 'src/engine/utils/compute-table-name.util';
17-
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
17+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
1818

1919
@Command({
2020
name: 'upgrade:0-54:0-54-created-by-default-value',
@@ -27,7 +27,6 @@ export class FixCreatedByDefaultValueCommand extends ActiveOrSuspendedWorkspaces
2727
protected readonly twentyORMGlobalManager: TwentyORMGlobalManager,
2828
@InjectRepository(ObjectMetadataEntity, 'core')
2929
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
30-
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
3130
) {
3231
super(workspaceRepository, twentyORMGlobalManager);
3332
}
@@ -50,8 +49,7 @@ export class FixCreatedByDefaultValueCommand extends ActiveOrSuspendedWorkspaces
5049
continue;
5150
}
5251

53-
const schemaName =
54-
this.workspaceDataSourceService.getSchemaName(workspaceId);
52+
const schemaName = getWorkspaceSchemaName(workspaceId);
5553

5654
const tableName = computeTableName(
5755
objectMetadataItem.nameSingular,

packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-add-enqueued-status-to-workflow-run.command.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
1111
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
1212
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
13+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
1314
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
1415
import { WORKFLOW_RUN_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids';
1516
import { WorkflowRunStatus } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity';
@@ -86,8 +87,7 @@ export class AddEnqueuedStatusToWorkflowRunCommand extends ActiveOrSuspendedWork
8687
);
8788
}
8889

89-
const schemaName =
90-
this.workspaceDataSourceService.getSchemaName(workspaceId);
90+
const schemaName = getWorkspaceSchemaName(workspaceId);
9191

9292
const mainDataSource =
9393
await this.workspaceDataSourceService.connectToMainDataSource();

packages/twenty-server/src/database/commands/upgrade-version-command/1-1/1-1-fix-schema-array-type.command.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/
1414
import { computeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
1515
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
1616
import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util';
17-
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
17+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
1818
import { DatabaseStructureService } from 'src/engine/workspace-manager/workspace-health/services/database-structure.service';
1919

2020
@Command({
@@ -27,7 +27,6 @@ export class FixSchemaArrayTypeCommand extends ActiveOrSuspendedWorkspacesMigrat
2727
protected readonly workspaceRepository: Repository<Workspace>,
2828
protected readonly twentyORMGlobalManager: TwentyORMGlobalManager,
2929
private readonly databaseStructureService: DatabaseStructureService,
30-
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
3130
private readonly typeORMService: TypeORMService,
3231
@InjectRepository(FieldMetadataEntity, 'core')
3332
private readonly fieldMetadataRepository: Repository<FieldMetadataEntity>,
@@ -61,8 +60,7 @@ export class FixSchemaArrayTypeCommand extends ActiveOrSuspendedWorkspacesMigrat
6160
const object = field.object;
6261

6362
const tableName = computeObjectTargetTable(object);
64-
const schemaName =
65-
this.workspaceDataSourceService.getSchemaName(workspaceId);
63+
const schemaName = getWorkspaceSchemaName(workspaceId);
6664
const columns =
6765
await this.databaseStructureService.getWorkspaceTableColumns(
6866
schemaName,

packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/fetch-table-columns.util.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { PostgresTableSchemaColumn } from 'src/engine/metadata-modules/remote-server/types/postgres-table-schema-column';
2+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
23
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
34

45
export const fetchTableColumns = async (
56
workspaceDataSourceService: WorkspaceDataSourceService,
67
workspaceId: string,
78
tableName: string,
89
): Promise<PostgresTableSchemaColumn[]> => {
9-
const schemaName = workspaceDataSourceService.getSchemaName(workspaceId);
10+
const schemaName = getWorkspaceSchemaName(workspaceId);
1011

1112
// TODO: executeRawQuery is deprecated and will throw
1213
const res = await workspaceDataSourceService.executeRawQuery(
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { uuidToBase36 } from 'twenty-shared/utils';
2+
3+
export const getWorkspaceSchemaName = (workspaceId: string): string => {
4+
return `workspace_${uuidToBase36(workspaceId)}`;
5+
};

packages/twenty-server/src/engine/workspace-datasource/workspace-datasource.service.ts

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
PermissionsException,
99
PermissionsExceptionCode,
1010
} from 'src/engine/metadata-modules/permissions/permissions.exception';
11+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
1112

1213
@Injectable()
1314
export class WorkspaceDataSourceService {
@@ -50,7 +51,7 @@ export class WorkspaceDataSourceService {
5051
* @returns
5152
*/
5253
public async createWorkspaceDBSchema(workspaceId: string): Promise<string> {
53-
const schemaName = this.getSchemaName(workspaceId);
54+
const schemaName = getWorkspaceSchemaName(workspaceId);
5455

5556
return await this.typeormService.createSchema(schemaName);
5657
}
@@ -63,45 +64,11 @@ export class WorkspaceDataSourceService {
6364
* @returns
6465
*/
6566
public async deleteWorkspaceDBSchema(workspaceId: string): Promise<void> {
66-
const schemaName = this.getSchemaName(workspaceId);
67+
const schemaName = getWorkspaceSchemaName(workspaceId);
6768

6869
return await this.typeormService.deleteSchema(schemaName);
6970
}
7071

71-
/**
72-
*
73-
* Get the schema name for a workspace
74-
* Note: This is assuming that the workspace only has one schema but we should prefer querying the metadata table instead.
75-
*
76-
* @param workspaceId
77-
* @returns string
78-
*/
79-
public getSchemaName(workspaceId: string): string {
80-
return `workspace_${this.uuidToBase36(workspaceId)}`;
81-
}
82-
83-
/**
84-
*
85-
* Convert a uuid to base36
86-
*
87-
* @param uuid
88-
* @returns string
89-
*/
90-
private uuidToBase36(uuid: string): string {
91-
let devId = false;
92-
93-
if (uuid.startsWith('twenty-')) {
94-
devId = true;
95-
// Clean dev uuids (twenty-)
96-
uuid = uuid.replace('twenty-', '');
97-
}
98-
const hexString = uuid.replace(/-/g, '');
99-
const base10Number = BigInt('0x' + hexString);
100-
const base36String = base10Number.toString(36);
101-
102-
return `${devId ? 'twenty_' : ''}${base36String}`;
103-
}
104-
10572
public async executeRawQuery(
10673
_query: string,
10774
// eslint-disable-next-line @typescript-eslint/no-explicit-any

packages/twenty-server/src/engine/workspace-manager/workspace-health/workspace-health.service.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-
1414
import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service';
1515
import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
1616
import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util';
17-
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
17+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
1818
import { DatabaseStructureService } from 'src/engine/workspace-manager/workspace-health/services/database-structure.service';
1919
import { FieldMetadataHealthService } from 'src/engine/workspace-manager/workspace-health/services/field-metadata-health.service';
2020
import { ObjectMetadataHealthService } from 'src/engine/workspace-manager/workspace-health/services/object-metadata-health.service';
@@ -31,7 +31,6 @@ export class WorkspaceHealthService {
3131
private readonly dataSourceService: DataSourceService,
3232
private readonly objectMetadataService: ObjectMetadataService,
3333
private readonly databaseStructureService: DatabaseStructureService,
34-
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
3534
private readonly objectMetadataHealthService: ObjectMetadataHealthService,
3635
private readonly fieldMetadataHealthService: FieldMetadataHealthService,
3736
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
@@ -42,8 +41,7 @@ export class WorkspaceHealthService {
4241
workspaceId: string,
4342
options: WorkspaceHealthOptions = { mode: WorkspaceHealthMode.All },
4443
): Promise<WorkspaceHealthIssue[]> {
45-
const schemaName =
46-
this.workspaceDataSourceService.getSchemaName(workspaceId);
44+
const schemaName = getWorkspaceSchemaName(workspaceId);
4745
const issues: WorkspaceHealthIssue[] = [];
4846

4947
const dataSourceMetadata =

packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
WorkspaceMigrationTableActionType,
1616
} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
1717
import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.service';
18+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
1819
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
1920
import { WorkspaceMigrationColumnService } from 'src/engine/workspace-manager/workspace-migration-runner/services/workspace-migration-column.service';
2021
import { PostgresQueryRunner } from 'src/engine/workspace-manager/workspace-migration-runner/types/postgres-query-runner.type';
@@ -54,8 +55,7 @@ export class WorkspaceMigrationRunnerService {
5455
})),
5556
);
5657

57-
const schemaName =
58-
this.workspaceDataSourceService.getSchemaName(workspaceId);
58+
const schemaName = getWorkspaceSchemaName(workspaceId);
5959

6060
await transactionQueryRunner.query(
6161
`SET LOCAL search_path TO ${schemaName}`,

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { Processor } from 'src/engine/core-modules/message-queue/decorators/proc
1111
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
1212
import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
1313
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
14-
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
14+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
1515
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
1616
import {
1717
CalendarEventListFetchJob,
@@ -30,7 +30,6 @@ export class CalendarEventListFetchCronJob {
3030
private readonly workspaceRepository: Repository<Workspace>,
3131
@InjectMessageQueue(MessageQueue.calendarQueue)
3232
private readonly messageQueueService: MessageQueueService,
33-
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
3433
private readonly exceptionHandlerService: ExceptionHandlerService,
3534
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
3635
) {}
@@ -52,9 +51,7 @@ export class CalendarEventListFetchCronJob {
5251

5352
for (const activeWorkspace of activeWorkspaces) {
5453
try {
55-
const schemaName = this.workspaceDataSourceService.getSchemaName(
56-
activeWorkspace.id,
57-
);
54+
const schemaName = getWorkspaceSchemaName(activeWorkspace.id);
5855

5956
const calendarChannels = await mainDataSource.query(
6057
`SELECT * FROM ${schemaName}."calendarChannel" WHERE "isSyncEnabled" = true AND "syncStage" IN ('${CalendarChannelSyncStage.FULL_CALENDAR_EVENT_LIST_FETCH_PENDING}', '${CalendarChannelSyncStage.PARTIAL_CALENDAR_EVENT_LIST_FETCH_PENDING}')`,

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Processor } from 'src/engine/core-modules/message-queue/decorators/proc
1111
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
1212
import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
1313
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
14+
import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util';
1415
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
1516
import { CalendarEventListFetchJobData } from 'src/modules/calendar/calendar-event-import-manager/jobs/calendar-event-list-fetch.job';
1617
import { CalendarEventsImportJob } from 'src/modules/calendar/calendar-event-import-manager/jobs/calendar-events-import.job';
@@ -47,9 +48,7 @@ export class CalendarEventsImportCronJob {
4748

4849
for (const activeWorkspace of activeWorkspaces) {
4950
try {
50-
const schemaName = this.workspaceDataSourceService.getSchemaName(
51-
activeWorkspace.id,
52-
);
51+
const schemaName = getWorkspaceSchemaName(activeWorkspace.id);
5352

5453
const calendarChannels = await mainDataSource.query(
5554
`SELECT * FROM ${schemaName}."calendarChannel" WHERE "isSyncEnabled" = true AND "syncStage" = '${CalendarChannelSyncStage.CALENDAR_EVENTS_IMPORT_PENDING}'`,

0 commit comments

Comments
 (0)