From 91e714969f2168b0036eb484e43e16ae085e43f5 Mon Sep 17 00:00:00 2001 From: Weiko Date: Wed, 5 Mar 2025 16:47:02 +0100 Subject: [PATCH] Fix REST API when metadata cache not found (#10669) ## Context When REST API calls fail due to metadata cache version not found, we throw an exception without trying to recover. In Graphql implementation, the exception is thrown after recomputing the cache. This PR implements the same logic for REST for users only user the REST API. --- .../core/query-builder/core-query-builder.factory.ts | 9 +++++++-- .../rest/core/query-builder/core-query-builder.module.ts | 8 +++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts index 73811490c..f79e41b63 100644 --- a/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts @@ -24,6 +24,7 @@ import { ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/typ import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps'; import { getObjectMetadataMapItemByNamePlural } from 'src/engine/metadata-modules/utils/get-object-metadata-map-item-by-name-plural.util'; import { getObjectMetadataMapItemByNameSingular } from 'src/engine/metadata-modules/utils/get-object-metadata-map-item-by-name-singular.util'; +import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service'; import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service'; @Injectable() @@ -44,6 +45,7 @@ export class CoreQueryBuilderFactory { private readonly accessTokenService: AccessTokenService, private readonly domainManagerService: DomainManagerService, private readonly workspaceCacheStorageService: WorkspaceCacheStorageService, + private readonly workspaceMetadataCacheService: WorkspaceMetadataCacheService, ) {} async getObjectMetadata( @@ -60,9 +62,12 @@ export class CoreQueryBuilderFactory { await this.workspaceCacheStorageService.getMetadataVersion(workspace.id); if (currentCacheVersion === undefined) { - throw new BadRequestException('No cacheVersion'); - } + await this.workspaceMetadataCacheService.recomputeMetadataCache({ + workspaceId: workspace.id, + }); + throw new BadRequestException('Metadata cache version not found'); + } const objectMetadataMaps = await this.workspaceCacheStorageService.getObjectMetadataMaps( workspace.id, diff --git a/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.module.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.module.ts index 7557d506b..ec8386ffe 100644 --- a/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.module.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.module.ts @@ -4,10 +4,16 @@ import { CoreQueryBuilderFactory } from 'src/engine/api/rest/core/query-builder/ import { coreQueryBuilderFactories } from 'src/engine/api/rest/core/query-builder/factories/factories'; import { AuthModule } from 'src/engine/core-modules/auth/auth.module'; import { DomainManagerModule } from 'src/engine/core-modules/domain-manager/domain-manager.module'; +import { WorkspaceMetadataCacheModule } from 'src/engine/metadata-modules/workspace-metadata-cache/workspace-metadata-cache.module'; import { WorkspaceCacheStorageModule } from 'src/engine/workspace-cache-storage/workspace-cache-storage.module'; @Module({ - imports: [AuthModule, DomainManagerModule, WorkspaceCacheStorageModule], + imports: [ + AuthModule, + DomainManagerModule, + WorkspaceCacheStorageModule, + WorkspaceMetadataCacheModule, + ], providers: [...coreQueryBuilderFactories, CoreQueryBuilderFactory], exports: [CoreQueryBuilderFactory], })