feat: new relation resolver (#9794)

Fix [#240](https://github.com/twentyhq/core-team-issues/issues/240)
This commit is contained in:
Jérémy M
2025-01-24 10:38:50 +01:00
committed by GitHub
parent 5783c41df2
commit 8d794374f1
13 changed files with 318 additions and 8 deletions

View File

@ -1,6 +1,11 @@
import DataLoader from 'dataloader';
import { RelationMetadataLoaderPayload } from 'src/engine/dataloaders/dataloader.service';
import {
RelationLoaderPayload,
RelationMetadataLoaderPayload,
} from 'src/engine/dataloaders/dataloader.service';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
export interface IDataloaders {
@ -8,4 +13,14 @@ export interface IDataloaders {
RelationMetadataLoaderPayload,
RelationMetadataEntity
>;
relationLoader: DataLoader<
RelationLoaderPayload,
{
sourceObjectMetadata: ObjectMetadataEntity;
targetObjectMetadata: ObjectMetadataEntity;
sourceFieldMetadata: FieldMetadataEntity;
targetFieldMetadata: FieldMetadataEntity;
}
>;
}

View File

@ -1,11 +1,12 @@
import { Module } from '@nestjs/common';
import { DataloaderService } from 'src/engine/dataloaders/dataloader.service';
import { FieldMetadataModule } from 'src/engine/metadata-modules/field-metadata/field-metadata.module';
import { RelationMetadataModule } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.module';
@Module({
imports: [RelationMetadataModule, FieldMetadataModule],
providers: [DataloaderService],
imports: [RelationMetadataModule],
exports: [DataloaderService],
})
export class DataloaderModule {}

View File

@ -5,6 +5,9 @@ import DataLoader from 'dataloader';
import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface';
import { IDataloaders } from 'src/engine/dataloaders/dataloader.interface';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { FieldMetadataRelationService } from 'src/engine/metadata-modules/field-metadata/relation/field-metadata-relation.service';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
import { RelationMetadataService } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.service';
@ -16,14 +19,37 @@ export type RelationMetadataLoaderPayload = {
>;
};
export type RelationLoaderPayload = {
workspaceId: string;
fieldMetadata: Pick<
FieldMetadataInterface,
| 'type'
| 'id'
| 'objectMetadataId'
| 'relationTargetFieldMetadataId'
| 'relationTargetObjectMetadataId'
>;
};
@Injectable()
export class DataloaderService {
constructor(
private readonly relationMetadataService: RelationMetadataService,
private readonly fieldMetadataRelationService: FieldMetadataRelationService,
) {}
createLoaders(): IDataloaders {
const relationMetadataLoader = new DataLoader<
const relationMetadataLoader = this.createRelationMetadataLoader();
const relationLoader = this.createRelationLoader();
return {
relationMetadataLoader,
relationLoader,
};
}
private createRelationMetadataLoader() {
return new DataLoader<
RelationMetadataLoaderPayload,
RelationMetadataEntity
>(async (dataLoaderParams: RelationMetadataLoaderPayload[]) => {
@ -40,9 +66,30 @@ export class DataloaderService {
return relationsMetadataCollection;
});
}
return {
relationMetadataLoader,
};
private createRelationLoader() {
return new DataLoader<
RelationLoaderPayload,
{
sourceObjectMetadata: ObjectMetadataEntity;
targetObjectMetadata: ObjectMetadataEntity;
sourceFieldMetadata: FieldMetadataEntity;
targetFieldMetadata: FieldMetadataEntity;
}
>(async (dataLoaderParams: RelationLoaderPayload[]) => {
const workspaceId = dataLoaderParams[0].workspaceId;
const fieldMetadataItems = dataLoaderParams.map(
(dataLoaderParam) => dataLoaderParam.fieldMetadata,
);
const fieldMetadataRelationCollection =
await this.fieldMetadataRelationService.findCachedFieldMetadataRelation(
fieldMetadataItems,
workspaceId,
);
return fieldMetadataRelationCollection;
});
}
}