@webiny/api-headless-cms-ddb 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2

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.
Files changed (152) hide show
  1. package/abstractions/CmsDdbDataLoaders.d.ts +5 -0
  2. package/abstractions/CmsDdbDataLoaders.js +5 -0
  3. package/abstractions/CmsDdbDataLoaders.js.map +1 -0
  4. package/abstractions/CmsDdbEntryEntity.d.ts +5 -0
  5. package/abstractions/CmsDdbEntryEntity.js +5 -0
  6. package/abstractions/CmsDdbEntryEntity.js.map +1 -0
  7. package/abstractions/CmsDdbGroupEntity.d.ts +5 -0
  8. package/abstractions/CmsDdbGroupEntity.js +5 -0
  9. package/abstractions/CmsDdbGroupEntity.js.map +1 -0
  10. package/abstractions/CmsDdbModelEntity.d.ts +5 -0
  11. package/abstractions/CmsDdbModelEntity.js +5 -0
  12. package/abstractions/CmsDdbModelEntity.js.map +1 -0
  13. package/abstractions/CmsDdbTable.d.ts +5 -0
  14. package/abstractions/CmsDdbTable.js +5 -0
  15. package/abstractions/CmsDdbTable.js.map +1 -0
  16. package/index.d.ts +10 -2
  17. package/index.js +30 -74
  18. package/index.js.map +1 -1
  19. package/operations/entry/DdbCreateEntry.d.ts +16 -0
  20. package/operations/entry/DdbCreateEntry.js +77 -0
  21. package/operations/entry/DdbCreateEntry.js.map +1 -0
  22. package/operations/entry/DdbCreateEntryRevisionFrom.d.ts +16 -0
  23. package/operations/entry/DdbCreateEntryRevisionFrom.js +85 -0
  24. package/operations/entry/DdbCreateEntryRevisionFrom.js.map +1 -0
  25. package/operations/entry/DdbDeleteEntry.d.ts +16 -0
  26. package/operations/entry/DdbDeleteEntry.js +65 -0
  27. package/operations/entry/DdbDeleteEntry.js.map +1 -0
  28. package/operations/entry/DdbDeleteEntryRevision.d.ts +17 -0
  29. package/operations/entry/DdbDeleteEntryRevision.js +91 -0
  30. package/operations/entry/DdbDeleteEntryRevision.js.map +1 -0
  31. package/operations/entry/DdbDeleteMultipleEntries.d.ts +16 -0
  32. package/operations/entry/DdbDeleteMultipleEntries.js +59 -0
  33. package/operations/entry/DdbDeleteMultipleEntries.js.map +1 -0
  34. package/operations/entry/DdbGetEntriesByIds.d.ts +14 -0
  35. package/operations/entry/DdbGetEntriesByIds.js +31 -0
  36. package/operations/entry/DdbGetEntriesByIds.js.map +1 -0
  37. package/operations/entry/DdbGetEntry.d.ts +14 -0
  38. package/operations/entry/DdbGetEntry.js +27 -0
  39. package/operations/entry/DdbGetEntry.js.map +1 -0
  40. package/operations/entry/DdbGetLatestEntriesByIds.d.ts +14 -0
  41. package/operations/entry/DdbGetLatestEntriesByIds.js +31 -0
  42. package/operations/entry/DdbGetLatestEntriesByIds.js.map +1 -0
  43. package/operations/entry/DdbGetLatestRevisionByEntryId.d.ts +14 -0
  44. package/operations/entry/DdbGetLatestRevisionByEntryId.js +35 -0
  45. package/operations/entry/DdbGetLatestRevisionByEntryId.js.map +1 -0
  46. package/operations/entry/DdbGetPreviousRevision.d.ts +14 -0
  47. package/operations/entry/DdbGetPreviousRevision.js +53 -0
  48. package/operations/entry/DdbGetPreviousRevision.js.map +1 -0
  49. package/operations/entry/DdbGetPublishedEntriesByIds.d.ts +14 -0
  50. package/operations/entry/DdbGetPublishedEntriesByIds.js +31 -0
  51. package/operations/entry/DdbGetPublishedEntriesByIds.js.map +1 -0
  52. package/operations/entry/DdbGetPublishedRevisionByEntryId.d.ts +14 -0
  53. package/operations/entry/DdbGetPublishedRevisionByEntryId.js +35 -0
  54. package/operations/entry/DdbGetPublishedRevisionByEntryId.js.map +1 -0
  55. package/operations/entry/DdbGetRevisionById.d.ts +14 -0
  56. package/operations/entry/DdbGetRevisionById.js +34 -0
  57. package/operations/entry/DdbGetRevisionById.js.map +1 -0
  58. package/operations/entry/DdbGetRevisions.d.ts +14 -0
  59. package/operations/entry/DdbGetRevisions.js +33 -0
  60. package/operations/entry/DdbGetRevisions.js.map +1 -0
  61. package/operations/entry/DdbGetUniqueFieldValues.d.ts +12 -0
  62. package/operations/entry/DdbGetUniqueFieldValues.js +31 -0
  63. package/operations/entry/DdbGetUniqueFieldValues.js.map +1 -0
  64. package/operations/entry/DdbListEntries.d.ts +30 -0
  65. package/operations/entry/DdbListEntries.js +133 -0
  66. package/operations/entry/DdbListEntries.js.map +1 -0
  67. package/operations/entry/DdbMoveEntry.d.ts +16 -0
  68. package/operations/entry/DdbMoveEntry.js +63 -0
  69. package/operations/entry/DdbMoveEntry.js.map +1 -0
  70. package/operations/entry/DdbMoveToBin.d.ts +16 -0
  71. package/operations/entry/DdbMoveToBin.js +77 -0
  72. package/operations/entry/DdbMoveToBin.js.map +1 -0
  73. package/operations/entry/DdbPublishEntry.d.ts +18 -0
  74. package/operations/entry/DdbPublishEntry.js +162 -0
  75. package/operations/entry/DdbPublishEntry.js.map +1 -0
  76. package/operations/entry/DdbRestoreFromBin.d.ts +16 -0
  77. package/operations/entry/DdbRestoreFromBin.js +78 -0
  78. package/operations/entry/DdbRestoreFromBin.js.map +1 -0
  79. package/operations/entry/DdbUnpublishEntry.d.ts +17 -0
  80. package/operations/entry/DdbUnpublishEntry.js +112 -0
  81. package/operations/entry/DdbUnpublishEntry.js.map +1 -0
  82. package/operations/entry/DdbUpdateEntry.d.ts +17 -0
  83. package/operations/entry/DdbUpdateEntry.js +105 -0
  84. package/operations/entry/DdbUpdateEntry.js.map +1 -0
  85. package/operations/entry/dataLoaders.d.ts +7 -6
  86. package/operations/entry/dataLoaders.js +11 -3
  87. package/operations/entry/dataLoaders.js.map +1 -1
  88. package/operations/entry/feature.d.ts +4 -0
  89. package/operations/entry/feature.js +55 -0
  90. package/operations/entry/feature.js.map +1 -0
  91. package/operations/entry/storageEntryUtils.d.ts +8 -0
  92. package/operations/entry/storageEntryUtils.js +25 -0
  93. package/operations/entry/storageEntryUtils.js.map +1 -0
  94. package/operations/group/DdbCreateGroup.d.ts +12 -0
  95. package/operations/group/DdbCreateGroup.js +35 -0
  96. package/operations/group/DdbCreateGroup.js.map +1 -0
  97. package/operations/group/DdbDeleteGroup.d.ts +12 -0
  98. package/operations/group/DdbDeleteGroup.js +31 -0
  99. package/operations/group/DdbDeleteGroup.js.map +1 -0
  100. package/operations/group/DdbGetGroup.d.ts +12 -0
  101. package/operations/group/DdbGetGroup.js +31 -0
  102. package/operations/group/DdbGetGroup.js.map +1 -0
  103. package/operations/group/DdbListGroups.d.ts +14 -0
  104. package/operations/group/DdbListGroups.js +52 -0
  105. package/operations/group/DdbListGroups.js.map +1 -0
  106. package/operations/group/DdbUpdateGroup.d.ts +12 -0
  107. package/operations/group/DdbUpdateGroup.js +35 -0
  108. package/operations/group/DdbUpdateGroup.js.map +1 -0
  109. package/operations/group/feature.d.ts +4 -0
  110. package/operations/group/feature.js +19 -0
  111. package/operations/group/feature.js.map +1 -0
  112. package/operations/group/keys.d.ts +15 -0
  113. package/operations/group/keys.js +17 -0
  114. package/operations/group/keys.js.map +1 -0
  115. package/operations/model/DdbCreateModel.d.ts +12 -0
  116. package/operations/model/DdbCreateModel.js +37 -0
  117. package/operations/model/DdbCreateModel.js.map +1 -0
  118. package/operations/model/DdbDeleteModel.d.ts +12 -0
  119. package/operations/model/DdbDeleteModel.js +31 -0
  120. package/operations/model/DdbDeleteModel.js.map +1 -0
  121. package/operations/model/DdbGetModel.d.ts +12 -0
  122. package/operations/model/DdbGetModel.js +30 -0
  123. package/operations/model/DdbGetModel.js.map +1 -0
  124. package/operations/model/DdbListModels.d.ts +12 -0
  125. package/operations/model/DdbListModels.js +36 -0
  126. package/operations/model/DdbListModels.js.map +1 -0
  127. package/operations/model/DdbUpdateModel.d.ts +12 -0
  128. package/operations/model/DdbUpdateModel.js +36 -0
  129. package/operations/model/DdbUpdateModel.js.map +1 -0
  130. package/operations/model/feature.d.ts +4 -0
  131. package/operations/model/feature.js +19 -0
  132. package/operations/model/feature.js.map +1 -0
  133. package/operations/model/keys.d.ts +15 -0
  134. package/operations/model/keys.js +16 -0
  135. package/operations/model/keys.js.map +1 -0
  136. package/package.json +15 -17
  137. package/types.d.ts +9 -26
  138. package/types.js.map +1 -1
  139. package/dynamoDb/index.d.ts +0 -2
  140. package/dynamoDb/index.js +0 -9
  141. package/dynamoDb/index.js.map +0 -1
  142. package/operations/entry/index.d.ts +0 -9
  143. package/operations/entry/index.js +0 -937
  144. package/operations/entry/index.js.map +0 -1
  145. package/operations/group/index.d.ts +0 -8
  146. package/operations/group/index.js +0 -121
  147. package/operations/group/index.js.map +0 -1
  148. package/operations/model/index.d.ts +0 -7
  149. package/operations/model/index.js +0 -106
  150. package/operations/model/index.js.map +0 -1
  151. package/plugins/index.d.ts +0 -2
  152. package/plugins/index.js +0 -1
@@ -1,937 +0,0 @@
1
- import error from "@webiny/error";
2
- import { DataLoadersHandler } from "./dataLoaders.js";
3
- import { CONTENT_ENTRY_STATUS } from "@webiny/api-headless-cms/types/index.js";
4
- import { createEntryLatestKeys, createEntryPublishedKeys, createEntryRevisionKeys, createGSIPartitionKey, createPartitionKey, createPublishedSortKey, createRevisionSortKey } from "./keys.js";
5
- import { decodeCursor, encodeCursor } from "@webiny/utils";
6
- import { ValueFilterRegistry } from "@webiny/db-utils";
7
- import { aggregateUniqueFieldValues, createFields, createStorageModelAccessor, createStorageTransformCallable, filter, sort } from "@webiny/api-headless-cms-storage";
8
- import { isDeletedEntryMetaField, isEntryLevelEntryMetaField, isRestoredEntryMetaField, pickEntryMetaFields } from "@webiny/api-headless-cms/constants.js";
9
- import { StorageTransformRegistry } from "@webiny/api-headless-cms/exports/api/cms/storage.js";
10
- const convertToStorageEntry = (params)=>{
11
- const { model, storageEntry } = params;
12
- const values = model.convertValueKeyToStorage({
13
- fields: model.fields,
14
- values: storageEntry.values
15
- });
16
- return {
17
- ...storageEntry,
18
- values
19
- };
20
- };
21
- const convertFromStorageEntry = (params)=>{
22
- const { model, storageEntry } = params;
23
- const values = model.convertValueKeyFromStorage({
24
- fields: model.fields,
25
- values: storageEntry.values
26
- });
27
- return {
28
- ...storageEntry,
29
- values
30
- };
31
- };
32
- const MAX_LIST_LIMIT = 1000000;
33
- const createEntriesStorageOperations = (params)=>{
34
- const { entity, container, plugins } = params;
35
- const storageTransformRegistry = container.resolve(StorageTransformRegistry);
36
- const { getModel: getStorageOperationsModel } = createStorageModelAccessor(plugins);
37
- const dataLoaders = new DataLoadersHandler({
38
- entity
39
- });
40
- const create = async (initialModel, params)=>{
41
- const { entry, storageEntry: initialStorageEntry } = params;
42
- const model = getStorageOperationsModel(initialModel);
43
- const isPublished = "published" === entry.status;
44
- const locked = isPublished ? true : entry.locked;
45
- const storageEntry = convertToStorageEntry({
46
- model,
47
- storageEntry: initialStorageEntry
48
- });
49
- const storageEntryRevisionKeys = createEntryRevisionKeys(entry);
50
- const storageEntryLatestKeys = createEntryLatestKeys(entry);
51
- const entityBatch = entity.createEntityWriter({
52
- put: [
53
- {
54
- ...storageEntryRevisionKeys,
55
- data: {
56
- ...storageEntry,
57
- locked
58
- }
59
- },
60
- {
61
- ...storageEntryLatestKeys,
62
- data: {
63
- ...storageEntry,
64
- locked
65
- }
66
- }
67
- ]
68
- });
69
- if (isPublished) {
70
- const storageEntryPublishedKeys = createEntryPublishedKeys(storageEntry);
71
- entityBatch.put({
72
- ...storageEntryPublishedKeys,
73
- data: {
74
- ...storageEntry,
75
- locked
76
- }
77
- });
78
- }
79
- try {
80
- await entityBatch.execute();
81
- dataLoaders.clearAll({
82
- tenant: entry.tenant
83
- });
84
- } catch (ex) {
85
- throw new error(ex.message || "Could not insert data into the DynamoDB.", ex.code || "CREATE_ENTRY_ERROR", {
86
- error: ex,
87
- entry
88
- });
89
- }
90
- return initialStorageEntry;
91
- };
92
- const createRevisionFrom = async (initialModel, params)=>{
93
- const { entry, storageEntry: initialStorageEntry } = params;
94
- const model = getStorageOperationsModel(initialModel);
95
- const storageEntry = convertToStorageEntry({
96
- storageEntry: initialStorageEntry,
97
- model
98
- });
99
- const entityBatch = entity.createEntityWriter({
100
- put: [
101
- {
102
- ...createEntryRevisionKeys(storageEntry),
103
- data: {
104
- ...storageEntry
105
- }
106
- },
107
- {
108
- ...createEntryLatestKeys(storageEntry),
109
- data: {
110
- ...storageEntry
111
- }
112
- }
113
- ]
114
- });
115
- const isPublished = "published" === entry.status;
116
- if (isPublished) {
117
- entityBatch.put({
118
- ...createEntryPublishedKeys(storageEntry),
119
- data: {
120
- ...storageEntry
121
- }
122
- });
123
- const [publishedRevisionStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
124
- model,
125
- ids: [
126
- entry.id
127
- ]
128
- });
129
- if (publishedRevisionStorageEntry) entityBatch.put({
130
- ...createEntryRevisionKeys(publishedRevisionStorageEntry),
131
- data: {
132
- ...publishedRevisionStorageEntry,
133
- status: CONTENT_ENTRY_STATUS.UNPUBLISHED
134
- }
135
- });
136
- }
137
- try {
138
- await entityBatch.execute();
139
- dataLoaders.clearAll({
140
- tenant: entry.tenant
141
- });
142
- } catch (ex) {
143
- throw new error(ex.message || "Could not create revision from given entry.", ex.code || "CREATE_REVISION_ERROR", {
144
- error: ex,
145
- entry,
146
- storageEntry
147
- });
148
- }
149
- return initialStorageEntry;
150
- };
151
- const update = async (initialModel, params)=>{
152
- const { entry, storageEntry: initialStorageEntry } = params;
153
- const model = getStorageOperationsModel(initialModel);
154
- const isPublished = "published" === entry.status;
155
- const locked = isPublished ? true : entry.locked;
156
- const storageEntry = convertToStorageEntry({
157
- model,
158
- storageEntry: initialStorageEntry
159
- });
160
- const entityBatch = entity.createEntityWriter({
161
- put: [
162
- {
163
- ...createEntryRevisionKeys(storageEntry),
164
- data: {
165
- ...storageEntry,
166
- locked
167
- }
168
- }
169
- ]
170
- });
171
- if (isPublished) entityBatch.put({
172
- ...createEntryPublishedKeys(storageEntry),
173
- data: {
174
- ...storageEntry,
175
- locked
176
- }
177
- });
178
- const latestStorageEntry = await getLatestRevisionByEntryId(model, entry);
179
- if (latestStorageEntry) {
180
- const updatingLatestRevision = latestStorageEntry.id === entry.id;
181
- if (updatingLatestRevision) entityBatch.put({
182
- ...createEntryLatestKeys(storageEntry),
183
- data: {
184
- ...storageEntry,
185
- locked
186
- }
187
- });
188
- else {
189
- const updatedEntryLevelMetaFields = pickEntryMetaFields(entry, isEntryLevelEntryMetaField);
190
- entityBatch.put({
191
- ...createEntryRevisionKeys(latestStorageEntry),
192
- data: {
193
- ...latestStorageEntry,
194
- ...updatedEntryLevelMetaFields
195
- }
196
- });
197
- entityBatch.put({
198
- ...createEntryLatestKeys(latestStorageEntry),
199
- data: {
200
- ...latestStorageEntry,
201
- ...updatedEntryLevelMetaFields
202
- }
203
- });
204
- }
205
- }
206
- try {
207
- await entityBatch.execute();
208
- dataLoaders.clearAll({
209
- tenant: entry.tenant
210
- });
211
- return initialStorageEntry;
212
- } catch (ex) {
213
- throw new error(ex.message || "Could not update entry.", ex.code || "UPDATE_ERROR", {
214
- error: ex,
215
- entry,
216
- latestStorageEntry
217
- });
218
- }
219
- };
220
- const updateRevision = async (initialModel, params)=>{
221
- const { entry, storageEntry: initialStorageEntry } = params;
222
- const model = getStorageOperationsModel(initialModel);
223
- const storageEntry = convertToStorageEntry({
224
- model,
225
- storageEntry: initialStorageEntry
226
- });
227
- const entityBatch = entity.createEntityWriter({
228
- put: [
229
- {
230
- ...createEntryRevisionKeys(storageEntry),
231
- data: storageEntry
232
- }
233
- ]
234
- });
235
- try {
236
- await entityBatch.execute();
237
- dataLoaders.clearAll({
238
- tenant: entry.tenant
239
- });
240
- return initialStorageEntry;
241
- } catch (ex) {
242
- throw new error(ex.message || "Could not update revision.", ex.code || "UPDATE_REVISION_ERROR", {
243
- error: ex,
244
- entry
245
- });
246
- }
247
- };
248
- const move = async (initialModel, id, folderId)=>{
249
- const model = getStorageOperationsModel(initialModel);
250
- const partitionKey = createPartitionKey({
251
- id,
252
- tenant: model.tenant
253
- });
254
- const records = await entity.queryAll({
255
- partitionKey,
256
- options: {
257
- gte: " "
258
- }
259
- });
260
- const entityBatch = entity.createEntityWriter({
261
- put: records.map((item)=>({
262
- ...item,
263
- data: {
264
- ...item.data,
265
- location: {
266
- ...item.data.location,
267
- folderId
268
- }
269
- }
270
- }))
271
- });
272
- try {
273
- await entityBatch.execute();
274
- } catch (ex) {
275
- throw error.from(ex, {
276
- message: "Could not move records to a new folder.",
277
- data: {
278
- id,
279
- folderId
280
- }
281
- });
282
- }
283
- };
284
- const moveToBin = async (initialModel, params)=>{
285
- const { entry, storageEntry: initialStorageEntry } = params;
286
- const model = getStorageOperationsModel(initialModel);
287
- let records = [];
288
- try {
289
- records = await entity.queryAll({
290
- partitionKey: createPartitionKey({
291
- id: entry.id,
292
- tenant: model.tenant
293
- }),
294
- options: {
295
- gte: " "
296
- }
297
- });
298
- } catch (ex) {
299
- throw new error(ex.message || "Could not load all records.", ex.code || "LOAD_ALL_RECORDS_ERROR", {
300
- error: ex,
301
- id: entry.id
302
- });
303
- }
304
- if (0 === records.length) return;
305
- const storageEntry = convertToStorageEntry({
306
- model,
307
- storageEntry: initialStorageEntry
308
- });
309
- const updatedDeletedMetaFields = pickEntryMetaFields(storageEntry, isDeletedEntryMetaField);
310
- const entityBatch = entity.createEntityWriter({
311
- put: records.map((record)=>({
312
- ...record,
313
- data: {
314
- ...record.data,
315
- ...updatedDeletedMetaFields,
316
- wbyDeleted: storageEntry.wbyDeleted,
317
- location: storageEntry.location,
318
- binOriginalFolderId: storageEntry.binOriginalFolderId
319
- }
320
- }))
321
- });
322
- try {
323
- await entityBatch.execute();
324
- dataLoaders.clearAll({
325
- tenant: entry.tenant
326
- });
327
- } catch (ex) {
328
- throw new error(ex.message || "Could not move the entry to the bin.", ex.code || "MOVE_ENTRY_TO_BIN_ERROR", {
329
- error: ex,
330
- entry,
331
- storageEntry
332
- });
333
- }
334
- };
335
- const deleteEntry = async (initialModel, params)=>{
336
- const { entry } = params;
337
- const id = entry.id || entry.entryId;
338
- const model = getStorageOperationsModel(initialModel);
339
- const partitionKey = createPartitionKey({
340
- id,
341
- tenant: model.tenant
342
- });
343
- let records = [];
344
- try {
345
- records = await entity.queryAll({
346
- partitionKey,
347
- options: {
348
- gte: " "
349
- }
350
- });
351
- } catch (ex) {
352
- throw new error(ex.message || "Could not load all records.", ex.code || "LOAD_ALL_RECORDS_ERROR", {
353
- error: ex,
354
- id
355
- });
356
- }
357
- const entityBatch = entity.createEntityWriter({
358
- delete: records.map((item)=>({
359
- PK: item.PK,
360
- SK: item.SK
361
- }))
362
- });
363
- try {
364
- await entityBatch.execute();
365
- dataLoaders.clearAll({
366
- tenant: entry.tenant
367
- });
368
- } catch (ex) {
369
- throw new error(ex.message || "Could not delete the entry.", ex.code || "DELETE_ENTRY_ERROR", {
370
- error: ex,
371
- partitionKey,
372
- id
373
- });
374
- }
375
- };
376
- const restoreFromBin = async (initialModel, params)=>{
377
- const { entry, storageEntry: initialStorageEntry } = params;
378
- const model = getStorageOperationsModel(initialModel);
379
- let records = [];
380
- try {
381
- records = await entity.queryAll({
382
- partitionKey: createPartitionKey({
383
- id: entry.id,
384
- tenant: model.tenant
385
- }),
386
- options: {
387
- gte: " "
388
- }
389
- });
390
- } catch (ex) {
391
- throw new error(ex.message || "Could not load all records.", ex.code || "LOAD_ALL_RECORDS_ERROR", {
392
- error: ex,
393
- id: entry.id
394
- });
395
- }
396
- if (0 === records.length) return initialStorageEntry;
397
- const storageEntry = convertToStorageEntry({
398
- model,
399
- storageEntry: initialStorageEntry
400
- });
401
- const updatedRestoredMetaFields = pickEntryMetaFields(storageEntry, isRestoredEntryMetaField);
402
- const entityBatch = entity.createEntityWriter({
403
- put: records.map((record)=>({
404
- ...record,
405
- data: {
406
- ...record.data,
407
- ...updatedRestoredMetaFields,
408
- wbyDeleted: storageEntry.wbyDeleted,
409
- location: storageEntry.location,
410
- binOriginalFolderId: storageEntry.binOriginalFolderId
411
- }
412
- }))
413
- });
414
- try {
415
- await entityBatch.execute();
416
- dataLoaders.clearAll({
417
- tenant: entry.tenant
418
- });
419
- return initialStorageEntry;
420
- } catch (ex) {
421
- throw new error(ex.message || "Could not restore the entry from the bin.", ex.code || "RESTORE_ENTRY_ERROR", {
422
- error: ex,
423
- entry,
424
- storageEntry
425
- });
426
- }
427
- };
428
- const deleteRevision = async (initialModel, params)=>{
429
- const { entry, latestEntry, latestStorageEntry: initialLatestStorageEntry } = params;
430
- const model = getStorageOperationsModel(initialModel);
431
- const partitionKey = createPartitionKey({
432
- id: entry.id,
433
- tenant: model.tenant
434
- });
435
- const entityBatch = entity.createEntityWriter({
436
- delete: [
437
- {
438
- PK: partitionKey,
439
- SK: createRevisionSortKey(entry)
440
- }
441
- ]
442
- });
443
- const publishedStorageEntry = await getPublishedRevisionByEntryId(model, entry);
444
- if (publishedStorageEntry && entry.id === publishedStorageEntry.id) entityBatch.delete({
445
- PK: partitionKey,
446
- SK: createPublishedSortKey()
447
- });
448
- if (initialLatestStorageEntry) {
449
- const latestStorageEntry = convertToStorageEntry({
450
- storageEntry: initialLatestStorageEntry,
451
- model
452
- });
453
- entityBatch.put({
454
- ...createEntryLatestKeys(latestStorageEntry),
455
- data: {
456
- ...latestStorageEntry
457
- }
458
- });
459
- entityBatch.put({
460
- ...createEntryRevisionKeys(latestStorageEntry),
461
- data: {
462
- ...latestStorageEntry
463
- }
464
- });
465
- }
466
- try {
467
- await entityBatch.execute();
468
- dataLoaders.clearAll({
469
- tenant: entry.tenant
470
- });
471
- } catch (ex) {
472
- throw new error(ex.message, ex.code, {
473
- error: ex,
474
- entry,
475
- latestEntry
476
- });
477
- }
478
- };
479
- const deleteMultipleEntries = async (initialModel, params)=>{
480
- const { entries } = params;
481
- const model = getStorageOperationsModel(initialModel);
482
- const revisions = await dataLoaders.getAllEntryRevisions({
483
- model,
484
- ids: entries
485
- });
486
- const entityBatch = entity.createEntityWriter();
487
- for (const id of entries){
488
- const partitionKey = createPartitionKey({
489
- id,
490
- tenant: model.tenant
491
- });
492
- entityBatch.delete({
493
- PK: partitionKey,
494
- SK: "L"
495
- });
496
- entityBatch.delete({
497
- PK: partitionKey,
498
- SK: "P"
499
- });
500
- }
501
- for (const revision of revisions)entityBatch.delete({
502
- PK: createPartitionKey({
503
- id: revision.id,
504
- tenant: model.tenant
505
- }),
506
- SK: createRevisionSortKey({
507
- version: revision.version
508
- })
509
- });
510
- await entityBatch.execute();
511
- };
512
- const getLatestRevisionByEntryId = async (initialModel, params)=>{
513
- const model = getStorageOperationsModel(initialModel);
514
- const items = await dataLoaders.getLatestRevisionByEntryId({
515
- model,
516
- ids: [
517
- params.id
518
- ]
519
- });
520
- const item = items.shift() || null;
521
- if (!item) return null;
522
- return convertFromStorageEntry({
523
- storageEntry: item,
524
- model
525
- });
526
- };
527
- const getPublishedRevisionByEntryId = async (initialModel, params)=>{
528
- const model = getStorageOperationsModel(initialModel);
529
- const items = await dataLoaders.getPublishedRevisionByEntryId({
530
- model,
531
- ids: [
532
- params.id
533
- ]
534
- });
535
- const item = items.shift() || null;
536
- if (!item) return null;
537
- return convertFromStorageEntry({
538
- storageEntry: item,
539
- model
540
- });
541
- };
542
- const getRevisionById = async (initialModel, params)=>{
543
- const model = getStorageOperationsModel(initialModel);
544
- const items = await dataLoaders.getRevisionById({
545
- model,
546
- ids: [
547
- params.id
548
- ]
549
- });
550
- const item = items.shift() || null;
551
- if (!item) return null;
552
- return convertFromStorageEntry({
553
- storageEntry: item,
554
- model
555
- });
556
- };
557
- const getRevisions = async (initialModel, params)=>{
558
- const model = getStorageOperationsModel(initialModel);
559
- const items = await dataLoaders.getAllEntryRevisions({
560
- model,
561
- ids: [
562
- params.id
563
- ]
564
- });
565
- return items.map((item)=>convertFromStorageEntry({
566
- storageEntry: item,
567
- model
568
- }));
569
- };
570
- const getByIds = async (initialModel, params)=>{
571
- const model = getStorageOperationsModel(initialModel);
572
- const items = await dataLoaders.getRevisionById({
573
- model,
574
- ids: params.ids
575
- });
576
- return items.map((item)=>convertFromStorageEntry({
577
- storageEntry: item,
578
- model
579
- }));
580
- };
581
- const getLatestByIds = async (initialModel, params)=>{
582
- const model = getStorageOperationsModel(initialModel);
583
- const items = await dataLoaders.getLatestRevisionByEntryId({
584
- model,
585
- ids: params.ids
586
- });
587
- return items.map((item)=>convertFromStorageEntry({
588
- storageEntry: item,
589
- model
590
- }));
591
- };
592
- const getPublishedByIds = async (initialModel, params)=>{
593
- const model = getStorageOperationsModel(initialModel);
594
- const items = await dataLoaders.getPublishedRevisionByEntryId({
595
- model,
596
- ids: params.ids
597
- });
598
- return items.map((item)=>convertFromStorageEntry({
599
- storageEntry: item,
600
- model
601
- }));
602
- };
603
- const getPreviousRevision = async (initialModel, params)=>{
604
- const model = getStorageOperationsModel(initialModel);
605
- const { entryId, version } = params;
606
- const partitionKey = createPartitionKey({
607
- tenant: model.tenant,
608
- id: entryId
609
- });
610
- const unfilteredRevisions = await entity.queryAll({
611
- partitionKey,
612
- options: {
613
- beginsWith: "REV#",
614
- reverse: true
615
- }
616
- });
617
- const filteredRevisions = unfilteredRevisions.filter((item)=>item.data.version < version);
618
- const storageEntry = filteredRevisions[0];
619
- if (!storageEntry) return null;
620
- try {
621
- return convertFromStorageEntry({
622
- storageEntry: storageEntry.data,
623
- model
624
- });
625
- } catch (ex) {
626
- throw new error(ex.message || "Could not get previous version of given entry.", ex.code || "GET_PREVIOUS_VERSION_ERROR", {
627
- ...params,
628
- error: ex,
629
- partitionKey,
630
- model
631
- });
632
- }
633
- };
634
- const list = async (initialModel, params)=>{
635
- const model = getStorageOperationsModel(initialModel);
636
- const { limit: initialLimit = 10, where: initialWhere, after, sort: sortBy, fields, search } = params;
637
- const limit = initialLimit <= 0 || initialLimit >= MAX_LIST_LIMIT ? MAX_LIST_LIMIT : initialLimit;
638
- const type = initialWhere.published ? "P" : "L";
639
- const partitionKey = createGSIPartitionKey(model, type);
640
- const options = {
641
- index: "GSI1",
642
- gte: " "
643
- };
644
- let storageEntries = [];
645
- try {
646
- storageEntries = await entity.queryAll({
647
- partitionKey,
648
- options
649
- });
650
- } catch (ex) {
651
- throw new error(ex.message, "QUERY_ENTRIES_ERROR", {
652
- error: ex,
653
- partitionKey,
654
- options
655
- });
656
- }
657
- if (0 === storageEntries.length) return {
658
- hasMoreItems: false,
659
- totalCount: 0,
660
- cursor: null,
661
- items: []
662
- };
663
- const where = {
664
- ...initialWhere
665
- };
666
- delete where["published"];
667
- delete where["latest"];
668
- const modelFields = createFields({
669
- plugins,
670
- fields: model.fields
671
- });
672
- const fromStorage = createStorageTransformCallable(storageTransformRegistry, model);
673
- const records = await Promise.all(storageEntries.map(async (storageEntry)=>{
674
- const entry = convertFromStorageEntry({
675
- storageEntry: storageEntry.data,
676
- model
677
- });
678
- for (const field of model.fields)entry.values[field.fieldId] = await fromStorage(field, entry.values[field.fieldId]);
679
- return entry;
680
- }));
681
- const valueFilterRegistry = container.resolve(ValueFilterRegistry);
682
- const filteredItems = filter({
683
- items: records,
684
- where,
685
- plugins,
686
- fields: modelFields,
687
- fullTextSearch: {
688
- term: search,
689
- fields: fields || []
690
- },
691
- valueFilterRegistry
692
- });
693
- const totalCount = filteredItems.length;
694
- const sortedItems = sort({
695
- model,
696
- plugins,
697
- items: filteredItems,
698
- sort: sortBy,
699
- fields: modelFields
700
- });
701
- const start = parseInt(decodeCursor(after) || "0") || 0;
702
- const hasMoreItems = totalCount > start + limit;
703
- const end = limit > totalCount + start + limit ? void 0 : start + limit;
704
- const slicedItems = sortedItems.slice(start, end);
705
- const cursor = encodeCursor(`${start + limit}`);
706
- return {
707
- hasMoreItems,
708
- totalCount,
709
- cursor,
710
- items: slicedItems
711
- };
712
- };
713
- const get = async (initialModel, params)=>{
714
- const model = getStorageOperationsModel(initialModel);
715
- const { items } = await list(model, {
716
- ...params,
717
- limit: 1
718
- });
719
- return items.shift() || null;
720
- };
721
- const publish = async (initialModel, params)=>{
722
- const { entry, storageEntry: initialStorageEntry } = params;
723
- const model = getStorageOperationsModel(initialModel);
724
- const initialLatestStorageEntry = await getLatestRevisionByEntryId(model, entry);
725
- if (!initialLatestStorageEntry) throw new error('Could not publish entry. Could not load latest ("L") record.', "PUBLISH_ERROR", {
726
- entry
727
- });
728
- const initialPublishedStorageEntry = await getPublishedRevisionByEntryId(model, entry);
729
- const storageEntry = convertToStorageEntry({
730
- model,
731
- storageEntry: initialStorageEntry
732
- });
733
- const entityBatch = entity.createEntityWriter({
734
- put: [
735
- {
736
- ...createEntryRevisionKeys(storageEntry),
737
- data: {
738
- ...storageEntry
739
- }
740
- },
741
- {
742
- ...createEntryPublishedKeys(storageEntry),
743
- data: {
744
- ...storageEntry
745
- }
746
- }
747
- ]
748
- });
749
- const publishedRevisionId = initialPublishedStorageEntry?.id;
750
- const publishingLatestRevision = entry.id === initialLatestStorageEntry.id;
751
- if (publishingLatestRevision) {
752
- entityBatch.put({
753
- ...createEntryLatestKeys(storageEntry),
754
- data: {
755
- ...storageEntry
756
- }
757
- });
758
- if (publishedRevisionId && publishedRevisionId !== entry.id) {
759
- const publishedStorageEntry = convertToStorageEntry({
760
- storageEntry: initialPublishedStorageEntry,
761
- model
762
- });
763
- entityBatch.put({
764
- ...createEntryRevisionKeys(publishedStorageEntry),
765
- data: {
766
- ...publishedStorageEntry,
767
- status: CONTENT_ENTRY_STATUS.UNPUBLISHED
768
- }
769
- });
770
- }
771
- } else {
772
- const updatedEntryLevelMetaFields = pickEntryMetaFields(entry, isEntryLevelEntryMetaField);
773
- const latestStorageEntry = convertToStorageEntry({
774
- storageEntry: initialLatestStorageEntry,
775
- model
776
- });
777
- let latestRevisionStatus = latestStorageEntry.status;
778
- if (latestRevisionStatus === CONTENT_ENTRY_STATUS.PUBLISHED) latestRevisionStatus = CONTENT_ENTRY_STATUS.UNPUBLISHED;
779
- const latestStorageEntryFields = {
780
- ...latestStorageEntry,
781
- ...updatedEntryLevelMetaFields,
782
- status: latestRevisionStatus
783
- };
784
- entityBatch.put({
785
- ...createEntryLatestKeys(latestStorageEntryFields),
786
- data: {
787
- ...latestStorageEntryFields
788
- }
789
- });
790
- entityBatch.put({
791
- ...createEntryRevisionKeys(latestStorageEntryFields),
792
- data: {
793
- ...latestStorageEntryFields
794
- }
795
- });
796
- const publishedRevisionDifferentFromLatest = publishedRevisionId && publishedRevisionId !== latestStorageEntry.id;
797
- if (publishedRevisionDifferentFromLatest) {
798
- const publishedStorageEntry = convertToStorageEntry({
799
- storageEntry: initialPublishedStorageEntry,
800
- model
801
- });
802
- entityBatch.put({
803
- ...createEntryRevisionKeys(publishedStorageEntry),
804
- data: {
805
- ...publishedStorageEntry,
806
- status: CONTENT_ENTRY_STATUS.UNPUBLISHED
807
- }
808
- });
809
- }
810
- }
811
- try {
812
- await entityBatch.execute();
813
- dataLoaders.clearAll({
814
- tenant: entry.tenant
815
- });
816
- return initialStorageEntry;
817
- } catch (ex) {
818
- throw new error(ex.message || "Could not execute the publishing batch.", ex.code || "PUBLISH_ERROR", {
819
- entry,
820
- latestStorageEntry: initialLatestStorageEntry,
821
- publishedStorageEntry: initialPublishedStorageEntry
822
- });
823
- }
824
- };
825
- const unpublish = async (initialModel, params)=>{
826
- const { entry, storageEntry: initialStorageEntry } = params;
827
- const model = getStorageOperationsModel(initialModel);
828
- const partitionKey = createPartitionKey({
829
- id: entry.id,
830
- tenant: model.tenant
831
- });
832
- const storageEntry = convertToStorageEntry({
833
- storageEntry: initialStorageEntry,
834
- model
835
- });
836
- const entityBatch = entity.createEntityWriter({
837
- delete: [
838
- {
839
- PK: partitionKey,
840
- SK: createPublishedSortKey()
841
- }
842
- ],
843
- put: [
844
- {
845
- ...createEntryRevisionKeys(storageEntry),
846
- data: {
847
- ...storageEntry
848
- }
849
- }
850
- ]
851
- });
852
- const initialLatestStorageEntry = await getLatestRevisionByEntryId(model, entry);
853
- if (initialLatestStorageEntry) {
854
- const unpublishingLatestRevision = entry.id === initialLatestStorageEntry.id;
855
- if (unpublishingLatestRevision) entityBatch.put({
856
- ...createEntryLatestKeys(storageEntry),
857
- data: {
858
- ...storageEntry
859
- }
860
- });
861
- else {
862
- const latestStorageEntry = convertToStorageEntry({
863
- storageEntry: initialLatestStorageEntry,
864
- model
865
- });
866
- const updatedEntryLevelMetaFields = pickEntryMetaFields(entry, isEntryLevelEntryMetaField);
867
- entityBatch.put({
868
- ...createEntryRevisionKeys(latestStorageEntry),
869
- data: {
870
- ...latestStorageEntry,
871
- ...updatedEntryLevelMetaFields
872
- }
873
- });
874
- entityBatch.put({
875
- ...createEntryLatestKeys(latestStorageEntry),
876
- data: {
877
- ...latestStorageEntry,
878
- ...updatedEntryLevelMetaFields
879
- }
880
- });
881
- }
882
- }
883
- try {
884
- await entityBatch.execute();
885
- dataLoaders.clearAll({
886
- tenant: entry.tenant
887
- });
888
- return initialStorageEntry;
889
- } catch (ex) {
890
- throw new error(ex.message || "Could not execute unpublish batch.", ex.code || "UNPUBLISH_ERROR", {
891
- entry,
892
- storageEntry
893
- });
894
- }
895
- };
896
- const getUniqueFieldValues = async (model, params)=>{
897
- const { where, fieldId } = params;
898
- const field = model.fields.find((f)=>f.fieldId === fieldId);
899
- if (!field) throw new error('Could not find field with given "fieldId" value.', "FIELD_NOT_FOUND", {
900
- fieldId
901
- });
902
- const { items } = await list(model, {
903
- where,
904
- limit: MAX_LIST_LIMIT
905
- });
906
- return aggregateUniqueFieldValues(items, field.fieldId);
907
- };
908
- return {
909
- create,
910
- createRevisionFrom,
911
- update,
912
- updateRevision,
913
- move,
914
- delete: deleteEntry,
915
- moveToBin,
916
- restoreFromBin,
917
- deleteRevision,
918
- deleteMultipleEntries,
919
- getPreviousRevision,
920
- getPublishedByIds,
921
- getLatestByIds,
922
- getByIds,
923
- getRevisionById,
924
- getPublishedRevisionByEntryId,
925
- getLatestRevisionByEntryId,
926
- get,
927
- getRevisions,
928
- publish,
929
- list,
930
- unpublish,
931
- dataLoaders,
932
- getUniqueFieldValues
933
- };
934
- };
935
- export { createEntriesStorageOperations };
936
-
937
- //# sourceMappingURL=index.js.map