@webiny/api-headless-cms-ddb-es 6.4.2 → 6.4.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -82,7 +82,7 @@ class DataLoadersHandler {
82
82
  });
83
83
  }
84
84
  clearAll(params) {
85
- this.cache.clearAll(params?.model);
85
+ this.cache.clearAll(params);
86
86
  }
87
87
  }
88
88
  export { DataLoadersHandler };
@@ -1 +1 @@
1
- {"version":3,"file":"operations/entry/dataLoaders.js","sources":["../../../src/operations/entry/dataLoaders.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\nimport WebinyError from \"@webiny/error\";\nimport type {\n CmsEntryValues,\n CmsModel,\n CmsStorageEntry\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { CacheKeyParams } from \"~/operations/entry/dataLoader/DataLoaderCache.js\";\nimport { DataLoaderCache } from \"~/operations/entry/dataLoader/DataLoaderCache.js\";\nimport type { DataLoaders } from \"~/operations/entry/dataLoader/index.js\";\nimport { getDataLoaderFactory } from \"~/operations/entry/dataLoader/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport type { DataLoadersHandlerInterfaceClearAllParams, IDataLoadersHandler } from \"~/types.js\";\nimport type { IEntryEntity } from \"~/definitions/types.js\";\n\ninterface DataLoaderParams {\n model: Pick<CmsModel, \"tenant\" | \"modelId\">;\n ids: readonly string[];\n}\n\ninterface GetLoaderParams {\n model: Pick<CmsModel, \"tenant\" | \"modelId\">;\n}\n\ninterface IDataLoadersHandlerParams {\n entity: IEntryEntity;\n}\n\nexport interface ClearAllParams {\n model: Pick<CmsModel, \"tenant\" | \"modelId\">;\n}\n\nexport class DataLoadersHandler implements IDataLoadersHandler {\n private readonly entity;\n private readonly cache = new DataLoaderCache();\n\n public constructor(params: IDataLoadersHandlerParams) {\n this.entity = params.entity;\n }\n\n public async getAllEntryRevisions<T extends CmsEntryValues = CmsEntryValues>(\n params: DataLoaderParams\n ): Promise<CmsStorageEntry<T>[]> {\n const ids = params.ids.map(id => {\n const { id: entryId } = parseIdentifier(id);\n return entryId;\n });\n return await this.loadMany<T>(\"getAllEntryRevisions\", params, ids);\n }\n\n public async getRevisionById<T extends CmsEntryValues = CmsEntryValues>(\n params: DataLoaderParams\n ): Promise<CmsStorageEntry<T>[]> {\n return await this.loadMany<T>(\"getRevisionById\", params, params.ids);\n }\n\n public async getPublishedRevisionByEntryId<T extends CmsEntryValues = CmsEntryValues>(\n params: DataLoaderParams\n ): Promise<CmsStorageEntry<T>[]> {\n const ids = params.ids.map(id => {\n const { id: entryId } = parseIdentifier(id);\n return entryId;\n });\n return await this.loadMany<T>(\"getPublishedRevisionByEntryId\", params, ids);\n }\n\n public async getLatestRevisionByEntryId<T extends CmsEntryValues = CmsEntryValues>(\n params: DataLoaderParams\n ): Promise<CmsStorageEntry<T>[]> {\n const ids = params.ids.map(id => {\n const { id: entryId } = parseIdentifier(id);\n return entryId;\n });\n return await this.loadMany<T>(\"getLatestRevisionByEntryId\", params, ids);\n }\n\n /**\n * TODO @ts-refactor\n * Maybe pass on the generics to DataLoader definition?\n */\n private getLoader(name: DataLoaders, params: GetLoaderParams): DataLoader<any, any> {\n const { model } = params;\n const cacheParams: CacheKeyParams = {\n tenant: model.tenant,\n modelId: model.modelId,\n name\n };\n let loader = this.cache.getDataLoader(cacheParams);\n if (loader) {\n return loader;\n }\n const factory = getDataLoaderFactory(name);\n loader = factory({\n entity: this.entity,\n tenant: model.tenant,\n modelId: model.modelId\n });\n this.cache.setDataLoader(cacheParams, loader);\n return loader;\n }\n\n private async loadMany<T extends CmsEntryValues = CmsEntryValues>(\n loader: DataLoaders,\n params: GetLoaderParams,\n ids: readonly string[]\n ): Promise<CmsStorageEntry<T>[]> {\n let results: CmsStorageEntry<T>[] = [];\n try {\n results = await this.getLoader(loader, params).loadMany(ids);\n if (Array.isArray(results) === true) {\n return results.reduce<CmsStorageEntry<T>[]>((acc, res) => {\n if (Array.isArray(res) === false) {\n if (res && res.message) {\n throw new WebinyError(res.message, res.code, {\n ...res,\n data: JSON.stringify(res.data || {})\n });\n }\n throw new WebinyError(\n \"Result from the data loader must be an array of arrays which contain requested items.\",\n \"DATA_LOADER_RESULTS_ERROR\",\n {\n ...params,\n loader\n }\n );\n }\n acc.push(...res);\n return acc;\n }, []);\n }\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Data loader error.\",\n ex.code || \"DATA_LOADER_ERROR\",\n {\n error: ex,\n ...params,\n loader,\n ids\n }\n );\n }\n throw new WebinyError(\n `Data loader did not return array of items or empty array.`,\n \"INVALID_DATA_LOADER_RESULT\",\n {\n loader,\n ids,\n results\n }\n );\n }\n\n public clearAll(params?: DataLoadersHandlerInterfaceClearAllParams): void {\n this.cache.clearAll(params?.model);\n }\n}\n"],"names":["DataLoadersHandler","params","DataLoaderCache","ids","id","entryId","parseIdentifier","name","model","cacheParams","loader","factory","getDataLoaderFactory","results","Array","acc","res","WebinyError","JSON","ex"],"mappings":"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"}
1
+ {"version":3,"file":"operations/entry/dataLoaders.js","sources":["../../../src/operations/entry/dataLoaders.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\nimport WebinyError from \"@webiny/error\";\nimport type {\n CmsEntryValues,\n CmsModel,\n CmsStorageEntry\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { CacheKeyParams } from \"~/operations/entry/dataLoader/DataLoaderCache.js\";\nimport { DataLoaderCache } from \"~/operations/entry/dataLoader/DataLoaderCache.js\";\nimport type { DataLoaders } from \"~/operations/entry/dataLoader/index.js\";\nimport { getDataLoaderFactory } from \"~/operations/entry/dataLoader/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport type { DataLoadersHandlerInterfaceClearAllParams, IDataLoadersHandler } from \"~/types.js\";\nimport type { IEntryEntity } from \"~/definitions/types.js\";\n\ninterface DataLoaderParams {\n model: Pick<CmsModel, \"tenant\" | \"modelId\">;\n ids: readonly string[];\n}\n\ninterface GetLoaderParams {\n model: Pick<CmsModel, \"tenant\" | \"modelId\">;\n}\n\ninterface IDataLoadersHandlerParams {\n entity: IEntryEntity;\n}\n\nexport interface ClearAllParams {\n model: Pick<CmsModel, \"tenant\" | \"modelId\">;\n}\n\nexport class DataLoadersHandler implements IDataLoadersHandler {\n private readonly entity;\n private readonly cache = new DataLoaderCache();\n\n public constructor(params: IDataLoadersHandlerParams) {\n this.entity = params.entity;\n }\n\n public async getAllEntryRevisions<T extends CmsEntryValues = CmsEntryValues>(\n params: DataLoaderParams\n ): Promise<CmsStorageEntry<T>[]> {\n const ids = params.ids.map(id => {\n const { id: entryId } = parseIdentifier(id);\n return entryId;\n });\n return await this.loadMany<T>(\"getAllEntryRevisions\", params, ids);\n }\n\n public async getRevisionById<T extends CmsEntryValues = CmsEntryValues>(\n params: DataLoaderParams\n ): Promise<CmsStorageEntry<T>[]> {\n return await this.loadMany<T>(\"getRevisionById\", params, params.ids);\n }\n\n public async getPublishedRevisionByEntryId<T extends CmsEntryValues = CmsEntryValues>(\n params: DataLoaderParams\n ): Promise<CmsStorageEntry<T>[]> {\n const ids = params.ids.map(id => {\n const { id: entryId } = parseIdentifier(id);\n return entryId;\n });\n return await this.loadMany<T>(\"getPublishedRevisionByEntryId\", params, ids);\n }\n\n public async getLatestRevisionByEntryId<T extends CmsEntryValues = CmsEntryValues>(\n params: DataLoaderParams\n ): Promise<CmsStorageEntry<T>[]> {\n const ids = params.ids.map(id => {\n const { id: entryId } = parseIdentifier(id);\n return entryId;\n });\n return await this.loadMany<T>(\"getLatestRevisionByEntryId\", params, ids);\n }\n\n /**\n * TODO @ts-refactor\n * Maybe pass on the generics to DataLoader definition?\n */\n private getLoader(name: DataLoaders, params: GetLoaderParams): DataLoader<any, any> {\n const { model } = params;\n const cacheParams: CacheKeyParams = {\n tenant: model.tenant,\n modelId: model.modelId,\n name\n };\n let loader = this.cache.getDataLoader(cacheParams);\n if (loader) {\n return loader;\n }\n const factory = getDataLoaderFactory(name);\n loader = factory({\n entity: this.entity,\n tenant: model.tenant,\n modelId: model.modelId\n });\n this.cache.setDataLoader(cacheParams, loader);\n return loader;\n }\n\n private async loadMany<T extends CmsEntryValues = CmsEntryValues>(\n loader: DataLoaders,\n params: GetLoaderParams,\n ids: readonly string[]\n ): Promise<CmsStorageEntry<T>[]> {\n let results: CmsStorageEntry<T>[] = [];\n try {\n results = await this.getLoader(loader, params).loadMany(ids);\n if (Array.isArray(results) === true) {\n return results.reduce<CmsStorageEntry<T>[]>((acc, res) => {\n if (Array.isArray(res) === false) {\n if (res && res.message) {\n throw new WebinyError(res.message, res.code, {\n ...res,\n data: JSON.stringify(res.data || {})\n });\n }\n throw new WebinyError(\n \"Result from the data loader must be an array of arrays which contain requested items.\",\n \"DATA_LOADER_RESULTS_ERROR\",\n {\n ...params,\n loader\n }\n );\n }\n acc.push(...res);\n return acc;\n }, []);\n }\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Data loader error.\",\n ex.code || \"DATA_LOADER_ERROR\",\n {\n error: ex,\n ...params,\n loader,\n ids\n }\n );\n }\n throw new WebinyError(\n `Data loader did not return array of items or empty array.`,\n \"INVALID_DATA_LOADER_RESULT\",\n {\n loader,\n ids,\n results\n }\n );\n }\n\n public clearAll(params?: DataLoadersHandlerInterfaceClearAllParams): void {\n this.cache.clearAll(params);\n }\n}\n"],"names":["DataLoadersHandler","params","DataLoaderCache","ids","id","entryId","parseIdentifier","name","model","cacheParams","loader","factory","getDataLoaderFactory","results","Array","acc","res","WebinyError","JSON","ex"],"mappings":";;;;AAgCO,MAAMA;IAIT,YAAmBC,MAAiC,CAAE;aAFrC,KAAK,GAAG,IAAIC;QAGzB,IAAI,CAAC,MAAM,GAAGD,OAAO,MAAM;IAC/B;IAEA,MAAa,qBACTA,MAAwB,EACK;QAC7B,MAAME,MAAMF,OAAO,GAAG,CAAC,GAAG,CAACG,CAAAA;YACvB,MAAM,EAAE,IAAIC,OAAO,EAAE,GAAGC,gBAAgBF;YACxC,OAAOC;QACX;QACA,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAI,wBAAwBJ,QAAQE;IAClE;IAEA,MAAa,gBACTF,MAAwB,EACK;QAC7B,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAI,mBAAmBA,QAAQA,OAAO,GAAG;IACvE;IAEA,MAAa,8BACTA,MAAwB,EACK;QAC7B,MAAME,MAAMF,OAAO,GAAG,CAAC,GAAG,CAACG,CAAAA;YACvB,MAAM,EAAE,IAAIC,OAAO,EAAE,GAAGC,gBAAgBF;YACxC,OAAOC;QACX;QACA,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAI,iCAAiCJ,QAAQE;IAC3E;IAEA,MAAa,2BACTF,MAAwB,EACK;QAC7B,MAAME,MAAMF,OAAO,GAAG,CAAC,GAAG,CAACG,CAAAA;YACvB,MAAM,EAAE,IAAIC,OAAO,EAAE,GAAGC,gBAAgBF;YACxC,OAAOC;QACX;QACA,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAI,8BAA8BJ,QAAQE;IACxE;IAMQ,UAAUI,IAAiB,EAAEN,MAAuB,EAAwB;QAChF,MAAM,EAAEO,KAAK,EAAE,GAAGP;QAClB,MAAMQ,cAA8B;YAChC,QAAQD,MAAM,MAAM;YACpB,SAASA,MAAM,OAAO;YACtBD;QACJ;QACA,IAAIG,SAAS,IAAI,CAAC,KAAK,CAAC,aAAa,CAACD;QACtC,IAAIC,QACA,OAAOA;QAEX,MAAMC,UAAUC,qBAAqBL;QACrCG,SAASC,QAAQ;YACb,QAAQ,IAAI,CAAC,MAAM;YACnB,QAAQH,MAAM,MAAM;YACpB,SAASA,MAAM,OAAO;QAC1B;QACA,IAAI,CAAC,KAAK,CAAC,aAAa,CAACC,aAAaC;QACtC,OAAOA;IACX;IAEA,MAAc,SACVA,MAAmB,EACnBT,MAAuB,EACvBE,GAAsB,EACO;QAC7B,IAAIU,UAAgC,EAAE;QACtC,IAAI;YACAA,UAAU,MAAM,IAAI,CAAC,SAAS,CAACH,QAAQT,QAAQ,QAAQ,CAACE;YACxD,IAAIW,AAA2B,SAA3BA,MAAM,OAAO,CAACD,UACd,OAAOA,QAAQ,MAAM,CAAuB,CAACE,KAAKC;gBAC9C,IAAIF,AAAuB,UAAvBA,MAAM,OAAO,CAACE,MAAgB;oBAC9B,IAAIA,OAAOA,IAAI,OAAO,EAClB,MAAM,IAAIC,MAAYD,IAAI,OAAO,EAAEA,IAAI,IAAI,EAAE;wBACzC,GAAGA,GAAG;wBACN,MAAME,KAAK,SAAS,CAACF,IAAI,IAAI,IAAI,CAAC;oBACtC;oBAEJ,MAAM,IAAIC,MACN,yFACA,6BACA;wBACI,GAAGhB,MAAM;wBACTS;oBACJ;gBAER;gBACAK,IAAI,IAAI,IAAIC;gBACZ,OAAOD;YACX,GAAG,EAAE;QAEb,EAAE,OAAOI,IAAI;YACT,MAAM,IAAIF,MACNE,GAAG,OAAO,IAAI,sBACdA,GAAG,IAAI,IAAI,qBACX;gBACI,OAAOA;gBACP,GAAGlB,MAAM;gBACTS;gBACAP;YACJ;QAER;QACA,MAAM,IAAIc,MACN,6DACA,8BACA;YACIP;YACAP;YACAU;QACJ;IAER;IAEO,SAASZ,MAAkD,EAAQ;QACtE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAACA;IACxB;AACJ"}
@@ -89,7 +89,7 @@ const createEntriesStorageOperations = (params)=>{
89
89
  try {
90
90
  await entityBatch.execute();
91
91
  dataLoaders.clearAll({
92
- model
92
+ tenant: entry.tenant
93
93
  });
94
94
  } catch (ex) {
95
95
  throw new WebinyError(ex.message || "Could not insert entry data into the DynamoDB table.", ex.code || "CREATE_ENTRY_ERROR", {
@@ -181,7 +181,7 @@ const createEntriesStorageOperations = (params)=>{
181
181
  try {
182
182
  await entityBatch.execute();
183
183
  dataLoaders.clearAll({
184
- model
184
+ tenant: entry.tenant
185
185
  });
186
186
  } catch (ex) {
187
187
  throw new WebinyError(ex.message || "Could not create revision from given entry in the DynamoDB table.", ex.code || "CREATE_REVISION_ERROR", {
@@ -330,7 +330,7 @@ const createEntriesStorageOperations = (params)=>{
330
330
  try {
331
331
  await entityBatch.execute();
332
332
  dataLoaders.clearAll({
333
- model
333
+ tenant: entry.tenant
334
334
  });
335
335
  } catch (ex) {
336
336
  throw new WebinyError(ex.message || "Could not update entry DynamoDB records.", ex.code || "UPDATE_ENTRY_ERROR", {
@@ -384,7 +384,7 @@ const createEntriesStorageOperations = (params)=>{
384
384
  try {
385
385
  await entityBatch.execute();
386
386
  dataLoaders.clearAll({
387
- model
387
+ tenant: initialModel.tenant
388
388
  });
389
389
  } catch (ex) {
390
390
  throw new WebinyError(ex.message || "Could not move all entry records from in the DynamoDB table.", ex.code || "MOVE_ENTRY_ERROR", {
@@ -478,7 +478,7 @@ const createEntriesStorageOperations = (params)=>{
478
478
  try {
479
479
  await entityBatch.execute();
480
480
  dataLoaders.clearAll({
481
- model
481
+ tenant: entry.tenant
482
482
  });
483
483
  } catch (ex) {
484
484
  throw new WebinyError(ex.message || "Could mark as deleted all entry records from in the DynamoDB table.", ex.code || "MOVE_ENTRY_TO_BIN_ERROR", {
@@ -573,7 +573,7 @@ const createEntriesStorageOperations = (params)=>{
573
573
  try {
574
574
  await entityBatch.execute();
575
575
  dataLoaders.clearAll({
576
- model
576
+ tenant: entry.tenant
577
577
  });
578
578
  } catch (ex) {
579
579
  throw new WebinyError(ex.message || "Could not restore all entry records from in the DynamoDB table.", ex.code || "RESTORE_ENTRY_ERROR", {
@@ -657,7 +657,7 @@ const createEntriesStorageOperations = (params)=>{
657
657
  try {
658
658
  await entityBatch.execute();
659
659
  dataLoaders.clearAll({
660
- model
660
+ tenant: entry.tenant
661
661
  });
662
662
  } catch (ex) {
663
663
  throw new WebinyError(ex.message || "Could not destroy entry records from DynamoDB table.", ex.code || "DELETE_ENTRY_ERROR", {
@@ -743,7 +743,7 @@ const createEntriesStorageOperations = (params)=>{
743
743
  try {
744
744
  await entityBatch.execute();
745
745
  dataLoaders.clearAll({
746
- model
746
+ tenant: entry.tenant
747
747
  });
748
748
  } catch (ex) {
749
749
  throw new WebinyError(ex.message || "Could not batch write entry records to DynamoDB table.", ex.code || "DELETE_REVISION_ERROR", {
@@ -1048,7 +1048,7 @@ const createEntriesStorageOperations = (params)=>{
1048
1048
  try {
1049
1049
  await entityBatch.execute();
1050
1050
  dataLoaders.clearAll({
1051
- model
1051
+ tenant: entry.tenant
1052
1052
  });
1053
1053
  } catch (ex) {
1054
1054
  throw new WebinyError(ex.message || "Could not store publish entry records in DynamoDB table.", ex.code || "PUBLISH_ERROR", {
@@ -1134,7 +1134,7 @@ const createEntriesStorageOperations = (params)=>{
1134
1134
  try {
1135
1135
  await entityBatch.execute();
1136
1136
  dataLoaders.clearAll({
1137
- model
1137
+ tenant: entry.tenant
1138
1138
  });
1139
1139
  } catch (ex) {
1140
1140
  throw new WebinyError(ex.message || "Could not store unpublished entry records in DynamoDB table.", ex.code || "UNPUBLISH_ERROR", {
@@ -1 +1 @@
1
- {"version":3,"file":"operations/entry/index.js","sources":["../../../src/operations/entry/index.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport type {\n CmsEntry,\n CmsEntryStorageOperationsCreateParams,\n CmsEntryStorageOperationsCreateRevisionFromParams,\n CmsEntryStorageOperationsDeleteEntriesParams,\n CmsEntryStorageOperationsDeleteParams,\n CmsEntryStorageOperationsDeleteRevisionParams,\n CmsEntryStorageOperationsGetByIdsParams,\n CmsEntryStorageOperationsGetLatestByIdsParams,\n CmsEntryStorageOperationsGetLatestRevisionParams,\n CmsEntryStorageOperationsGetParams,\n CmsEntryStorageOperationsGetPreviousRevisionParams,\n CmsEntryStorageOperationsGetPublishedByIdsParams,\n CmsEntryStorageOperationsGetPublishedRevisionParams,\n CmsEntryStorageOperationsGetRevisionParams,\n CmsEntryStorageOperationsGetRevisionsParams,\n CmsEntryStorageOperationsGetUniqueFieldValuesParams,\n CmsEntryStorageOperationsListParams,\n CmsEntryStorageOperationsMoveToBinParams,\n CmsEntryStorageOperationsPublishParams,\n CmsEntryStorageOperationsRestoreFromBinParams,\n CmsEntryStorageOperationsUnpublishParams,\n CmsEntryStorageOperationsUpdateParams,\n CmsEntryValues,\n CmsModel,\n CmsStorageEntry,\n StorageOperationsCmsModel\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport { CONTENT_ENTRY_STATUS } from \"@webiny/api-headless-cms/types/index.js\";\nimport { extractEntriesFromIndex } from \"~/helpers/index.js\";\nimport { configurations } from \"~/configurations.js\";\nimport type { Client } from \"@webiny/api-opensearch\";\nimport {\n createLimit,\n decodeCursor,\n encodeCursor,\n type IOpenSearchEntity as IElasticsearchEntity,\n type IOpenSearchEntityAttributes as IElasticsearchEntityAttributes\n} from \"@webiny/api-opensearch\";\nimport type { PluginsContainer } from \"@webiny/plugins\";\nimport type { IEntityQueryAllParams } from \"@webiny/db-dynamodb\";\nimport { DataLoadersHandler } from \"./dataLoaders.js\";\nimport {\n createEntryLatestKeys,\n createEntryPublishedKeys,\n createEntryRevisionKeys,\n createLatestSortKey,\n createPartitionKey,\n createPublishedSortKey,\n createRevisionSortKey\n} from \"./keys.js\";\nimport {\n getTotalCount,\n type OpenSearchSearchResponse,\n type SearchBody as OpenSearchSearchBody\n} from \"@webiny/api-opensearch/types.js\";\nimport type { CmsEntryStorageOperations, CmsIndexEntry } from \"~/types.js\";\nimport { createElasticsearchBody } from \"./elasticsearch/body.js\";\nimport { shouldIgnoreEsResponseError } from \"./elasticsearch/shouldIgnoreEsResponseError.js\";\nimport { StorageOperationsCmsModelPlugin } from \"@webiny/api-headless-cms\";\nimport { createTransformer } from \"./transformations/index.js\";\nimport { convertEntryKeysFromStorage } from \"./transformations/convertEntryKeys.js\";\nimport {\n isDeletedEntryMetaField,\n isEntryLevelEntryMetaField,\n isRestoredEntryMetaField,\n pickEntryMetaFields\n} from \"@webiny/api-headless-cms/constants.js\";\nimport type { IEntryEntity, IEntryEntityAttributes } from \"~/definitions/types.js\";\nimport type { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\nimport { CompressionHandler } from \"@webiny/utils/features/compression/abstractions/CompressionHandler.js\";\nimport type { CmsEntryOpenSearchBodyModifier } from \"~/features/CmsEntryOpenSearchBodyModifier/index.js\";\nimport type { CmsEntryOpenSearchSortModifier } from \"~/features/CmsEntryOpenSearchSortModifier/index.js\";\nimport type { CmsEntryOpenSearchValuesModifier } from \"~/features/CmsEntryOpenSearchValuesModifier/index.js\";\nimport type { CmsEntryOpenSearchQueryModifier } from \"~/features/CmsEntryOpenSearchQueryModifier/index.js\";\nimport type { CmsEntryOpenSearchValueSearchRegistry } from \"~/features/CmsEntryOpenSearchValueSearch/index.js\";\nimport type { CmsEntryOpenSearchFullTextSearch } from \"~/features/CmsEntryOpenSearchFullTextSearch/index.js\";\nimport type { CmsEntryOpenSearchFieldIndexRegistry } from \"~/features/CmsEntryOpenSearchFieldIndex/index.js\";\nimport type { CmsEntryOpenSearchFilterRegistry } from \"~/features/CmsEntryOpenSearchFilter/index.js\";\n\nexport interface CreateEntriesStorageOperationsParams {\n entity: IEntryEntity;\n esEntity: IElasticsearchEntity;\n elasticsearch: Client;\n plugins: PluginsContainer;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n fieldIndexRegistry: CmsEntryOpenSearchFieldIndexRegistry.Interface;\n compressionHandler: CompressionHandler.Interface;\n bodyModifiers: CmsEntryOpenSearchBodyModifier.Interface[];\n sortModifiers: CmsEntryOpenSearchSortModifier.Interface[];\n queryModifiers: CmsEntryOpenSearchQueryModifier.Interface[];\n valueSearchRegistry: CmsEntryOpenSearchValueSearchRegistry.Interface;\n fullTextSearches: CmsEntryOpenSearchFullTextSearch.Interface[];\n valuesModifiers: CmsEntryOpenSearchValuesModifier.Interface[];\n filterRegistry: CmsEntryOpenSearchFilterRegistry.Interface;\n}\n\ninterface ConvertStorageEntryParams<T extends CmsEntryValues = CmsEntryValues> {\n storageEntry: CmsStorageEntry<T>;\n model: StorageOperationsCmsModel<T>;\n}\n\nconst convertToStorageEntry = <T extends CmsEntryValues = CmsEntryValues>(\n params: ConvertStorageEntryParams<T>\n): CmsStorageEntry<T> => {\n const { model, storageEntry } = params;\n\n const values = model.convertValueKeyToStorage({\n fields: model.fields,\n values: storageEntry.values\n });\n return {\n ...storageEntry,\n values\n };\n};\n\nexport const createEntriesStorageOperations = (\n params: CreateEntriesStorageOperationsParams\n): CmsEntryStorageOperations => {\n const {\n entity,\n esEntity,\n elasticsearch,\n plugins,\n fieldRegistry,\n fieldIndexRegistry,\n compressionHandler,\n bodyModifiers,\n sortModifiers,\n queryModifiers,\n valueSearchRegistry,\n fullTextSearches,\n valuesModifiers,\n filterRegistry\n } = params;\n\n let storageOperationsCmsModelPlugin: StorageOperationsCmsModelPlugin | undefined;\n const getStorageOperationsCmsModelPlugin = () => {\n if (storageOperationsCmsModelPlugin) {\n return storageOperationsCmsModelPlugin;\n }\n storageOperationsCmsModelPlugin = plugins.oneByType<StorageOperationsCmsModelPlugin>(\n StorageOperationsCmsModelPlugin.type\n );\n return storageOperationsCmsModelPlugin;\n };\n\n const getStorageOperationsModel = <T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel\n ): StorageOperationsCmsModel<T> => {\n const plugin = getStorageOperationsCmsModelPlugin();\n return plugin.getModel(model) as StorageOperationsCmsModel<T>;\n };\n\n const dataLoaders = new DataLoadersHandler({\n entity\n });\n\n const create = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsCreateParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n\n const model = getStorageOperationsModel<T>(initialModel);\n\n const isPublished = initialEntry.status === \"published\";\n const locked = isPublished ? true : initialEntry.locked;\n\n initialEntry.locked = locked;\n initialStorageEntry.locked = locked;\n\n const transformer = createTransformer<T>({\n fieldIndexRegistry,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n compressionHandler,\n valuesModifiers\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const esEntry = transformer.transformToIndex();\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n const revisionKeys = createEntryRevisionKeys(entry);\n const latestKeys = createEntryLatestKeys(entry);\n const publishedKeys = createEntryPublishedKeys(entry);\n\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...revisionKeys,\n data: {\n ...storageEntry,\n locked\n }\n },\n {\n ...latestKeys,\n data: {\n ...storageEntry,\n locked\n }\n }\n ]\n });\n\n if (isPublished) {\n entityBatch.put({\n ...publishedKeys,\n data: {\n ...storageEntry,\n locked\n }\n });\n }\n\n try {\n await entityBatch.execute();\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not insert entry data into the DynamoDB table.\",\n ex.code || \"CREATE_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n const esLatestData = await transformer.getElasticsearchLatestEntryData();\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n put: [\n {\n ...latestKeys,\n index: esIndex,\n data: esLatestData\n }\n ]\n });\n\n if (isPublished) {\n const esPublishedData = await transformer.getElasticsearchPublishedEntryData();\n elasticsearchEntityBatch.put({\n ...publishedKeys,\n index: esIndex,\n data: esPublishedData\n });\n }\n\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not insert entry data into the Elasticsearch DynamoDB table.\",\n ex.code || \"CREATE_ES_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n esEntry\n }\n );\n }\n\n return initialStorageEntry;\n };\n\n const createRevisionFrom = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsCreateRevisionFromParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel<T>(initialModel);\n\n const transformer = createTransformer<T>({\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler,\n valuesModifiers\n });\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const revisionKeys = createEntryRevisionKeys(entry);\n const latestKeys = createEntryLatestKeys(entry);\n const publishedKeys = createEntryPublishedKeys(entry);\n\n // We'll need this flag below.\n const isPublished = entry.status === \"published\";\n\n const esLatestData = await transformer.getElasticsearchLatestEntryData();\n\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...revisionKeys,\n data: storageEntry\n },\n {\n ...latestKeys,\n data: storageEntry\n }\n ]\n });\n\n if (isPublished) {\n entityBatch.put({\n ...publishedKeys,\n data: storageEntry\n });\n\n // Unpublish previously published revision (if any).\n const [publishedRevisionStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId(\n {\n model,\n ids: [entry.id]\n }\n );\n\n if (publishedRevisionStorageEntry) {\n const publishedRevisionKey = createEntryRevisionKeys(publishedRevisionStorageEntry);\n entityBatch.put({\n ...publishedRevisionKey,\n data: {\n ...publishedRevisionStorageEntry,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED\n }\n });\n }\n }\n\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create revision from given entry in the DynamoDB table.\",\n ex.code || \"CREATE_REVISION_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n put: [\n {\n ...latestKeys,\n index: esIndex,\n data: esLatestData\n }\n ]\n });\n\n if (isPublished) {\n const esPublishedData = await transformer.getElasticsearchPublishedEntryData();\n elasticsearchEntityBatch.put({\n ...publishedKeys,\n index: esIndex,\n data: esPublishedData\n });\n }\n\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update latest entry in the DynamoDB Elasticsearch table.\",\n ex.code || \"CREATE_REVISION_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n /**\n * There are no modifications on the entry created so just return the data.\n */\n return initialStorageEntry;\n };\n\n const update = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsUpdateParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const isPublished = entry.status === \"published\";\n const locked = isPublished ? true : entry.locked;\n\n const revisionKeys = createEntryRevisionKeys(entry);\n const latestKeys = createEntryLatestKeys(entry);\n const publishedKeys = createEntryPublishedKeys(entry);\n\n /**\n * We need the latest entry to check if it needs to be updated.\n */\n const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...revisionKeys,\n data: {\n ...storageEntry,\n locked\n }\n }\n ]\n });\n\n if (isPublished) {\n entityBatch.put({\n ...publishedKeys,\n data: {\n ...storageEntry,\n locked\n }\n });\n }\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n /**\n * If the latest entry is the one being updated, we need to create a new latest entry records.\n */\n if (latestStorageEntry) {\n const updatingLatestRevision = latestStorageEntry.id === entry.id;\n if (updatingLatestRevision) {\n /**\n * First we update the regular DynamoDB table.\n */\n entityBatch.put({\n ...latestKeys,\n data: storageEntry\n });\n\n /**\n * And then update the Elasticsearch table to propagate changes to the Elasticsearch\n */\n const elasticsearchLatestData = await transformer.getElasticsearchLatestEntryData();\n\n elasticsearchEntityBatch.put({\n ...latestKeys,\n index: esIndex,\n data: elasticsearchLatestData\n });\n } else {\n /**\n * If not updating latest revision, we still want to update the latest revision's\n * entry-level meta fields to match the current revision's entry-level meta fields.\n */\n const updatedEntryLevelMetaFields = pickEntryMetaFields(\n entry,\n isEntryLevelEntryMetaField\n );\n\n const updatedLatestStorageEntry: IEntryEntityAttributes = {\n ...latestKeys,\n data: {\n ...latestStorageEntry,\n ...updatedEntryLevelMetaFields\n }\n };\n\n /**\n * First we update the regular DynamoDB table. Two updates are needed:\n * - one for the actual revision record\n * - one for the latest record\n */\n entityBatch.put({\n ...updatedLatestStorageEntry,\n PK: createPartitionKey({\n id: latestStorageEntry.id,\n tenant: model.tenant\n }),\n SK: createRevisionSortKey(latestStorageEntry)\n });\n\n entityBatch.put({\n ...updatedLatestStorageEntry\n });\n\n /**\n * Update the Elasticsearch table to propagate changes to the Elasticsearch.\n */\n const latestEsEntry = await esEntity.getClean(latestKeys);\n\n if (latestEsEntry) {\n const latestEsEntryDataDecompressed = (await compressionHandler.decompress(\n latestEsEntry.data\n )) as CmsIndexEntry;\n\n const updatedLatestEntry = await compressionHandler.compress({\n ...latestEsEntryDataDecompressed,\n ...updatedEntryLevelMetaFields\n });\n\n elasticsearchEntityBatch.put({\n ...latestKeys,\n index: esIndex,\n data: updatedLatestEntry\n });\n }\n }\n }\n\n if (isPublished && publishedStorageEntry?.id === entry.id) {\n const elasticsearchPublishedData =\n await transformer.getElasticsearchPublishedEntryData();\n elasticsearchEntityBatch.put({\n ...publishedKeys,\n index: esIndex,\n data: elasticsearchPublishedData\n });\n }\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update entry DynamoDB records.\",\n ex.code || \"UPDATE_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update entry DynamoDB Elasticsearch records.\",\n ex.code || \"UPDATE_ES_ENTRY_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n return initialStorageEntry;\n };\n\n const move: CmsEntryStorageOperations[\"move\"] = async (\n initialModel: CmsModel,\n id: string,\n folderId: string\n ) => {\n const model = getStorageOperationsModel(initialModel);\n\n const partitionKey = createPartitionKey({\n id,\n tenant: model.tenant\n });\n /**\n * First we need to fetch all the records in the regular DynamoDB table.\n */\n const queryAllParams: IEntityQueryAllParams = {\n partitionKey,\n options: {\n gte: \" \"\n }\n };\n const latestSortKey = createLatestSortKey();\n const publishedSortKey = createPublishedSortKey();\n const records = await entity.queryAll(queryAllParams);\n /**\n * Then update the folderId in each record and prepare it to be stored.\n */\n let latestRecord: CmsEntry | undefined = undefined;\n let publishedRecord: CmsEntry | undefined = undefined;\n const entityBatch = entity.createEntityWriter();\n\n for (const record of records) {\n entityBatch.put({\n ...record,\n data: {\n ...record.data,\n location: {\n ...record.data.location,\n folderId\n }\n }\n });\n\n /**\n * We need to get the published and latest records, so we can update the Elasticsearch.\n */\n if (record.SK === publishedSortKey) {\n publishedRecord = record.data;\n } else if (record.SK === latestSortKey) {\n latestRecord = record.data;\n }\n }\n try {\n await entityBatch.execute();\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not move all entry records from in the DynamoDB table.\",\n ex.code || \"MOVE_ENTRY_ERROR\",\n {\n error: ex,\n id\n }\n );\n }\n\n const esEntityReader = esEntity.createEntityReader();\n\n if (publishedRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: publishedSortKey\n });\n }\n if (latestRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: latestSortKey\n });\n }\n if (esEntityReader.total === 0) {\n return;\n }\n const esRecords = await esEntityReader.execute();\n\n const esItems = (\n await Promise.all(\n esRecords.map(async record => {\n if (!record) {\n return null;\n }\n return {\n ...record,\n data: await compressionHandler.decompress(record.data)\n };\n })\n )\n ).filter((item): item is IElasticsearchEntityAttributes => !!item);\n\n if (esItems.length === 0) {\n return;\n }\n\n try {\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n put: await Promise.all(\n esItems.map(async item => {\n return {\n ...item,\n data: await compressionHandler.compress({\n ...item.data,\n location: {\n ...item.data?.location,\n folderId\n }\n })\n };\n })\n )\n });\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not move entry DynamoDB Elasticsearch records.\",\n ex.code || \"MOVE_ES_ENTRY_ERROR\",\n {\n error: ex,\n partitionKey\n }\n );\n }\n };\n\n const moveToBin: CmsEntryStorageOperations[\"moveToBin\"] = async (\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsMoveToBinParams\n ) => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n tenant: model.tenant\n });\n\n /**\n * First we need to fetch all the records in the regular DynamoDB table.\n */\n const queryAllParams: IEntityQueryAllParams = {\n partitionKey,\n options: {\n gte: \" \"\n }\n };\n\n const latestSortKey = createLatestSortKey();\n const publishedSortKey = createPublishedSortKey();\n const records = await entity.queryAll(queryAllParams);\n\n /**\n * Let's pick the `deleted` meta fields from the entry.\n */\n const updatedEntryMetaFields = pickEntryMetaFields(entry, isDeletedEntryMetaField);\n\n /**\n * Then update all the records with data received.\n */\n let latestRecord: CmsEntry | undefined = undefined;\n let publishedRecord: CmsEntry | undefined = undefined;\n\n const entityBatch = entity.createEntityWriter();\n\n for (const record of records) {\n entityBatch.put({\n ...record,\n data: {\n ...record.data,\n ...updatedEntryMetaFields,\n wbyDeleted: storageEntry.wbyDeleted,\n location: storageEntry.location,\n binOriginalFolderId: storageEntry.binOriginalFolderId\n }\n });\n\n /**\n * We need to get the published and latest records, so we can update the Elasticsearch.\n */\n if (record.SK === publishedSortKey) {\n publishedRecord = record.data;\n } else if (record.SK === latestSortKey) {\n latestRecord = record.data;\n }\n }\n\n /**\n * We write the records back to the primary DynamoDB table.\n */\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could mark as deleted all entry records from in the DynamoDB table.\",\n ex.code || \"MOVE_ENTRY_TO_BIN_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n /**\n * We need to get the published and latest records from Elasticsearch.\n */\n const esEntityReader = esEntity.createEntityReader();\n if (publishedRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: publishedSortKey\n });\n }\n if (latestRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: latestSortKey\n });\n }\n if (esEntityReader.total === 0) {\n return;\n }\n\n const esRecords = await esEntityReader.execute();\n\n const esItems = (\n await Promise.all(\n esRecords.map(async record => {\n if (!record) {\n return null;\n }\n return {\n ...record,\n data: await compressionHandler.decompress(record.data)\n };\n })\n )\n ).filter((item): item is IElasticsearchEntityAttributes => !!item);\n\n if (esItems.length === 0) {\n return;\n }\n\n /**\n * We update all ES records with data received.\n */\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n\n for (const item of esItems) {\n elasticsearchEntityBatch.put({\n ...item,\n data: await compressionHandler.compress({\n ...item.data,\n ...updatedEntryMetaFields,\n wbyDeleted: entry.wbyDeleted,\n location: entry.location,\n binOriginalFolderId: entry.binOriginalFolderId\n })\n });\n }\n\n /**\n * We write the records back to the primary DynamoDB Elasticsearch table.\n */\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not mark as deleted entry records from DynamoDB Elasticsearch table.\",\n ex.code || \"MOVE_ENTRY_TO_BIN_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n };\n\n const restoreFromBin = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsRestoreFromBinParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n /**\n * Let's pick the `restored` meta fields from the storage entry.\n */\n const updatedEntryMetaFields = pickEntryMetaFields(entry, isRestoredEntryMetaField);\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n tenant: model.tenant\n });\n\n /**\n * First we need to fetch all the records in the regular DynamoDB table.\n */\n const queryAllParams: IEntityQueryAllParams = {\n partitionKey,\n options: {\n gte: \" \"\n }\n };\n\n const latestSortKey = createLatestSortKey();\n const publishedSortKey = createPublishedSortKey();\n const records = await entity.queryAll(queryAllParams);\n\n /**\n * Then update all the records with data received.\n */\n let latestRecord: CmsEntry | undefined = undefined;\n let publishedRecord: CmsEntry | undefined = undefined;\n\n const entityBatch = entity.createEntityWriter();\n\n for (const record of records) {\n entityBatch.put({\n ...record,\n data: {\n ...record.data,\n ...updatedEntryMetaFields,\n wbyDeleted: storageEntry.wbyDeleted,\n location: storageEntry.location,\n binOriginalFolderId: storageEntry.binOriginalFolderId\n }\n });\n\n /**\n * We need to get the published and latest records, so we can update the Elasticsearch.\n */\n if (record.SK === publishedSortKey) {\n publishedRecord = record.data;\n } else if (record.SK === latestSortKey) {\n latestRecord = record.data;\n }\n }\n\n /**\n * We write the records back to the primary DynamoDB table.\n */\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not restore all entry records from in the DynamoDB table.\",\n ex.code || \"RESTORE_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n /**\n * We need to get the published and latest records from Elasticsearch.\n */\n const esEntityReader = esEntity.createEntityReader();\n if (publishedRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: publishedSortKey\n });\n }\n if (latestRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: latestSortKey\n });\n }\n\n const esRecords = await esEntityReader.execute();\n\n const esItems = (\n await Promise.all(\n esRecords.map(async record => {\n if (!record) {\n return null;\n }\n return {\n ...record,\n data: await compressionHandler.decompress(record.data)\n };\n })\n )\n ).filter((item): item is IElasticsearchEntityAttributes => !!item);\n\n if (esItems.length === 0) {\n return initialStorageEntry;\n }\n\n /**\n * We update all ES records with data received.\n */\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n for (const item of esItems) {\n elasticsearchEntityBatch.put({\n ...item,\n data: await compressionHandler.compress({\n ...item.data,\n ...updatedEntryMetaFields,\n wbyDeleted: entry.wbyDeleted,\n location: entry.location,\n binOriginalFolderId: entry.binOriginalFolderId\n })\n });\n }\n\n /**\n * We write the records back to the primary DynamoDB Elasticsearch table.\n */\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not restore entry records from DynamoDB Elasticsearch table.\",\n ex.code || \"RESTORE_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n return initialStorageEntry;\n };\n\n const deleteEntry: CmsEntryStorageOperations[\"delete\"] = async (\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsDeleteParams\n ) => {\n const { entry } = params;\n const id = entry.id || entry.entryId;\n const model = getStorageOperationsModel(initialModel);\n\n const partitionKey = createPartitionKey({\n id,\n tenant: model.tenant\n });\n\n const items = await entity.queryAll({\n partitionKey,\n options: {\n gte: \" \"\n }\n });\n\n const esItems = await esEntity.queryAll({\n partitionKey,\n options: {\n gte: \" \"\n }\n });\n\n const entityBatch = entity.createEntityWriter({\n delete: items.map(item => {\n return {\n PK: item.PK,\n SK: item.SK\n };\n })\n });\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n delete: esItems.map(item => {\n return {\n PK: item.PK,\n SK: item.SK\n };\n })\n });\n\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not destroy entry records from DynamoDB table.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n id\n }\n );\n }\n\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not destroy entry records from DynamoDB Elasticsearch table.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n id\n }\n );\n }\n };\n\n const deleteRevision = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsDeleteRevisionParams<T>\n ): Promise<void> => {\n const { entry, latestEntry, latestStorageEntry: initialLatestStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n tenant: model.tenant\n });\n\n const { index } = configurations.es({\n model\n });\n /**\n * We need published entry to delete it if necessary.\n */\n const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n /**\n * We need to delete all existing records of the given entry revision.\n */\n const entityBatch = entity.createEntityWriter({\n delete: [\n {\n PK: partitionKey,\n SK: createRevisionSortKey(entry)\n }\n ]\n });\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n\n /**\n * If revision we are deleting is the published one as well, we need to delete those records as well.\n */\n if (publishedStorageEntry?.id === entry.id) {\n entityBatch.delete({\n PK: partitionKey,\n SK: createPublishedSortKey()\n });\n\n elasticsearchEntityBatch.delete({\n PK: partitionKey,\n SK: createPublishedSortKey()\n });\n }\n\n if (latestEntry && initialLatestStorageEntry) {\n const latestStorageEntry = convertToStorageEntry({\n storageEntry: initialLatestStorageEntry,\n model\n });\n\n /**\n * In the end we need to set the new latest entry.\n */\n const latestStorageEntryLatestKey = createEntryLatestKeys(latestStorageEntry);\n entityBatch.put({\n ...latestStorageEntryLatestKey,\n data: latestStorageEntry\n });\n\n /**\n * Also perform an update on the actual revision. This is needed\n * because of updates on the entry-level meta fields.\n */\n const actualRevisionEntryKey = createEntryRevisionKeys(initialLatestStorageEntry);\n entityBatch.put({\n ...actualRevisionEntryKey,\n data: latestStorageEntry\n });\n\n const latestTransformer = createTransformer({\n valuesModifiers,\n model,\n entry: latestEntry,\n storageEntry: initialLatestStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const esLatestData = await latestTransformer.getElasticsearchLatestEntryData();\n\n const esLatestKeys = createEntryLatestKeys(latestEntry);\n elasticsearchEntityBatch.put({\n ...esLatestKeys,\n index,\n data: esLatestData\n });\n }\n\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not batch write entry records to DynamoDB table.\",\n ex.code || \"DELETE_REVISION_ERROR\",\n {\n error: ex,\n entry,\n latestEntry,\n initialLatestStorageEntry\n }\n );\n }\n\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not batch write entry records to DynamoDB Elasticsearch table.\",\n ex.code || \"DELETE_REVISION_ERROR\",\n {\n error: ex,\n entry,\n latestEntry,\n initialLatestStorageEntry\n }\n );\n }\n };\n\n const deleteMultipleEntries: CmsEntryStorageOperations[\"deleteMultipleEntries\"] = async (\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsDeleteEntriesParams\n ) => {\n const { entries } = params;\n const model = getStorageOperationsModel(initialModel);\n /**\n * First we need all the revisions of the entries we want to delete.\n */\n const revisions = await dataLoaders.getAllEntryRevisions({\n model,\n ids: entries\n });\n /**\n * Then we need to construct the queries for all the revisions and entries.\n */\n\n const entityBatch = entity.createEntityWriter();\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n for (const id of entries) {\n /**\n * Latest item.\n */\n entityBatch.delete({\n PK: createPartitionKey({\n id,\n tenant: model.tenant\n }),\n SK: \"L\"\n });\n\n elasticsearchEntityBatch.delete({\n PK: createPartitionKey({\n id,\n tenant: model.tenant\n }),\n SK: \"L\"\n });\n\n /**\n * Published item.\n */\n entityBatch.delete({\n PK: createPartitionKey({\n id,\n tenant: model.tenant\n }),\n SK: \"P\"\n });\n\n elasticsearchEntityBatch.delete({\n PK: createPartitionKey({\n id,\n tenant: model.tenant\n }),\n SK: \"P\"\n });\n }\n /**\n * Exact revisions of all the entries\n */\n for (const revision of revisions) {\n entityBatch.delete({\n PK: createPartitionKey({\n id: revision.id,\n tenant: model.tenant\n }),\n SK: createRevisionSortKey({\n version: revision.version\n })\n });\n }\n\n await entityBatch.execute();\n await elasticsearchEntityBatch.execute();\n };\n\n const list = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsListParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const limit = createLimit(params.limit, 50);\n const { index } = configurations.es({\n model\n });\n\n const body = createElasticsearchBody({\n model,\n fieldRegistry,\n fieldIndexRegistry,\n bodyModifiers,\n sortModifiers,\n queryModifiers,\n valueSearchRegistry,\n fullTextSearches,\n filterRegistry,\n params: {\n ...params,\n limit,\n after: decodeCursor(params.after)\n },\n plugins\n });\n\n let response: OpenSearchSearchResponse;\n try {\n response = await elasticsearch.search({\n index,\n body\n });\n } catch (error) {\n /**\n * We will silently ignore the `index_not_found_exception` error and return an empty result set.\n * This is because the index might not exist yet, and we don't want to throw an error.\n */\n if (shouldIgnoreEsResponseError(error)) {\n return {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null,\n items: []\n };\n }\n\n throw new WebinyError(error.message, error.code || \"OPENSEARCH_ERROR\", {\n error,\n index,\n body,\n model\n });\n }\n\n const { hits, total } = response.body.hits;\n\n const items = extractEntriesFromIndex<T>({\n fieldRegistry,\n fieldIndexRegistry,\n model,\n entries: hits.map(item => {\n return item._source as CmsIndexEntry<T>;\n })\n }).map(item => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry: item\n });\n });\n\n const hasMoreItems = items.length > limit;\n if (hasMoreItems) {\n /**\n * Remove the last item from results, we don't want to include it.\n */\n items.pop();\n }\n /**\n * Cursor is the `sort` value of the last item in the array.\n * https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#search-after\n */\n /**\n * TODO expect errors over hit properties is required due to opensearch library narrowing types too much because of the _source: false. At least what Claude says, didnt go into it too much.\n * Properties are there, but types are not correct.\n */\n // @ts-expect-error\n const cursor = items.length > 0 ? encodeCursor(hits[items.length - 1].sort) || null : null;\n return {\n hasMoreItems,\n totalCount: getTotalCount(total),\n cursor,\n items\n };\n };\n\n const get = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const { items } = await list<T>(model, {\n ...params,\n limit: 1\n });\n return items.shift() || null;\n };\n\n const publish = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsPublishParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const revisionKeys = createEntryRevisionKeys(entry);\n const latestKeys = createEntryLatestKeys(entry);\n const publishedKeys = createEntryPublishedKeys(entry);\n\n let latestEsEntry: IElasticsearchEntityAttributes | null = null;\n try {\n latestEsEntry = await esEntity.getClean(latestKeys);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read Elasticsearch latest data.\",\n ex.code || \"PUBLISH_LATEST_READ\",\n {\n error: ex,\n latestKeys: latestKeys,\n publishedKeys: publishedKeys\n }\n );\n }\n\n if (!latestEsEntry) {\n throw new WebinyError(\n `Could not publish entry. Could not load latest (\"L\") record (ES table).`,\n \"PUBLISH_ERROR\",\n { entry }\n );\n }\n\n /**\n * We need the latest entry to check if it needs to be updated as well in the Elasticsearch.\n */\n const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n if (!latestStorageEntry) {\n throw new WebinyError(\n `Could not publish entry. Could not load latest (\"L\") record.`,\n \"PUBLISH_ERROR\",\n { entry }\n );\n }\n\n /**\n * We need currently published entry to check if need to remove it.\n */\n const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n // 1. Update REV# and P records with new data.\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...revisionKeys,\n data: storageEntry\n },\n {\n ...publishedKeys,\n data: storageEntry\n }\n ]\n });\n\n const elasticsearchEntityWriter = esEntity.createEntityWriter();\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n // 2. When it comes to the latest record, we need to perform a couple of different\n // updates, based on whether the entry being published is the latest revision or not.\n const publishedRevisionId = publishedStorageEntry?.id;\n const publishingLatestRevision = latestStorageEntry?.id === entry.id;\n\n if (publishingLatestRevision) {\n // 2.1 If we're publishing the latest revision, we first need to update the L record.\n entityBatch.put({\n ...latestKeys,\n data: storageEntry\n });\n\n // 2.2 Additionally, if we have a previously published entry, we need to mark it as unpublished.\n // Note that we need to take re-publishing into account (same published revision being\n // published again), in which case the below code does not apply. This is because the\n // required updates were already applied above.\n if (publishedStorageEntry) {\n const isRepublishing = publishedStorageEntry.id === entry.id;\n if (!isRepublishing) {\n /**\n * Update currently published entry (unpublish it)\n */\n const publishedStorageEntryKeys =\n createEntryRevisionKeys(publishedStorageEntry);\n entityBatch.put({\n ...publishedStorageEntryKeys,\n data: {\n ...publishedStorageEntry,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED\n }\n });\n }\n }\n } else {\n // 2.3 If the published revision is not the latest one, the situation is a bit\n // more complex. We first need to update the L and REV# records with the new\n // values of *only entry-level* meta fields.\n const updatedEntryLevelMetaFields = pickEntryMetaFields(\n entry,\n isEntryLevelEntryMetaField\n );\n\n // 2.4 Update L record. Apart from updating the entry-level meta fields, we also need\n // to change the status from \"published\" to \"unpublished\" (if the status is set to \"published\").\n let latestRevisionStatus = latestStorageEntry.status;\n if (latestRevisionStatus === CONTENT_ENTRY_STATUS.PUBLISHED) {\n latestRevisionStatus = CONTENT_ENTRY_STATUS.UNPUBLISHED;\n }\n\n const latestStorageEntryFields = {\n ...latestStorageEntry,\n ...updatedEntryLevelMetaFields,\n status: latestRevisionStatus\n };\n\n const latestStorageEntryLatestKeys = createEntryLatestKeys(latestStorageEntry);\n entityBatch.put({\n ...latestStorageEntryLatestKeys,\n data: latestStorageEntryFields\n });\n\n // 2.5 Update REV# record.\n const latestStorageEntryRevisionKeys = createEntryRevisionKeys(latestStorageEntry);\n entityBatch.put({\n ...latestStorageEntryRevisionKeys,\n data: latestStorageEntryFields\n });\n\n // 2.6 Additionally, if we have a previously published entry, we need to mark it as unpublished.\n // Note that we need to take re-publishing into account (same published revision being\n // published again), in which case the below code does not apply. This is because the\n // required updates were already applied above.\n if (publishedStorageEntry) {\n const isRepublishing = publishedStorageEntry.id === entry.id;\n const publishedRevisionDifferentFromLatest =\n publishedRevisionId !== latestStorageEntry.id;\n\n if (!isRepublishing && publishedRevisionDifferentFromLatest) {\n const publishedStorageEntryRevisionKeys =\n createEntryRevisionKeys(publishedStorageEntry);\n entityBatch.put({\n ...publishedStorageEntryRevisionKeys,\n data: {\n ...publishedStorageEntry,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED\n }\n });\n }\n }\n }\n\n // 3. Update records in ES -> DDB table.\n\n /**\n * Update the published revision entry in ES.\n */\n const esPublishedData = await transformer.getElasticsearchPublishedEntryData();\n elasticsearchEntityWriter.put({\n ...publishedKeys,\n index: esIndex,\n data: esPublishedData\n });\n\n /**\n * Need to decompress the data from Elasticsearch DynamoDB table.\n *\n * No need to transform it for the storage because it was fetched\n * directly from the Elasticsearch table, where it sits transformed.\n */\n const latestEsEntryDataDecompressed = (await compressionHandler.decompress(\n latestEsEntry.data\n )) as CmsIndexEntry;\n\n if (publishingLatestRevision) {\n const updatedMetaFields = pickEntryMetaFields(entry);\n\n const latestTransformer = createTransformer({\n valuesModifiers,\n model,\n transformedToIndex: {\n ...latestEsEntryDataDecompressed,\n status: CONTENT_ENTRY_STATUS.PUBLISHED,\n locked: true,\n ...updatedMetaFields\n },\n fieldIndexRegistry,\n compressionHandler\n });\n\n const esEntryLatestKeys = createEntryLatestKeys(latestEsEntryDataDecompressed);\n elasticsearchEntityWriter.put({\n index: esIndex,\n data: await latestTransformer.getElasticsearchLatestEntryData(),\n ...esEntryLatestKeys\n });\n } else {\n const updatedEntryLevelMetaFields = pickEntryMetaFields(\n entry,\n isEntryLevelEntryMetaField\n );\n\n /**\n * Update the Elasticsearch table to propagate changes to the Elasticsearch.\n */\n const latestEsEntry = await esEntity.getClean(latestKeys);\n\n if (latestEsEntry) {\n const latestEsEntryDataDecompressed = (await compressionHandler.decompress(\n latestEsEntry.data\n )) as CmsIndexEntry;\n\n let latestRevisionStatus = latestEsEntryDataDecompressed.status;\n if (latestRevisionStatus === CONTENT_ENTRY_STATUS.PUBLISHED) {\n latestRevisionStatus = CONTENT_ENTRY_STATUS.UNPUBLISHED;\n }\n\n const updatedLatestEntry = await compressionHandler.compress({\n ...latestEsEntryDataDecompressed,\n ...updatedEntryLevelMetaFields,\n status: latestRevisionStatus\n });\n\n elasticsearchEntityWriter.put({\n ...latestKeys,\n index: esIndex,\n data: updatedLatestEntry\n });\n }\n }\n\n /**\n * Finally, execute regular table batch.\n */\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not store publish entry records in DynamoDB table.\",\n ex.code || \"PUBLISH_ERROR\",\n {\n error: ex,\n entry,\n latestStorageEntry,\n publishedStorageEntry\n }\n );\n }\n /**\n * And Elasticsearch table batch.\n */\n try {\n await elasticsearchEntityWriter.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not store publish entry records in DynamoDB Elasticsearch table.\",\n ex.code || \"PUBLISH_ES_ERROR\",\n {\n error: ex,\n entry,\n latestStorageEntry,\n publishedStorageEntry\n }\n );\n }\n return initialStorageEntry;\n };\n\n const unpublish = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsUnpublishParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel<T>(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n const { entry, storageEntry } = await transformer.transformEntryKeys();\n\n /**\n * We need the latest entry to check if it needs to be updated.\n */\n const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n tenant: model.tenant\n });\n\n const entryRevisionKeys = createEntryRevisionKeys(entry);\n\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...entryRevisionKeys,\n data: storageEntry\n }\n ],\n delete: [\n {\n PK: partitionKey,\n SK: createPublishedSortKey()\n }\n ]\n });\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n delete: [\n {\n PK: partitionKey,\n SK: createPublishedSortKey()\n }\n ]\n });\n\n /**\n * If we are unpublishing the latest revision, let's also update the latest revision entry's status in both DynamoDB tables.\n */\n if (latestStorageEntry?.id === entry.id) {\n const { index } = configurations.es({\n model\n });\n\n const entryLatestKeys = createEntryLatestKeys(storageEntry);\n entityBatch.put({\n ...entryLatestKeys,\n data: storageEntry\n });\n\n const esLatestData = await transformer.getElasticsearchLatestEntryData();\n\n elasticsearchEntityBatch.put({\n index,\n data: esLatestData,\n ...entryLatestKeys\n });\n }\n\n /**\n * Finally, execute regular table batch.\n */\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not store unpublished entry records in DynamoDB table.\",\n ex.code || \"UNPUBLISH_ERROR\",\n {\n entry,\n storageEntry\n }\n );\n }\n /**\n * And Elasticsearch table batch.\n */\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not store unpublished entry records in DynamoDB Elasticsearch table.\",\n ex.code || \"UNPUBLISH_ERROR\",\n {\n entry,\n storageEntry\n }\n );\n }\n return initialStorageEntry;\n };\n\n const getLatestRevisionByEntryId = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetLatestRevisionParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const [entry] = await dataLoaders.getLatestRevisionByEntryId<T>({\n model,\n ids: [params.id]\n });\n if (!entry) {\n return null;\n }\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n };\n\n const getPublishedRevisionByEntryId = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedRevisionParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const [entry] = await dataLoaders.getPublishedRevisionByEntryId<T>({\n model,\n ids: [params.id]\n });\n if (!entry) {\n return null;\n }\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n };\n\n const getRevisionById = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const [entry] = await dataLoaders.getRevisionById<T>({\n model,\n ids: [params.id]\n });\n if (!entry) {\n return null;\n }\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n };\n\n const getRevisions = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionsParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const entries = await dataLoaders.getAllEntryRevisions<T>({\n model,\n ids: [params.id]\n });\n\n return entries.map(entry => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n });\n };\n\n const getByIds = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetByIdsParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const entries = await dataLoaders.getRevisionById<T>({\n model,\n ids: params.ids\n });\n\n return entries.map(entry => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n });\n };\n\n const getLatestByIds = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetLatestByIdsParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const entries = await dataLoaders.getLatestRevisionByEntryId<T>({\n model,\n ids: params.ids\n });\n return entries.map(entry => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n });\n };\n\n const getPublishedByIds = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedByIdsParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const entries = await dataLoaders.getPublishedRevisionByEntryId<T>({\n model,\n ids: params.ids\n });\n\n return entries.map(entry => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n });\n };\n\n const getPreviousRevision = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetPreviousRevisionParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const { tenant } = model;\n const { entryId, version } = params;\n\n const partitionKey = createPartitionKey({\n tenant,\n id: entryId\n });\n const options: IEntityQueryAllParams[\"options\"] = {\n beginsWith: `REV#`,\n reverse: true\n };\n\n try {\n const unfilteredEntries = (\n await entity.queryAll({\n partitionKey,\n options\n })\n ).map(item => {\n return item.data;\n });\n\n const entries = unfilteredEntries.filter(item => {\n return item.version < version;\n });\n\n const entry = entries[0];\n\n if (!entry) {\n return null;\n }\n return convertEntryKeysFromStorage<T>({\n entry,\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not get previous version of given entry.\",\n ex.code || \"GET_PREVIOUS_VERSION_ERROR\",\n {\n ...params,\n error: ex,\n partitionKey,\n options,\n model\n }\n );\n }\n };\n\n const getUniqueFieldValues = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetUniqueFieldValuesParams\n ) => {\n const { where, fieldId } = params;\n\n const { index } = configurations.es({\n model\n });\n\n const initialBody = createElasticsearchBody({\n model,\n fieldRegistry,\n fieldIndexRegistry,\n bodyModifiers,\n sortModifiers,\n queryModifiers,\n valueSearchRegistry,\n fullTextSearches,\n filterRegistry,\n params: {\n limit: 1,\n where\n },\n plugins\n });\n\n const field = model.fields.find(f => f.fieldId === fieldId);\n if (!field) {\n throw new WebinyError(\n `Could not find field with given \"fieldId\" value.`,\n \"FIELD_NOT_FOUND\",\n {\n fieldId\n }\n );\n }\n\n const body: OpenSearchSearchBody = {\n ...initialBody,\n /**\n * We do not need any hits returned, we only need the aggregations.\n */\n size: 0,\n aggregations: {\n getUniqueFieldValues: {\n terms: {\n field: `values.${field.storageId}.keyword`,\n size: 1000000\n }\n }\n }\n };\n\n let response: OpenSearchSearchResponse | undefined = undefined;\n\n try {\n response = await elasticsearch.search({\n index,\n body\n });\n } catch (error) {\n if (shouldIgnoreEsResponseError(error)) {\n return [];\n }\n\n throw new WebinyError(\n error.message || \"Error in the Elasticsearch query.\",\n error.code || \"OPENSEARCH_ERROR\",\n {\n error,\n index,\n model,\n body\n }\n );\n }\n\n const aggregations = response.body.aggregations || {};\n const agg = aggregations[\"getUniqueFieldValues\"];\n const buckets = agg && \"buckets\" in agg && Array.isArray(agg.buckets) ? agg.buckets : [];\n return buckets.map((bucket: { key: string; doc_count: number }) => {\n return {\n value: bucket.key,\n count: bucket.doc_count\n };\n });\n };\n\n return {\n create,\n createRevisionFrom,\n update,\n move,\n delete: deleteEntry,\n moveToBin,\n restoreFromBin,\n deleteRevision,\n deleteMultipleEntries,\n get,\n publish,\n unpublish,\n list,\n getLatestRevisionByEntryId,\n getPublishedRevisionByEntryId,\n getRevisionById,\n getRevisions,\n getByIds,\n getLatestByIds,\n getPublishedByIds,\n getPreviousRevision,\n getUniqueFieldValues,\n dataLoaders\n };\n};\n"],"names":["convertToStorageEntry","params","model","storageEntry","values","createEntriesStorageOperations","entity","esEntity","elasticsearch","plugins","fieldRegistry","fieldIndexRegistry","compressionHandler","bodyModifiers","sortModifiers","queryModifiers","valueSearchRegistry","fullTextSearches","valuesModifiers","filterRegistry","storageOperationsCmsModelPlugin","getStorageOperationsCmsModelPlugin","StorageOperationsCmsModelPlugin","getStorageOperationsModel","plugin","dataLoaders","DataLoadersHandler","create","initialModel","initialEntry","initialStorageEntry","isPublished","locked","transformer","createTransformer","entry","esEntry","esIndex","configurations","revisionKeys","createEntryRevisionKeys","latestKeys","createEntryLatestKeys","publishedKeys","createEntryPublishedKeys","entityBatch","ex","WebinyError","esLatestData","elasticsearchEntityBatch","esPublishedData","createRevisionFrom","publishedRevisionStorageEntry","publishedRevisionKey","CONTENT_ENTRY_STATUS","update","latestStorageEntry","publishedStorageEntry","updatingLatestRevision","elasticsearchLatestData","updatedEntryLevelMetaFields","pickEntryMetaFields","isEntryLevelEntryMetaField","updatedLatestStorageEntry","createPartitionKey","createRevisionSortKey","latestEsEntry","latestEsEntryDataDecompressed","updatedLatestEntry","elasticsearchPublishedData","move","id","folderId","partitionKey","queryAllParams","latestSortKey","createLatestSortKey","publishedSortKey","createPublishedSortKey","records","latestRecord","publishedRecord","record","esEntityReader","esRecords","esItems","Promise","item","moveToBin","updatedEntryMetaFields","isDeletedEntryMetaField","restoreFromBin","isRestoredEntryMetaField","deleteEntry","items","deleteRevision","latestEntry","initialLatestStorageEntry","index","latestStorageEntryLatestKey","actualRevisionEntryKey","latestTransformer","esLatestKeys","deleteMultipleEntries","entries","revisions","revision","list","limit","createLimit","body","createElasticsearchBody","decodeCursor","response","error","shouldIgnoreEsResponseError","hits","total","extractEntriesFromIndex","convertEntryKeysFromStorage","hasMoreItems","cursor","encodeCursor","getTotalCount","get","publish","elasticsearchEntityWriter","publishedRevisionId","publishingLatestRevision","isRepublishing","publishedStorageEntryKeys","latestRevisionStatus","latestStorageEntryFields","latestStorageEntryLatestKeys","latestStorageEntryRevisionKeys","publishedRevisionDifferentFromLatest","publishedStorageEntryRevisionKeys","updatedMetaFields","esEntryLatestKeys","unpublish","entryRevisionKeys","entryLatestKeys","getLatestRevisionByEntryId","getPublishedRevisionByEntryId","getRevisionById","getRevisions","getByIds","getLatestByIds","getPublishedByIds","getPreviousRevision","tenant","entryId","version","options","unfilteredEntries","getUniqueFieldValues","where","fieldId","initialBody","field","f","aggregations","agg","buckets","Array","bucket"],"mappings":"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"}
1
+ {"version":3,"file":"operations/entry/index.js","sources":["../../../src/operations/entry/index.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport type {\n CmsEntry,\n CmsEntryStorageOperationsCreateParams,\n CmsEntryStorageOperationsCreateRevisionFromParams,\n CmsEntryStorageOperationsDeleteEntriesParams,\n CmsEntryStorageOperationsDeleteParams,\n CmsEntryStorageOperationsDeleteRevisionParams,\n CmsEntryStorageOperationsGetByIdsParams,\n CmsEntryStorageOperationsGetLatestByIdsParams,\n CmsEntryStorageOperationsGetLatestRevisionParams,\n CmsEntryStorageOperationsGetParams,\n CmsEntryStorageOperationsGetPreviousRevisionParams,\n CmsEntryStorageOperationsGetPublishedByIdsParams,\n CmsEntryStorageOperationsGetPublishedRevisionParams,\n CmsEntryStorageOperationsGetRevisionParams,\n CmsEntryStorageOperationsGetRevisionsParams,\n CmsEntryStorageOperationsGetUniqueFieldValuesParams,\n CmsEntryStorageOperationsListParams,\n CmsEntryStorageOperationsMoveToBinParams,\n CmsEntryStorageOperationsPublishParams,\n CmsEntryStorageOperationsRestoreFromBinParams,\n CmsEntryStorageOperationsUnpublishParams,\n CmsEntryStorageOperationsUpdateParams,\n CmsEntryValues,\n CmsModel,\n CmsStorageEntry,\n StorageOperationsCmsModel\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport { CONTENT_ENTRY_STATUS } from \"@webiny/api-headless-cms/types/index.js\";\nimport { extractEntriesFromIndex } from \"~/helpers/index.js\";\nimport { configurations } from \"~/configurations.js\";\nimport type { Client } from \"@webiny/api-opensearch\";\nimport {\n createLimit,\n decodeCursor,\n encodeCursor,\n type IOpenSearchEntity as IElasticsearchEntity,\n type IOpenSearchEntityAttributes as IElasticsearchEntityAttributes\n} from \"@webiny/api-opensearch\";\nimport type { PluginsContainer } from \"@webiny/plugins\";\nimport type { IEntityQueryAllParams } from \"@webiny/db-dynamodb\";\nimport { DataLoadersHandler } from \"./dataLoaders.js\";\nimport {\n createEntryLatestKeys,\n createEntryPublishedKeys,\n createEntryRevisionKeys,\n createLatestSortKey,\n createPartitionKey,\n createPublishedSortKey,\n createRevisionSortKey\n} from \"./keys.js\";\nimport {\n getTotalCount,\n type OpenSearchSearchResponse,\n type SearchBody as OpenSearchSearchBody\n} from \"@webiny/api-opensearch/types.js\";\nimport type { CmsEntryStorageOperations, CmsIndexEntry } from \"~/types.js\";\nimport { createElasticsearchBody } from \"./elasticsearch/body.js\";\nimport { shouldIgnoreEsResponseError } from \"./elasticsearch/shouldIgnoreEsResponseError.js\";\nimport { StorageOperationsCmsModelPlugin } from \"@webiny/api-headless-cms\";\nimport { createTransformer } from \"./transformations/index.js\";\nimport { convertEntryKeysFromStorage } from \"./transformations/convertEntryKeys.js\";\nimport {\n isDeletedEntryMetaField,\n isEntryLevelEntryMetaField,\n isRestoredEntryMetaField,\n pickEntryMetaFields\n} from \"@webiny/api-headless-cms/constants.js\";\nimport type { IEntryEntity, IEntryEntityAttributes } from \"~/definitions/types.js\";\nimport type { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\nimport { CompressionHandler } from \"@webiny/utils/features/compression/abstractions/CompressionHandler.js\";\nimport type { CmsEntryOpenSearchBodyModifier } from \"~/features/CmsEntryOpenSearchBodyModifier/index.js\";\nimport type { CmsEntryOpenSearchSortModifier } from \"~/features/CmsEntryOpenSearchSortModifier/index.js\";\nimport type { CmsEntryOpenSearchValuesModifier } from \"~/features/CmsEntryOpenSearchValuesModifier/index.js\";\nimport type { CmsEntryOpenSearchQueryModifier } from \"~/features/CmsEntryOpenSearchQueryModifier/index.js\";\nimport type { CmsEntryOpenSearchValueSearchRegistry } from \"~/features/CmsEntryOpenSearchValueSearch/index.js\";\nimport type { CmsEntryOpenSearchFullTextSearch } from \"~/features/CmsEntryOpenSearchFullTextSearch/index.js\";\nimport type { CmsEntryOpenSearchFieldIndexRegistry } from \"~/features/CmsEntryOpenSearchFieldIndex/index.js\";\nimport type { CmsEntryOpenSearchFilterRegistry } from \"~/features/CmsEntryOpenSearchFilter/index.js\";\n\nexport interface CreateEntriesStorageOperationsParams {\n entity: IEntryEntity;\n esEntity: IElasticsearchEntity;\n elasticsearch: Client;\n plugins: PluginsContainer;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n fieldIndexRegistry: CmsEntryOpenSearchFieldIndexRegistry.Interface;\n compressionHandler: CompressionHandler.Interface;\n bodyModifiers: CmsEntryOpenSearchBodyModifier.Interface[];\n sortModifiers: CmsEntryOpenSearchSortModifier.Interface[];\n queryModifiers: CmsEntryOpenSearchQueryModifier.Interface[];\n valueSearchRegistry: CmsEntryOpenSearchValueSearchRegistry.Interface;\n fullTextSearches: CmsEntryOpenSearchFullTextSearch.Interface[];\n valuesModifiers: CmsEntryOpenSearchValuesModifier.Interface[];\n filterRegistry: CmsEntryOpenSearchFilterRegistry.Interface;\n}\n\ninterface ConvertStorageEntryParams<T extends CmsEntryValues = CmsEntryValues> {\n storageEntry: CmsStorageEntry<T>;\n model: StorageOperationsCmsModel<T>;\n}\n\nconst convertToStorageEntry = <T extends CmsEntryValues = CmsEntryValues>(\n params: ConvertStorageEntryParams<T>\n): CmsStorageEntry<T> => {\n const { model, storageEntry } = params;\n\n const values = model.convertValueKeyToStorage({\n fields: model.fields,\n values: storageEntry.values\n });\n return {\n ...storageEntry,\n values\n };\n};\n\nexport const createEntriesStorageOperations = (\n params: CreateEntriesStorageOperationsParams\n): CmsEntryStorageOperations => {\n const {\n entity,\n esEntity,\n elasticsearch,\n plugins,\n fieldRegistry,\n fieldIndexRegistry,\n compressionHandler,\n bodyModifiers,\n sortModifiers,\n queryModifiers,\n valueSearchRegistry,\n fullTextSearches,\n valuesModifiers,\n filterRegistry\n } = params;\n\n let storageOperationsCmsModelPlugin: StorageOperationsCmsModelPlugin | undefined;\n const getStorageOperationsCmsModelPlugin = () => {\n if (storageOperationsCmsModelPlugin) {\n return storageOperationsCmsModelPlugin;\n }\n storageOperationsCmsModelPlugin = plugins.oneByType<StorageOperationsCmsModelPlugin>(\n StorageOperationsCmsModelPlugin.type\n );\n return storageOperationsCmsModelPlugin;\n };\n\n const getStorageOperationsModel = <T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel\n ): StorageOperationsCmsModel<T> => {\n const plugin = getStorageOperationsCmsModelPlugin();\n return plugin.getModel(model) as StorageOperationsCmsModel<T>;\n };\n\n const dataLoaders = new DataLoadersHandler({\n entity\n });\n\n const create = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsCreateParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n\n const model = getStorageOperationsModel<T>(initialModel);\n\n const isPublished = initialEntry.status === \"published\";\n const locked = isPublished ? true : initialEntry.locked;\n\n initialEntry.locked = locked;\n initialStorageEntry.locked = locked;\n\n const transformer = createTransformer<T>({\n fieldIndexRegistry,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n compressionHandler,\n valuesModifiers\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const esEntry = transformer.transformToIndex();\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n const revisionKeys = createEntryRevisionKeys(entry);\n const latestKeys = createEntryLatestKeys(entry);\n const publishedKeys = createEntryPublishedKeys(entry);\n\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...revisionKeys,\n data: {\n ...storageEntry,\n locked\n }\n },\n {\n ...latestKeys,\n data: {\n ...storageEntry,\n locked\n }\n }\n ]\n });\n\n if (isPublished) {\n entityBatch.put({\n ...publishedKeys,\n data: {\n ...storageEntry,\n locked\n }\n });\n }\n\n try {\n await entityBatch.execute();\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not insert entry data into the DynamoDB table.\",\n ex.code || \"CREATE_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n const esLatestData = await transformer.getElasticsearchLatestEntryData();\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n put: [\n {\n ...latestKeys,\n index: esIndex,\n data: esLatestData\n }\n ]\n });\n\n if (isPublished) {\n const esPublishedData = await transformer.getElasticsearchPublishedEntryData();\n elasticsearchEntityBatch.put({\n ...publishedKeys,\n index: esIndex,\n data: esPublishedData\n });\n }\n\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not insert entry data into the Elasticsearch DynamoDB table.\",\n ex.code || \"CREATE_ES_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n esEntry\n }\n );\n }\n\n return initialStorageEntry;\n };\n\n const createRevisionFrom = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsCreateRevisionFromParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel<T>(initialModel);\n\n const transformer = createTransformer<T>({\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler,\n valuesModifiers\n });\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const revisionKeys = createEntryRevisionKeys(entry);\n const latestKeys = createEntryLatestKeys(entry);\n const publishedKeys = createEntryPublishedKeys(entry);\n\n // We'll need this flag below.\n const isPublished = entry.status === \"published\";\n\n const esLatestData = await transformer.getElasticsearchLatestEntryData();\n\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...revisionKeys,\n data: storageEntry\n },\n {\n ...latestKeys,\n data: storageEntry\n }\n ]\n });\n\n if (isPublished) {\n entityBatch.put({\n ...publishedKeys,\n data: storageEntry\n });\n\n // Unpublish previously published revision (if any).\n const [publishedRevisionStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId(\n {\n model,\n ids: [entry.id]\n }\n );\n\n if (publishedRevisionStorageEntry) {\n const publishedRevisionKey = createEntryRevisionKeys(publishedRevisionStorageEntry);\n entityBatch.put({\n ...publishedRevisionKey,\n data: {\n ...publishedRevisionStorageEntry,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED\n }\n });\n }\n }\n\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create revision from given entry in the DynamoDB table.\",\n ex.code || \"CREATE_REVISION_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n put: [\n {\n ...latestKeys,\n index: esIndex,\n data: esLatestData\n }\n ]\n });\n\n if (isPublished) {\n const esPublishedData = await transformer.getElasticsearchPublishedEntryData();\n elasticsearchEntityBatch.put({\n ...publishedKeys,\n index: esIndex,\n data: esPublishedData\n });\n }\n\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update latest entry in the DynamoDB Elasticsearch table.\",\n ex.code || \"CREATE_REVISION_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n /**\n * There are no modifications on the entry created so just return the data.\n */\n return initialStorageEntry;\n };\n\n const update = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsUpdateParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const isPublished = entry.status === \"published\";\n const locked = isPublished ? true : entry.locked;\n\n const revisionKeys = createEntryRevisionKeys(entry);\n const latestKeys = createEntryLatestKeys(entry);\n const publishedKeys = createEntryPublishedKeys(entry);\n\n /**\n * We need the latest entry to check if it needs to be updated.\n */\n const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...revisionKeys,\n data: {\n ...storageEntry,\n locked\n }\n }\n ]\n });\n\n if (isPublished) {\n entityBatch.put({\n ...publishedKeys,\n data: {\n ...storageEntry,\n locked\n }\n });\n }\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n /**\n * If the latest entry is the one being updated, we need to create a new latest entry records.\n */\n if (latestStorageEntry) {\n const updatingLatestRevision = latestStorageEntry.id === entry.id;\n if (updatingLatestRevision) {\n /**\n * First we update the regular DynamoDB table.\n */\n entityBatch.put({\n ...latestKeys,\n data: storageEntry\n });\n\n /**\n * And then update the Elasticsearch table to propagate changes to the Elasticsearch\n */\n const elasticsearchLatestData = await transformer.getElasticsearchLatestEntryData();\n\n elasticsearchEntityBatch.put({\n ...latestKeys,\n index: esIndex,\n data: elasticsearchLatestData\n });\n } else {\n /**\n * If not updating latest revision, we still want to update the latest revision's\n * entry-level meta fields to match the current revision's entry-level meta fields.\n */\n const updatedEntryLevelMetaFields = pickEntryMetaFields(\n entry,\n isEntryLevelEntryMetaField\n );\n\n const updatedLatestStorageEntry: IEntryEntityAttributes = {\n ...latestKeys,\n data: {\n ...latestStorageEntry,\n ...updatedEntryLevelMetaFields\n }\n };\n\n /**\n * First we update the regular DynamoDB table. Two updates are needed:\n * - one for the actual revision record\n * - one for the latest record\n */\n entityBatch.put({\n ...updatedLatestStorageEntry,\n PK: createPartitionKey({\n id: latestStorageEntry.id,\n tenant: model.tenant\n }),\n SK: createRevisionSortKey(latestStorageEntry)\n });\n\n entityBatch.put({\n ...updatedLatestStorageEntry\n });\n\n /**\n * Update the Elasticsearch table to propagate changes to the Elasticsearch.\n */\n const latestEsEntry = await esEntity.getClean(latestKeys);\n\n if (latestEsEntry) {\n const latestEsEntryDataDecompressed = (await compressionHandler.decompress(\n latestEsEntry.data\n )) as CmsIndexEntry;\n\n const updatedLatestEntry = await compressionHandler.compress({\n ...latestEsEntryDataDecompressed,\n ...updatedEntryLevelMetaFields\n });\n\n elasticsearchEntityBatch.put({\n ...latestKeys,\n index: esIndex,\n data: updatedLatestEntry\n });\n }\n }\n }\n\n if (isPublished && publishedStorageEntry?.id === entry.id) {\n const elasticsearchPublishedData =\n await transformer.getElasticsearchPublishedEntryData();\n elasticsearchEntityBatch.put({\n ...publishedKeys,\n index: esIndex,\n data: elasticsearchPublishedData\n });\n }\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update entry DynamoDB records.\",\n ex.code || \"UPDATE_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update entry DynamoDB Elasticsearch records.\",\n ex.code || \"UPDATE_ES_ENTRY_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n return initialStorageEntry;\n };\n\n const move: CmsEntryStorageOperations[\"move\"] = async (\n initialModel: CmsModel,\n id: string,\n folderId: string\n ) => {\n const model = getStorageOperationsModel(initialModel);\n\n const partitionKey = createPartitionKey({\n id,\n tenant: model.tenant\n });\n /**\n * First we need to fetch all the records in the regular DynamoDB table.\n */\n const queryAllParams: IEntityQueryAllParams = {\n partitionKey,\n options: {\n gte: \" \"\n }\n };\n const latestSortKey = createLatestSortKey();\n const publishedSortKey = createPublishedSortKey();\n const records = await entity.queryAll(queryAllParams);\n /**\n * Then update the folderId in each record and prepare it to be stored.\n */\n let latestRecord: CmsEntry | undefined = undefined;\n let publishedRecord: CmsEntry | undefined = undefined;\n const entityBatch = entity.createEntityWriter();\n\n for (const record of records) {\n entityBatch.put({\n ...record,\n data: {\n ...record.data,\n location: {\n ...record.data.location,\n folderId\n }\n }\n });\n\n /**\n * We need to get the published and latest records, so we can update the Elasticsearch.\n */\n if (record.SK === publishedSortKey) {\n publishedRecord = record.data;\n } else if (record.SK === latestSortKey) {\n latestRecord = record.data;\n }\n }\n try {\n await entityBatch.execute();\n dataLoaders.clearAll({\n tenant: initialModel.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not move all entry records from in the DynamoDB table.\",\n ex.code || \"MOVE_ENTRY_ERROR\",\n {\n error: ex,\n id\n }\n );\n }\n\n const esEntityReader = esEntity.createEntityReader();\n\n if (publishedRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: publishedSortKey\n });\n }\n if (latestRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: latestSortKey\n });\n }\n if (esEntityReader.total === 0) {\n return;\n }\n const esRecords = await esEntityReader.execute();\n\n const esItems = (\n await Promise.all(\n esRecords.map(async record => {\n if (!record) {\n return null;\n }\n return {\n ...record,\n data: await compressionHandler.decompress(record.data)\n };\n })\n )\n ).filter((item): item is IElasticsearchEntityAttributes => !!item);\n\n if (esItems.length === 0) {\n return;\n }\n\n try {\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n put: await Promise.all(\n esItems.map(async item => {\n return {\n ...item,\n data: await compressionHandler.compress({\n ...item.data,\n location: {\n ...item.data?.location,\n folderId\n }\n })\n };\n })\n )\n });\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not move entry DynamoDB Elasticsearch records.\",\n ex.code || \"MOVE_ES_ENTRY_ERROR\",\n {\n error: ex,\n partitionKey\n }\n );\n }\n };\n\n const moveToBin: CmsEntryStorageOperations[\"moveToBin\"] = async (\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsMoveToBinParams\n ) => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n tenant: model.tenant\n });\n\n /**\n * First we need to fetch all the records in the regular DynamoDB table.\n */\n const queryAllParams: IEntityQueryAllParams = {\n partitionKey,\n options: {\n gte: \" \"\n }\n };\n\n const latestSortKey = createLatestSortKey();\n const publishedSortKey = createPublishedSortKey();\n const records = await entity.queryAll(queryAllParams);\n\n /**\n * Let's pick the `deleted` meta fields from the entry.\n */\n const updatedEntryMetaFields = pickEntryMetaFields(entry, isDeletedEntryMetaField);\n\n /**\n * Then update all the records with data received.\n */\n let latestRecord: CmsEntry | undefined = undefined;\n let publishedRecord: CmsEntry | undefined = undefined;\n\n const entityBatch = entity.createEntityWriter();\n\n for (const record of records) {\n entityBatch.put({\n ...record,\n data: {\n ...record.data,\n ...updatedEntryMetaFields,\n wbyDeleted: storageEntry.wbyDeleted,\n location: storageEntry.location,\n binOriginalFolderId: storageEntry.binOriginalFolderId\n }\n });\n\n /**\n * We need to get the published and latest records, so we can update the Elasticsearch.\n */\n if (record.SK === publishedSortKey) {\n publishedRecord = record.data;\n } else if (record.SK === latestSortKey) {\n latestRecord = record.data;\n }\n }\n\n /**\n * We write the records back to the primary DynamoDB table.\n */\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could mark as deleted all entry records from in the DynamoDB table.\",\n ex.code || \"MOVE_ENTRY_TO_BIN_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n /**\n * We need to get the published and latest records from Elasticsearch.\n */\n const esEntityReader = esEntity.createEntityReader();\n if (publishedRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: publishedSortKey\n });\n }\n if (latestRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: latestSortKey\n });\n }\n if (esEntityReader.total === 0) {\n return;\n }\n\n const esRecords = await esEntityReader.execute();\n\n const esItems = (\n await Promise.all(\n esRecords.map(async record => {\n if (!record) {\n return null;\n }\n return {\n ...record,\n data: await compressionHandler.decompress(record.data)\n };\n })\n )\n ).filter((item): item is IElasticsearchEntityAttributes => !!item);\n\n if (esItems.length === 0) {\n return;\n }\n\n /**\n * We update all ES records with data received.\n */\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n\n for (const item of esItems) {\n elasticsearchEntityBatch.put({\n ...item,\n data: await compressionHandler.compress({\n ...item.data,\n ...updatedEntryMetaFields,\n wbyDeleted: entry.wbyDeleted,\n location: entry.location,\n binOriginalFolderId: entry.binOriginalFolderId\n })\n });\n }\n\n /**\n * We write the records back to the primary DynamoDB Elasticsearch table.\n */\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not mark as deleted entry records from DynamoDB Elasticsearch table.\",\n ex.code || \"MOVE_ENTRY_TO_BIN_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n };\n\n const restoreFromBin = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsRestoreFromBinParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n /**\n * Let's pick the `restored` meta fields from the storage entry.\n */\n const updatedEntryMetaFields = pickEntryMetaFields(entry, isRestoredEntryMetaField);\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n tenant: model.tenant\n });\n\n /**\n * First we need to fetch all the records in the regular DynamoDB table.\n */\n const queryAllParams: IEntityQueryAllParams = {\n partitionKey,\n options: {\n gte: \" \"\n }\n };\n\n const latestSortKey = createLatestSortKey();\n const publishedSortKey = createPublishedSortKey();\n const records = await entity.queryAll(queryAllParams);\n\n /**\n * Then update all the records with data received.\n */\n let latestRecord: CmsEntry | undefined = undefined;\n let publishedRecord: CmsEntry | undefined = undefined;\n\n const entityBatch = entity.createEntityWriter();\n\n for (const record of records) {\n entityBatch.put({\n ...record,\n data: {\n ...record.data,\n ...updatedEntryMetaFields,\n wbyDeleted: storageEntry.wbyDeleted,\n location: storageEntry.location,\n binOriginalFolderId: storageEntry.binOriginalFolderId\n }\n });\n\n /**\n * We need to get the published and latest records, so we can update the Elasticsearch.\n */\n if (record.SK === publishedSortKey) {\n publishedRecord = record.data;\n } else if (record.SK === latestSortKey) {\n latestRecord = record.data;\n }\n }\n\n /**\n * We write the records back to the primary DynamoDB table.\n */\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not restore all entry records from in the DynamoDB table.\",\n ex.code || \"RESTORE_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n /**\n * We need to get the published and latest records from Elasticsearch.\n */\n const esEntityReader = esEntity.createEntityReader();\n if (publishedRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: publishedSortKey\n });\n }\n if (latestRecord) {\n esEntityReader.get({\n PK: partitionKey,\n SK: latestSortKey\n });\n }\n\n const esRecords = await esEntityReader.execute();\n\n const esItems = (\n await Promise.all(\n esRecords.map(async record => {\n if (!record) {\n return null;\n }\n return {\n ...record,\n data: await compressionHandler.decompress(record.data)\n };\n })\n )\n ).filter((item): item is IElasticsearchEntityAttributes => !!item);\n\n if (esItems.length === 0) {\n return initialStorageEntry;\n }\n\n /**\n * We update all ES records with data received.\n */\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n for (const item of esItems) {\n elasticsearchEntityBatch.put({\n ...item,\n data: await compressionHandler.compress({\n ...item.data,\n ...updatedEntryMetaFields,\n wbyDeleted: entry.wbyDeleted,\n location: entry.location,\n binOriginalFolderId: entry.binOriginalFolderId\n })\n });\n }\n\n /**\n * We write the records back to the primary DynamoDB Elasticsearch table.\n */\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not restore entry records from DynamoDB Elasticsearch table.\",\n ex.code || \"RESTORE_ENTRY_ERROR\",\n {\n error: ex,\n entry,\n storageEntry\n }\n );\n }\n\n return initialStorageEntry;\n };\n\n const deleteEntry: CmsEntryStorageOperations[\"delete\"] = async (\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsDeleteParams\n ) => {\n const { entry } = params;\n const id = entry.id || entry.entryId;\n const model = getStorageOperationsModel(initialModel);\n\n const partitionKey = createPartitionKey({\n id,\n tenant: model.tenant\n });\n\n const items = await entity.queryAll({\n partitionKey,\n options: {\n gte: \" \"\n }\n });\n\n const esItems = await esEntity.queryAll({\n partitionKey,\n options: {\n gte: \" \"\n }\n });\n\n const entityBatch = entity.createEntityWriter({\n delete: items.map(item => {\n return {\n PK: item.PK,\n SK: item.SK\n };\n })\n });\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n delete: esItems.map(item => {\n return {\n PK: item.PK,\n SK: item.SK\n };\n })\n });\n\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not destroy entry records from DynamoDB table.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n id\n }\n );\n }\n\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not destroy entry records from DynamoDB Elasticsearch table.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n id\n }\n );\n }\n };\n\n const deleteRevision = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsDeleteRevisionParams<T>\n ): Promise<void> => {\n const { entry, latestEntry, latestStorageEntry: initialLatestStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n tenant: model.tenant\n });\n\n const { index } = configurations.es({\n model\n });\n /**\n * We need published entry to delete it if necessary.\n */\n const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n /**\n * We need to delete all existing records of the given entry revision.\n */\n const entityBatch = entity.createEntityWriter({\n delete: [\n {\n PK: partitionKey,\n SK: createRevisionSortKey(entry)\n }\n ]\n });\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n\n /**\n * If revision we are deleting is the published one as well, we need to delete those records as well.\n */\n if (publishedStorageEntry?.id === entry.id) {\n entityBatch.delete({\n PK: partitionKey,\n SK: createPublishedSortKey()\n });\n\n elasticsearchEntityBatch.delete({\n PK: partitionKey,\n SK: createPublishedSortKey()\n });\n }\n\n if (latestEntry && initialLatestStorageEntry) {\n const latestStorageEntry = convertToStorageEntry({\n storageEntry: initialLatestStorageEntry,\n model\n });\n\n /**\n * In the end we need to set the new latest entry.\n */\n const latestStorageEntryLatestKey = createEntryLatestKeys(latestStorageEntry);\n entityBatch.put({\n ...latestStorageEntryLatestKey,\n data: latestStorageEntry\n });\n\n /**\n * Also perform an update on the actual revision. This is needed\n * because of updates on the entry-level meta fields.\n */\n const actualRevisionEntryKey = createEntryRevisionKeys(initialLatestStorageEntry);\n entityBatch.put({\n ...actualRevisionEntryKey,\n data: latestStorageEntry\n });\n\n const latestTransformer = createTransformer({\n valuesModifiers,\n model,\n entry: latestEntry,\n storageEntry: initialLatestStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const esLatestData = await latestTransformer.getElasticsearchLatestEntryData();\n\n const esLatestKeys = createEntryLatestKeys(latestEntry);\n elasticsearchEntityBatch.put({\n ...esLatestKeys,\n index,\n data: esLatestData\n });\n }\n\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not batch write entry records to DynamoDB table.\",\n ex.code || \"DELETE_REVISION_ERROR\",\n {\n error: ex,\n entry,\n latestEntry,\n initialLatestStorageEntry\n }\n );\n }\n\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not batch write entry records to DynamoDB Elasticsearch table.\",\n ex.code || \"DELETE_REVISION_ERROR\",\n {\n error: ex,\n entry,\n latestEntry,\n initialLatestStorageEntry\n }\n );\n }\n };\n\n const deleteMultipleEntries: CmsEntryStorageOperations[\"deleteMultipleEntries\"] = async (\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsDeleteEntriesParams\n ) => {\n const { entries } = params;\n const model = getStorageOperationsModel(initialModel);\n /**\n * First we need all the revisions of the entries we want to delete.\n */\n const revisions = await dataLoaders.getAllEntryRevisions({\n model,\n ids: entries\n });\n /**\n * Then we need to construct the queries for all the revisions and entries.\n */\n\n const entityBatch = entity.createEntityWriter();\n const elasticsearchEntityBatch = esEntity.createEntityWriter();\n for (const id of entries) {\n /**\n * Latest item.\n */\n entityBatch.delete({\n PK: createPartitionKey({\n id,\n tenant: model.tenant\n }),\n SK: \"L\"\n });\n\n elasticsearchEntityBatch.delete({\n PK: createPartitionKey({\n id,\n tenant: model.tenant\n }),\n SK: \"L\"\n });\n\n /**\n * Published item.\n */\n entityBatch.delete({\n PK: createPartitionKey({\n id,\n tenant: model.tenant\n }),\n SK: \"P\"\n });\n\n elasticsearchEntityBatch.delete({\n PK: createPartitionKey({\n id,\n tenant: model.tenant\n }),\n SK: \"P\"\n });\n }\n /**\n * Exact revisions of all the entries\n */\n for (const revision of revisions) {\n entityBatch.delete({\n PK: createPartitionKey({\n id: revision.id,\n tenant: model.tenant\n }),\n SK: createRevisionSortKey({\n version: revision.version\n })\n });\n }\n\n await entityBatch.execute();\n await elasticsearchEntityBatch.execute();\n };\n\n const list = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsListParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const limit = createLimit(params.limit, 50);\n const { index } = configurations.es({\n model\n });\n\n const body = createElasticsearchBody({\n model,\n fieldRegistry,\n fieldIndexRegistry,\n bodyModifiers,\n sortModifiers,\n queryModifiers,\n valueSearchRegistry,\n fullTextSearches,\n filterRegistry,\n params: {\n ...params,\n limit,\n after: decodeCursor(params.after)\n },\n plugins\n });\n\n let response: OpenSearchSearchResponse;\n try {\n response = await elasticsearch.search({\n index,\n body\n });\n } catch (error) {\n /**\n * We will silently ignore the `index_not_found_exception` error and return an empty result set.\n * This is because the index might not exist yet, and we don't want to throw an error.\n */\n if (shouldIgnoreEsResponseError(error)) {\n return {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null,\n items: []\n };\n }\n\n throw new WebinyError(error.message, error.code || \"OPENSEARCH_ERROR\", {\n error,\n index,\n body,\n model\n });\n }\n\n const { hits, total } = response.body.hits;\n\n const items = extractEntriesFromIndex<T>({\n fieldRegistry,\n fieldIndexRegistry,\n model,\n entries: hits.map(item => {\n return item._source as CmsIndexEntry<T>;\n })\n }).map(item => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry: item\n });\n });\n\n const hasMoreItems = items.length > limit;\n if (hasMoreItems) {\n /**\n * Remove the last item from results, we don't want to include it.\n */\n items.pop();\n }\n /**\n * Cursor is the `sort` value of the last item in the array.\n * https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#search-after\n */\n /**\n * TODO expect errors over hit properties is required due to opensearch library narrowing types too much because of the _source: false. At least what Claude says, didnt go into it too much.\n * Properties are there, but types are not correct.\n */\n // @ts-expect-error\n const cursor = items.length > 0 ? encodeCursor(hits[items.length - 1].sort) || null : null;\n return {\n hasMoreItems,\n totalCount: getTotalCount(total),\n cursor,\n items\n };\n };\n\n const get = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const { items } = await list<T>(model, {\n ...params,\n limit: 1\n });\n return items.shift() || null;\n };\n\n const publish = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsPublishParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n\n const { entry, storageEntry } = transformer.transformEntryKeys();\n\n const revisionKeys = createEntryRevisionKeys(entry);\n const latestKeys = createEntryLatestKeys(entry);\n const publishedKeys = createEntryPublishedKeys(entry);\n\n let latestEsEntry: IElasticsearchEntityAttributes | null = null;\n try {\n latestEsEntry = await esEntity.getClean(latestKeys);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read Elasticsearch latest data.\",\n ex.code || \"PUBLISH_LATEST_READ\",\n {\n error: ex,\n latestKeys: latestKeys,\n publishedKeys: publishedKeys\n }\n );\n }\n\n if (!latestEsEntry) {\n throw new WebinyError(\n `Could not publish entry. Could not load latest (\"L\") record (ES table).`,\n \"PUBLISH_ERROR\",\n { entry }\n );\n }\n\n /**\n * We need the latest entry to check if it needs to be updated as well in the Elasticsearch.\n */\n const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n if (!latestStorageEntry) {\n throw new WebinyError(\n `Could not publish entry. Could not load latest (\"L\") record.`,\n \"PUBLISH_ERROR\",\n { entry }\n );\n }\n\n /**\n * We need currently published entry to check if need to remove it.\n */\n const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n // 1. Update REV# and P records with new data.\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...revisionKeys,\n data: storageEntry\n },\n {\n ...publishedKeys,\n data: storageEntry\n }\n ]\n });\n\n const elasticsearchEntityWriter = esEntity.createEntityWriter();\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n // 2. When it comes to the latest record, we need to perform a couple of different\n // updates, based on whether the entry being published is the latest revision or not.\n const publishedRevisionId = publishedStorageEntry?.id;\n const publishingLatestRevision = latestStorageEntry?.id === entry.id;\n\n if (publishingLatestRevision) {\n // 2.1 If we're publishing the latest revision, we first need to update the L record.\n entityBatch.put({\n ...latestKeys,\n data: storageEntry\n });\n\n // 2.2 Additionally, if we have a previously published entry, we need to mark it as unpublished.\n // Note that we need to take re-publishing into account (same published revision being\n // published again), in which case the below code does not apply. This is because the\n // required updates were already applied above.\n if (publishedStorageEntry) {\n const isRepublishing = publishedStorageEntry.id === entry.id;\n if (!isRepublishing) {\n /**\n * Update currently published entry (unpublish it)\n */\n const publishedStorageEntryKeys =\n createEntryRevisionKeys(publishedStorageEntry);\n entityBatch.put({\n ...publishedStorageEntryKeys,\n data: {\n ...publishedStorageEntry,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED\n }\n });\n }\n }\n } else {\n // 2.3 If the published revision is not the latest one, the situation is a bit\n // more complex. We first need to update the L and REV# records with the new\n // values of *only entry-level* meta fields.\n const updatedEntryLevelMetaFields = pickEntryMetaFields(\n entry,\n isEntryLevelEntryMetaField\n );\n\n // 2.4 Update L record. Apart from updating the entry-level meta fields, we also need\n // to change the status from \"published\" to \"unpublished\" (if the status is set to \"published\").\n let latestRevisionStatus = latestStorageEntry.status;\n if (latestRevisionStatus === CONTENT_ENTRY_STATUS.PUBLISHED) {\n latestRevisionStatus = CONTENT_ENTRY_STATUS.UNPUBLISHED;\n }\n\n const latestStorageEntryFields = {\n ...latestStorageEntry,\n ...updatedEntryLevelMetaFields,\n status: latestRevisionStatus\n };\n\n const latestStorageEntryLatestKeys = createEntryLatestKeys(latestStorageEntry);\n entityBatch.put({\n ...latestStorageEntryLatestKeys,\n data: latestStorageEntryFields\n });\n\n // 2.5 Update REV# record.\n const latestStorageEntryRevisionKeys = createEntryRevisionKeys(latestStorageEntry);\n entityBatch.put({\n ...latestStorageEntryRevisionKeys,\n data: latestStorageEntryFields\n });\n\n // 2.6 Additionally, if we have a previously published entry, we need to mark it as unpublished.\n // Note that we need to take re-publishing into account (same published revision being\n // published again), in which case the below code does not apply. This is because the\n // required updates were already applied above.\n if (publishedStorageEntry) {\n const isRepublishing = publishedStorageEntry.id === entry.id;\n const publishedRevisionDifferentFromLatest =\n publishedRevisionId !== latestStorageEntry.id;\n\n if (!isRepublishing && publishedRevisionDifferentFromLatest) {\n const publishedStorageEntryRevisionKeys =\n createEntryRevisionKeys(publishedStorageEntry);\n entityBatch.put({\n ...publishedStorageEntryRevisionKeys,\n data: {\n ...publishedStorageEntry,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED\n }\n });\n }\n }\n }\n\n // 3. Update records in ES -> DDB table.\n\n /**\n * Update the published revision entry in ES.\n */\n const esPublishedData = await transformer.getElasticsearchPublishedEntryData();\n elasticsearchEntityWriter.put({\n ...publishedKeys,\n index: esIndex,\n data: esPublishedData\n });\n\n /**\n * Need to decompress the data from Elasticsearch DynamoDB table.\n *\n * No need to transform it for the storage because it was fetched\n * directly from the Elasticsearch table, where it sits transformed.\n */\n const latestEsEntryDataDecompressed = (await compressionHandler.decompress(\n latestEsEntry.data\n )) as CmsIndexEntry;\n\n if (publishingLatestRevision) {\n const updatedMetaFields = pickEntryMetaFields(entry);\n\n const latestTransformer = createTransformer({\n valuesModifiers,\n model,\n transformedToIndex: {\n ...latestEsEntryDataDecompressed,\n status: CONTENT_ENTRY_STATUS.PUBLISHED,\n locked: true,\n ...updatedMetaFields\n },\n fieldIndexRegistry,\n compressionHandler\n });\n\n const esEntryLatestKeys = createEntryLatestKeys(latestEsEntryDataDecompressed);\n elasticsearchEntityWriter.put({\n index: esIndex,\n data: await latestTransformer.getElasticsearchLatestEntryData(),\n ...esEntryLatestKeys\n });\n } else {\n const updatedEntryLevelMetaFields = pickEntryMetaFields(\n entry,\n isEntryLevelEntryMetaField\n );\n\n /**\n * Update the Elasticsearch table to propagate changes to the Elasticsearch.\n */\n const latestEsEntry = await esEntity.getClean(latestKeys);\n\n if (latestEsEntry) {\n const latestEsEntryDataDecompressed = (await compressionHandler.decompress(\n latestEsEntry.data\n )) as CmsIndexEntry;\n\n let latestRevisionStatus = latestEsEntryDataDecompressed.status;\n if (latestRevisionStatus === CONTENT_ENTRY_STATUS.PUBLISHED) {\n latestRevisionStatus = CONTENT_ENTRY_STATUS.UNPUBLISHED;\n }\n\n const updatedLatestEntry = await compressionHandler.compress({\n ...latestEsEntryDataDecompressed,\n ...updatedEntryLevelMetaFields,\n status: latestRevisionStatus\n });\n\n elasticsearchEntityWriter.put({\n ...latestKeys,\n index: esIndex,\n data: updatedLatestEntry\n });\n }\n }\n\n /**\n * Finally, execute regular table batch.\n */\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not store publish entry records in DynamoDB table.\",\n ex.code || \"PUBLISH_ERROR\",\n {\n error: ex,\n entry,\n latestStorageEntry,\n publishedStorageEntry\n }\n );\n }\n /**\n * And Elasticsearch table batch.\n */\n try {\n await elasticsearchEntityWriter.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not store publish entry records in DynamoDB Elasticsearch table.\",\n ex.code || \"PUBLISH_ES_ERROR\",\n {\n error: ex,\n entry,\n latestStorageEntry,\n publishedStorageEntry\n }\n );\n }\n return initialStorageEntry;\n };\n\n const unpublish = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsUnpublishParams<T>\n ): Promise<CmsEntry<T>> => {\n const { entry: initialEntry, storageEntry: initialStorageEntry } = params;\n const model = getStorageOperationsModel<T>(initialModel);\n\n const transformer = createTransformer({\n valuesModifiers,\n model,\n entry: initialEntry,\n storageEntry: initialStorageEntry,\n fieldIndexRegistry,\n compressionHandler\n });\n const { entry, storageEntry } = await transformer.transformEntryKeys();\n\n /**\n * We need the latest entry to check if it needs to be updated.\n */\n const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: [entry.id]\n });\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n tenant: model.tenant\n });\n\n const entryRevisionKeys = createEntryRevisionKeys(entry);\n\n const entityBatch = entity.createEntityWriter({\n put: [\n {\n ...entryRevisionKeys,\n data: storageEntry\n }\n ],\n delete: [\n {\n PK: partitionKey,\n SK: createPublishedSortKey()\n }\n ]\n });\n\n const elasticsearchEntityBatch = esEntity.createEntityWriter({\n delete: [\n {\n PK: partitionKey,\n SK: createPublishedSortKey()\n }\n ]\n });\n\n /**\n * If we are unpublishing the latest revision, let's also update the latest revision entry's status in both DynamoDB tables.\n */\n if (latestStorageEntry?.id === entry.id) {\n const { index } = configurations.es({\n model\n });\n\n const entryLatestKeys = createEntryLatestKeys(storageEntry);\n entityBatch.put({\n ...entryLatestKeys,\n data: storageEntry\n });\n\n const esLatestData = await transformer.getElasticsearchLatestEntryData();\n\n elasticsearchEntityBatch.put({\n index,\n data: esLatestData,\n ...entryLatestKeys\n });\n }\n\n /**\n * Finally, execute regular table batch.\n */\n try {\n await entityBatch.execute();\n\n dataLoaders.clearAll({\n tenant: entry.tenant\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not store unpublished entry records in DynamoDB table.\",\n ex.code || \"UNPUBLISH_ERROR\",\n {\n entry,\n storageEntry\n }\n );\n }\n /**\n * And Elasticsearch table batch.\n */\n try {\n await elasticsearchEntityBatch.execute();\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not store unpublished entry records in DynamoDB Elasticsearch table.\",\n ex.code || \"UNPUBLISH_ERROR\",\n {\n entry,\n storageEntry\n }\n );\n }\n return initialStorageEntry;\n };\n\n const getLatestRevisionByEntryId = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetLatestRevisionParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const [entry] = await dataLoaders.getLatestRevisionByEntryId<T>({\n model,\n ids: [params.id]\n });\n if (!entry) {\n return null;\n }\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n };\n\n const getPublishedRevisionByEntryId = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedRevisionParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const [entry] = await dataLoaders.getPublishedRevisionByEntryId<T>({\n model,\n ids: [params.id]\n });\n if (!entry) {\n return null;\n }\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n };\n\n const getRevisionById = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const [entry] = await dataLoaders.getRevisionById<T>({\n model,\n ids: [params.id]\n });\n if (!entry) {\n return null;\n }\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n };\n\n const getRevisions = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionsParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const entries = await dataLoaders.getAllEntryRevisions<T>({\n model,\n ids: [params.id]\n });\n\n return entries.map(entry => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n });\n };\n\n const getByIds = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetByIdsParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const entries = await dataLoaders.getRevisionById<T>({\n model,\n ids: params.ids\n });\n\n return entries.map(entry => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n });\n };\n\n const getLatestByIds = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetLatestByIdsParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const entries = await dataLoaders.getLatestRevisionByEntryId<T>({\n model,\n ids: params.ids\n });\n return entries.map(entry => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n });\n };\n\n const getPublishedByIds = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedByIdsParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const entries = await dataLoaders.getPublishedRevisionByEntryId<T>({\n model,\n ids: params.ids\n });\n\n return entries.map(entry => {\n return convertEntryKeysFromStorage<T>({\n model,\n entry\n });\n });\n };\n\n const getPreviousRevision = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetPreviousRevisionParams\n ) => {\n const model = getStorageOperationsModel<T>(initialModel);\n\n const { tenant } = model;\n const { entryId, version } = params;\n\n const partitionKey = createPartitionKey({\n tenant,\n id: entryId\n });\n const options: IEntityQueryAllParams[\"options\"] = {\n beginsWith: `REV#`,\n reverse: true\n };\n\n try {\n const unfilteredEntries = (\n await entity.queryAll({\n partitionKey,\n options\n })\n ).map(item => {\n return item.data;\n });\n\n const entries = unfilteredEntries.filter(item => {\n return item.version < version;\n });\n\n const entry = entries[0];\n\n if (!entry) {\n return null;\n }\n return convertEntryKeysFromStorage<T>({\n entry,\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not get previous version of given entry.\",\n ex.code || \"GET_PREVIOUS_VERSION_ERROR\",\n {\n ...params,\n error: ex,\n partitionKey,\n options,\n model\n }\n );\n }\n };\n\n const getUniqueFieldValues = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetUniqueFieldValuesParams\n ) => {\n const { where, fieldId } = params;\n\n const { index } = configurations.es({\n model\n });\n\n const initialBody = createElasticsearchBody({\n model,\n fieldRegistry,\n fieldIndexRegistry,\n bodyModifiers,\n sortModifiers,\n queryModifiers,\n valueSearchRegistry,\n fullTextSearches,\n filterRegistry,\n params: {\n limit: 1,\n where\n },\n plugins\n });\n\n const field = model.fields.find(f => f.fieldId === fieldId);\n if (!field) {\n throw new WebinyError(\n `Could not find field with given \"fieldId\" value.`,\n \"FIELD_NOT_FOUND\",\n {\n fieldId\n }\n );\n }\n\n const body: OpenSearchSearchBody = {\n ...initialBody,\n /**\n * We do not need any hits returned, we only need the aggregations.\n */\n size: 0,\n aggregations: {\n getUniqueFieldValues: {\n terms: {\n field: `values.${field.storageId}.keyword`,\n size: 1000000\n }\n }\n }\n };\n\n let response: OpenSearchSearchResponse | undefined = undefined;\n\n try {\n response = await elasticsearch.search({\n index,\n body\n });\n } catch (error) {\n if (shouldIgnoreEsResponseError(error)) {\n return [];\n }\n\n throw new WebinyError(\n error.message || \"Error in the Elasticsearch query.\",\n error.code || \"OPENSEARCH_ERROR\",\n {\n error,\n index,\n model,\n body\n }\n );\n }\n\n const aggregations = response.body.aggregations || {};\n const agg = aggregations[\"getUniqueFieldValues\"];\n const buckets = agg && \"buckets\" in agg && Array.isArray(agg.buckets) ? agg.buckets : [];\n return buckets.map((bucket: { key: string; doc_count: number }) => {\n return {\n value: bucket.key,\n count: bucket.doc_count\n };\n });\n };\n\n return {\n create,\n createRevisionFrom,\n update,\n move,\n delete: deleteEntry,\n moveToBin,\n restoreFromBin,\n deleteRevision,\n deleteMultipleEntries,\n get,\n publish,\n unpublish,\n list,\n getLatestRevisionByEntryId,\n getPublishedRevisionByEntryId,\n getRevisionById,\n getRevisions,\n getByIds,\n getLatestByIds,\n getPublishedByIds,\n getPreviousRevision,\n getUniqueFieldValues,\n dataLoaders\n };\n};\n"],"names":["convertToStorageEntry","params","model","storageEntry","values","createEntriesStorageOperations","entity","esEntity","elasticsearch","plugins","fieldRegistry","fieldIndexRegistry","compressionHandler","bodyModifiers","sortModifiers","queryModifiers","valueSearchRegistry","fullTextSearches","valuesModifiers","filterRegistry","storageOperationsCmsModelPlugin","getStorageOperationsCmsModelPlugin","StorageOperationsCmsModelPlugin","getStorageOperationsModel","plugin","dataLoaders","DataLoadersHandler","create","initialModel","initialEntry","initialStorageEntry","isPublished","locked","transformer","createTransformer","entry","esEntry","esIndex","configurations","revisionKeys","createEntryRevisionKeys","latestKeys","createEntryLatestKeys","publishedKeys","createEntryPublishedKeys","entityBatch","ex","WebinyError","esLatestData","elasticsearchEntityBatch","esPublishedData","createRevisionFrom","publishedRevisionStorageEntry","publishedRevisionKey","CONTENT_ENTRY_STATUS","update","latestStorageEntry","publishedStorageEntry","updatingLatestRevision","elasticsearchLatestData","updatedEntryLevelMetaFields","pickEntryMetaFields","isEntryLevelEntryMetaField","updatedLatestStorageEntry","createPartitionKey","createRevisionSortKey","latestEsEntry","latestEsEntryDataDecompressed","updatedLatestEntry","elasticsearchPublishedData","move","id","folderId","partitionKey","queryAllParams","latestSortKey","createLatestSortKey","publishedSortKey","createPublishedSortKey","records","latestRecord","publishedRecord","record","esEntityReader","esRecords","esItems","Promise","item","moveToBin","updatedEntryMetaFields","isDeletedEntryMetaField","restoreFromBin","isRestoredEntryMetaField","deleteEntry","items","deleteRevision","latestEntry","initialLatestStorageEntry","index","latestStorageEntryLatestKey","actualRevisionEntryKey","latestTransformer","esLatestKeys","deleteMultipleEntries","entries","revisions","revision","list","limit","createLimit","body","createElasticsearchBody","decodeCursor","response","error","shouldIgnoreEsResponseError","hits","total","extractEntriesFromIndex","convertEntryKeysFromStorage","hasMoreItems","cursor","encodeCursor","getTotalCount","get","publish","elasticsearchEntityWriter","publishedRevisionId","publishingLatestRevision","isRepublishing","publishedStorageEntryKeys","latestRevisionStatus","latestStorageEntryFields","latestStorageEntryLatestKeys","latestStorageEntryRevisionKeys","publishedRevisionDifferentFromLatest","publishedStorageEntryRevisionKeys","updatedMetaFields","esEntryLatestKeys","unpublish","entryRevisionKeys","entryLatestKeys","getLatestRevisionByEntryId","getPublishedRevisionByEntryId","getRevisionById","getRevisions","getByIds","getLatestByIds","getPublishedByIds","getPreviousRevision","tenant","entryId","version","options","unfilteredEntries","getUniqueFieldValues","where","fieldId","initialBody","field","f","aggregations","agg","buckets","Array","bucket"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms-ddb-es",
3
- "version": "6.4.2",
3
+ "version": "6.4.3-beta.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -30,36 +30,36 @@
30
30
  ],
31
31
  "license": "MIT",
32
32
  "dependencies": {
33
- "@webiny/api": "6.4.2",
34
- "@webiny/api-elasticsearch-tasks": "6.4.2",
35
- "@webiny/api-headless-cms": "6.4.2",
36
- "@webiny/api-opensearch": "6.4.2",
37
- "@webiny/aws-sdk": "6.4.2",
38
- "@webiny/db-dynamodb": "6.4.2",
39
- "@webiny/error": "6.4.2",
40
- "@webiny/feature": "6.4.2",
41
- "@webiny/handler-db": "6.4.2",
42
- "@webiny/plugins": "6.4.2",
43
- "@webiny/utils": "6.4.2",
33
+ "@webiny/api": "6.4.3-beta.1",
34
+ "@webiny/api-elasticsearch-tasks": "6.4.3-beta.1",
35
+ "@webiny/api-headless-cms": "6.4.3-beta.1",
36
+ "@webiny/api-opensearch": "6.4.3-beta.1",
37
+ "@webiny/aws-sdk": "6.4.3-beta.1",
38
+ "@webiny/db-dynamodb": "6.4.3-beta.1",
39
+ "@webiny/error": "6.4.3-beta.1",
40
+ "@webiny/feature": "6.4.3-beta.1",
41
+ "@webiny/handler-db": "6.4.3-beta.1",
42
+ "@webiny/plugins": "6.4.3-beta.1",
43
+ "@webiny/utils": "6.4.3-beta.1",
44
44
  "dataloader": "2.2.3",
45
45
  "lodash": "4.18.1"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/jsonpack": "1.1.6",
49
- "@webiny/api-core": "6.4.2",
50
- "@webiny/api-dynamodb-to-elasticsearch": "6.4.2",
51
- "@webiny/background-tasks": "6.4.2",
52
- "@webiny/build-tools": "6.4.2",
49
+ "@webiny/api-core": "6.4.3-beta.1",
50
+ "@webiny/api-dynamodb-to-elasticsearch": "6.4.3-beta.1",
51
+ "@webiny/background-tasks": "6.4.3-beta.1",
52
+ "@webiny/build-tools": "6.4.3-beta.1",
53
53
  "@webiny/di": "1.0.1",
54
- "@webiny/handler": "6.4.2",
55
- "@webiny/handler-aws": "6.4.2",
56
- "@webiny/handler-graphql": "6.4.2",
57
- "@webiny/project-utils": "6.4.2",
58
- "@webiny/wcp": "6.4.2",
54
+ "@webiny/handler": "6.4.3-beta.1",
55
+ "@webiny/handler-aws": "6.4.3-beta.1",
56
+ "@webiny/handler-graphql": "6.4.3-beta.1",
57
+ "@webiny/project-utils": "6.4.3-beta.1",
58
+ "@webiny/wcp": "6.4.3-beta.1",
59
59
  "jest-dynalite": "3.6.1",
60
60
  "rimraf": "6.1.3",
61
61
  "typescript": "6.0.3",
62
- "vitest": "4.1.7"
62
+ "vitest": "4.1.8"
63
63
  },
64
64
  "publishConfig": {
65
65
  "access": "public"
package/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { CmsContext as BaseCmsContext, CmsEntry, CmsEntryStorageOperations as BaseCmsEntryStorageOperations, CmsEntryValues, CmsModel, HeadlessCmsStorageOperations as BaseHeadlessCmsStorageOperations } from "@webiny/api-headless-cms/types/index.js";
1
+ import type { CmsContext as BaseCmsContext, CmsEntry, CmsEntryStorageOperations as BaseCmsEntryStorageOperations, CmsEntryValues, HeadlessCmsStorageOperations as BaseHeadlessCmsStorageOperations } from "@webiny/api-headless-cms/types/index.js";
2
2
  import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb/index.js";
3
3
  import type { Client, IOpenSearchEntity as IElasticsearchEntity, OpenSearchContext } from "@webiny/api-opensearch";
4
4
  import type { PluginsContainer } from "@webiny/plugins";
@@ -54,7 +54,7 @@ export interface CmsEntryStorageOperations extends BaseCmsEntryStorageOperations
54
54
  dataLoaders: IDataLoadersHandler;
55
55
  }
56
56
  export interface DataLoadersHandlerInterfaceClearAllParams {
57
- model: Pick<CmsModel, "tenant">;
57
+ tenant: string;
58
58
  }
59
59
  export interface IDataLoadersHandler {
60
60
  clearAll: (params?: DataLoadersHandlerInterfaceClearAllParams) => void;
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import type {\n CmsContext as BaseCmsContext,\n CmsEntry,\n CmsEntryStorageOperations as BaseCmsEntryStorageOperations,\n CmsEntryValues,\n CmsModel,\n HeadlessCmsStorageOperations as BaseHeadlessCmsStorageOperations\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { DynamoDBDocument } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport type {\n Client,\n IOpenSearchEntity as IElasticsearchEntity,\n OpenSearchContext\n} from \"@webiny/api-opensearch\";\nimport type { PluginsContainer } from \"@webiny/plugins\";\nimport type { IEntryEntity, IGroupEntity, IModelEntity } from \"~/definitions/types.js\";\nimport type { ITable } from \"@webiny/db-dynamodb\";\n\nexport interface CmsContext extends BaseCmsContext, OpenSearchContext {}\n/**\n * A definition of the entry that is being prepared for the Elasticsearch.\n *\n * @category Elasticsearch\n * @category CmsEntry\n */\nexport interface CmsIndexEntry<T extends CmsEntryValues = CmsEntryValues> extends CmsEntry<T> {\n /**\n * Values that are not going to be indexed.\n */\n rawValues: Partial<T>;\n /**\n * Dev can add whatever keys they want and need. Just need to be careful not to break the entry.\n */\n [key: string]: any;\n}\n\nexport enum ENTITIES {\n GROUPS = \"CmsGroups\",\n MODELS = \"CmsModels\",\n ENTRIES = \"CmsEntries\",\n ENTRIES_ES = \"CmsEntriesElasticsearch\"\n}\n\nexport interface StorageOperationsFactoryParams {\n documentClient: DynamoDBDocument;\n elasticsearch: Client;\n table?: string;\n esTable?: string;\n plugins: PluginsContainer;\n container: CmsContext[\"container\"];\n}\n\nexport interface IGetEntitiesResponse {\n groups: IGroupEntity;\n models: IModelEntity;\n entries: IEntryEntity;\n entriesEs: IElasticsearchEntity;\n}\n\nexport interface HeadlessCmsStorageOperations extends BaseHeadlessCmsStorageOperations {\n getTable: () => ITable;\n getEsTable: () => ITable;\n getEntities: () => IGetEntitiesResponse;\n}\n\nexport interface StorageOperationsFactory {\n (params: StorageOperationsFactoryParams): HeadlessCmsStorageOperations;\n}\n\nexport interface CmsEntryStorageOperations extends BaseCmsEntryStorageOperations {\n dataLoaders: IDataLoadersHandler;\n}\n\nexport interface DataLoadersHandlerInterfaceClearAllParams {\n model: Pick<CmsModel, \"tenant\">;\n}\nexport interface IDataLoadersHandler {\n clearAll: (params?: DataLoadersHandlerInterfaceClearAllParams) => void;\n}\n"],"names":["ENTITIES"],"mappings":"AAoCO,IAAKA,iBAAQA,WAAAA,GAAAA,SAARA,QAAQ;;;;;WAARA"}
1
+ {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import type {\n CmsContext as BaseCmsContext,\n CmsEntry,\n CmsEntryStorageOperations as BaseCmsEntryStorageOperations,\n CmsEntryValues,\n HeadlessCmsStorageOperations as BaseHeadlessCmsStorageOperations\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { DynamoDBDocument } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport type {\n Client,\n IOpenSearchEntity as IElasticsearchEntity,\n OpenSearchContext\n} from \"@webiny/api-opensearch\";\nimport type { PluginsContainer } from \"@webiny/plugins\";\nimport type { IEntryEntity, IGroupEntity, IModelEntity } from \"~/definitions/types.js\";\nimport type { ITable } from \"@webiny/db-dynamodb\";\n\nexport interface CmsContext extends BaseCmsContext, OpenSearchContext {}\n/**\n * A definition of the entry that is being prepared for the Elasticsearch.\n *\n * @category Elasticsearch\n * @category CmsEntry\n */\nexport interface CmsIndexEntry<T extends CmsEntryValues = CmsEntryValues> extends CmsEntry<T> {\n /**\n * Values that are not going to be indexed.\n */\n rawValues: Partial<T>;\n /**\n * Dev can add whatever keys they want and need. Just need to be careful not to break the entry.\n */\n [key: string]: any;\n}\n\nexport enum ENTITIES {\n GROUPS = \"CmsGroups\",\n MODELS = \"CmsModels\",\n ENTRIES = \"CmsEntries\",\n ENTRIES_ES = \"CmsEntriesElasticsearch\"\n}\n\nexport interface StorageOperationsFactoryParams {\n documentClient: DynamoDBDocument;\n elasticsearch: Client;\n table?: string;\n esTable?: string;\n plugins: PluginsContainer;\n container: CmsContext[\"container\"];\n}\n\nexport interface IGetEntitiesResponse {\n groups: IGroupEntity;\n models: IModelEntity;\n entries: IEntryEntity;\n entriesEs: IElasticsearchEntity;\n}\n\nexport interface HeadlessCmsStorageOperations extends BaseHeadlessCmsStorageOperations {\n getTable: () => ITable;\n getEsTable: () => ITable;\n getEntities: () => IGetEntitiesResponse;\n}\n\nexport interface StorageOperationsFactory {\n (params: StorageOperationsFactoryParams): HeadlessCmsStorageOperations;\n}\n\nexport interface CmsEntryStorageOperations extends BaseCmsEntryStorageOperations {\n dataLoaders: IDataLoadersHandler;\n}\n\nexport interface DataLoadersHandlerInterfaceClearAllParams {\n tenant: string;\n}\nexport interface IDataLoadersHandler {\n clearAll: (params?: DataLoadersHandlerInterfaceClearAllParams) => void;\n}\n"],"names":["ENTITIES"],"mappings":"AAmCO,IAAKA,iBAAQA,WAAAA,GAAAA,SAARA,QAAQ;;;;;WAARA"}