Deprecate workspace datasoure (#16507)

This commit is contained in:
Weiko
2025-12-11 18:27:49 +01:00
committed by GitHub
parent 3dd2684254
commit 083a038f8a
39 changed files with 200 additions and 1929 deletions
@@ -33,11 +33,15 @@ export class GlobalWorkspaceDataSourceService
rejectUnauthorized: false,
}
: undefined,
poolSize: this.twentyConfigService.get('PG_POOL_MAX_CONNECTIONS'),
extra: {
query_timeout: 10000, // 10 seconds,
idleTimeoutMillis: 120_000, // 2 minutes,
max: 4,
allowExitOnIdle: true,
idleTimeoutMillis: this.twentyConfigService.get(
'PG_POOL_IDLE_TIMEOUT_MS',
),
allowExitOnIdle: this.twentyConfigService.get(
'PG_POOL_ALLOW_EXIT_ON_IDLE',
),
},
},
this.workspaceEventEmitter,
@@ -15,7 +15,6 @@ import { EntityMetadataNotFoundError } from 'typeorm/error/EntityMetadataNotFoun
import { type WorkspaceAuthContext } from 'src/engine/api/common/interfaces/workspace-auth-context.interface';
import { type FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface';
import { type WorkspaceDataSourceInterface } from 'src/engine/twenty-orm/interfaces/workspace-datasource.interface';
import {
PermissionsException,
@@ -32,11 +31,7 @@ type CreateQueryBuilderOptions = {
calledByWorkspaceEntityManager?: boolean;
};
export class GlobalWorkspaceDataSource
extends DataSource
implements WorkspaceDataSourceInterface
{
readonly isGlobalFlow = true;
export class GlobalWorkspaceDataSource extends DataSource {
readonly eventEmitterService: WorkspaceEventEmitter;
private _isConstructing = true;
dataSourceWithOverridenCreateQueryBuilder: GlobalWorkspaceDataSource;
@@ -107,7 +102,7 @@ export class GlobalWorkspaceDataSource
return super.createEntityManager(queryRunner) as WorkspaceEntityManager;
}
return new WorkspaceEntityManager(undefined, this, queryRunner);
return new WorkspaceEntityManager(this, queryRunner);
}
override createQueryRunner(
@@ -3,17 +3,15 @@ import { Injectable, type Type } from '@nestjs/common';
import { type ObjectLiteral } from 'typeorm';
import { type WorkspaceAuthContext } from 'src/engine/api/common/interfaces/workspace-auth-context.interface';
import type { WorkspaceDataSourceInterface } from 'src/engine/twenty-orm/interfaces/workspace-datasource.interface';
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util';
import { GlobalWorkspaceDataSource } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-datasource';
import { GlobalWorkspaceDataSourceService } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-datasource.service';
import type { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
import {
type ORMWorkspaceContext,
withWorkspaceContext,
} from 'src/engine/twenty-orm/storage/orm-workspace-context.storage';
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import type { RolePermissionConfig } from 'src/engine/twenty-orm/types/role-permission-config';
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util';
@@ -23,21 +21,8 @@ export class GlobalWorkspaceOrmManager {
constructor(
private readonly globalWorkspaceDataSourceService: GlobalWorkspaceDataSourceService,
private readonly workspaceCacheService: WorkspaceCacheService,
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
) {}
async isGlobalDataSourceFlow(workspaceId: string): Promise<boolean> {
const { featureFlagsMap } = await this.workspaceCacheService.getOrRecompute(
workspaceId,
['featureFlagsMap'],
);
return (
featureFlagsMap[FeatureFlagKey.IS_GLOBAL_WORKSPACE_DATASOURCE_ENABLED] ===
true
);
}
async getRepository<T extends ObjectLiteral>(
workspaceId: string,
workspaceEntity: Type<T>,
@@ -51,62 +36,29 @@ export class GlobalWorkspaceOrmManager {
): Promise<WorkspaceRepository<T>>;
async getRepository<T extends ObjectLiteral>(
workspaceId: string,
_workspaceId: string,
workspaceEntityOrObjectMetadataName: Type<T> | string,
permissionOptions?: RolePermissionConfig,
): Promise<WorkspaceRepository<T>> {
const isGlobalFlow = await this.isGlobalDataSourceFlow(workspaceId);
if (isGlobalFlow) {
let objectMetadataName: string;
if (typeof workspaceEntityOrObjectMetadataName === 'string') {
objectMetadataName = workspaceEntityOrObjectMetadataName;
} else {
objectMetadataName = convertClassNameToObjectMetadataName(
workspaceEntityOrObjectMetadataName.name,
);
}
const globalDataSource =
this.globalWorkspaceDataSourceService.getGlobalWorkspaceDataSource();
return globalDataSource.getRepository<T>(
objectMetadataName,
permissionOptions,
);
}
let objectMetadataName: string;
if (typeof workspaceEntityOrObjectMetadataName === 'string') {
return this.twentyORMGlobalManager.getRepositoryForWorkspace<T>(
workspaceId,
workspaceEntityOrObjectMetadataName,
permissionOptions,
objectMetadataName = workspaceEntityOrObjectMetadataName;
} else {
objectMetadataName = convertClassNameToObjectMetadataName(
workspaceEntityOrObjectMetadataName.name,
);
}
return this.twentyORMGlobalManager.getRepositoryForWorkspace<T>(
workspaceId,
workspaceEntityOrObjectMetadataName,
const globalDataSource = await this.getGlobalWorkspaceDataSource();
return globalDataSource.getRepository<T>(
objectMetadataName,
permissionOptions,
);
}
async getDataSourceForWorkspace(
workspaceId: string,
): Promise<WorkspaceDataSourceInterface> {
const isGlobalFlow = await this.isGlobalDataSourceFlow(workspaceId);
if (isGlobalFlow) {
return this.globalWorkspaceDataSourceService.getGlobalWorkspaceDataSource();
}
return this.twentyORMGlobalManager.getDataSourceForWorkspace({
workspaceId,
});
}
async getGlobalWorkspaceDataSource() {
async getGlobalWorkspaceDataSource(): Promise<GlobalWorkspaceDataSource> {
return this.globalWorkspaceDataSourceService.getGlobalWorkspaceDataSource();
}
@@ -119,18 +71,6 @@ export class GlobalWorkspaceOrmManager {
return withWorkspaceContext(context, fn);
}
async destroyDataSourceForWorkspace(workspaceId: string): Promise<void> {
const isGlobalFlow = await this.isGlobalDataSourceFlow(workspaceId);
if (isGlobalFlow) {
return;
}
await this.twentyORMGlobalManager.destroyDataSourceForWorkspace(
workspaceId,
);
}
private async loadWorkspaceContext(
authContext: WorkspaceAuthContext,
): Promise<ORMWorkspaceContext> {