Deprecate inject workspace repo (#6353)

This commit is contained in:
Charles Bochet
2024-07-20 00:43:29 +02:00
committed by GitHub
parent 2e38c3bbc1
commit d8cadad0fa
29 changed files with 441 additions and 359 deletions

View File

@ -36,4 +36,8 @@ export class WorkspaceDataSource extends DataSource {
): WorkspaceEntityManager {
return new WorkspaceEntityManager(this.internalContext, this, queryRunner);
}
getWorkspaceId(): string {
return this.internalContext.workspaceId;
}
}

View File

@ -2,9 +2,9 @@ import { Injectable } from '@nestjs/common';
import { EntitySchema } from 'typeorm';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { EntitySchemaColumnFactory } from 'src/engine/twenty-orm/factories/entity-schema-column.factory';
import { EntitySchemaRelationFactory } from 'src/engine/twenty-orm/factories/entity-schema-relation.factory';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { WorkspaceEntitiesStorage } from 'src/engine/twenty-orm/storage/workspace-entities.storage';
import { computeTableName } from 'src/engine/utils/compute-table-name.util';
import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service';
@ -20,35 +20,7 @@ export class EntitySchemaFactory {
async create(
workspaceId: string,
objectMetadata: ObjectMetadataEntity,
): Promise<EntitySchema>;
async create(
workspaceId: string,
objectMetadataName: string,
): Promise<EntitySchema>;
async create(
workspaceId: string,
objectMetadataOrObjectMetadataName: ObjectMetadataEntity | string,
): Promise<EntitySchema> {
let objectMetadata: ObjectMetadataEntity | null =
typeof objectMetadataOrObjectMetadataName !== 'string'
? objectMetadataOrObjectMetadataName
: null;
if (typeof objectMetadataOrObjectMetadataName === 'string') {
objectMetadata =
(await this.workspaceCacheStorageService.getObjectMetadata(
workspaceId,
(objectMetadata) =>
objectMetadata.nameSingular === objectMetadataOrObjectMetadataName,
)) ?? null;
}
if (!objectMetadata) {
throw new Error('Object metadata not found');
}
const columns = this.entitySchemaColumnFactory.create(
workspaceId,
objectMetadata.fields,

View File

@ -54,9 +54,42 @@ export class TwentyORMManager {
throw new Error('Workspace data source not found');
}
const workspaceId = this.workspaceDataSource.getWorkspaceId();
let objectMetadataCollection =
await this.workspaceCacheStorageService.getObjectMetadataCollection(
workspaceId,
);
if (!objectMetadataCollection) {
objectMetadataCollection = await this.objectMetadataRepository.find({
where: { workspaceId },
relations: [
'fields.object',
'fields',
'fields.fromRelationMetadata',
'fields.toRelationMetadata',
'fields.fromRelationMetadata.toObjectMetadata',
],
});
await this.workspaceCacheStorageService.setObjectMetadataCollection(
workspaceId,
objectMetadataCollection,
);
}
const objectMetadata = objectMetadataCollection.find(
(objectMetadata) => objectMetadata.nameSingular === objectMetadataName,
);
if (!objectMetadata) {
throw new Error('Object metadata not found');
}
const entitySchema = await this.entitySchemaFactory.create(
this.workspaceDataSource.internalContext.workspaceId,
objectMetadataName,
workspaceId,
objectMetadata,
);
if (!entitySchema) {
@ -95,38 +128,38 @@ export class TwentyORMManager {
);
}
let objectMetadataCollection =
await this.workspaceCacheStorageService.getObjectMetadataCollection(
workspaceId,
);
if (!objectMetadataCollection) {
objectMetadataCollection = await this.objectMetadataRepository.find({
where: { workspaceId },
relations: [
'fields.object',
'fields',
'fields.fromRelationMetadata',
'fields.toRelationMetadata',
'fields.fromRelationMetadata.toObjectMetadata',
],
});
await this.workspaceCacheStorageService.setObjectMetadataCollection(
workspaceId,
objectMetadataCollection,
);
}
const entities = await Promise.all(
objectMetadataCollection.map((objectMetadata) =>
this.entitySchemaFactory.create(workspaceId, objectMetadata),
),
);
const workspaceDataSource = await workspaceDataSourceCacheInstance.execute(
`${workspaceId}-${cacheVersion}`,
async () => {
let objectMetadataCollection =
await this.workspaceCacheStorageService.getObjectMetadataCollection(
workspaceId,
);
if (!objectMetadataCollection) {
objectMetadataCollection = await this.objectMetadataRepository.find({
where: { workspaceId },
relations: [
'fields.object',
'fields',
'fields.fromRelationMetadata',
'fields.toRelationMetadata',
'fields.fromRelationMetadata.toObjectMetadata',
],
});
await this.workspaceCacheStorageService.setObjectMetadataCollection(
workspaceId,
objectMetadataCollection,
);
}
const entities = await Promise.all(
objectMetadataCollection.map((objectMetadata) =>
this.entitySchemaFactory.create(workspaceId, objectMetadata),
),
);
const workspaceDataSource =
await this.workspaceDataSourceFactory.create(entities, workspaceId);
@ -135,9 +168,17 @@ export class TwentyORMManager {
(dataSource) => dataSource.destroy(),
);
const objectMetadata = objectMetadataCollection.find(
(objectMetadata) => objectMetadata.nameSingular === objectMetadataName,
);
if (!objectMetadata) {
throw new Error('Object metadata not found');
}
const entitySchema = await this.entitySchemaFactory.create(
workspaceId,
objectMetadataName,
objectMetadata,
);
if (!workspaceDataSource) {

View File

@ -6,9 +6,9 @@ import {
TwentyORMOptions,
} from 'src/engine/twenty-orm/interfaces/twenty-orm-options.interface';
import { createTwentyORMProviders } from 'src/engine/twenty-orm/twenty-orm.providers';
import { TwentyORMCoreModule } from 'src/engine/twenty-orm/twenty-orm-core.module';
// Todo: remove this file
@Global()
@Module({})
export class TwentyORMModule {
@ -19,8 +19,8 @@ export class TwentyORMModule {
};
}
static forFeature(objects: EntityClassOrSchema[] = []): DynamicModule {
const providers = createTwentyORMProviders(objects);
static forFeature(_objects: EntityClassOrSchema[] = []): DynamicModule {
const providers = [];
return {
module: TwentyORMModule,

View File

@ -1,44 +0,0 @@
import { Provider, Type } from '@nestjs/common';
import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type';
import { getWorkspaceRepositoryToken } from 'src/engine/twenty-orm/utils/get-workspace-repository-token.util';
import { TWENTY_ORM_WORKSPACE_DATASOURCE } from 'src/engine/twenty-orm/twenty-orm.constants';
import { EntitySchemaFactory } from 'src/engine/twenty-orm/factories/entity-schema.factory';
import { WorkspaceDataSource } from 'src/engine/twenty-orm/datasource/workspace.datasource';
import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util';
/**
* Create providers for the given entities.
*/
export function createTwentyORMProviders(
objects?: EntityClassOrSchema[],
): Provider[] {
return (objects || []).map((object) => ({
provide: getWorkspaceRepositoryToken(object),
useFactory: async (
dataSource: WorkspaceDataSource | null,
entitySchemaFactory: EntitySchemaFactory,
) => {
const objectMetadataName = convertClassNameToObjectMetadataName(
(object as Type).name,
);
if (!dataSource) {
// TODO: Throw here when the code is well architected
return null;
}
const entitySchema = await entitySchemaFactory.create(
dataSource.internalContext.workspaceId,
objectMetadataName,
);
if (!entitySchema) {
throw new Error('Entity schema not found');
}
return dataSource.getRepository(entitySchema);
},
inject: [TWENTY_ORM_WORKSPACE_DATASOURCE, EntitySchemaFactory],
}));
}