@webiny/api-headless-cms-ddb-es 5.26.0-beta.2 → 5.27.0-beta.0

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.
@@ -100,11 +100,17 @@ const createEntriesStorageOperations = params => {
100
100
  entry,
101
101
  storageEntry
102
102
  } = params;
103
+ const isPublished = entry.status === "published";
104
+ const locked = isPublished ? true : entry.locked;
103
105
  const esEntry = (0, _helpers.prepareEntryToIndex)({
104
106
  plugins,
105
107
  model,
106
- entry: (0, _cloneDeep.default)(entry),
107
- storageEntry: (0, _cloneDeep.default)(storageEntry)
108
+ entry: (0, _cloneDeep.default)(_objectSpread(_objectSpread({}, entry), {}, {
109
+ locked
110
+ })),
111
+ storageEntry: (0, _cloneDeep.default)(_objectSpread(_objectSpread({}, storageEntry), {}, {
112
+ locked
113
+ }))
108
114
  });
109
115
 
110
116
  const {
@@ -114,20 +120,49 @@ const createEntriesStorageOperations = params => {
114
120
  });
115
121
 
116
122
  const esLatestData = await getESLatestEntryData(plugins, esEntry);
123
+ const esPublishedData = await getESPublishedEntryData(plugins, esEntry);
117
124
  const revisionKeys = {
118
- PK: (0, _keys.createPartitionKey)(entry),
125
+ PK: (0, _keys.createPartitionKey)({
126
+ id: entry.id,
127
+ locale: model.locale,
128
+ tenant: model.tenant
129
+ }),
119
130
  SK: (0, _keys.createRevisionSortKey)(entry)
120
131
  };
121
132
  const latestKeys = {
122
- PK: (0, _keys.createPartitionKey)(entry),
133
+ PK: (0, _keys.createPartitionKey)({
134
+ id: entry.id,
135
+ locale: model.locale,
136
+ tenant: model.tenant
137
+ }),
123
138
  SK: (0, _keys.createLatestSortKey)()
124
139
  };
125
- const items = [entity.putBatch(_objectSpread(_objectSpread(_objectSpread({}, storageEntry), revisionKeys), {}, {
140
+ const publishedKeys = {
141
+ PK: (0, _keys.createPartitionKey)({
142
+ id: entry.id,
143
+ locale: model.locale,
144
+ tenant: model.tenant
145
+ }),
146
+ SK: (0, _keys.createPublishedSortKey)()
147
+ };
148
+ const items = [entity.putBatch(_objectSpread(_objectSpread(_objectSpread({}, storageEntry), {}, {
149
+ locked
150
+ }, revisionKeys), {}, {
126
151
  TYPE: createType()
127
- })), entity.putBatch(_objectSpread(_objectSpread(_objectSpread({}, storageEntry), latestKeys), {}, {
152
+ })), entity.putBatch(_objectSpread(_objectSpread(_objectSpread({}, storageEntry), {}, {
153
+ locked
154
+ }, latestKeys), {}, {
128
155
  TYPE: createLatestType()
129
156
  }))];
130
157
 
158
+ if (isPublished) {
159
+ items.push(entity.putBatch(_objectSpread(_objectSpread(_objectSpread({}, storageEntry), {}, {
160
+ locked
161
+ }, publishedKeys), {}, {
162
+ TYPE: createPublishedType()
163
+ })));
164
+ }
165
+
131
166
  try {
132
167
  await (0, _batchWrite.batchWriteAll)({
133
168
  table: entity.table,
@@ -144,11 +179,23 @@ const createEntriesStorageOperations = params => {
144
179
  });
145
180
  }
146
181
 
147
- try {
148
- await esEntity.put(_objectSpread(_objectSpread({}, latestKeys), {}, {
182
+ const esItems = [esEntity.putBatch(_objectSpread(_objectSpread({}, latestKeys), {}, {
183
+ index: esIndex,
184
+ data: esLatestData
185
+ }))];
186
+
187
+ if (isPublished) {
188
+ esItems.push(esEntity.putBatch(_objectSpread(_objectSpread({}, publishedKeys), {}, {
149
189
  index: esIndex,
150
- data: esLatestData
151
- }));
190
+ data: esPublishedData
191
+ })));
192
+ }
193
+
194
+ try {
195
+ await (0, _batchWrite.batchWriteAll)({
196
+ table: esEntity.table,
197
+ items: esItems
198
+ });
152
199
  } catch (ex) {
153
200
  throw new _error.default(ex.message || "Could not insert entry data into the Elasticsearch DynamoDB table.", ex.code || "CREATE_ES_ENTRY_ERROR", {
154
201
  error: ex,
@@ -166,11 +213,19 @@ const createEntriesStorageOperations = params => {
166
213
  storageEntry
167
214
  } = params;
168
215
  const revisionKeys = {
169
- PK: (0, _keys.createPartitionKey)(entry),
216
+ PK: (0, _keys.createPartitionKey)({
217
+ id: entry.id,
218
+ locale: model.locale,
219
+ tenant: model.tenant
220
+ }),
170
221
  SK: (0, _keys.createRevisionSortKey)(entry)
171
222
  };
172
223
  const latestKeys = {
173
- PK: (0, _keys.createPartitionKey)(entry),
224
+ PK: (0, _keys.createPartitionKey)({
225
+ id: entry.id,
226
+ locale: model.locale,
227
+ tenant: model.tenant
228
+ }),
174
229
  SK: (0, _keys.createLatestSortKey)()
175
230
  };
176
231
  const esEntry = (0, _helpers.prepareEntryToIndex)({
@@ -236,14 +291,32 @@ const createEntriesStorageOperations = params => {
236
291
  entry,
237
292
  storageEntry
238
293
  } = params;
294
+ const isPublished = entry.status === "published";
295
+ const locked = isPublished ? true : entry.locked;
239
296
  const revisionKeys = {
240
- PK: (0, _keys.createPartitionKey)(entry),
297
+ PK: (0, _keys.createPartitionKey)({
298
+ id: entry.id,
299
+ locale: model.locale,
300
+ tenant: model.tenant
301
+ }),
241
302
  SK: (0, _keys.createRevisionSortKey)(entry)
242
303
  };
243
304
  const latestKeys = {
244
- PK: (0, _keys.createPartitionKey)(entry),
305
+ PK: (0, _keys.createPartitionKey)({
306
+ id: entry.id,
307
+ locale: model.locale,
308
+ tenant: model.tenant
309
+ }),
245
310
  SK: (0, _keys.createLatestSortKey)()
246
311
  };
312
+ const publishedKeys = {
313
+ PK: (0, _keys.createPartitionKey)({
314
+ id: entry.id,
315
+ locale: model.locale,
316
+ tenant: model.tenant
317
+ }),
318
+ SK: (0, _keys.createPublishedSortKey)()
319
+ };
247
320
  /**
248
321
  * We need the latest entry to check if it needs to be updated.
249
322
  */
@@ -252,16 +325,39 @@ const createEntriesStorageOperations = params => {
252
325
  model,
253
326
  ids: [entry.id]
254
327
  });
255
- const items = [entity.putBatch(_objectSpread(_objectSpread(_objectSpread({}, storageEntry), revisionKeys), {}, {
328
+ const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
329
+ model,
330
+ ids: [entry.id]
331
+ });
332
+ const items = [entity.putBatch(_objectSpread(_objectSpread(_objectSpread({}, storageEntry), {}, {
333
+ locked
334
+ }, revisionKeys), {}, {
256
335
  TYPE: createType()
257
336
  }))];
337
+
338
+ if (isPublished) {
339
+ items.push(entity.putBatch(_objectSpread(_objectSpread(_objectSpread({}, storageEntry), {}, {
340
+ locked
341
+ }, publishedKeys), {}, {
342
+ TYPE: createPublishedType()
343
+ })));
344
+ }
345
+
346
+ const esItems = [];
347
+
348
+ const {
349
+ index: esIndex
350
+ } = _configurations.configurations.es({
351
+ model
352
+ });
258
353
  /**
259
354
  * If the latest entry is the one being updated, we need to create a new latest entry records.
260
355
  */
261
356
 
357
+
262
358
  let elasticsearchLatestData = null;
263
359
 
264
- if (latestStorageEntry.id === entry.id) {
360
+ if (latestStorageEntry && latestStorageEntry.id === entry.id) {
265
361
  /**
266
362
  * First we update the regular DynamoDB table
267
363
  */
@@ -275,10 +371,51 @@ const createEntriesStorageOperations = params => {
275
371
  const esEntry = (0, _helpers.prepareEntryToIndex)({
276
372
  plugins,
277
373
  model,
278
- entry: (0, _cloneDeep.default)(entry),
279
- storageEntry: (0, _cloneDeep.default)(storageEntry)
374
+ entry: (0, _cloneDeep.default)(_objectSpread(_objectSpread({}, entry), {}, {
375
+ locked
376
+ })),
377
+ storageEntry: (0, _cloneDeep.default)(_objectSpread(_objectSpread({}, storageEntry), {}, {
378
+ locked
379
+ }))
280
380
  });
281
381
  elasticsearchLatestData = await getESLatestEntryData(plugins, esEntry);
382
+ esItems.push(esEntity.putBatch(_objectSpread(_objectSpread({}, latestKeys), {}, {
383
+ index: esIndex,
384
+ data: elasticsearchLatestData
385
+ })));
386
+ }
387
+
388
+ let elasticsearchPublishedData = null;
389
+
390
+ if (isPublished && publishedStorageEntry && publishedStorageEntry.id === entry.id) {
391
+ if (!elasticsearchLatestData) {
392
+ /**
393
+ * And then update the Elasticsearch table to propagate changes to the Elasticsearch
394
+ */
395
+ const esEntry = (0, _helpers.prepareEntryToIndex)({
396
+ plugins,
397
+ model,
398
+ entry: (0, _cloneDeep.default)(_objectSpread(_objectSpread({}, entry), {}, {
399
+ locked
400
+ })),
401
+ storageEntry: (0, _cloneDeep.default)(_objectSpread(_objectSpread({}, storageEntry), {}, {
402
+ locked
403
+ }))
404
+ });
405
+ elasticsearchPublishedData = await getESPublishedEntryData(plugins, esEntry);
406
+ } else {
407
+ elasticsearchPublishedData = _objectSpread(_objectSpread({}, elasticsearchLatestData), {}, {
408
+ published: true,
409
+ TYPE: createPublishedType(),
410
+ __type: createPublishedType()
411
+ });
412
+ delete elasticsearchPublishedData.latest;
413
+ }
414
+
415
+ esItems.push(esEntity.putBatch(_objectSpread(_objectSpread({}, publishedKeys), {}, {
416
+ index: esIndex,
417
+ data: elasticsearchPublishedData
418
+ })));
282
419
  }
283
420
 
284
421
  try {
@@ -297,23 +434,17 @@ const createEntriesStorageOperations = params => {
297
434
  });
298
435
  }
299
436
 
300
- if (!elasticsearchLatestData) {
437
+ if (esItems.length === 0) {
301
438
  return storageEntry;
302
439
  }
303
440
 
304
- const {
305
- index: esIndex
306
- } = _configurations.configurations.es({
307
- model
308
- });
309
-
310
441
  try {
311
- await esEntity.put(_objectSpread(_objectSpread({}, latestKeys), {}, {
312
- index: esIndex,
313
- data: elasticsearchLatestData
314
- }));
442
+ await (0, _batchWrite.batchWriteAll)({
443
+ table: esEntity.table,
444
+ items: esItems
445
+ });
315
446
  } catch (ex) {
316
- throw new _error.default(ex.message || "Could not update entry DynamoDB Elasticsearch record.", ex.code || "UPDATE_ES_ENTRY_ERROR", {
447
+ throw new _error.default(ex.message || "Could not update entry DynamoDB Elasticsearch records.", ex.code || "UPDATE_ES_ENTRY_ERROR", {
317
448
  error: ex,
318
449
  entry
319
450
  });
@@ -326,7 +457,11 @@ const createEntriesStorageOperations = params => {
326
457
  const {
327
458
  entry
328
459
  } = params;
329
- const partitionKey = (0, _keys.createPartitionKey)(entry);
460
+ const partitionKey = (0, _keys.createPartitionKey)({
461
+ id: entry.id,
462
+ locale: model.locale,
463
+ tenant: model.tenant
464
+ });
330
465
  const items = await (0, _query.queryAll)({
331
466
  entity,
332
467
  partitionKey,
@@ -388,7 +523,11 @@ const createEntriesStorageOperations = params => {
388
523
  latestEntry,
389
524
  latestStorageEntry
390
525
  } = params;
391
- const partitionKey = (0, _keys.createPartitionKey)(entry);
526
+ const partitionKey = (0, _keys.createPartitionKey)({
527
+ id: entry.id,
528
+ locale: model.locale,
529
+ tenant: model.tenant
530
+ });
392
531
 
393
532
  const {
394
533
  index
@@ -600,15 +739,27 @@ const createEntriesStorageOperations = params => {
600
739
  ids: [entry.id]
601
740
  });
602
741
  const revisionKeys = {
603
- PK: (0, _keys.createPartitionKey)(entry),
742
+ PK: (0, _keys.createPartitionKey)({
743
+ id: entry.id,
744
+ locale: model.locale,
745
+ tenant: model.tenant
746
+ }),
604
747
  SK: (0, _keys.createRevisionSortKey)(entry)
605
748
  };
606
749
  const latestKeys = {
607
- PK: (0, _keys.createPartitionKey)(entry),
750
+ PK: (0, _keys.createPartitionKey)({
751
+ id: entry.id,
752
+ locale: model.locale,
753
+ tenant: model.tenant
754
+ }),
608
755
  SK: (0, _keys.createLatestSortKey)()
609
756
  };
610
757
  const publishedKeys = {
611
- PK: (0, _keys.createPartitionKey)(entry),
758
+ PK: (0, _keys.createPartitionKey)({
759
+ id: entry.id,
760
+ locale: model.locale,
761
+ tenant: model.tenant
762
+ }),
612
763
  SK: (0, _keys.createPublishedSortKey)()
613
764
  };
614
765
  let latestEsEntry = null;
@@ -774,7 +925,11 @@ const createEntriesStorageOperations = params => {
774
925
  model,
775
926
  ids: [entry.id]
776
927
  });
777
- const partitionKey = (0, _keys.createPartitionKey)(entry);
928
+ const partitionKey = (0, _keys.createPartitionKey)({
929
+ id: entry.id,
930
+ locale: model.locale,
931
+ tenant: model.tenant
932
+ });
778
933
  const items = [entity.deleteBatch({
779
934
  PK: partitionKey,
780
935
  SK: (0, _keys.createPublishedSortKey)()
@@ -864,7 +1019,11 @@ const createEntriesStorageOperations = params => {
864
1019
  model,
865
1020
  ids: [entry.id]
866
1021
  });
867
- const partitionKey = (0, _keys.createPartitionKey)(entry);
1022
+ const partitionKey = (0, _keys.createPartitionKey)({
1023
+ id: entry.id,
1024
+ locale: model.locale,
1025
+ tenant: model.tenant
1026
+ });
868
1027
  /**
869
1028
  * If we updated the latest version, then make sure the changes are propagated to ES too.
870
1029
  */
@@ -943,7 +1102,11 @@ const createEntriesStorageOperations = params => {
943
1102
  model,
944
1103
  ids: [entry.id]
945
1104
  });
946
- const partitionKey = (0, _keys.createPartitionKey)(entry);
1105
+ const partitionKey = (0, _keys.createPartitionKey)({
1106
+ id: entry.id,
1107
+ locale: model.locale,
1108
+ tenant: model.tenant
1109
+ });
947
1110
  const items = [entity.putBatch(_objectSpread(_objectSpread({}, storageEntry), {}, {
948
1111
  PK: partitionKey,
949
1112
  SK: (0, _keys.createRevisionSortKey)(entry),
@@ -1 +1 @@
1
- {"version":3,"sources":["index.ts"],"names":["createType","createLatestType","createPublishedType","getEntryData","entry","TYPE","__type","getESLatestEntryData","plugins","latest","getESPublishedEntryData","published","createEntriesStorageOperations","params","entity","esEntity","elasticsearch","dataLoaders","DataLoadersHandler","create","model","storageEntry","esEntry","index","esIndex","configurations","es","esLatestData","revisionKeys","PK","SK","latestKeys","items","putBatch","table","clearAll","ex","WebinyError","message","code","error","put","data","createRevisionFrom","update","latestStorageEntry","getLatestRevisionByEntryId","ids","id","elasticsearchLatestData","push","deleteEntry","partitionKey","options","gte","esItems","deleteItems","map","item","deleteBatch","deleteEsItems","deleteRevision","latestEntry","publishedStorageEntry","getPublishedRevisionByEntryId","length","list","limit","result","indices","exists","body","hasMoreItems","totalCount","cursor","args","parentPath","response","search","hits","total","entries","_source","pop","sort","value","get","shift","publish","publishedKeys","latestEsEntry","keys","previouslyPublishedEntry","getRevisionById","status","CONTENT_ENTRY_STATUS","UNPUBLISHED","savedOn","latestEsEntryDataDecompressed","PUBLISHED","locked","publishedOn","preparedEntryData","unpublish","requestReview","requestChanges","getRevisions","getAllEntryRevisions","getByIds","getLatestByIds","getPublishedByIds","getPreviousRevision","tenant","locale","entryId","version","queryParams","lt","filters","attr","eq","reverse","delete"],"mappings":"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","sourcesContent":["import {\n CmsEntry,\n CmsEntryStorageOperations,\n CmsEntryStorageOperationsCreateParams,\n CmsEntryStorageOperationsCreateRevisionFromParams,\n CmsEntryStorageOperationsDeleteParams,\n CmsEntryStorageOperationsDeleteRevisionParams,\n CmsEntryStorageOperationsGetByIdsParams,\n CmsEntryStorageOperationsGetLatestByIdsParams,\n CmsEntryStorageOperationsGetLatestRevisionParams,\n CmsEntryStorageOperationsGetParams,\n CmsEntryStorageOperationsGetPreviousRevisionParams,\n CmsEntryStorageOperationsGetPublishedByIdsParams,\n CmsEntryStorageOperationsGetRevisionParams,\n CmsEntryStorageOperationsGetRevisionsParams,\n CmsEntryStorageOperationsListParams,\n CmsEntryStorageOperationsPublishParams,\n CmsEntryStorageOperationsRequestChangesParams,\n CmsEntryStorageOperationsRequestReviewParams,\n CmsEntryStorageOperationsUnpublishParams,\n CmsEntryStorageOperationsUpdateParams,\n CmsModel,\n CONTENT_ENTRY_STATUS\n} from \"@webiny/api-headless-cms/types\";\nimport {\n createElasticsearchQueryBody,\n extractEntriesFromIndex,\n prepareEntryToIndex\n} from \"~/helpers\";\nimport { configurations } from \"~/configurations\";\nimport WebinyError from \"@webiny/error\";\nimport lodashCloneDeep from \"lodash/cloneDeep\";\nimport lodashOmit from \"lodash/omit\";\nimport { Entity } from \"dynamodb-toolbox\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { compress, decompress } from \"@webiny/api-elasticsearch/compression\";\nimport { batchWriteAll } from \"@webiny/db-dynamodb/utils/batchWrite\";\nimport { DataLoadersHandler } from \"~/operations/entry/dataLoaders\";\nimport {\n createLatestSortKey,\n createPartitionKey,\n createPublishedSortKey,\n createRevisionSortKey\n} from \"~/operations/entry/keys\";\nimport { queryAll, queryOne, QueryOneParams } from \"@webiny/db-dynamodb/utils/query\";\nimport { createLimit } from \"@webiny/api-elasticsearch/limit\";\nimport { encodeCursor } from \"@webiny/api-elasticsearch/cursors\";\nimport { get as getRecord } from \"@webiny/db-dynamodb/utils/get\";\nimport { zeroPad } from \"@webiny/utils\";\nimport { cleanupItem } from \"@webiny/db-dynamodb/utils/cleanup\";\nimport { ElasticsearchSearchResponse } from \"@webiny/api-elasticsearch/types\";\n\nconst createType = (): string => {\n return \"cms.entry\";\n};\nexport const createLatestType = (): string => {\n return `${createType()}.l`;\n};\nexport const createPublishedType = (): string => {\n return `${createType()}.p`;\n};\n\nconst getEntryData = (entry: CmsEntry) => {\n return {\n ...lodashOmit(entry, [\"PK\", \"SK\", \"published\", \"latest\"]),\n TYPE: createType(),\n __type: createType()\n };\n};\n\nconst getESLatestEntryData = async (plugins: PluginsContainer, entry: CmsEntry) => {\n return compress(plugins, {\n ...getEntryData(entry),\n latest: true,\n TYPE: createLatestType(),\n __type: createLatestType()\n });\n};\n\nconst getESPublishedEntryData = async (plugins: PluginsContainer, entry: CmsEntry) => {\n return compress(plugins, {\n ...getEntryData(entry),\n published: true,\n TYPE: createPublishedType(),\n __type: createPublishedType()\n });\n};\n\ninterface ElasticsearchDbRecord {\n index: string;\n data: Record<string, string>;\n}\n\nexport interface CreateEntriesStorageOperationsParams {\n entity: Entity<any>;\n esEntity: Entity<any>;\n elasticsearch: Client;\n plugins: PluginsContainer;\n}\nexport const createEntriesStorageOperations = (\n params: CreateEntriesStorageOperationsParams\n): CmsEntryStorageOperations => {\n const { entity, esEntity, elasticsearch, plugins } = params;\n\n const dataLoaders = new DataLoadersHandler({\n entity\n });\n\n const create = async (model: CmsModel, params: CmsEntryStorageOperationsCreateParams) => {\n const { entry, storageEntry } = params;\n\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n const esLatestData = await getESLatestEntryData(plugins, esEntry);\n\n const revisionKeys = {\n PK: createPartitionKey(entry),\n SK: createRevisionSortKey(entry)\n };\n\n const latestKeys = {\n PK: createPartitionKey(entry),\n SK: createLatestSortKey()\n };\n\n const items = [\n entity.putBatch({\n ...storageEntry,\n ...revisionKeys,\n TYPE: createType()\n }),\n entity.putBatch({\n ...storageEntry,\n ...latestKeys,\n TYPE: createLatestType()\n })\n ];\n\n try {\n await batchWriteAll({\n table: entity.table,\n items\n });\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 try {\n await esEntity.put({\n ...latestKeys,\n index: esIndex,\n data: esLatestData\n });\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 storageEntry;\n };\n\n const createRevisionFrom = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsCreateRevisionFromParams\n ) => {\n const { entry, storageEntry } = params;\n const revisionKeys = {\n PK: createPartitionKey(entry),\n SK: createRevisionSortKey(entry)\n };\n const latestKeys = {\n PK: createPartitionKey(entry),\n SK: createLatestSortKey()\n };\n\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n const esLatestData = await getESLatestEntryData(plugins, esEntry);\n\n const items = [\n entity.putBatch({\n ...storageEntry,\n TYPE: createType(),\n ...revisionKeys\n }),\n entity.putBatch({\n ...storageEntry,\n TYPE: createLatestType(),\n ...latestKeys\n })\n ];\n\n const { index } = configurations.es({\n model\n });\n try {\n await batchWriteAll({\n table: entity.table,\n items\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 * Update the \"latest\" entry item in the Elasticsearch\n */\n try {\n await esEntity.put({\n ...latestKeys,\n index,\n data: esLatestData\n });\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 storageEntry;\n };\n\n const update = async (model: CmsModel, params: CmsEntryStorageOperationsUpdateParams) => {\n const { entry, storageEntry } = params;\n const revisionKeys = {\n PK: createPartitionKey(entry),\n SK: createRevisionSortKey(entry)\n };\n const latestKeys = {\n PK: createPartitionKey(entry),\n SK: createLatestSortKey()\n };\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 items = [\n entity.putBatch({\n ...storageEntry,\n ...revisionKeys,\n TYPE: createType()\n })\n ];\n /**\n * If the latest entry is the one being updated, we need to create a new latest entry records.\n */\n let elasticsearchLatestData = null;\n if (latestStorageEntry.id === entry.id) {\n /**\n * First we update the regular DynamoDB table\n */\n items.push(\n entity.putBatch({\n ...storageEntry,\n ...latestKeys,\n TYPE: createLatestSortKey()\n })\n );\n /**\n * And then update the Elasticsearch table to propagate changes to the Elasticsearch\n */\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n elasticsearchLatestData = await getESLatestEntryData(plugins, esEntry);\n }\n try {\n await batchWriteAll({\n table: entity.table,\n items\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 if (!elasticsearchLatestData) {\n return storageEntry;\n }\n const { index: esIndex } = configurations.es({\n model\n });\n try {\n await esEntity.put({\n ...latestKeys,\n index: esIndex,\n data: elasticsearchLatestData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update entry DynamoDB Elasticsearch record.\",\n ex.code || \"UPDATE_ES_ENTRY_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n return storageEntry;\n };\n\n const deleteEntry = async (model: CmsModel, params: CmsEntryStorageOperationsDeleteParams) => {\n const { entry } = params;\n\n const partitionKey = createPartitionKey(entry);\n\n const items = await queryAll<CmsEntry>({\n entity,\n partitionKey,\n options: {\n gte: \" \"\n }\n });\n\n const esItems = await queryAll<CmsEntry>({\n entity: esEntity,\n partitionKey,\n options: {\n gte: \" \"\n }\n });\n\n const deleteItems = items.map(item => {\n return entity.deleteBatch({\n PK: item.PK,\n SK: item.SK\n });\n });\n\n const deleteEsItems = esItems.map(item => {\n return esEntity.deleteBatch({\n PK: item.PK,\n SK: item.SK\n });\n });\n\n try {\n await batchWriteAll({\n table: entity.table,\n items: deleteItems\n });\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete entry records from DynamoDB table.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n\n try {\n await batchWriteAll({\n table: esEntity.table,\n items: deleteEsItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete entry records from DynamoDB Elasticsearch table.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n };\n\n const deleteRevision = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsDeleteRevisionParams\n ) => {\n const { entry, latestEntry, latestStorageEntry } = params;\n\n const partitionKey = createPartitionKey(entry);\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 items = [\n /**\n * Delete records of given entry revision.\n */\n entity.deleteBatch({\n PK: partitionKey,\n SK: createRevisionSortKey(entry)\n })\n ];\n\n const esItems = [];\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 && entry.id === publishedStorageEntry.id) {\n items.push(\n entity.deleteBatch({\n PK: partitionKey,\n SK: createPublishedSortKey()\n })\n );\n esItems.push(\n entity.deleteBatch({\n PK: partitionKey,\n SK: createPublishedSortKey()\n })\n );\n }\n if (latestEntry && latestStorageEntry) {\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(latestEntry),\n storageEntry: lodashCloneDeep(latestStorageEntry)\n });\n\n const esLatestData = await getESLatestEntryData(plugins, esEntry);\n /**\n * In the end we need to set the new latest entry\n */\n items.push(\n entity.putBatch({\n ...latestStorageEntry,\n PK: partitionKey,\n SK: createLatestSortKey(),\n TYPE: createLatestType()\n })\n );\n esItems.push(\n esEntity.putBatch({\n PK: partitionKey,\n SK: createLatestSortKey(),\n index,\n data: esLatestData\n })\n );\n }\n\n try {\n await batchWriteAll({\n table: entity.table,\n items\n });\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 latestStorageEntry\n }\n );\n }\n\n if (esItems.length === 0) {\n return;\n }\n\n try {\n await batchWriteAll({\n table: esEntity.table,\n items: esItems\n });\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 latestStorageEntry\n }\n );\n }\n };\n\n const list = async (model: CmsModel, params: CmsEntryStorageOperationsListParams) => {\n const limit = createLimit(params.limit, 50);\n const { index } = configurations.es({\n model\n });\n\n try {\n const result = await elasticsearch.indices.exists({\n index\n });\n if (!result || !result.body) {\n return {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null,\n items: []\n };\n }\n } catch (ex) {\n throw new WebinyError(\n \"Could not determine if Elasticsearch index exists.\",\n \"ELASTICSEARCH_INDEX_CHECK_ERROR\",\n {\n error: ex,\n index\n }\n );\n }\n\n const body = createElasticsearchQueryBody({\n model,\n args: {\n ...params,\n limit\n },\n plugins,\n parentPath: \"values\"\n });\n\n let response: ElasticsearchSearchResponse;\n try {\n response = await elasticsearch.search({\n index,\n body\n });\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"ELASTICSEARCH_ERROR\", {\n error: ex,\n index,\n body\n });\n }\n\n const { hits, total } = response.body.hits;\n const items = extractEntriesFromIndex({\n plugins,\n model,\n entries: hits.map(item => item._source)\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 const cursor = items.length > 0 ? encodeCursor(hits[items.length - 1].sort) || null : null;\n return {\n hasMoreItems,\n totalCount: total.value,\n cursor,\n items\n };\n };\n\n const get = async (model: CmsModel, params: CmsEntryStorageOperationsGetParams) => {\n const { items } = await list(model, {\n ...params,\n limit: 1\n });\n return items.shift() || null;\n };\n\n const publish = async (model: CmsModel, params: CmsEntryStorageOperationsPublishParams) => {\n const { entry, storageEntry } = params;\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 const revisionKeys = {\n PK: createPartitionKey(entry),\n SK: createRevisionSortKey(entry)\n };\n const latestKeys = {\n PK: createPartitionKey(entry),\n SK: createLatestSortKey()\n };\n const publishedKeys = {\n PK: createPartitionKey(entry),\n SK: createPublishedSortKey()\n };\n\n let latestEsEntry: ElasticsearchDbRecord | null = null;\n try {\n latestEsEntry = await getRecord<ElasticsearchDbRecord>({\n entity: esEntity,\n keys: latestKeys\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read Elasticsearch latest or published data.\",\n ex.code || \"PUBLISH_BATCH_READ\",\n {\n error: ex,\n latestKeys: latestKeys,\n publishedKeys: publishedKeys\n }\n );\n }\n\n const items = [\n entity.putBatch({\n ...storageEntry,\n ...revisionKeys,\n TYPE: createType()\n })\n ];\n const esItems = [];\n\n const { index } = configurations.es({\n model\n });\n\n if (publishedStorageEntry && publishedStorageEntry.id !== entry.id) {\n /**\n * If there is a `published` entry already, we need to set it to `unpublished`. We need to\n * execute two updates: update the previously published entry's status and the published entry record.\n * DynamoDB does not support `batchUpdate` - so here we load the previously published\n * entry's data to update its status within a batch operation. If, hopefully,\n * they introduce a true update batch operation, remove this `read` call.\n */\n const [previouslyPublishedEntry] = await dataLoaders.getRevisionById({\n model,\n ids: [publishedStorageEntry.id]\n });\n\n items.push(\n /**\n * Update currently published entry (unpublish it)\n */\n entity.putBatch({\n ...previouslyPublishedEntry,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED,\n savedOn: entry.savedOn,\n TYPE: createType(),\n PK: createPartitionKey(publishedStorageEntry),\n SK: createRevisionSortKey(publishedStorageEntry)\n })\n );\n }\n /**\n * Update the helper item in DB with the new published entry\n */\n items.push(\n entity.putBatch({\n ...storageEntry,\n ...publishedKeys,\n TYPE: createPublishedType()\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 && latestStorageEntry.id === entry.id) {\n items.push(\n entity.putBatch({\n ...storageEntry,\n ...latestKeys\n })\n );\n }\n /**\n * If we are publishing the latest revision, let's also update the latest revision's status in ES.\n */\n if (latestEsEntry && latestStorageEntry && latestStorageEntry.id === entry.id) {\n /**\n * Need to decompress the data from Elasticsearch DynamoDB table.\n */\n const latestEsEntryDataDecompressed: CmsEntry = (await decompress(\n plugins,\n latestEsEntry.data\n )) as any;\n\n esItems.push(\n esEntity.putBatch({\n index,\n PK: createPartitionKey(latestEsEntryDataDecompressed),\n SK: createLatestSortKey(),\n data: {\n ...latestEsEntryDataDecompressed,\n status: CONTENT_ENTRY_STATUS.PUBLISHED,\n locked: true,\n savedOn: entry.savedOn,\n publishedOn: entry.publishedOn\n }\n })\n );\n }\n\n const preparedEntryData = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n /**\n * Update the published revision entry in ES.\n */\n const esLatestData = await getESPublishedEntryData(plugins, preparedEntryData);\n\n esItems.push(\n esEntity.putBatch({\n ...publishedKeys,\n index,\n data: esLatestData\n })\n );\n\n /**\n * Finally, execute regular table batch.\n */\n try {\n await batchWriteAll({\n table: entity.table,\n items\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 batchWriteAll({\n table: esEntity.table,\n items: esItems\n });\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 storageEntry;\n };\n\n const unpublish = async (model: CmsModel, params: CmsEntryStorageOperationsUnpublishParams) => {\n const { entry, storageEntry } = params;\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(entry);\n\n const items = [\n entity.deleteBatch({\n PK: partitionKey,\n SK: createPublishedSortKey()\n }),\n entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: createRevisionSortKey(entry),\n TYPE: createType()\n })\n ];\n\n const esItems = [\n esEntity.deleteBatch({\n PK: partitionKey,\n SK: createPublishedSortKey()\n })\n ];\n /**\n * If we are unpublishing the latest revision, let's also update the latest revision entry's status in ES.\n */\n if (latestStorageEntry.id === entry.id) {\n const { index } = configurations.es({\n model\n });\n\n const preparedEntryData = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n const esLatestData = await getESLatestEntryData(plugins, preparedEntryData);\n esItems.push(\n esEntity.putBatch({\n PK: partitionKey,\n SK: createLatestSortKey(),\n index,\n data: esLatestData\n })\n );\n }\n\n /**\n * Finally, execute regular table batch.\n */\n try {\n await batchWriteAll({\n table: entity.table,\n items\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 batchWriteAll({\n table: esEntity.table,\n items: esItems\n });\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 storageEntry;\n };\n\n const requestReview = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsRequestReviewParams\n ) => {\n const { entry, storageEntry } = params;\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(entry);\n\n /**\n * If we updated the latest version, then make sure the changes are propagated to ES too.\n */\n let esLatestData = null;\n const { index } = configurations.es({\n model\n });\n if (latestStorageEntry && latestStorageEntry.id === entry.id) {\n const preparedEntryData = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n esLatestData = await getESLatestEntryData(plugins, preparedEntryData);\n }\n\n try {\n await entity.put({\n ...storageEntry,\n PK: partitionKey,\n SK: createRevisionSortKey(entry),\n TYPE: createType()\n });\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not store request review entry record into DynamoDB table.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n entry,\n storageEntry,\n latestStorageEntry\n }\n );\n }\n /**\n * No need to proceed further if nothing to put into Elasticsearch.\n */\n if (!esLatestData) {\n return storageEntry;\n }\n\n try {\n await esEntity.put({\n PK: partitionKey,\n SK: createLatestSortKey(),\n index,\n data: esLatestData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not store request review entry record into DynamoDB Elasticsearch table.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n entry,\n storageEntry,\n latestStorageEntry\n }\n );\n }\n return storageEntry;\n };\n\n const requestChanges = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsRequestChangesParams\n ) => {\n const { entry, storageEntry } = params;\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(entry);\n\n const items = [\n entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: createRevisionSortKey(entry),\n TYPE: createType()\n })\n ];\n /**\n * If we updated the latest version, then make sure the changes are propagated to ES too.\n */\n const { index } = configurations.es({\n model\n });\n let esLatestData = null;\n if (latestStorageEntry && latestStorageEntry.id === entry.id) {\n items.push(\n entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: createLatestSortKey(),\n TYPE: createLatestType()\n })\n );\n\n const preparedEntryData = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n esLatestData = await getESLatestEntryData(plugins, preparedEntryData);\n }\n\n try {\n await batchWriteAll({\n table: entity.table,\n items\n });\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not store request changes entry record into DynamoDB table.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n entry,\n latestStorageEntry\n }\n );\n }\n /**\n * No need to proceed further if nothing to put into Elasticsearch.\n */\n if (!esLatestData) {\n return storageEntry;\n }\n\n try {\n await esEntity.put({\n PK: partitionKey,\n SK: createLatestSortKey(),\n index,\n data: esLatestData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not store request changes entry record into DynamoDB Elasticsearch table.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n entry,\n latestStorageEntry\n }\n );\n }\n return storageEntry;\n };\n\n const getLatestRevisionByEntryId = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestRevisionParams\n ) => {\n const result = await dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: [params.id]\n });\n return result.shift() || null;\n };\n const getPublishedRevisionByEntryId = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestRevisionParams\n ) => {\n const result = await dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: [params.id]\n });\n return result.shift() || null;\n };\n\n const getRevisionById = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionParams\n ) => {\n const result = await dataLoaders.getRevisionById({\n model,\n ids: [params.id]\n });\n return result.shift() || null;\n };\n\n const getRevisions = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionsParams\n ) => {\n return await dataLoaders.getAllEntryRevisions({\n model,\n ids: [params.id]\n });\n };\n\n const getByIds = async (model: CmsModel, params: CmsEntryStorageOperationsGetByIdsParams) => {\n return dataLoaders.getRevisionById({\n model,\n ids: params.ids\n });\n };\n\n const getLatestByIds = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestByIdsParams\n ) => {\n return dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: params.ids\n });\n };\n\n const getPublishedByIds = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedByIdsParams\n ) => {\n return dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: params.ids\n });\n };\n\n const getPreviousRevision = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPreviousRevisionParams\n ) => {\n const { tenant, locale } = model;\n const { entryId, version } = params;\n const queryParams: QueryOneParams = {\n entity,\n partitionKey: createPartitionKey({\n tenant,\n locale,\n id: entryId\n }),\n options: {\n lt: `REV#${zeroPad(version)}`,\n /**\n * We need to have extra checks because DynamoDB will return published or latest record if there is no REV# record.\n */\n filters: [\n {\n attr: \"TYPE\",\n eq: createType()\n },\n {\n attr: \"version\",\n lt: version\n }\n ],\n reverse: true\n }\n };\n\n try {\n const result = await queryOne<CmsEntry>(queryParams);\n\n return cleanupItem(entity, result);\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: queryParams.partitionKey,\n options: queryParams.options,\n model\n }\n );\n }\n };\n\n return {\n create,\n createRevisionFrom,\n update,\n delete: deleteEntry,\n deleteRevision,\n get,\n publish,\n unpublish,\n requestReview,\n requestChanges,\n list,\n getLatestRevisionByEntryId,\n getPublishedRevisionByEntryId,\n getRevisionById,\n getRevisions,\n getByIds,\n getLatestByIds,\n getPublishedByIds,\n getPreviousRevision\n };\n};\n"]}
1
+ {"version":3,"sources":["index.ts"],"names":["createType","createLatestType","createPublishedType","getEntryData","entry","TYPE","__type","getESLatestEntryData","plugins","latest","getESPublishedEntryData","published","createEntriesStorageOperations","params","entity","esEntity","elasticsearch","dataLoaders","DataLoadersHandler","create","model","storageEntry","isPublished","status","locked","esEntry","index","esIndex","configurations","es","esLatestData","esPublishedData","revisionKeys","PK","id","locale","tenant","SK","latestKeys","publishedKeys","items","putBatch","push","table","clearAll","ex","WebinyError","message","code","error","esItems","data","createRevisionFrom","put","update","latestStorageEntry","getLatestRevisionByEntryId","ids","publishedStorageEntry","getPublishedRevisionByEntryId","elasticsearchLatestData","elasticsearchPublishedData","length","deleteEntry","partitionKey","options","gte","deleteItems","map","item","deleteBatch","deleteEsItems","deleteRevision","latestEntry","list","limit","result","indices","exists","body","hasMoreItems","totalCount","cursor","args","parentPath","response","search","hits","total","entries","_source","pop","sort","value","get","shift","publish","latestEsEntry","keys","previouslyPublishedEntry","getRevisionById","CONTENT_ENTRY_STATUS","UNPUBLISHED","savedOn","latestEsEntryDataDecompressed","PUBLISHED","publishedOn","preparedEntryData","unpublish","requestReview","requestChanges","getRevisions","getAllEntryRevisions","getByIds","getLatestByIds","getPublishedByIds","getPreviousRevision","entryId","version","queryParams","lt","filters","attr","eq","reverse","delete"],"mappings":"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","sourcesContent":["import {\n CmsEntry,\n CmsEntryStorageOperations,\n CmsEntryStorageOperationsCreateParams,\n CmsEntryStorageOperationsCreateRevisionFromParams,\n CmsEntryStorageOperationsDeleteParams,\n CmsEntryStorageOperationsDeleteRevisionParams,\n CmsEntryStorageOperationsGetByIdsParams,\n CmsEntryStorageOperationsGetLatestByIdsParams,\n CmsEntryStorageOperationsGetLatestRevisionParams,\n CmsEntryStorageOperationsGetParams,\n CmsEntryStorageOperationsGetPreviousRevisionParams,\n CmsEntryStorageOperationsGetPublishedByIdsParams,\n CmsEntryStorageOperationsGetRevisionParams,\n CmsEntryStorageOperationsGetRevisionsParams,\n CmsEntryStorageOperationsListParams,\n CmsEntryStorageOperationsPublishParams,\n CmsEntryStorageOperationsRequestChangesParams,\n CmsEntryStorageOperationsRequestReviewParams,\n CmsEntryStorageOperationsUnpublishParams,\n CmsEntryStorageOperationsUpdateParams,\n CmsModel,\n CONTENT_ENTRY_STATUS\n} from \"@webiny/api-headless-cms/types\";\nimport {\n createElasticsearchQueryBody,\n extractEntriesFromIndex,\n prepareEntryToIndex\n} from \"~/helpers\";\nimport { configurations } from \"~/configurations\";\nimport WebinyError from \"@webiny/error\";\nimport lodashCloneDeep from \"lodash/cloneDeep\";\nimport lodashOmit from \"lodash/omit\";\nimport { Entity } from \"dynamodb-toolbox\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { compress, decompress } from \"@webiny/api-elasticsearch/compression\";\nimport { batchWriteAll } from \"@webiny/db-dynamodb/utils/batchWrite\";\nimport { DataLoadersHandler } from \"~/operations/entry/dataLoaders\";\nimport {\n createLatestSortKey,\n createPartitionKey,\n createPublishedSortKey,\n createRevisionSortKey\n} from \"~/operations/entry/keys\";\nimport { queryAll, queryOne, QueryOneParams } from \"@webiny/db-dynamodb/utils/query\";\nimport { createLimit } from \"@webiny/api-elasticsearch/limit\";\nimport { encodeCursor } from \"@webiny/api-elasticsearch/cursors\";\nimport { get as getRecord } from \"@webiny/db-dynamodb/utils/get\";\nimport { zeroPad } from \"@webiny/utils\";\nimport { cleanupItem } from \"@webiny/db-dynamodb/utils/cleanup\";\nimport { ElasticsearchSearchResponse } from \"@webiny/api-elasticsearch/types\";\n\nconst createType = (): string => {\n return \"cms.entry\";\n};\nexport const createLatestType = (): string => {\n return `${createType()}.l`;\n};\nexport const createPublishedType = (): string => {\n return `${createType()}.p`;\n};\n\nconst getEntryData = (entry: CmsEntry) => {\n return {\n ...lodashOmit(entry, [\"PK\", \"SK\", \"published\", \"latest\"]),\n TYPE: createType(),\n __type: createType()\n };\n};\n\nconst getESLatestEntryData = async (plugins: PluginsContainer, entry: CmsEntry) => {\n return compress(plugins, {\n ...getEntryData(entry),\n latest: true,\n TYPE: createLatestType(),\n __type: createLatestType()\n });\n};\n\nconst getESPublishedEntryData = async (plugins: PluginsContainer, entry: CmsEntry) => {\n return compress(plugins, {\n ...getEntryData(entry),\n published: true,\n TYPE: createPublishedType(),\n __type: createPublishedType()\n });\n};\n\ninterface ElasticsearchDbRecord {\n index: string;\n data: Record<string, string>;\n}\n\nexport interface CreateEntriesStorageOperationsParams {\n entity: Entity<any>;\n esEntity: Entity<any>;\n elasticsearch: Client;\n plugins: PluginsContainer;\n}\nexport const createEntriesStorageOperations = (\n params: CreateEntriesStorageOperationsParams\n): CmsEntryStorageOperations => {\n const { entity, esEntity, elasticsearch, plugins } = params;\n\n const dataLoaders = new DataLoadersHandler({\n entity\n });\n\n const create = async (model: CmsModel, params: CmsEntryStorageOperationsCreateParams) => {\n const { entry, storageEntry } = params;\n const isPublished = entry.status === \"published\";\n const locked = isPublished ? true : entry.locked;\n\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep({ ...entry, locked }),\n storageEntry: lodashCloneDeep({ ...storageEntry, locked })\n });\n\n const { index: esIndex } = configurations.es({\n model\n });\n\n const esLatestData = await getESLatestEntryData(plugins, esEntry);\n const esPublishedData = await getESPublishedEntryData(plugins, esEntry);\n\n const revisionKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createRevisionSortKey(entry)\n };\n\n const latestKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createLatestSortKey()\n };\n\n const publishedKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createPublishedSortKey()\n };\n\n const items = [\n entity.putBatch({\n ...storageEntry,\n locked,\n ...revisionKeys,\n TYPE: createType()\n }),\n entity.putBatch({\n ...storageEntry,\n locked,\n ...latestKeys,\n TYPE: createLatestType()\n })\n ];\n\n if (isPublished) {\n items.push(\n entity.putBatch({\n ...storageEntry,\n locked,\n ...publishedKeys,\n TYPE: createPublishedType()\n })\n );\n }\n\n try {\n await batchWriteAll({\n table: entity.table,\n items\n });\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 esItems = [\n esEntity.putBatch({\n ...latestKeys,\n index: esIndex,\n data: esLatestData\n })\n ];\n if (isPublished) {\n esItems.push(\n esEntity.putBatch({\n ...publishedKeys,\n index: esIndex,\n data: esPublishedData\n })\n );\n }\n\n try {\n await batchWriteAll({\n table: esEntity.table,\n items: esItems\n });\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 storageEntry;\n };\n\n const createRevisionFrom = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsCreateRevisionFromParams\n ) => {\n const { entry, storageEntry } = params;\n const revisionKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createRevisionSortKey(entry)\n };\n const latestKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createLatestSortKey()\n };\n\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n const esLatestData = await getESLatestEntryData(plugins, esEntry);\n\n const items = [\n entity.putBatch({\n ...storageEntry,\n TYPE: createType(),\n ...revisionKeys\n }),\n entity.putBatch({\n ...storageEntry,\n TYPE: createLatestType(),\n ...latestKeys\n })\n ];\n\n const { index } = configurations.es({\n model\n });\n try {\n await batchWriteAll({\n table: entity.table,\n items\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 * Update the \"latest\" entry item in the Elasticsearch\n */\n try {\n await esEntity.put({\n ...latestKeys,\n index,\n data: esLatestData\n });\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 storageEntry;\n };\n\n const update = async (model: CmsModel, params: CmsEntryStorageOperationsUpdateParams) => {\n const { entry, storageEntry } = params;\n\n const isPublished = entry.status === \"published\";\n const locked = isPublished ? true : entry.locked;\n\n const revisionKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createRevisionSortKey(entry)\n };\n const latestKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createLatestSortKey()\n };\n\n const publishedKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createPublishedSortKey()\n };\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 items = [\n entity.putBatch({\n ...storageEntry,\n locked,\n ...revisionKeys,\n TYPE: createType()\n })\n ];\n if (isPublished) {\n items.push(\n entity.putBatch({\n ...storageEntry,\n locked,\n ...publishedKeys,\n TYPE: createPublishedType()\n })\n );\n }\n\n const esItems = [];\n\n const { index: esIndex } = configurations.es({\n model\n });\n /**\n * If the latest entry is the one being updated, we need to create a new latest entry records.\n */\n let elasticsearchLatestData: any = null;\n if (latestStorageEntry && latestStorageEntry.id === entry.id) {\n /**\n * First we update the regular DynamoDB table\n */\n items.push(\n entity.putBatch({\n ...storageEntry,\n ...latestKeys,\n TYPE: createLatestSortKey()\n })\n );\n /**\n * And then update the Elasticsearch table to propagate changes to the Elasticsearch\n */\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep({\n ...entry,\n locked\n }),\n storageEntry: lodashCloneDeep({\n ...storageEntry,\n locked\n })\n });\n\n elasticsearchLatestData = await getESLatestEntryData(plugins, esEntry);\n\n esItems.push(\n esEntity.putBatch({\n ...latestKeys,\n index: esIndex,\n data: elasticsearchLatestData\n })\n );\n }\n let elasticsearchPublishedData = null;\n if (isPublished && publishedStorageEntry && publishedStorageEntry.id === entry.id) {\n if (!elasticsearchLatestData) {\n /**\n * And then update the Elasticsearch table to propagate changes to the Elasticsearch\n */\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep({\n ...entry,\n locked\n }),\n storageEntry: lodashCloneDeep({\n ...storageEntry,\n locked\n })\n });\n elasticsearchPublishedData = await getESPublishedEntryData(plugins, esEntry);\n } else {\n elasticsearchPublishedData = {\n ...elasticsearchLatestData,\n published: true,\n TYPE: createPublishedType(),\n __type: createPublishedType()\n };\n delete elasticsearchPublishedData.latest;\n }\n esItems.push(\n esEntity.putBatch({\n ...publishedKeys,\n index: esIndex,\n data: elasticsearchPublishedData\n })\n );\n }\n try {\n await batchWriteAll({\n table: entity.table,\n items\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 if (esItems.length === 0) {\n return storageEntry;\n }\n\n try {\n await batchWriteAll({\n table: esEntity.table,\n items: esItems\n });\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 storageEntry;\n };\n\n const deleteEntry = async (model: CmsModel, params: CmsEntryStorageOperationsDeleteParams) => {\n const { entry } = params;\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n });\n\n const items = await queryAll<CmsEntry>({\n entity,\n partitionKey,\n options: {\n gte: \" \"\n }\n });\n\n const esItems = await queryAll<CmsEntry>({\n entity: esEntity,\n partitionKey,\n options: {\n gte: \" \"\n }\n });\n\n const deleteItems = items.map(item => {\n return entity.deleteBatch({\n PK: item.PK,\n SK: item.SK\n });\n });\n\n const deleteEsItems = esItems.map(item => {\n return esEntity.deleteBatch({\n PK: item.PK,\n SK: item.SK\n });\n });\n\n try {\n await batchWriteAll({\n table: entity.table,\n items: deleteItems\n });\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete entry records from DynamoDB table.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n\n try {\n await batchWriteAll({\n table: esEntity.table,\n items: deleteEsItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete entry records from DynamoDB Elasticsearch table.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n };\n\n const deleteRevision = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsDeleteRevisionParams\n ) => {\n const { entry, latestEntry, latestStorageEntry } = params;\n\n const partitionKey = createPartitionKey({\n id: entry.id,\n locale: model.locale,\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 items = [\n /**\n * Delete records of given entry revision.\n */\n entity.deleteBatch({\n PK: partitionKey,\n SK: createRevisionSortKey(entry)\n })\n ];\n\n const esItems = [];\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 && entry.id === publishedStorageEntry.id) {\n items.push(\n entity.deleteBatch({\n PK: partitionKey,\n SK: createPublishedSortKey()\n })\n );\n esItems.push(\n entity.deleteBatch({\n PK: partitionKey,\n SK: createPublishedSortKey()\n })\n );\n }\n if (latestEntry && latestStorageEntry) {\n const esEntry = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(latestEntry),\n storageEntry: lodashCloneDeep(latestStorageEntry)\n });\n\n const esLatestData = await getESLatestEntryData(plugins, esEntry);\n /**\n * In the end we need to set the new latest entry\n */\n items.push(\n entity.putBatch({\n ...latestStorageEntry,\n PK: partitionKey,\n SK: createLatestSortKey(),\n TYPE: createLatestType()\n })\n );\n esItems.push(\n esEntity.putBatch({\n PK: partitionKey,\n SK: createLatestSortKey(),\n index,\n data: esLatestData\n })\n );\n }\n\n try {\n await batchWriteAll({\n table: entity.table,\n items\n });\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 latestStorageEntry\n }\n );\n }\n\n if (esItems.length === 0) {\n return;\n }\n\n try {\n await batchWriteAll({\n table: esEntity.table,\n items: esItems\n });\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 latestStorageEntry\n }\n );\n }\n };\n\n const list = async (model: CmsModel, params: CmsEntryStorageOperationsListParams) => {\n const limit = createLimit(params.limit, 50);\n const { index } = configurations.es({\n model\n });\n\n try {\n const result = await elasticsearch.indices.exists({\n index\n });\n if (!result || !result.body) {\n return {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null,\n items: []\n };\n }\n } catch (ex) {\n throw new WebinyError(\n \"Could not determine if Elasticsearch index exists.\",\n \"ELASTICSEARCH_INDEX_CHECK_ERROR\",\n {\n error: ex,\n index\n }\n );\n }\n\n const body = createElasticsearchQueryBody({\n model,\n args: {\n ...params,\n limit\n },\n plugins,\n parentPath: \"values\"\n });\n\n let response: ElasticsearchSearchResponse;\n try {\n response = await elasticsearch.search({\n index,\n body\n });\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"ELASTICSEARCH_ERROR\", {\n error: ex,\n index,\n body\n });\n }\n\n const { hits, total } = response.body.hits;\n const items = extractEntriesFromIndex({\n plugins,\n model,\n entries: hits.map(item => item._source)\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 const cursor = items.length > 0 ? encodeCursor(hits[items.length - 1].sort) || null : null;\n return {\n hasMoreItems,\n totalCount: total.value,\n cursor,\n items\n };\n };\n\n const get = async (model: CmsModel, params: CmsEntryStorageOperationsGetParams) => {\n const { items } = await list(model, {\n ...params,\n limit: 1\n });\n return items.shift() || null;\n };\n\n const publish = async (model: CmsModel, params: CmsEntryStorageOperationsPublishParams) => {\n const { entry, storageEntry } = params;\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 const revisionKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createRevisionSortKey(entry)\n };\n const latestKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createLatestSortKey()\n };\n const publishedKeys = {\n PK: createPartitionKey({\n id: entry.id,\n locale: model.locale,\n tenant: model.tenant\n }),\n SK: createPublishedSortKey()\n };\n\n let latestEsEntry: ElasticsearchDbRecord | null = null;\n try {\n latestEsEntry = await getRecord<ElasticsearchDbRecord>({\n entity: esEntity,\n keys: latestKeys\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read Elasticsearch latest or published data.\",\n ex.code || \"PUBLISH_BATCH_READ\",\n {\n error: ex,\n latestKeys: latestKeys,\n publishedKeys: publishedKeys\n }\n );\n }\n\n const items = [\n entity.putBatch({\n ...storageEntry,\n ...revisionKeys,\n TYPE: createType()\n })\n ];\n const esItems = [];\n\n const { index } = configurations.es({\n model\n });\n\n if (publishedStorageEntry && publishedStorageEntry.id !== entry.id) {\n /**\n * If there is a `published` entry already, we need to set it to `unpublished`. We need to\n * execute two updates: update the previously published entry's status and the published entry record.\n * DynamoDB does not support `batchUpdate` - so here we load the previously published\n * entry's data to update its status within a batch operation. If, hopefully,\n * they introduce a true update batch operation, remove this `read` call.\n */\n const [previouslyPublishedEntry] = await dataLoaders.getRevisionById({\n model,\n ids: [publishedStorageEntry.id]\n });\n\n items.push(\n /**\n * Update currently published entry (unpublish it)\n */\n entity.putBatch({\n ...previouslyPublishedEntry,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED,\n savedOn: entry.savedOn,\n TYPE: createType(),\n PK: createPartitionKey(publishedStorageEntry),\n SK: createRevisionSortKey(publishedStorageEntry)\n })\n );\n }\n /**\n * Update the helper item in DB with the new published entry\n */\n items.push(\n entity.putBatch({\n ...storageEntry,\n ...publishedKeys,\n TYPE: createPublishedType()\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 && latestStorageEntry.id === entry.id) {\n items.push(\n entity.putBatch({\n ...storageEntry,\n ...latestKeys\n })\n );\n }\n /**\n * If we are publishing the latest revision, let's also update the latest revision's status in ES.\n */\n if (latestEsEntry && latestStorageEntry && latestStorageEntry.id === entry.id) {\n /**\n * Need to decompress the data from Elasticsearch DynamoDB table.\n */\n const latestEsEntryDataDecompressed: CmsEntry = (await decompress(\n plugins,\n latestEsEntry.data\n )) as any;\n\n esItems.push(\n esEntity.putBatch({\n index,\n PK: createPartitionKey(latestEsEntryDataDecompressed),\n SK: createLatestSortKey(),\n data: {\n ...latestEsEntryDataDecompressed,\n status: CONTENT_ENTRY_STATUS.PUBLISHED,\n locked: true,\n savedOn: entry.savedOn,\n publishedOn: entry.publishedOn\n }\n })\n );\n }\n\n const preparedEntryData = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n /**\n * Update the published revision entry in ES.\n */\n const esLatestData = await getESPublishedEntryData(plugins, preparedEntryData);\n\n esItems.push(\n esEntity.putBatch({\n ...publishedKeys,\n index,\n data: esLatestData\n })\n );\n\n /**\n * Finally, execute regular table batch.\n */\n try {\n await batchWriteAll({\n table: entity.table,\n items\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 batchWriteAll({\n table: esEntity.table,\n items: esItems\n });\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 storageEntry;\n };\n\n const unpublish = async (model: CmsModel, params: CmsEntryStorageOperationsUnpublishParams) => {\n const { entry, storageEntry } = params;\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 locale: model.locale,\n tenant: model.tenant\n });\n\n const items = [\n entity.deleteBatch({\n PK: partitionKey,\n SK: createPublishedSortKey()\n }),\n entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: createRevisionSortKey(entry),\n TYPE: createType()\n })\n ];\n\n const esItems = [\n esEntity.deleteBatch({\n PK: partitionKey,\n SK: createPublishedSortKey()\n })\n ];\n /**\n * If we are unpublishing the latest revision, let's also update the latest revision entry's status in ES.\n */\n if (latestStorageEntry.id === entry.id) {\n const { index } = configurations.es({\n model\n });\n\n const preparedEntryData = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n const esLatestData = await getESLatestEntryData(plugins, preparedEntryData);\n esItems.push(\n esEntity.putBatch({\n PK: partitionKey,\n SK: createLatestSortKey(),\n index,\n data: esLatestData\n })\n );\n }\n\n /**\n * Finally, execute regular table batch.\n */\n try {\n await batchWriteAll({\n table: entity.table,\n items\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 batchWriteAll({\n table: esEntity.table,\n items: esItems\n });\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 storageEntry;\n };\n\n const requestReview = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsRequestReviewParams\n ) => {\n const { entry, storageEntry } = params;\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 locale: model.locale,\n tenant: model.tenant\n });\n\n /**\n * If we updated the latest version, then make sure the changes are propagated to ES too.\n */\n let esLatestData = null;\n const { index } = configurations.es({\n model\n });\n if (latestStorageEntry && latestStorageEntry.id === entry.id) {\n const preparedEntryData = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n esLatestData = await getESLatestEntryData(plugins, preparedEntryData);\n }\n\n try {\n await entity.put({\n ...storageEntry,\n PK: partitionKey,\n SK: createRevisionSortKey(entry),\n TYPE: createType()\n });\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not store request review entry record into DynamoDB table.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n entry,\n storageEntry,\n latestStorageEntry\n }\n );\n }\n /**\n * No need to proceed further if nothing to put into Elasticsearch.\n */\n if (!esLatestData) {\n return storageEntry;\n }\n\n try {\n await esEntity.put({\n PK: partitionKey,\n SK: createLatestSortKey(),\n index,\n data: esLatestData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not store request review entry record into DynamoDB Elasticsearch table.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n entry,\n storageEntry,\n latestStorageEntry\n }\n );\n }\n return storageEntry;\n };\n\n const requestChanges = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsRequestChangesParams\n ) => {\n const { entry, storageEntry } = params;\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 locale: model.locale,\n tenant: model.tenant\n });\n\n const items = [\n entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: createRevisionSortKey(entry),\n TYPE: createType()\n })\n ];\n /**\n * If we updated the latest version, then make sure the changes are propagated to ES too.\n */\n const { index } = configurations.es({\n model\n });\n let esLatestData = null;\n if (latestStorageEntry && latestStorageEntry.id === entry.id) {\n items.push(\n entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: createLatestSortKey(),\n TYPE: createLatestType()\n })\n );\n\n const preparedEntryData = prepareEntryToIndex({\n plugins,\n model,\n entry: lodashCloneDeep(entry),\n storageEntry: lodashCloneDeep(storageEntry)\n });\n\n esLatestData = await getESLatestEntryData(plugins, preparedEntryData);\n }\n\n try {\n await batchWriteAll({\n table: entity.table,\n items\n });\n dataLoaders.clearAll({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not store request changes entry record into DynamoDB table.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n entry,\n latestStorageEntry\n }\n );\n }\n /**\n * No need to proceed further if nothing to put into Elasticsearch.\n */\n if (!esLatestData) {\n return storageEntry;\n }\n\n try {\n await esEntity.put({\n PK: partitionKey,\n SK: createLatestSortKey(),\n index,\n data: esLatestData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not store request changes entry record into DynamoDB Elasticsearch table.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n entry,\n latestStorageEntry\n }\n );\n }\n return storageEntry;\n };\n\n const getLatestRevisionByEntryId = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestRevisionParams\n ) => {\n const result = await dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: [params.id]\n });\n return result.shift() || null;\n };\n const getPublishedRevisionByEntryId = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestRevisionParams\n ) => {\n const result = await dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: [params.id]\n });\n return result.shift() || null;\n };\n\n const getRevisionById = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionParams\n ) => {\n const result = await dataLoaders.getRevisionById({\n model,\n ids: [params.id]\n });\n return result.shift() || null;\n };\n\n const getRevisions = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionsParams\n ) => {\n return await dataLoaders.getAllEntryRevisions({\n model,\n ids: [params.id]\n });\n };\n\n const getByIds = async (model: CmsModel, params: CmsEntryStorageOperationsGetByIdsParams) => {\n return dataLoaders.getRevisionById({\n model,\n ids: params.ids\n });\n };\n\n const getLatestByIds = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestByIdsParams\n ) => {\n return dataLoaders.getLatestRevisionByEntryId({\n model,\n ids: params.ids\n });\n };\n\n const getPublishedByIds = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedByIdsParams\n ) => {\n return dataLoaders.getPublishedRevisionByEntryId({\n model,\n ids: params.ids\n });\n };\n\n const getPreviousRevision = async (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPreviousRevisionParams\n ) => {\n const { tenant, locale } = model;\n const { entryId, version } = params;\n const queryParams: QueryOneParams = {\n entity,\n partitionKey: createPartitionKey({\n tenant,\n locale,\n id: entryId\n }),\n options: {\n lt: `REV#${zeroPad(version)}`,\n /**\n * We need to have extra checks because DynamoDB will return published or latest record if there is no REV# record.\n */\n filters: [\n {\n attr: \"TYPE\",\n eq: createType()\n },\n {\n attr: \"version\",\n lt: version\n }\n ],\n reverse: true\n }\n };\n\n try {\n const result = await queryOne<CmsEntry>(queryParams);\n\n return cleanupItem(entity, result);\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: queryParams.partitionKey,\n options: queryParams.options,\n model\n }\n );\n }\n };\n\n return {\n create,\n createRevisionFrom,\n update,\n delete: deleteEntry,\n deleteRevision,\n get,\n publish,\n unpublish,\n requestReview,\n requestChanges,\n list,\n getLatestRevisionByEntryId,\n getPublishedRevisionByEntryId,\n getRevisionById,\n getRevisions,\n getByIds,\n getLatestByIds,\n getPublishedByIds,\n getPreviousRevision\n };\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms-ddb-es",
3
- "version": "5.26.0-beta.2",
3
+ "version": "5.27.0-beta.0",
4
4
  "main": "index.js",
5
5
  "keywords": [
6
6
  "@webiny/api-headless-cms",
@@ -23,15 +23,15 @@
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
25
  "@babel/runtime": "7.16.7",
26
- "@webiny/api-elasticsearch": "5.26.0-beta.2",
27
- "@webiny/api-headless-cms": "5.26.0-beta.2",
28
- "@webiny/db-dynamodb": "5.26.0-beta.2",
29
- "@webiny/error": "5.26.0-beta.2",
30
- "@webiny/handler": "5.26.0-beta.2",
31
- "@webiny/handler-aws": "5.26.0-beta.2",
32
- "@webiny/handler-db": "5.26.0-beta.2",
33
- "@webiny/plugins": "5.26.0-beta.2",
34
- "@webiny/utils": "5.26.0-beta.2",
26
+ "@webiny/api-elasticsearch": "5.27.0-beta.0",
27
+ "@webiny/api-headless-cms": "5.27.0-beta.0",
28
+ "@webiny/db-dynamodb": "5.27.0-beta.0",
29
+ "@webiny/error": "5.27.0-beta.0",
30
+ "@webiny/handler": "5.27.0-beta.0",
31
+ "@webiny/handler-aws": "5.27.0-beta.0",
32
+ "@webiny/handler-db": "5.27.0-beta.0",
33
+ "@webiny/plugins": "5.27.0-beta.0",
34
+ "@webiny/utils": "5.27.0-beta.0",
35
35
  "dataloader": "2.0.0",
36
36
  "dynamodb-toolbox": "0.3.5",
37
37
  "jsonpack": "1.1.5",
@@ -44,9 +44,9 @@
44
44
  "@babel/preset-flow": "^7.16.0",
45
45
  "@elastic/elasticsearch": "7.12.0",
46
46
  "@types/jsonpack": "^1.1.0",
47
- "@webiny/api-dynamodb-to-elasticsearch": "^5.26.0-beta.2",
48
- "@webiny/cli": "^5.26.0-beta.2",
49
- "@webiny/project-utils": "^5.26.0-beta.2",
47
+ "@webiny/api-dynamodb-to-elasticsearch": "^5.27.0-beta.0",
48
+ "@webiny/cli": "^5.27.0-beta.0",
49
+ "@webiny/project-utils": "^5.27.0-beta.0",
50
50
  "jest": "^26.6.3",
51
51
  "jest-dynalite": "^3.2.0",
52
52
  "jest-environment-node": "^26.6.2",
@@ -65,5 +65,5 @@
65
65
  "build": "yarn webiny run build",
66
66
  "watch": "yarn webiny run watch"
67
67
  },
68
- "gitHead": "2bf6b56823a2ccb4e95ad747564d2a240d5043ab"
68
+ "gitHead": "9e557dd294ae37cf84f17e0e8158c2ed16e2d415"
69
69
  }