From 3d21e6e1b428160f7968e59a0b1204933ee4520f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Thu, 11 May 2023 14:10:29 +0200 Subject: [PATCH] fix(api-headless-cms-ddb-es): data loader clear caching on each request --- packages/api-headless-cms-ddb-es/src/index.ts | 15 +++++++++------ .../entry/dataLoader/DataLoaderCache.ts | 8 +++++++- .../src/operations/entry/dataLoaders.ts | 10 ++++------ .../src/operations/entry/index.ts | 6 +++--- packages/api-headless-cms-ddb-es/src/types.ts | 12 ++++++++++++ 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/packages/api-headless-cms-ddb-es/src/index.ts b/packages/api-headless-cms-ddb-es/src/index.ts index 19ee29a8f04..bc5afa7d114 100644 --- a/packages/api-headless-cms-ddb-es/src/index.ts +++ b/packages/api-headless-cms-ddb-es/src/index.ts @@ -118,6 +118,13 @@ export const createStorageOperations: StorageOperationsFactory = params => { ...(userPlugins || []) ]); + const entries = createEntriesStorageOperations({ + entity: entities.entries, + esEntity: entities.entriesEs, + plugins, + elasticsearch + }); + return { name: "dynamodb:elasticsearch", beforeInit: async context => { @@ -154,6 +161,7 @@ export const createStorageOperations: StorageOperationsFactory = params => { for (const type of types) { plugins.mergeByType(context.plugins, type); } + entries.dataLoaders.clearAll(); }, init: async context => { /** @@ -206,11 +214,6 @@ export const createStorageOperations: StorageOperationsFactory = params => { entity: entities.models, elasticsearch }), - entries: createEntriesStorageOperations({ - entity: entities.entries, - esEntity: entities.entriesEs, - plugins, - elasticsearch - }) + entries }; }; diff --git a/packages/api-headless-cms-ddb-es/src/operations/entry/dataLoader/DataLoaderCache.ts b/packages/api-headless-cms-ddb-es/src/operations/entry/dataLoader/DataLoaderCache.ts index 03927eb718c..4df721cf3b0 100644 --- a/packages/api-headless-cms-ddb-es/src/operations/entry/dataLoader/DataLoaderCache.ts +++ b/packages/api-headless-cms-ddb-es/src/operations/entry/dataLoader/DataLoaderCache.ts @@ -25,7 +25,13 @@ export class DataLoaderCache { this.cache[key] = dataLoader; } - public clearAll(params: ClearAllParams): void { + public clearAll(params?: ClearAllParams): void { + if (!params) { + for (const current in this.cache) { + this.cache[current].clearAll(); + } + return; + } const key = this.createKey({ ...params, name: "" diff --git a/packages/api-headless-cms-ddb-es/src/operations/entry/dataLoaders.ts b/packages/api-headless-cms-ddb-es/src/operations/entry/dataLoaders.ts index 0582f0d977d..fe66714f296 100644 --- a/packages/api-headless-cms-ddb-es/src/operations/entry/dataLoaders.ts +++ b/packages/api-headless-cms-ddb-es/src/operations/entry/dataLoaders.ts @@ -5,6 +5,7 @@ import { CacheKeyParams, DataLoaderCache } from "~/operations/entry/dataLoader/D import { Entity } from "dynamodb-toolbox"; import { DataLoaders, getDataLoaderFactory } from "~/operations/entry/dataLoader"; import { parseIdentifier } from "@webiny/utils"; +import { DataLoadersHandlerInterface, DataLoadersHandlerInterfaceClearAllParams } from "~/types"; interface DataLoaderParams { model: Pick; @@ -23,7 +24,7 @@ export interface ClearAllParams { model: Pick; } -export class DataLoadersHandler { +export class DataLoadersHandler implements DataLoadersHandlerInterface { private readonly entity: Entity; private readonly cache: DataLoaderCache = new DataLoaderCache(); @@ -139,10 +140,7 @@ export class DataLoadersHandler { ); } - public clearAll({ model }: ClearAllParams): void { - this.cache.clearAll({ - tenant: model.tenant, - locale: model.locale - }); + public clearAll(params?: DataLoadersHandlerInterfaceClearAllParams): void { + this.cache.clearAll(params?.model); } } diff --git a/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts b/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts index 0750ac8e96e..2e8ababef59 100644 --- a/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts +++ b/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts @@ -2,7 +2,6 @@ import lodashCloneDeep from "lodash/cloneDeep"; import WebinyError from "@webiny/error"; import { CmsEntry, - CmsEntryStorageOperations, CmsModel, CmsStorageEntry, CONTENT_ENTRY_STATUS, @@ -33,7 +32,7 @@ import { get as getRecord } from "@webiny/db-dynamodb/utils/get"; import { zeroPad } from "@webiny/utils"; import { cleanupItem } from "@webiny/db-dynamodb/utils/cleanup"; import { ElasticsearchSearchResponse } from "@webiny/api-elasticsearch/types"; -import { CmsIndexEntry } from "~/types"; +import { CmsEntryStorageOperations, CmsIndexEntry } from "~/types"; import { createElasticsearchBody } from "~/operations/entry/elasticsearch/body"; import { createLatestRecordType, createPublishedRecordType, createRecordType } from "./recordType"; import { StorageOperationsCmsModelPlugin } from "@webiny/api-headless-cms"; @@ -1526,6 +1525,7 @@ export const createEntriesStorageOperations = ( getByIds, getLatestByIds, getPublishedByIds, - getPreviousRevision + getPreviousRevision, + dataLoaders }; }; diff --git a/packages/api-headless-cms-ddb-es/src/types.ts b/packages/api-headless-cms-ddb-es/src/types.ts index 8a4f11ef8b0..def10b8df40 100644 --- a/packages/api-headless-cms-ddb-es/src/types.ts +++ b/packages/api-headless-cms-ddb-es/src/types.ts @@ -2,6 +2,7 @@ import { Plugin, PluginCollection } from "@webiny/plugins/types"; import { CmsContext as BaseCmsContext, CmsEntry, + CmsEntryStorageOperations as BaseCmsEntryStorageOperations, CmsModel, CmsModelField, CmsModelFieldToGraphQLPlugin, @@ -187,3 +188,14 @@ export interface StorageOperationsFactory { export interface CmsContext extends BaseCmsContext { [key: string]: any; } + +export interface CmsEntryStorageOperations extends BaseCmsEntryStorageOperations { + dataLoaders: DataLoadersHandlerInterface; +} + +export interface DataLoadersHandlerInterfaceClearAllParams { + model: Pick; +} +export interface DataLoadersHandlerInterface { + clearAll: (params?: DataLoadersHandlerInterfaceClearAllParams) => void; +}