@webiny/api-headless-cms-ddb-es 5.26.0 → 5.27.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.
- package/operations/entry/index.js +201 -38
- package/operations/entry/index.js.map +1 -1
- package/package.json +14 -14
|
@@ -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
|
-
|
|
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)(
|
|
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)(
|
|
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
|
|
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),
|
|
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
|
-
|
|
148
|
-
|
|
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:
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|
|
312
|
-
|
|
313
|
-
|
|
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
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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.
|
|
3
|
+
"version": "5.27.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.
|
|
27
|
-
"@webiny/api-headless-cms": "5.
|
|
28
|
-
"@webiny/db-dynamodb": "5.
|
|
29
|
-
"@webiny/error": "5.
|
|
30
|
-
"@webiny/handler": "5.
|
|
31
|
-
"@webiny/handler-aws": "5.
|
|
32
|
-
"@webiny/handler-db": "5.
|
|
33
|
-
"@webiny/plugins": "5.
|
|
34
|
-
"@webiny/utils": "5.
|
|
26
|
+
"@webiny/api-elasticsearch": "5.27.0",
|
|
27
|
+
"@webiny/api-headless-cms": "5.27.0",
|
|
28
|
+
"@webiny/db-dynamodb": "5.27.0",
|
|
29
|
+
"@webiny/error": "5.27.0",
|
|
30
|
+
"@webiny/handler": "5.27.0",
|
|
31
|
+
"@webiny/handler-aws": "5.27.0",
|
|
32
|
+
"@webiny/handler-db": "5.27.0",
|
|
33
|
+
"@webiny/plugins": "5.27.0",
|
|
34
|
+
"@webiny/utils": "5.27.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.
|
|
48
|
-
"@webiny/cli": "^5.
|
|
49
|
-
"@webiny/project-utils": "^5.
|
|
47
|
+
"@webiny/api-dynamodb-to-elasticsearch": "^5.27.0",
|
|
48
|
+
"@webiny/cli": "^5.27.0",
|
|
49
|
+
"@webiny/project-utils": "^5.27.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": "
|
|
68
|
+
"gitHead": "0f2b0b65639d2e1a79cf9189c8fe5cea2c32d302"
|
|
69
69
|
}
|