import { Injectable, Type } from '@nestjs/common'; import { ObjectLiteral } from 'typeorm'; import { WorkspaceDatasourceFactory } from 'src/engine/twenty-orm/factories/workspace-datasource.factory'; import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository'; import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util'; @Injectable() export class TwentyORMGlobalManager { constructor( private readonly workspaceDataSourceFactory: WorkspaceDatasourceFactory, ) {} async getRepositoryForWorkspace( workspaceId: string, workspaceEntity: Type, options?: { shouldBypassPermissionChecks?: boolean; shouldFailIfMetadataNotFound?: boolean; }, ): Promise>; async getRepositoryForWorkspace( workspaceId: string, objectMetadataName: string, options?: { shouldBypassPermissionChecks?: boolean; shouldFailIfMetadataNotFound?: boolean; }, ): Promise>; async getRepositoryForWorkspace( workspaceId: string, workspaceEntityOrObjectMetadataName: Type | string, options: { shouldBypassPermissionChecks?: boolean; shouldFailIfMetadataNotFound?: boolean; } = { shouldBypassPermissionChecks: false, shouldFailIfMetadataNotFound: true, }, ): Promise> { let objectMetadataName: string; if (typeof workspaceEntityOrObjectMetadataName === 'string') { objectMetadataName = workspaceEntityOrObjectMetadataName; } else { objectMetadataName = convertClassNameToObjectMetadataName( workspaceEntityOrObjectMetadataName.name, ); } const workspaceDataSource = await this.workspaceDataSourceFactory.create( workspaceId, null, options.shouldFailIfMetadataNotFound, ); const repository = workspaceDataSource.getRepository( objectMetadataName, options.shouldBypassPermissionChecks, ); return repository; } async getDataSourceForWorkspace({ workspaceId, shouldFailIfMetadataNotFound = true, }: { workspaceId: string; shouldFailIfMetadataNotFound?: boolean; }) { return await this.workspaceDataSourceFactory.create( workspaceId, null, shouldFailIfMetadataNotFound, ); } async destroyDataSourceForWorkspace(workspaceId: string) { await this.workspaceDataSourceFactory.destroy(workspaceId); } }