Optimize metadata queries (#7013)

In this PR:

1. Refactor guards to avoid duplicated queries: WorkspaceAuthGuard and
UserAuthGuard only check for existence of workspace and user in the
request without querying the database
This commit is contained in:
Charles Bochet
2024-09-13 19:11:32 +02:00
committed by Charles Bochet
parent cf8b1161cc
commit 523df5398a
132 changed files with 818 additions and 6372 deletions

View File

@ -1,7 +1,11 @@
import DataLoader from 'dataloader';
import { RelationMetadataLoaderPayload } from 'src/engine/dataloaders/dataloader.service';
import { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
export interface IDataloaders {
relationMetadataLoader: DataLoader<string, RelationMetadataEntity>;
relationMetadataLoader: DataLoader<
RelationMetadataLoaderPayload,
RelationMetadataEntity
>;
}

View File

@ -2,10 +2,20 @@ import { Injectable } from '@nestjs/common';
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 { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
import { RelationMetadataService } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.service';
export type RelationMetadataLoaderPayload = {
workspaceId: string;
fieldMetadata: Pick<
FieldMetadataInterface,
'type' | 'id' | 'objectMetadataId'
>;
};
@Injectable()
export class DataloaderService {
constructor(
@ -14,12 +24,18 @@ export class DataloaderService {
createLoaders(): IDataloaders {
const relationMetadataLoader = new DataLoader<
string,
RelationMetadataLoaderPayload,
RelationMetadataEntity
>(async (fieldMetadataIds: string[]) => {
>(async (dataLoaderParams: RelationMetadataLoaderPayload[]) => {
const workspaceId = dataLoaderParams[0].workspaceId;
const fieldMetadataItems = dataLoaderParams.map(
(dataLoaderParam) => dataLoaderParam.fieldMetadata,
);
const relationsMetadataCollection =
await this.relationMetadataService.findManyRelationMetadataByFieldMetadataIds(
fieldMetadataIds,
fieldMetadataItems,
workspaceId,
);
return relationsMetadataCollection;