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:
committed by
Charles Bochet
parent
cf8b1161cc
commit
523df5398a
@ -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
|
||||
>;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user