Deprecate inject workspace repo (#6353)
This commit is contained in:
@ -36,4 +36,8 @@ export class WorkspaceDataSource extends DataSource {
|
||||
): WorkspaceEntityManager {
|
||||
return new WorkspaceEntityManager(this.internalContext, this, queryRunner);
|
||||
}
|
||||
|
||||
getWorkspaceId(): string {
|
||||
return this.internalContext.workspaceId;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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],
|
||||
}));
|
||||
}
|
||||
Reference in New Issue
Block a user