import { DataSource, EntityManager, EntityTarget, ObjectLiteral, QueryRunner, Repository, } from 'typeorm'; import { WorkspaceInternalContext } from 'src/engine/twenty-orm/interfaces/workspace-internal-context.interface'; import { WorkspaceDataSource } from 'src/engine/twenty-orm/datasource/workspace.datasource'; import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository'; export class WorkspaceEntityManager extends EntityManager { private readonly internalContext: WorkspaceInternalContext; readonly repositories: Map>; constructor( internalContext: WorkspaceInternalContext, connection: DataSource, queryRunner?: QueryRunner, ) { super(connection, queryRunner); this.internalContext = internalContext; this.repositories = new Map(); } override getRepository( target: EntityTarget, shouldBypassPermissionChecks = false, roleId?: string, ): WorkspaceRepository { const dataSource = this.connection as WorkspaceDataSource; const repositoryKey = this.getRepositoryKey({ target, dataSource, roleId, shouldBypassPermissionChecks, }); const repoFromMap = this.repositories.get(repositoryKey); if (repoFromMap) { return repoFromMap as WorkspaceRepository; } let objectPermissions = {}; if (roleId) { const objectPermissionsByRoleId = dataSource.permissionsPerRoleId; objectPermissions = objectPermissionsByRoleId?.[roleId] ?? {}; } const newRepository = new WorkspaceRepository( this.internalContext, target, this, dataSource.featureFlagMap, this.queryRunner, objectPermissions, shouldBypassPermissionChecks, ); this.repositories.set(repositoryKey, newRepository); return newRepository; } private getRepositoryKey({ target, dataSource, roleId, shouldBypassPermissionChecks, }: { target: EntityTarget; dataSource: WorkspaceDataSource; shouldBypassPermissionChecks: boolean; roleId?: string; }) { const repositoryPrefix = dataSource.getMetadata(target).name; const roleIdSuffix = roleId ? `_${roleId}` : ''; const rolesPermissionsVersionSuffix = dataSource.rolesPermissionsVersion ? `_${dataSource.rolesPermissionsVersion}` : ''; const featureFlagMapVersionSuffix = dataSource.featureFlagMapVersion ? `_${dataSource.featureFlagMapVersion}` : ''; return shouldBypassPermissionChecks ? `${repositoryPrefix}_bypass${featureFlagMapVersionSuffix}` : `${repositoryPrefix}${roleIdSuffix}${rolesPermissionsVersionSuffix}${featureFlagMapVersionSuffix}`; } }