@webiny/api-headless-cms-ddb 6.6.0-alpha.6 → 6.6.0-alpha.8

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.
@@ -41,6 +41,9 @@ class DdbDeleteMultipleEntriesImpl {
41
41
  })
42
42
  });
43
43
  await entityBatch.execute();
44
+ this.dataLoaders.clearAll({
45
+ tenant: model.tenant
46
+ });
44
47
  }
45
48
  }
46
49
  const DdbDeleteMultipleEntries = DeleteMultipleEntriesStorageOperation.createImplementation({
@@ -1 +1 @@
1
- {"version":3,"file":"operations/entry/DdbDeleteMultipleEntries.js","sources":["../../../src/operations/entry/DdbDeleteMultipleEntries.ts"],"sourcesContent":["import type {\n CmsModel,\n CmsEntryStorageOperationsDeleteEntriesParams\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport { DeleteMultipleEntriesStorageOperation } from \"@webiny/api-headless-cms/features/shared/storageOperations/entry/DeleteMultipleEntriesStorageOperation.js\";\nimport { CmsDdbEntryEntity } from \"~/abstractions/CmsDdbEntryEntity.js\";\nimport { CmsDdbDataLoaders } from \"~/abstractions/CmsDdbDataLoaders.js\";\nimport { CmsStorageModelProvider } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { createPartitionKey, createRevisionSortKey } from \"~/operations/entry/keys.js\";\n\nclass DdbDeleteMultipleEntriesImpl implements DeleteMultipleEntriesStorageOperation.Interface {\n constructor(\n private entity: CmsDdbEntryEntity.Interface,\n private dataLoaders: CmsDdbDataLoaders.Interface,\n private storageModelProvider: CmsStorageModelProvider.Interface\n ) {}\n\n async execute(initialModel: CmsModel, params: CmsEntryStorageOperationsDeleteEntriesParams) {\n const { entries } = params;\n const model = this.storageModelProvider.getModel(initialModel);\n /**\n * First we need all the revisions of the entries we want to delete.\n */\n const revisions = await this.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 = this.entity.createEntityWriter();\n\n for (const id of entries) {\n const partitionKey = createPartitionKey({\n id,\n tenant: model.tenant\n });\n entityBatch.delete({\n PK: partitionKey,\n SK: \"L\"\n });\n entityBatch.delete({\n PK: partitionKey,\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 }\n}\n\nexport const DdbDeleteMultipleEntries = DeleteMultipleEntriesStorageOperation.createImplementation({\n implementation: DdbDeleteMultipleEntriesImpl,\n dependencies: [CmsDdbEntryEntity, CmsDdbDataLoaders, CmsStorageModelProvider]\n});\n"],"names":["DdbDeleteMultipleEntriesImpl","entity","dataLoaders","storageModelProvider","initialModel","params","entries","model","revisions","entityBatch","id","partitionKey","createPartitionKey","revision","createRevisionSortKey","DdbDeleteMultipleEntries","DeleteMultipleEntriesStorageOperation","CmsDdbEntryEntity","CmsDdbDataLoaders","CmsStorageModelProvider"],"mappings":";;;;;AAUA,MAAMA;IACF,YACYC,MAAmC,EACnCC,WAAwC,EACxCC,oBAAuD,CACjE;aAHUF,MAAM,GAANA;aACAC,WAAW,GAAXA;aACAC,oBAAoB,GAApBA;IACT;IAEH,MAAM,QAAQC,YAAsB,EAAEC,MAAoD,EAAE;QACxF,MAAM,EAAEC,OAAO,EAAE,GAAGD;QACpB,MAAME,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAACH;QAIjD,MAAMI,YAAY,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC;YAC1DD;YACA,KAAKD;QACT;QAKA,MAAMG,cAAc,IAAI,CAAC,MAAM,CAAC,kBAAkB;QAElD,KAAK,MAAMC,MAAMJ,QAAS;YACtB,MAAMK,eAAeC,mBAAmB;gBACpCF;gBACA,QAAQH,MAAM,MAAM;YACxB;YACAE,YAAY,MAAM,CAAC;gBACf,IAAIE;gBACJ,IAAI;YACR;YACAF,YAAY,MAAM,CAAC;gBACf,IAAIE;gBACJ,IAAI;YACR;QACJ;QAIA,KAAK,MAAME,YAAYL,UACnBC,YAAY,MAAM,CAAC;YACf,IAAIG,mBAAmB;gBACnB,IAAIC,SAAS,EAAE;gBACf,QAAQN,MAAM,MAAM;YACxB;YACA,IAAIO,sBAAsB;gBACtB,SAASD,SAAS,OAAO;YAC7B;QACJ;QAGJ,MAAMJ,YAAY,OAAO;IAC7B;AACJ;AAEO,MAAMM,2BAA2BC,sCAAsC,oBAAoB,CAAC;IAC/F,gBAAgBhB;IAChB,cAAc;QAACiB;QAAmBC;QAAmBC;KAAwB;AACjF"}
1
+ {"version":3,"file":"operations/entry/DdbDeleteMultipleEntries.js","sources":["../../../src/operations/entry/DdbDeleteMultipleEntries.ts"],"sourcesContent":["import type {\n CmsModel,\n CmsEntryStorageOperationsDeleteEntriesParams\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport { DeleteMultipleEntriesStorageOperation } from \"@webiny/api-headless-cms/features/shared/storageOperations/entry/DeleteMultipleEntriesStorageOperation.js\";\nimport { CmsDdbEntryEntity } from \"~/abstractions/CmsDdbEntryEntity.js\";\nimport { CmsDdbDataLoaders } from \"~/abstractions/CmsDdbDataLoaders.js\";\nimport { CmsStorageModelProvider } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { createPartitionKey, createRevisionSortKey } from \"~/operations/entry/keys.js\";\n\nclass DdbDeleteMultipleEntriesImpl implements DeleteMultipleEntriesStorageOperation.Interface {\n constructor(\n private entity: CmsDdbEntryEntity.Interface,\n private dataLoaders: CmsDdbDataLoaders.Interface,\n private storageModelProvider: CmsStorageModelProvider.Interface\n ) {}\n\n async execute(initialModel: CmsModel, params: CmsEntryStorageOperationsDeleteEntriesParams) {\n const { entries } = params;\n const model = this.storageModelProvider.getModel(initialModel);\n /**\n * First we need all the revisions of the entries we want to delete.\n */\n const revisions = await this.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 = this.entity.createEntityWriter();\n\n for (const id of entries) {\n const partitionKey = createPartitionKey({\n id,\n tenant: model.tenant\n });\n entityBatch.delete({\n PK: partitionKey,\n SK: \"L\"\n });\n entityBatch.delete({\n PK: partitionKey,\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\n this.dataLoaders.clearAll({\n tenant: model.tenant\n });\n }\n}\n\nexport const DdbDeleteMultipleEntries = DeleteMultipleEntriesStorageOperation.createImplementation({\n implementation: DdbDeleteMultipleEntriesImpl,\n dependencies: [CmsDdbEntryEntity, CmsDdbDataLoaders, CmsStorageModelProvider]\n});\n"],"names":["DdbDeleteMultipleEntriesImpl","entity","dataLoaders","storageModelProvider","initialModel","params","entries","model","revisions","entityBatch","id","partitionKey","createPartitionKey","revision","createRevisionSortKey","DdbDeleteMultipleEntries","DeleteMultipleEntriesStorageOperation","CmsDdbEntryEntity","CmsDdbDataLoaders","CmsStorageModelProvider"],"mappings":";;;;;AAUA,MAAMA;IACF,YACYC,MAAmC,EACnCC,WAAwC,EACxCC,oBAAuD,CACjE;aAHUF,MAAM,GAANA;aACAC,WAAW,GAAXA;aACAC,oBAAoB,GAApBA;IACT;IAEH,MAAM,QAAQC,YAAsB,EAAEC,MAAoD,EAAE;QACxF,MAAM,EAAEC,OAAO,EAAE,GAAGD;QACpB,MAAME,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAACH;QAIjD,MAAMI,YAAY,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC;YAC1DD;YACA,KAAKD;QACT;QAKA,MAAMG,cAAc,IAAI,CAAC,MAAM,CAAC,kBAAkB;QAElD,KAAK,MAAMC,MAAMJ,QAAS;YACtB,MAAMK,eAAeC,mBAAmB;gBACpCF;gBACA,QAAQH,MAAM,MAAM;YACxB;YACAE,YAAY,MAAM,CAAC;gBACf,IAAIE;gBACJ,IAAI;YACR;YACAF,YAAY,MAAM,CAAC;gBACf,IAAIE;gBACJ,IAAI;YACR;QACJ;QAIA,KAAK,MAAME,YAAYL,UACnBC,YAAY,MAAM,CAAC;YACf,IAAIG,mBAAmB;gBACnB,IAAIC,SAAS,EAAE;gBACf,QAAQN,MAAM,MAAM;YACxB;YACA,IAAIO,sBAAsB;gBACtB,SAASD,SAAS,OAAO;YAC7B;QACJ;QAGJ,MAAMJ,YAAY,OAAO;QAEzB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YACtB,QAAQF,MAAM,MAAM;QACxB;IACJ;AACJ;AAEO,MAAMQ,2BAA2BC,sCAAsC,oBAAoB,CAAC;IAC/F,gBAAgBhB;IAChB,cAAc;QAACiB;QAAmBC;QAAmBC;KAAwB;AACjF"}
@@ -23,7 +23,7 @@ class DdbGetPreviousRevisionImpl {
23
23
  reverse: true
24
24
  }
25
25
  });
26
- const filteredRevisions = unfilteredRevisions.filter((item)=>item.data.version < version);
26
+ const filteredRevisions = unfilteredRevisions.filter((item)=>item.data.modelId === model.modelId && item.data.version < version);
27
27
  const storageEntry = filteredRevisions[0];
28
28
  if (!storageEntry) return null;
29
29
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"operations/entry/DdbGetPreviousRevision.js","sources":["../../../src/operations/entry/DdbGetPreviousRevision.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n CmsModel,\n CmsEntryValues,\n CmsEntryStorageOperationsGetPreviousRevisionParams\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport { GetPreviousRevisionStorageOperation } from \"@webiny/api-headless-cms/features/shared/storageOperations/entry/GetPreviousRevisionStorageOperation.js\";\nimport { CmsDdbEntryEntity } from \"~/abstractions/CmsDdbEntryEntity.js\";\nimport { CmsStorageModelProvider } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { createPartitionKey } from \"~/operations/entry/keys.js\";\nimport { convertFromStorageEntry } from \"./storageEntryUtils.js\";\n\nclass DdbGetPreviousRevisionImpl implements GetPreviousRevisionStorageOperation.Interface {\n constructor(\n private entity: CmsDdbEntryEntity.Interface,\n private storageModelProvider: CmsStorageModelProvider.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetPreviousRevisionParams\n ) {\n const model = this.storageModelProvider.getModel<T>(initialModel);\n\n const { entryId, version } = params;\n const partitionKey = createPartitionKey({\n tenant: model.tenant,\n id: entryId\n });\n\n const unfilteredRevisions = await this.entity.queryAll({\n partitionKey,\n options: {\n beginsWith: `REV#`,\n reverse: true\n }\n });\n const filteredRevisions = unfilteredRevisions.filter(item => {\n return item.data.version < version;\n });\n const storageEntry = filteredRevisions[0];\n if (!storageEntry) {\n return null;\n }\n\n try {\n return convertFromStorageEntry({\n storageEntry: storageEntry.data,\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 model\n }\n );\n }\n }\n}\n\nexport const DdbGetPreviousRevision = GetPreviousRevisionStorageOperation.createImplementation({\n implementation: DdbGetPreviousRevisionImpl,\n dependencies: [CmsDdbEntryEntity, CmsStorageModelProvider]\n});\n"],"names":["DdbGetPreviousRevisionImpl","entity","storageModelProvider","initialModel","params","model","entryId","version","partitionKey","createPartitionKey","unfilteredRevisions","filteredRevisions","item","storageEntry","convertFromStorageEntry","ex","WebinyError","DdbGetPreviousRevision","GetPreviousRevisionStorageOperation","CmsDdbEntryEntity","CmsStorageModelProvider"],"mappings":";;;;;;AAYA,MAAMA;IACF,YACYC,MAAmC,EACnCC,oBAAuD,CACjE;aAFUD,MAAM,GAANA;aACAC,oBAAoB,GAApBA;IACT;IAEH,MAAM,QACFC,YAAsB,EACtBC,MAA0D,EAC5D;QACE,MAAMC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAIF;QAEpD,MAAM,EAAEG,OAAO,EAAEC,OAAO,EAAE,GAAGH;QAC7B,MAAMI,eAAeC,mBAAmB;YACpC,QAAQJ,MAAM,MAAM;YACpB,IAAIC;QACR;QAEA,MAAMI,sBAAsB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnDF;YACA,SAAS;gBACL,YAAY;gBACZ,SAAS;YACb;QACJ;QACA,MAAMG,oBAAoBD,oBAAoB,MAAM,CAACE,CAAAA,OAC1CA,KAAK,IAAI,CAAC,OAAO,GAAGL;QAE/B,MAAMM,eAAeF,iBAAiB,CAAC,EAAE;QACzC,IAAI,CAACE,cACD,OAAO;QAGX,IAAI;YACA,OAAOC,wBAAwB;gBAC3B,cAAcD,aAAa,IAAI;gBAC/BR;YACJ;QACJ,EAAE,OAAOU,IAAI;YACT,MAAM,IAAIC,MACND,GAAG,OAAO,IAAI,kDACdA,GAAG,IAAI,IAAI,8BACX;gBACI,GAAGX,MAAM;gBACT,OAAOW;gBACPP;gBACAH;YACJ;QAER;IACJ;AACJ;AAEO,MAAMY,yBAAyBC,oCAAoC,oBAAoB,CAAC;IAC3F,gBAAgBlB;IAChB,cAAc;QAACmB;QAAmBC;KAAwB;AAC9D"}
1
+ {"version":3,"file":"operations/entry/DdbGetPreviousRevision.js","sources":["../../../src/operations/entry/DdbGetPreviousRevision.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n CmsModel,\n CmsEntryValues,\n CmsEntryStorageOperationsGetPreviousRevisionParams\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport { GetPreviousRevisionStorageOperation } from \"@webiny/api-headless-cms/features/shared/storageOperations/entry/GetPreviousRevisionStorageOperation.js\";\nimport { CmsDdbEntryEntity } from \"~/abstractions/CmsDdbEntryEntity.js\";\nimport { CmsStorageModelProvider } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { createPartitionKey } from \"~/operations/entry/keys.js\";\nimport { convertFromStorageEntry } from \"./storageEntryUtils.js\";\n\nclass DdbGetPreviousRevisionImpl implements GetPreviousRevisionStorageOperation.Interface {\n constructor(\n private entity: CmsDdbEntryEntity.Interface,\n private storageModelProvider: CmsStorageModelProvider.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsGetPreviousRevisionParams\n ) {\n const model = this.storageModelProvider.getModel<T>(initialModel);\n\n const { entryId, version } = params;\n const partitionKey = createPartitionKey({\n tenant: model.tenant,\n id: entryId\n });\n\n const unfilteredRevisions = await this.entity.queryAll({\n partitionKey,\n options: {\n beginsWith: `REV#`,\n reverse: true\n }\n });\n /**\n * The partition key does not include the model, so filter by it as well.\n */\n const filteredRevisions = unfilteredRevisions.filter(item => {\n return item.data.modelId === model.modelId && item.data.version < version;\n });\n const storageEntry = filteredRevisions[0];\n if (!storageEntry) {\n return null;\n }\n\n try {\n return convertFromStorageEntry({\n storageEntry: storageEntry.data,\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 model\n }\n );\n }\n }\n}\n\nexport const DdbGetPreviousRevision = GetPreviousRevisionStorageOperation.createImplementation({\n implementation: DdbGetPreviousRevisionImpl,\n dependencies: [CmsDdbEntryEntity, CmsStorageModelProvider]\n});\n"],"names":["DdbGetPreviousRevisionImpl","entity","storageModelProvider","initialModel","params","model","entryId","version","partitionKey","createPartitionKey","unfilteredRevisions","filteredRevisions","item","storageEntry","convertFromStorageEntry","ex","WebinyError","DdbGetPreviousRevision","GetPreviousRevisionStorageOperation","CmsDdbEntryEntity","CmsStorageModelProvider"],"mappings":";;;;;;AAYA,MAAMA;IACF,YACYC,MAAmC,EACnCC,oBAAuD,CACjE;aAFUD,MAAM,GAANA;aACAC,oBAAoB,GAApBA;IACT;IAEH,MAAM,QACFC,YAAsB,EACtBC,MAA0D,EAC5D;QACE,MAAMC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAIF;QAEpD,MAAM,EAAEG,OAAO,EAAEC,OAAO,EAAE,GAAGH;QAC7B,MAAMI,eAAeC,mBAAmB;YACpC,QAAQJ,MAAM,MAAM;YACpB,IAAIC;QACR;QAEA,MAAMI,sBAAsB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnDF;YACA,SAAS;gBACL,YAAY;gBACZ,SAAS;YACb;QACJ;QAIA,MAAMG,oBAAoBD,oBAAoB,MAAM,CAACE,CAAAA,OAC1CA,KAAK,IAAI,CAAC,OAAO,KAAKP,MAAM,OAAO,IAAIO,KAAK,IAAI,CAAC,OAAO,GAAGL;QAEtE,MAAMM,eAAeF,iBAAiB,CAAC,EAAE;QACzC,IAAI,CAACE,cACD,OAAO;QAGX,IAAI;YACA,OAAOC,wBAAwB;gBAC3B,cAAcD,aAAa,IAAI;gBAC/BR;YACJ;QACJ,EAAE,OAAOU,IAAI;YACT,MAAM,IAAIC,MACND,GAAG,OAAO,IAAI,kDACdA,GAAG,IAAI,IAAI,8BACX;gBACI,GAAGX,MAAM;gBACT,OAAOW;gBACPP;gBACAH;YACJ;QAER;IACJ;AACJ;AAEO,MAAMY,yBAAyBC,oCAAoC,oBAAoB,CAAC;IAC3F,gBAAgBlB;IAChB,cAAc;QAACmB;QAAmBC;KAAwB;AAC9D"}
@@ -5,7 +5,7 @@ import { CmsDdbDataLoaders } from "../../abstractions/CmsDdbDataLoaders.js";
5
5
  import { CmsStorageModelProvider } from "@webiny/api-headless-cms/features/shared/abstractions.js";
6
6
  import { createEntryLatestKeys, createEntryPublishedKeys, createEntryRevisionKeys } from "./keys.js";
7
7
  import { isEntryLevelEntryMetaField, pickEntryMetaFields } from "@webiny/api-headless-cms/constants.js";
8
- import { convertFromStorageEntry, convertToStorageEntry } from "./storageEntryUtils.js";
8
+ import { convertToStorageEntry } from "./storageEntryUtils.js";
9
9
  class DdbUpdateEntryImpl {
10
10
  constructor(entity, dataLoaders, storageModelProvider){
11
11
  this.entity = entity;
@@ -20,12 +20,7 @@ class DdbUpdateEntryImpl {
20
20
  params.id
21
21
  ]
22
22
  });
23
- const item = items.shift() || null;
24
- if (!item) return null;
25
- return convertFromStorageEntry({
26
- storageEntry: item,
27
- model
28
- });
23
+ return items.shift() || null;
29
24
  }
30
25
  async execute(initialModel, params) {
31
26
  const { entry, storageEntry: initialStorageEntry } = params;
@@ -1 +1 @@
1
- {"version":3,"file":"operations/entry/DdbUpdateEntry.js","sources":["../../../src/operations/entry/DdbUpdateEntry.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n CmsModel,\n CmsEntryValues,\n CmsEntryStorageOperationsUpdateParams\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport { UpdateEntryStorageOperation } from \"@webiny/api-headless-cms/features/shared/storageOperations/entry/UpdateEntryStorageOperation.js\";\nimport { CmsDdbEntryEntity } from \"~/abstractions/CmsDdbEntryEntity.js\";\nimport { CmsDdbDataLoaders } from \"~/abstractions/CmsDdbDataLoaders.js\";\nimport { CmsStorageModelProvider } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport {\n createEntryLatestKeys,\n createEntryPublishedKeys,\n createEntryRevisionKeys\n} from \"~/operations/entry/keys.js\";\nimport {\n isEntryLevelEntryMetaField,\n pickEntryMetaFields\n} from \"@webiny/api-headless-cms/constants.js\";\nimport { convertFromStorageEntry, convertToStorageEntry } from \"./storageEntryUtils.js\";\n\nclass DdbUpdateEntryImpl implements UpdateEntryStorageOperation.Interface {\n constructor(\n private entity: CmsDdbEntryEntity.Interface,\n private dataLoaders: CmsDdbDataLoaders.Interface,\n private storageModelProvider: CmsStorageModelProvider.Interface\n ) {}\n\n private async getLatestRevisionByEntryId<T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: { id: string }\n ) {\n const model = this.storageModelProvider.getModel<T>(initialModel);\n\n const items = await this.dataLoaders.getLatestRevisionByEntryId<T>({\n model,\n ids: [params.id]\n });\n const item = items.shift() || null;\n if (!item) {\n return null;\n }\n return convertFromStorageEntry({\n storageEntry: item,\n model\n });\n }\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsUpdateParams<T>\n ) {\n const { entry, storageEntry: initialStorageEntry } = params;\n const model = this.storageModelProvider.getModel(initialModel);\n\n const isPublished = entry.status === \"published\";\n const locked = isPublished ? true : entry.locked;\n\n const storageEntry = convertToStorageEntry({\n model,\n storageEntry: initialStorageEntry\n });\n /**\n * We need to:\n * - update the current entry\n * - update the latest entry if the current entry is the latest one\n */\n\n const entityBatch = this.entity.createEntityWriter({\n put: [\n {\n ...createEntryRevisionKeys(storageEntry),\n data: {\n ...storageEntry,\n locked\n }\n }\n ]\n });\n\n if (isPublished) {\n entityBatch.put({\n ...createEntryPublishedKeys(storageEntry),\n data: {\n ...storageEntry,\n locked\n }\n });\n }\n\n /**\n * We need the latest entry to update it as well if necessary.\n */\n const latestStorageEntry = await this.getLatestRevisionByEntryId(model, entry);\n\n if (latestStorageEntry) {\n const updatingLatestRevision = latestStorageEntry.id === entry.id;\n if (updatingLatestRevision) {\n entityBatch.put({\n ...createEntryLatestKeys(storageEntry),\n data: {\n ...storageEntry,\n locked\n }\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 /**\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 ...createEntryRevisionKeys(latestStorageEntry),\n data: {\n ...latestStorageEntry,\n ...updatedEntryLevelMetaFields\n }\n });\n\n entityBatch.put({\n ...createEntryLatestKeys(latestStorageEntry),\n data: {\n ...latestStorageEntry,\n ...updatedEntryLevelMetaFields\n }\n });\n }\n }\n\n try {\n await entityBatch.execute();\n this.dataLoaders.clearAll({\n tenant: entry.tenant\n });\n return initialStorageEntry;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update entry.\",\n ex.code || \"UPDATE_ERROR\",\n {\n error: ex,\n entry,\n latestStorageEntry\n }\n );\n }\n }\n}\n\nexport const DdbUpdateEntry = UpdateEntryStorageOperation.createImplementation({\n implementation: DdbUpdateEntryImpl,\n dependencies: [CmsDdbEntryEntity, CmsDdbDataLoaders, CmsStorageModelProvider]\n});\n"],"names":["DdbUpdateEntryImpl","entity","dataLoaders","storageModelProvider","initialModel","params","model","items","item","convertFromStorageEntry","entry","initialStorageEntry","isPublished","locked","storageEntry","convertToStorageEntry","entityBatch","createEntryRevisionKeys","createEntryPublishedKeys","latestStorageEntry","updatingLatestRevision","createEntryLatestKeys","updatedEntryLevelMetaFields","pickEntryMetaFields","isEntryLevelEntryMetaField","ex","WebinyError","DdbUpdateEntry","UpdateEntryStorageOperation","CmsDdbEntryEntity","CmsDdbDataLoaders","CmsStorageModelProvider"],"mappings":";;;;;;;;AAqBA,MAAMA;IACF,YACYC,MAAmC,EACnCC,WAAwC,EACxCC,oBAAuD,CACjE;aAHUF,MAAM,GAANA;aACAC,WAAW,GAAXA;aACAC,oBAAoB,GAApBA;IACT;IAEH,MAAc,2BACVC,YAAsB,EACtBC,MAAsB,EACxB;QACE,MAAMC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAIF;QAEpD,MAAMG,QAAQ,MAAM,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAI;YAC/DD;YACA,KAAK;gBAACD,OAAO,EAAE;aAAC;QACpB;QACA,MAAMG,OAAOD,MAAM,KAAK,MAAM;QAC9B,IAAI,CAACC,MACD,OAAO;QAEX,OAAOC,wBAAwB;YAC3B,cAAcD;YACdF;QACJ;IACJ;IAEA,MAAM,QACFF,YAAsB,EACtBC,MAAgD,EAClD;QACE,MAAM,EAAEK,KAAK,EAAE,cAAcC,mBAAmB,EAAE,GAAGN;QACrD,MAAMC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAACF;QAEjD,MAAMQ,cAAcF,AAAiB,gBAAjBA,MAAM,MAAM;QAChC,MAAMG,SAASD,cAAc,OAAOF,MAAM,MAAM;QAEhD,MAAMI,eAAeC,sBAAsB;YACvCT;YACA,cAAcK;QAClB;QAOA,MAAMK,cAAc,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC/C,KAAK;gBACD;oBACI,GAAGC,wBAAwBH,aAAa;oBACxC,MAAM;wBACF,GAAGA,YAAY;wBACfD;oBACJ;gBACJ;aACH;QACL;QAEA,IAAID,aACAI,YAAY,GAAG,CAAC;YACZ,GAAGE,yBAAyBJ,aAAa;YACzC,MAAM;gBACF,GAAGA,YAAY;gBACfD;YACJ;QACJ;QAMJ,MAAMM,qBAAqB,MAAM,IAAI,CAAC,0BAA0B,CAACb,OAAOI;QAExE,IAAIS,oBAAoB;YACpB,MAAMC,yBAAyBD,mBAAmB,EAAE,KAAKT,MAAM,EAAE;YACjE,IAAIU,wBACAJ,YAAY,GAAG,CAAC;gBACZ,GAAGK,sBAAsBP,aAAa;gBACtC,MAAM;oBACF,GAAGA,YAAY;oBACfD;gBACJ;YACJ;iBACG;gBAKH,MAAMS,8BAA8BC,oBAChCb,OACAc;gBAQJR,YAAY,GAAG,CAAC;oBACZ,GAAGC,wBAAwBE,mBAAmB;oBAC9C,MAAM;wBACF,GAAGA,kBAAkB;wBACrB,GAAGG,2BAA2B;oBAClC;gBACJ;gBAEAN,YAAY,GAAG,CAAC;oBACZ,GAAGK,sBAAsBF,mBAAmB;oBAC5C,MAAM;wBACF,GAAGA,kBAAkB;wBACrB,GAAGG,2BAA2B;oBAClC;gBACJ;YACJ;QACJ;QAEA,IAAI;YACA,MAAMN,YAAY,OAAO;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;gBACtB,QAAQN,MAAM,MAAM;YACxB;YACA,OAAOC;QACX,EAAE,OAAOc,IAAI;YACT,MAAM,IAAIC,MACND,GAAG,OAAO,IAAI,2BACdA,GAAG,IAAI,IAAI,gBACX;gBACI,OAAOA;gBACPf;gBACAS;YACJ;QAER;IACJ;AACJ;AAEO,MAAMQ,iBAAiBC,4BAA4B,oBAAoB,CAAC;IAC3E,gBAAgB5B;IAChB,cAAc;QAAC6B;QAAmBC;QAAmBC;KAAwB;AACjF"}
1
+ {"version":3,"file":"operations/entry/DdbUpdateEntry.js","sources":["../../../src/operations/entry/DdbUpdateEntry.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n CmsModel,\n CmsEntryValues,\n CmsEntryStorageOperationsUpdateParams\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport { UpdateEntryStorageOperation } from \"@webiny/api-headless-cms/features/shared/storageOperations/entry/UpdateEntryStorageOperation.js\";\nimport { CmsDdbEntryEntity } from \"~/abstractions/CmsDdbEntryEntity.js\";\nimport { CmsDdbDataLoaders } from \"~/abstractions/CmsDdbDataLoaders.js\";\nimport { CmsStorageModelProvider } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport {\n createEntryLatestKeys,\n createEntryPublishedKeys,\n createEntryRevisionKeys\n} from \"~/operations/entry/keys.js\";\nimport {\n isEntryLevelEntryMetaField,\n pickEntryMetaFields\n} from \"@webiny/api-headless-cms/constants.js\";\nimport { convertToStorageEntry } from \"./storageEntryUtils.js\";\n\ninterface IGetLatestRevisionByEntryIdParams {\n id: string;\n}\n\nclass DdbUpdateEntryImpl implements UpdateEntryStorageOperation.Interface {\n constructor(\n private entity: CmsDdbEntryEntity.Interface,\n private dataLoaders: CmsDdbDataLoaders.Interface,\n private storageModelProvider: CmsStorageModelProvider.Interface\n ) {}\n\n private async getLatestRevisionByEntryId<T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: IGetLatestRevisionByEntryIdParams\n ) {\n const model = this.storageModelProvider.getModel<T>(initialModel);\n\n const items = await this.dataLoaders.getLatestRevisionByEntryId<T>({\n model,\n ids: [params.id]\n });\n return items.shift() || null;\n }\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: CmsEntryStorageOperationsUpdateParams<T>\n ) {\n const { entry, storageEntry: initialStorageEntry } = params;\n const model = this.storageModelProvider.getModel(initialModel);\n\n const isPublished = entry.status === \"published\";\n const locked = isPublished ? true : entry.locked;\n\n const storageEntry = convertToStorageEntry({\n model,\n storageEntry: initialStorageEntry\n });\n /**\n * We need to:\n * - update the current entry\n * - update the latest entry if the current entry is the latest one\n */\n\n const entityBatch = this.entity.createEntityWriter({\n put: [\n {\n ...createEntryRevisionKeys(storageEntry),\n data: {\n ...storageEntry,\n locked\n }\n }\n ]\n });\n\n if (isPublished) {\n entityBatch.put({\n ...createEntryPublishedKeys(storageEntry),\n data: {\n ...storageEntry,\n locked\n }\n });\n }\n\n /**\n * We need the latest entry to update it as well if necessary.\n */\n const latestStorageEntry = await this.getLatestRevisionByEntryId(model, entry);\n\n if (latestStorageEntry) {\n const updatingLatestRevision = latestStorageEntry.id === entry.id;\n if (updatingLatestRevision) {\n entityBatch.put({\n ...createEntryLatestKeys(storageEntry),\n data: {\n ...storageEntry,\n locked\n }\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 /**\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 ...createEntryRevisionKeys(latestStorageEntry),\n data: {\n ...latestStorageEntry,\n ...updatedEntryLevelMetaFields\n }\n });\n\n entityBatch.put({\n ...createEntryLatestKeys(latestStorageEntry),\n data: {\n ...latestStorageEntry,\n ...updatedEntryLevelMetaFields\n }\n });\n }\n }\n\n try {\n await entityBatch.execute();\n this.dataLoaders.clearAll({\n tenant: entry.tenant\n });\n return initialStorageEntry;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update entry.\",\n ex.code || \"UPDATE_ERROR\",\n {\n error: ex,\n entry,\n latestStorageEntry\n }\n );\n }\n }\n}\n\nexport const DdbUpdateEntry = UpdateEntryStorageOperation.createImplementation({\n implementation: DdbUpdateEntryImpl,\n dependencies: [CmsDdbEntryEntity, CmsDdbDataLoaders, CmsStorageModelProvider]\n});\n"],"names":["DdbUpdateEntryImpl","entity","dataLoaders","storageModelProvider","initialModel","params","model","items","entry","initialStorageEntry","isPublished","locked","storageEntry","convertToStorageEntry","entityBatch","createEntryRevisionKeys","createEntryPublishedKeys","latestStorageEntry","updatingLatestRevision","createEntryLatestKeys","updatedEntryLevelMetaFields","pickEntryMetaFields","isEntryLevelEntryMetaField","ex","WebinyError","DdbUpdateEntry","UpdateEntryStorageOperation","CmsDdbEntryEntity","CmsDdbDataLoaders","CmsStorageModelProvider"],"mappings":";;;;;;;;AAyBA,MAAMA;IACF,YACYC,MAAmC,EACnCC,WAAwC,EACxCC,oBAAuD,CACjE;aAHUF,MAAM,GAANA;aACAC,WAAW,GAAXA;aACAC,oBAAoB,GAApBA;IACT;IAEH,MAAc,2BACVC,YAAsB,EACtBC,MAAyC,EAC3C;QACE,MAAMC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAIF;QAEpD,MAAMG,QAAQ,MAAM,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAI;YAC/DD;YACA,KAAK;gBAACD,OAAO,EAAE;aAAC;QACpB;QACA,OAAOE,MAAM,KAAK,MAAM;IAC5B;IAEA,MAAM,QACFH,YAAsB,EACtBC,MAAgD,EAClD;QACE,MAAM,EAAEG,KAAK,EAAE,cAAcC,mBAAmB,EAAE,GAAGJ;QACrD,MAAMC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAACF;QAEjD,MAAMM,cAAcF,AAAiB,gBAAjBA,MAAM,MAAM;QAChC,MAAMG,SAASD,cAAc,OAAOF,MAAM,MAAM;QAEhD,MAAMI,eAAeC,sBAAsB;YACvCP;YACA,cAAcG;QAClB;QAOA,MAAMK,cAAc,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC/C,KAAK;gBACD;oBACI,GAAGC,wBAAwBH,aAAa;oBACxC,MAAM;wBACF,GAAGA,YAAY;wBACfD;oBACJ;gBACJ;aACH;QACL;QAEA,IAAID,aACAI,YAAY,GAAG,CAAC;YACZ,GAAGE,yBAAyBJ,aAAa;YACzC,MAAM;gBACF,GAAGA,YAAY;gBACfD;YACJ;QACJ;QAMJ,MAAMM,qBAAqB,MAAM,IAAI,CAAC,0BAA0B,CAACX,OAAOE;QAExE,IAAIS,oBAAoB;YACpB,MAAMC,yBAAyBD,mBAAmB,EAAE,KAAKT,MAAM,EAAE;YACjE,IAAIU,wBACAJ,YAAY,GAAG,CAAC;gBACZ,GAAGK,sBAAsBP,aAAa;gBACtC,MAAM;oBACF,GAAGA,YAAY;oBACfD;gBACJ;YACJ;iBACG;gBAKH,MAAMS,8BAA8BC,oBAChCb,OACAc;gBAQJR,YAAY,GAAG,CAAC;oBACZ,GAAGC,wBAAwBE,mBAAmB;oBAC9C,MAAM;wBACF,GAAGA,kBAAkB;wBACrB,GAAGG,2BAA2B;oBAClC;gBACJ;gBAEAN,YAAY,GAAG,CAAC;oBACZ,GAAGK,sBAAsBF,mBAAmB;oBAC5C,MAAM;wBACF,GAAGA,kBAAkB;wBACrB,GAAGG,2BAA2B;oBAClC;gBACJ;YACJ;QACJ;QAEA,IAAI;YACA,MAAMN,YAAY,OAAO;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;gBACtB,QAAQN,MAAM,MAAM;YACxB;YACA,OAAOC;QACX,EAAE,OAAOc,IAAI;YACT,MAAM,IAAIC,MACND,GAAG,OAAO,IAAI,2BACdA,GAAG,IAAI,IAAI,gBACX;gBACI,OAAOA;gBACPf;gBACAS;YACJ;QAER;IACJ;AACJ;AAEO,MAAMQ,iBAAiBC,4BAA4B,oBAAoB,CAAC;IAC3E,gBAAgB1B;IAChB,cAAc;QAAC2B;QAAmBC;QAAmBC;KAAwB;AACjF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms-ddb",
3
- "version": "6.6.0-alpha.6",
3
+ "version": "6.6.0-alpha.8",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -26,22 +26,22 @@
26
26
  ],
27
27
  "license": "MIT",
28
28
  "dependencies": {
29
- "@webiny/api": "6.6.0-alpha.6",
30
- "@webiny/api-headless-cms": "6.6.0-alpha.6",
31
- "@webiny/api-headless-cms-storage": "6.6.0-alpha.6",
32
- "@webiny/aws-sdk": "6.6.0-alpha.6",
33
- "@webiny/db-dynamodb": "6.6.0-alpha.6",
34
- "@webiny/db-utils": "6.6.0-alpha.6",
35
- "@webiny/error": "6.6.0-alpha.6",
36
- "@webiny/feature": "6.6.0-alpha.6",
37
- "@webiny/handler": "6.6.0-alpha.6",
38
- "@webiny/utils": "6.6.0-alpha.6",
29
+ "@webiny/api": "6.6.0-alpha.8",
30
+ "@webiny/api-headless-cms": "6.6.0-alpha.8",
31
+ "@webiny/api-headless-cms-storage": "6.6.0-alpha.8",
32
+ "@webiny/aws-sdk": "6.6.0-alpha.8",
33
+ "@webiny/db-dynamodb": "6.6.0-alpha.8",
34
+ "@webiny/db-utils": "6.6.0-alpha.8",
35
+ "@webiny/error": "6.6.0-alpha.8",
36
+ "@webiny/feature": "6.6.0-alpha.8",
37
+ "@webiny/handler": "6.6.0-alpha.8",
38
+ "@webiny/utils": "6.6.0-alpha.8",
39
39
  "dataloader": "2.2.3"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/jsonpack": "1.1.6",
43
- "@webiny/api-core": "6.6.0-alpha.6",
44
- "@webiny/build-tools": "6.6.0-alpha.6",
43
+ "@webiny/api-core": "6.6.0-alpha.8",
44
+ "@webiny/build-tools": "6.6.0-alpha.8",
45
45
  "@webiny/di": "1.1.0",
46
46
  "jest-dynalite": "3.6.1",
47
47
  "typescript": "7.0.2",