feat: new relation resolver (#9794)
Fix [#240](https://github.com/twentyhq/core-team-issues/issues/240)
This commit is contained in:
@ -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;
|
||||
}
|
||||
>;
|
||||
}
|
||||
|
||||
@ -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 {}
|
||||
|
||||
@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user