import { Injectable, Optional, Type } from '@nestjs/common'; import { ObjectLiteral } from 'typeorm'; import { EntitySchemaFactory } from 'src/engine/twenty-orm/factories/entity-schema.factory'; import { WorkspaceDataSource } from 'src/engine/twenty-orm/datasource/workspace.datasource'; import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository'; import { WorkspaceDatasourceFactory } from 'src/engine/twenty-orm/factories/workspace-datasource.factory'; import { ObjectLiteralStorage } from 'src/engine/twenty-orm/storage/object-literal.storage'; @Injectable() export class TwentyORMManager { constructor( @Optional() private readonly workspaceDataSource: WorkspaceDataSource | null, private readonly entitySchemaFactory: EntitySchemaFactory, private readonly workspaceDataSourceFactory: WorkspaceDatasourceFactory, ) {} getRepository( entityClass: Type, ): WorkspaceRepository { const entitySchema = this.entitySchemaFactory.create(entityClass); if (!this.workspaceDataSource) { throw new Error('Workspace data source not found'); } return this.workspaceDataSource.getRepository(entitySchema); } async getRepositoryForWorkspace( workspaceId: string, entityClass: Type, ): Promise> { const entities = ObjectLiteralStorage.getAllEntitySchemas(); const workspaceDataSource = await this.workspaceDataSourceFactory.create( entities, workspaceId, ); if (!workspaceDataSource) { throw new Error('Workspace data source not found'); } const entitySchema = this.entitySchemaFactory.create(entityClass); return workspaceDataSource.getRepository(entitySchema); } }