@webiny/api-headless-cms-ddb 0.0.0-unstable.eb196ccd2f → 0.0.0-unstable.eb81deee7e

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 (290) hide show
  1. package/README.md +6 -20
  2. package/abstractions/CmsDdbDataLoaders.d.ts +5 -0
  3. package/abstractions/CmsDdbDataLoaders.js +5 -0
  4. package/abstractions/CmsDdbDataLoaders.js.map +1 -0
  5. package/abstractions/CmsDdbEntryEntity.d.ts +5 -0
  6. package/abstractions/CmsDdbEntryEntity.js +5 -0
  7. package/abstractions/CmsDdbEntryEntity.js.map +1 -0
  8. package/abstractions/CmsDdbGroupEntity.d.ts +5 -0
  9. package/abstractions/CmsDdbGroupEntity.js +5 -0
  10. package/abstractions/CmsDdbGroupEntity.js.map +1 -0
  11. package/abstractions/CmsDdbModelEntity.d.ts +5 -0
  12. package/abstractions/CmsDdbModelEntity.js +5 -0
  13. package/abstractions/CmsDdbModelEntity.js.map +1 -0
  14. package/abstractions/CmsDdbTable.d.ts +5 -0
  15. package/abstractions/CmsDdbTable.js +5 -0
  16. package/abstractions/CmsDdbTable.js.map +1 -0
  17. package/definitions/entry.d.ts +4 -6
  18. package/definitions/entry.js +8 -185
  19. package/definitions/entry.js.map +1 -1
  20. package/definitions/group.d.ts +4 -6
  21. package/definitions/group.js +8 -63
  22. package/definitions/group.js.map +1 -1
  23. package/definitions/model.d.ts +4 -6
  24. package/definitions/model.js +8 -107
  25. package/definitions/model.js.map +1 -1
  26. package/definitions/table.d.ts +3 -5
  27. package/definitions/table.js +6 -29
  28. package/definitions/table.js.map +1 -1
  29. package/definitions/types.d.ts +65 -0
  30. package/definitions/types.js +0 -0
  31. package/index.d.ts +17 -3
  32. package/index.js +36 -123
  33. package/index.js.map +1 -1
  34. package/operations/entry/DdbCreateEntry.d.ts +16 -0
  35. package/operations/entry/DdbCreateEntry.js +77 -0
  36. package/operations/entry/DdbCreateEntry.js.map +1 -0
  37. package/operations/entry/DdbCreateEntryRevisionFrom.d.ts +16 -0
  38. package/operations/entry/DdbCreateEntryRevisionFrom.js +85 -0
  39. package/operations/entry/DdbCreateEntryRevisionFrom.js.map +1 -0
  40. package/operations/entry/DdbDeleteEntry.d.ts +16 -0
  41. package/operations/entry/DdbDeleteEntry.js +65 -0
  42. package/operations/entry/DdbDeleteEntry.js.map +1 -0
  43. package/operations/entry/DdbDeleteEntryRevision.d.ts +17 -0
  44. package/operations/entry/DdbDeleteEntryRevision.js +91 -0
  45. package/operations/entry/DdbDeleteEntryRevision.js.map +1 -0
  46. package/operations/entry/DdbDeleteMultipleEntries.d.ts +16 -0
  47. package/operations/entry/DdbDeleteMultipleEntries.js +59 -0
  48. package/operations/entry/DdbDeleteMultipleEntries.js.map +1 -0
  49. package/operations/entry/DdbGetEntriesByIds.d.ts +14 -0
  50. package/operations/entry/DdbGetEntriesByIds.js +31 -0
  51. package/operations/entry/DdbGetEntriesByIds.js.map +1 -0
  52. package/operations/entry/DdbGetEntry.d.ts +14 -0
  53. package/operations/entry/DdbGetEntry.js +27 -0
  54. package/operations/entry/DdbGetEntry.js.map +1 -0
  55. package/operations/entry/DdbGetLatestEntriesByIds.d.ts +14 -0
  56. package/operations/entry/DdbGetLatestEntriesByIds.js +31 -0
  57. package/operations/entry/DdbGetLatestEntriesByIds.js.map +1 -0
  58. package/operations/entry/DdbGetLatestRevisionByEntryId.d.ts +14 -0
  59. package/operations/entry/DdbGetLatestRevisionByEntryId.js +35 -0
  60. package/operations/entry/DdbGetLatestRevisionByEntryId.js.map +1 -0
  61. package/operations/entry/DdbGetPreviousRevision.d.ts +14 -0
  62. package/operations/entry/DdbGetPreviousRevision.js +53 -0
  63. package/operations/entry/DdbGetPreviousRevision.js.map +1 -0
  64. package/operations/entry/DdbGetPublishedEntriesByIds.d.ts +14 -0
  65. package/operations/entry/DdbGetPublishedEntriesByIds.js +31 -0
  66. package/operations/entry/DdbGetPublishedEntriesByIds.js.map +1 -0
  67. package/operations/entry/DdbGetPublishedRevisionByEntryId.d.ts +14 -0
  68. package/operations/entry/DdbGetPublishedRevisionByEntryId.js +35 -0
  69. package/operations/entry/DdbGetPublishedRevisionByEntryId.js.map +1 -0
  70. package/operations/entry/DdbGetRevisionById.d.ts +14 -0
  71. package/operations/entry/DdbGetRevisionById.js +34 -0
  72. package/operations/entry/DdbGetRevisionById.js.map +1 -0
  73. package/operations/entry/DdbGetRevisions.d.ts +14 -0
  74. package/operations/entry/DdbGetRevisions.js +33 -0
  75. package/operations/entry/DdbGetRevisions.js.map +1 -0
  76. package/operations/entry/DdbGetUniqueFieldValues.d.ts +12 -0
  77. package/operations/entry/DdbGetUniqueFieldValues.js +31 -0
  78. package/operations/entry/DdbGetUniqueFieldValues.js.map +1 -0
  79. package/operations/entry/DdbListEntries.d.ts +28 -0
  80. package/operations/entry/DdbListEntries.js +124 -0
  81. package/operations/entry/DdbListEntries.js.map +1 -0
  82. package/operations/entry/DdbMoveEntry.d.ts +14 -0
  83. package/operations/entry/DdbMoveEntry.js +57 -0
  84. package/operations/entry/DdbMoveEntry.js.map +1 -0
  85. package/operations/entry/DdbMoveToBin.d.ts +16 -0
  86. package/operations/entry/DdbMoveToBin.js +77 -0
  87. package/operations/entry/DdbMoveToBin.js.map +1 -0
  88. package/operations/entry/DdbPublishEntry.d.ts +18 -0
  89. package/operations/entry/DdbPublishEntry.js +162 -0
  90. package/operations/entry/DdbPublishEntry.js.map +1 -0
  91. package/operations/entry/DdbRestoreFromBin.d.ts +16 -0
  92. package/operations/entry/DdbRestoreFromBin.js +78 -0
  93. package/operations/entry/DdbRestoreFromBin.js.map +1 -0
  94. package/operations/entry/DdbUnpublishEntry.d.ts +17 -0
  95. package/operations/entry/DdbUnpublishEntry.js +112 -0
  96. package/operations/entry/DdbUnpublishEntry.js.map +1 -0
  97. package/operations/entry/DdbUpdateEntry.d.ts +17 -0
  98. package/operations/entry/DdbUpdateEntry.js +105 -0
  99. package/operations/entry/DdbUpdateEntry.js.map +1 -0
  100. package/operations/entry/dataLoader/DataLoaderCache.d.ts +1 -2
  101. package/operations/entry/dataLoader/DataLoaderCache.js +21 -35
  102. package/operations/entry/dataLoader/DataLoaderCache.js.map +1 -1
  103. package/operations/entry/dataLoader/constants.js +2 -7
  104. package/operations/entry/dataLoader/constants.js.map +1 -1
  105. package/operations/entry/dataLoader/createBatchScheduleFn.js +7 -22
  106. package/operations/entry/dataLoader/createBatchScheduleFn.js.map +1 -1
  107. package/operations/entry/dataLoader/getAllEntryRevisions.d.ts +3 -3
  108. package/operations/entry/dataLoader/getAllEntryRevisions.js +20 -41
  109. package/operations/entry/dataLoader/getAllEntryRevisions.js.map +1 -1
  110. package/operations/entry/dataLoader/getLatestRevisionByEntryId.d.ts +3 -3
  111. package/operations/entry/dataLoader/getLatestRevisionByEntryId.js +36 -52
  112. package/operations/entry/dataLoader/getLatestRevisionByEntryId.js.map +1 -1
  113. package/operations/entry/dataLoader/getPublishedRevisionByEntryId.d.ts +3 -3
  114. package/operations/entry/dataLoader/getPublishedRevisionByEntryId.js +36 -52
  115. package/operations/entry/dataLoader/getPublishedRevisionByEntryId.js.map +1 -1
  116. package/operations/entry/dataLoader/getRevisionById.d.ts +3 -3
  117. package/operations/entry/dataLoader/getRevisionById.js +38 -58
  118. package/operations/entry/dataLoader/getRevisionById.js.map +1 -1
  119. package/operations/entry/dataLoader/index.d.ts +3 -3
  120. package/operations/entry/dataLoader/index.js +13 -35
  121. package/operations/entry/dataLoader/index.js.map +1 -1
  122. package/operations/entry/dataLoader/types.d.ts +4 -4
  123. package/operations/entry/dataLoader/types.js +0 -7
  124. package/operations/entry/dataLoaders.d.ts +13 -13
  125. package/operations/entry/dataLoaders.js +92 -110
  126. package/operations/entry/dataLoaders.js.map +1 -1
  127. package/operations/entry/feature.d.ts +4 -0
  128. package/operations/entry/feature.js +53 -0
  129. package/operations/entry/feature.js.map +1 -0
  130. package/operations/entry/keys.d.ts +46 -2
  131. package/operations/entry/keys.js +52 -49
  132. package/operations/entry/keys.js.map +1 -1
  133. package/operations/entry/storageEntryUtils.d.ts +8 -0
  134. package/operations/entry/storageEntryUtils.js +25 -0
  135. package/operations/entry/storageEntryUtils.js.map +1 -0
  136. package/operations/group/DdbCreateGroup.d.ts +12 -0
  137. package/operations/group/DdbCreateGroup.js +35 -0
  138. package/operations/group/DdbCreateGroup.js.map +1 -0
  139. package/operations/group/DdbDeleteGroup.d.ts +12 -0
  140. package/operations/group/DdbDeleteGroup.js +31 -0
  141. package/operations/group/DdbDeleteGroup.js.map +1 -0
  142. package/operations/group/DdbGetGroup.d.ts +12 -0
  143. package/operations/group/DdbGetGroup.js +31 -0
  144. package/operations/group/DdbGetGroup.js.map +1 -0
  145. package/operations/group/DdbListGroups.d.ts +14 -0
  146. package/operations/group/DdbListGroups.js +52 -0
  147. package/operations/group/DdbListGroups.js.map +1 -0
  148. package/operations/group/DdbUpdateGroup.d.ts +12 -0
  149. package/operations/group/DdbUpdateGroup.js +35 -0
  150. package/operations/group/DdbUpdateGroup.js.map +1 -0
  151. package/operations/group/feature.d.ts +4 -0
  152. package/operations/group/feature.js +19 -0
  153. package/operations/group/feature.js.map +1 -0
  154. package/operations/group/keys.d.ts +15 -0
  155. package/operations/group/keys.js +17 -0
  156. package/operations/group/keys.js.map +1 -0
  157. package/operations/model/DdbCreateModel.d.ts +12 -0
  158. package/operations/model/DdbCreateModel.js +37 -0
  159. package/operations/model/DdbCreateModel.js.map +1 -0
  160. package/operations/model/DdbDeleteModel.d.ts +12 -0
  161. package/operations/model/DdbDeleteModel.js +31 -0
  162. package/operations/model/DdbDeleteModel.js.map +1 -0
  163. package/operations/model/DdbGetModel.d.ts +12 -0
  164. package/operations/model/DdbGetModel.js +30 -0
  165. package/operations/model/DdbGetModel.js.map +1 -0
  166. package/operations/model/DdbListModels.d.ts +12 -0
  167. package/operations/model/DdbListModels.js +36 -0
  168. package/operations/model/DdbListModels.js.map +1 -0
  169. package/operations/model/DdbUpdateModel.d.ts +12 -0
  170. package/operations/model/DdbUpdateModel.js +36 -0
  171. package/operations/model/DdbUpdateModel.js.map +1 -0
  172. package/operations/model/feature.d.ts +4 -0
  173. package/operations/model/feature.js +19 -0
  174. package/operations/model/feature.js.map +1 -0
  175. package/operations/model/keys.d.ts +15 -0
  176. package/operations/model/keys.js +16 -0
  177. package/operations/model/keys.js.map +1 -0
  178. package/package.json +27 -25
  179. package/requestFeature.d.ts +17 -0
  180. package/requestFeature.js +19 -0
  181. package/requestFeature.js.map +1 -0
  182. package/types.d.ts +11 -51
  183. package/types.js +6 -12
  184. package/types.js.map +1 -1
  185. package/definitions/system.d.ts +0 -10
  186. package/definitions/system.js +0 -42
  187. package/definitions/system.js.map +0 -1
  188. package/dynamoDb/index.d.ts +0 -2
  189. package/dynamoDb/index.js +0 -15
  190. package/dynamoDb/index.js.map +0 -1
  191. package/dynamoDb/path/locationFolderId.d.ts +0 -2
  192. package/dynamoDb/path/locationFolderId.js +0 -43
  193. package/dynamoDb/path/locationFolderId.js.map +0 -1
  194. package/dynamoDb/path/plainObject.d.ts +0 -2
  195. package/dynamoDb/path/plainObject.js +0 -35
  196. package/dynamoDb/path/plainObject.js.map +0 -1
  197. package/dynamoDb/storage/longText.d.ts +0 -10
  198. package/dynamoDb/storage/longText.js +0 -94
  199. package/dynamoDb/storage/longText.js.map +0 -1
  200. package/dynamoDb/storage/richText.d.ts +0 -2
  201. package/dynamoDb/storage/richText.js +0 -61
  202. package/dynamoDb/storage/richText.js.map +0 -1
  203. package/dynamoDb/transformValue/datetime.d.ts +0 -5
  204. package/dynamoDb/transformValue/datetime.js +0 -47
  205. package/dynamoDb/transformValue/datetime.js.map +0 -1
  206. package/operations/entry/dataLoader/types.js.map +0 -1
  207. package/operations/entry/filtering/createExpressions.d.ts +0 -26
  208. package/operations/entry/filtering/createExpressions.js +0 -178
  209. package/operations/entry/filtering/createExpressions.js.map +0 -1
  210. package/operations/entry/filtering/createFields.d.ts +0 -16
  211. package/operations/entry/filtering/createFields.js +0 -108
  212. package/operations/entry/filtering/createFields.js.map +0 -1
  213. package/operations/entry/filtering/extractSort.d.ts +0 -17
  214. package/operations/entry/filtering/extractSort.js +0 -69
  215. package/operations/entry/filtering/extractSort.js.map +0 -1
  216. package/operations/entry/filtering/filter.d.ts +0 -15
  217. package/operations/entry/filtering/filter.js +0 -158
  218. package/operations/entry/filtering/filter.js.map +0 -1
  219. package/operations/entry/filtering/fullTextSearch.d.ts +0 -14
  220. package/operations/entry/filtering/fullTextSearch.js +0 -50
  221. package/operations/entry/filtering/fullTextSearch.js.map +0 -1
  222. package/operations/entry/filtering/getValue.d.ts +0 -5
  223. package/operations/entry/filtering/getValue.js +0 -66
  224. package/operations/entry/filtering/getValue.js.map +0 -1
  225. package/operations/entry/filtering/index.d.ts +0 -2
  226. package/operations/entry/filtering/index.js +0 -21
  227. package/operations/entry/filtering/index.js.map +0 -1
  228. package/operations/entry/filtering/mapPlugins.d.ts +0 -8
  229. package/operations/entry/filtering/mapPlugins.js +0 -33
  230. package/operations/entry/filtering/mapPlugins.js.map +0 -1
  231. package/operations/entry/filtering/plugins/defaultFilterCreate.d.ts +0 -2
  232. package/operations/entry/filtering/plugins/defaultFilterCreate.js +0 -45
  233. package/operations/entry/filtering/plugins/defaultFilterCreate.js.map +0 -1
  234. package/operations/entry/filtering/plugins/index.d.ts +0 -1
  235. package/operations/entry/filtering/plugins/index.js +0 -16
  236. package/operations/entry/filtering/plugins/index.js.map +0 -1
  237. package/operations/entry/filtering/plugins/objectFilterCreate.d.ts +0 -2
  238. package/operations/entry/filtering/plugins/objectFilterCreate.js +0 -90
  239. package/operations/entry/filtering/plugins/objectFilterCreate.js.map +0 -1
  240. package/operations/entry/filtering/plugins/refFilterCreate.d.ts +0 -3
  241. package/operations/entry/filtering/plugins/refFilterCreate.js +0 -80
  242. package/operations/entry/filtering/plugins/refFilterCreate.js.map +0 -1
  243. package/operations/entry/filtering/plugins/searchableJsonFilterCreate.d.ts +0 -2
  244. package/operations/entry/filtering/plugins/searchableJsonFilterCreate.js +0 -65
  245. package/operations/entry/filtering/plugins/searchableJsonFilterCreate.js.map +0 -1
  246. package/operations/entry/filtering/sort.d.ts +0 -12
  247. package/operations/entry/filtering/sort.js +0 -71
  248. package/operations/entry/filtering/sort.js.map +0 -1
  249. package/operations/entry/filtering/systemFields.d.ts +0 -4
  250. package/operations/entry/filtering/systemFields.js +0 -90
  251. package/operations/entry/filtering/systemFields.js.map +0 -1
  252. package/operations/entry/filtering/transform.d.ts +0 -6
  253. package/operations/entry/filtering/transform.js +0 -18
  254. package/operations/entry/filtering/transform.js.map +0 -1
  255. package/operations/entry/filtering/types.d.ts +0 -40
  256. package/operations/entry/filtering/types.js +0 -7
  257. package/operations/entry/filtering/types.js.map +0 -1
  258. package/operations/entry/filtering/values.d.ts +0 -2
  259. package/operations/entry/filtering/values.js +0 -24
  260. package/operations/entry/filtering/values.js.map +0 -1
  261. package/operations/entry/filtering/where.d.ts +0 -5
  262. package/operations/entry/filtering/where.js +0 -35
  263. package/operations/entry/filtering/where.js.map +0 -1
  264. package/operations/entry/index.d.ts +0 -8
  265. package/operations/entry/index.js +0 -1306
  266. package/operations/entry/index.js.map +0 -1
  267. package/operations/group/index.d.ts +0 -9
  268. package/operations/group/index.js +0 -174
  269. package/operations/group/index.js.map +0 -1
  270. package/operations/model/index.d.ts +0 -7
  271. package/operations/model/index.js +0 -150
  272. package/operations/model/index.js.map +0 -1
  273. package/operations/system/index.d.ts +0 -7
  274. package/operations/system/index.js +0 -94
  275. package/operations/system/index.js.map +0 -1
  276. package/plugins/CmsEntryFieldFilterPathPlugin.d.ts +0 -23
  277. package/plugins/CmsEntryFieldFilterPathPlugin.js +0 -48
  278. package/plugins/CmsEntryFieldFilterPathPlugin.js.map +0 -1
  279. package/plugins/CmsEntryFieldFilterPlugin.d.ts +0 -43
  280. package/plugins/CmsEntryFieldFilterPlugin.js +0 -27
  281. package/plugins/CmsEntryFieldFilterPlugin.js.map +0 -1
  282. package/plugins/CmsEntryFieldSortingPlugin.d.ts +0 -42
  283. package/plugins/CmsEntryFieldSortingPlugin.js +0 -27
  284. package/plugins/CmsEntryFieldSortingPlugin.js.map +0 -1
  285. package/plugins/CmsFieldFilterValueTransformPlugin.d.ts +0 -11
  286. package/plugins/CmsFieldFilterValueTransformPlugin.js +0 -23
  287. package/plugins/CmsFieldFilterValueTransformPlugin.js.map +0 -1
  288. package/plugins/index.d.ts +0 -4
  289. package/plugins/index.js +0 -51
  290. package/plugins/index.js.map +0 -1
@@ -1,1306 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.createEntriesStorageOperations = void 0;
8
- var _error = _interopRequireDefault(require("@webiny/error"));
9
- var _dataLoaders = require("./dataLoaders");
10
- var _types = require("@webiny/api-headless-cms/types");
11
- var _keys = require("./keys");
12
- var _dbDynamodb = require("@webiny/db-dynamodb");
13
- var _cursor = require("@webiny/utils/cursor");
14
- var _zeroPad = require("@webiny/utils/zeroPad");
15
- var _apiHeadlessCms = require("@webiny/api-headless-cms");
16
- var _createFields = require("./filtering/createFields");
17
- var _filtering = require("./filtering");
18
- var _constants = require("@webiny/api-headless-cms/constants");
19
- const createType = () => {
20
- return "cms.entry";
21
- };
22
- const createLatestType = () => {
23
- return `${createType()}.l`;
24
- };
25
- const createPublishedType = () => {
26
- return `${createType()}.p`;
27
- };
28
- const convertToStorageEntry = params => {
29
- const {
30
- model,
31
- storageEntry
32
- } = params;
33
- const values = model.convertValueKeyToStorage({
34
- fields: model.fields,
35
- values: storageEntry.values
36
- });
37
- return {
38
- ...storageEntry,
39
- values
40
- };
41
- };
42
- const convertFromStorageEntry = params => {
43
- const {
44
- model,
45
- storageEntry
46
- } = params;
47
- const values = model.convertValueKeyFromStorage({
48
- fields: model.fields,
49
- values: storageEntry.values
50
- });
51
- return {
52
- ...storageEntry,
53
- values
54
- };
55
- };
56
- const MAX_LIST_LIMIT = 1000000;
57
- const createEntriesStorageOperations = params => {
58
- const {
59
- entity,
60
- plugins
61
- } = params;
62
- let storageOperationsCmsModelPlugin;
63
- const getStorageOperationsCmsModelPlugin = () => {
64
- if (storageOperationsCmsModelPlugin) {
65
- return storageOperationsCmsModelPlugin;
66
- }
67
- storageOperationsCmsModelPlugin = plugins.oneByType(_apiHeadlessCms.StorageOperationsCmsModelPlugin.type);
68
- return storageOperationsCmsModelPlugin;
69
- };
70
- const getStorageOperationsModel = model => {
71
- const plugin = getStorageOperationsCmsModelPlugin();
72
- return plugin.getModel(model);
73
- };
74
- const dataLoaders = new _dataLoaders.DataLoadersHandler({
75
- entity
76
- });
77
- const createStorageTransformCallable = model => {
78
- // Cache StorageTransformPlugin to optimize execution.
79
- const storageTransformPlugins = plugins.byType(_apiHeadlessCms.StorageTransformPlugin.type).reduce((collection, plugin) => {
80
- collection[plugin.fieldType] = plugin;
81
- return collection;
82
- }, {});
83
- return (field, value) => {
84
- const plugin = storageTransformPlugins[field.type];
85
- if (!plugin) {
86
- return value;
87
- }
88
- return plugin.fromStorage({
89
- model,
90
- field,
91
- value,
92
- getStoragePlugin(fieldType) {
93
- return storageTransformPlugins[fieldType] || storageTransformPlugins["*"];
94
- },
95
- plugins
96
- });
97
- };
98
- };
99
- const create = async (initialModel, params) => {
100
- const {
101
- entry,
102
- storageEntry: initialStorageEntry
103
- } = params;
104
- const model = getStorageOperationsModel(initialModel);
105
- const partitionKey = (0, _keys.createPartitionKey)({
106
- id: entry.id,
107
- locale: model.locale,
108
- tenant: model.tenant
109
- });
110
- const isPublished = entry.status === "published";
111
- const locked = isPublished ? true : entry.locked;
112
- const storageEntry = convertToStorageEntry({
113
- model,
114
- storageEntry: initialStorageEntry
115
- });
116
- /**
117
- * We need to:
118
- * - create new main entry item
119
- * - create new or update the latest entry item
120
- */
121
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
122
- entity,
123
- put: [{
124
- ...storageEntry,
125
- locked,
126
- PK: partitionKey,
127
- SK: (0, _keys.createRevisionSortKey)(entry),
128
- TYPE: createType(),
129
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
130
- GSI1_SK: (0, _keys.createGSISortKey)(storageEntry)
131
- }, {
132
- ...storageEntry,
133
- locked,
134
- PK: partitionKey,
135
- SK: (0, _keys.createLatestSortKey)(),
136
- TYPE: createLatestType(),
137
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
138
- GSI1_SK: (0, _keys.createGSISortKey)(storageEntry)
139
- }]
140
- });
141
-
142
- /**
143
- * We need to create published entry if
144
- */
145
- if (isPublished) {
146
- entityBatch.put({
147
- ...storageEntry,
148
- locked,
149
- PK: partitionKey,
150
- SK: (0, _keys.createPublishedSortKey)(),
151
- TYPE: createLatestType(),
152
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "P"),
153
- GSI1_SK: (0, _keys.createGSISortKey)(storageEntry)
154
- });
155
- }
156
- try {
157
- await entityBatch.execute();
158
- dataLoaders.clearAll({
159
- model
160
- });
161
- } catch (ex) {
162
- throw new _error.default(ex.message || "Could not insert data into the DynamoDB.", ex.code || "CREATE_ENTRY_ERROR", {
163
- error: ex,
164
- entry
165
- });
166
- }
167
- return initialStorageEntry;
168
- };
169
- const createRevisionFrom = async (initialModel, params) => {
170
- const {
171
- entry,
172
- storageEntry: initialStorageEntry
173
- } = params;
174
- const model = getStorageOperationsModel(initialModel);
175
- const partitionKey = (0, _keys.createPartitionKey)({
176
- id: entry.id,
177
- locale: model.locale,
178
- tenant: model.tenant
179
- });
180
- const storageEntry = convertToStorageEntry({
181
- storageEntry: initialStorageEntry,
182
- model
183
- });
184
-
185
- /**
186
- * We need to:
187
- * - create the main entry item
188
- * - update the latest entry item to the current one
189
- * - if the entry's status was set to "published":
190
- * - update the published entry item to the current one
191
- * - unpublish previously published revision (if any)
192
- */
193
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
194
- entity,
195
- put: [{
196
- ...storageEntry,
197
- PK: partitionKey,
198
- SK: (0, _keys.createRevisionSortKey)(storageEntry),
199
- TYPE: createType(),
200
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
201
- GSI1_SK: (0, _keys.createGSISortKey)(storageEntry)
202
- }, {
203
- ...storageEntry,
204
- PK: partitionKey,
205
- SK: (0, _keys.createLatestSortKey)(),
206
- TYPE: createLatestType(),
207
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
208
- GSI1_SK: (0, _keys.createGSISortKey)(storageEntry)
209
- }]
210
- });
211
- const isPublished = entry.status === "published";
212
- if (isPublished) {
213
- entityBatch.put({
214
- ...storageEntry,
215
- PK: partitionKey,
216
- SK: (0, _keys.createPublishedSortKey)(),
217
- TYPE: createPublishedType(),
218
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "P"),
219
- GSI1_SK: (0, _keys.createGSISortKey)(storageEntry)
220
- });
221
-
222
- // Unpublish previously published revision (if any).
223
- const [publishedRevisionStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
224
- model,
225
- ids: [entry.id]
226
- });
227
- if (publishedRevisionStorageEntry) {
228
- entityBatch.put({
229
- ...publishedRevisionStorageEntry,
230
- PK: partitionKey,
231
- SK: (0, _keys.createRevisionSortKey)(publishedRevisionStorageEntry),
232
- TYPE: createType(),
233
- status: _types.CONTENT_ENTRY_STATUS.UNPUBLISHED,
234
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
235
- GSI1_SK: (0, _keys.createGSISortKey)(publishedRevisionStorageEntry)
236
- });
237
- }
238
- }
239
- try {
240
- await entityBatch.execute();
241
- dataLoaders.clearAll({
242
- model
243
- });
244
- } catch (ex) {
245
- throw new _error.default(ex.message || "Could not create revision from given entry.", ex.code || "CREATE_REVISION_ERROR", {
246
- error: ex,
247
- entry,
248
- storageEntry
249
- });
250
- }
251
- /**
252
- * There are no modifications on the entry created so just return the data.
253
- */
254
- return initialStorageEntry;
255
- };
256
- const update = async (initialModel, params) => {
257
- const {
258
- entry,
259
- storageEntry: initialStorageEntry
260
- } = params;
261
- const model = getStorageOperationsModel(initialModel);
262
- const partitionKey = (0, _keys.createPartitionKey)({
263
- id: entry.id,
264
- locale: model.locale,
265
- tenant: model.tenant
266
- });
267
- const isPublished = entry.status === "published";
268
- const locked = isPublished ? true : entry.locked;
269
- const storageEntry = convertToStorageEntry({
270
- model,
271
- storageEntry: initialStorageEntry
272
- });
273
- /**
274
- * We need to:
275
- * - update the current entry
276
- * - update the latest entry if the current entry is the latest one
277
- */
278
-
279
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
280
- entity,
281
- put: [{
282
- ...storageEntry,
283
- locked,
284
- PK: partitionKey,
285
- SK: (0, _keys.createRevisionSortKey)(storageEntry),
286
- TYPE: createType(),
287
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
288
- GSI1_SK: (0, _keys.createGSISortKey)(storageEntry)
289
- }]
290
- });
291
- if (isPublished) {
292
- entityBatch.put({
293
- ...storageEntry,
294
- locked,
295
- PK: partitionKey,
296
- SK: (0, _keys.createPublishedSortKey)(),
297
- TYPE: createPublishedType(),
298
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "P"),
299
- GSI1_SK: (0, _keys.createGSISortKey)(storageEntry)
300
- });
301
- }
302
-
303
- /**
304
- * We need the latest entry to update it as well if necessary.
305
- */
306
- const latestStorageEntry = await getLatestRevisionByEntryId(model, entry);
307
- if (latestStorageEntry) {
308
- const updatingLatestRevision = latestStorageEntry.id === entry.id;
309
- if (updatingLatestRevision) {
310
- entityBatch.put({
311
- ...storageEntry,
312
- locked,
313
- PK: partitionKey,
314
- SK: (0, _keys.createLatestSortKey)(),
315
- TYPE: createLatestType(),
316
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
317
- GSI1_SK: (0, _keys.createGSISortKey)(entry)
318
- });
319
- } else {
320
- /**
321
- * If not updating latest revision, we still want to update the latest revision's
322
- * entry-level meta fields to match the current revision's entry-level meta fields.
323
- */
324
- const updatedEntryLevelMetaFields = (0, _constants.pickEntryMetaFields)(entry, _constants.isEntryLevelEntryMetaField);
325
-
326
- /**
327
- * First we update the regular DynamoDB table. Two updates are needed:
328
- * - one for the actual revision record
329
- * - one for the latest record
330
- */
331
- entityBatch.put({
332
- ...latestStorageEntry,
333
- ...updatedEntryLevelMetaFields,
334
- PK: partitionKey,
335
- SK: (0, _keys.createRevisionSortKey)(latestStorageEntry),
336
- TYPE: createType(),
337
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
338
- GSI1_SK: (0, _keys.createGSISortKey)(latestStorageEntry)
339
- });
340
- entityBatch.put({
341
- ...latestStorageEntry,
342
- ...updatedEntryLevelMetaFields,
343
- PK: partitionKey,
344
- SK: (0, _keys.createLatestSortKey)(),
345
- TYPE: createLatestType(),
346
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
347
- GSI1_SK: (0, _keys.createGSISortKey)(latestStorageEntry)
348
- });
349
- }
350
- }
351
- try {
352
- await entityBatch.execute();
353
- dataLoaders.clearAll({
354
- model
355
- });
356
- return initialStorageEntry;
357
- } catch (ex) {
358
- throw new _error.default(ex.message || "Could not update entry.", ex.code || "UPDATE_ERROR", {
359
- error: ex,
360
- entry,
361
- latestStorageEntry
362
- });
363
- }
364
- };
365
- const move = async (initialModel, id, folderId) => {
366
- /**
367
- * We need to:
368
- * - load all the revisions of the entry, including published and latest
369
- * - update all the revisions (published and latest ) of the entry with new folderId
370
- */
371
- const model = getStorageOperationsModel(initialModel);
372
- /**
373
- * First we need to load all the revisions and published / latest entry.
374
- */
375
- const queryAllParams = {
376
- entity,
377
- partitionKey: (0, _keys.createPartitionKey)({
378
- id,
379
- locale: model.locale,
380
- tenant: model.tenant
381
- }),
382
- options: {
383
- gte: " "
384
- }
385
- };
386
- const records = await (0, _dbDynamodb.queryAll)(queryAllParams);
387
- /**
388
- * Then create the batch writes for the DynamoDB, with the updated folderId.
389
- */
390
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
391
- entity,
392
- put: records.map(item => {
393
- return {
394
- ...item,
395
- location: {
396
- ...item.location,
397
- folderId
398
- }
399
- };
400
- })
401
- });
402
-
403
- /**
404
- * And finally write it...
405
- */
406
- try {
407
- await entityBatch.execute();
408
- } catch (ex) {
409
- throw _error.default.from(ex, {
410
- message: "Could not move records to a new folder.",
411
- data: {
412
- id,
413
- folderId
414
- }
415
- });
416
- }
417
- };
418
- const moveToBin = async (initialModel, params) => {
419
- const {
420
- entry,
421
- storageEntry: initialStorageEntry
422
- } = params;
423
- const model = getStorageOperationsModel(initialModel);
424
-
425
- /**
426
- * First we need to load all the revisions and published / latest entries.
427
- */
428
- const queryAllParams = {
429
- entity,
430
- partitionKey: (0, _keys.createPartitionKey)({
431
- id: entry.id,
432
- locale: model.locale,
433
- tenant: model.tenant
434
- }),
435
- options: {
436
- gte: " "
437
- }
438
- };
439
- let records = [];
440
- try {
441
- records = await (0, _dbDynamodb.queryAll)(queryAllParams);
442
- } catch (ex) {
443
- throw new _error.default(ex.message || "Could not load all records.", ex.code || "LOAD_ALL_RECORDS_ERROR", {
444
- error: ex,
445
- id: entry.id
446
- });
447
- }
448
- if (records.length === 0) {
449
- return;
450
- }
451
- const storageEntry = convertToStorageEntry({
452
- model,
453
- storageEntry: initialStorageEntry
454
- });
455
-
456
- /**
457
- * Let's pick the `deleted` meta fields from the storage entry.
458
- */
459
- const updatedDeletedMetaFields = (0, _constants.pickEntryMetaFields)(storageEntry, _constants.isDeletedEntryMetaField);
460
-
461
- /**
462
- * Then create the batch writes for the DynamoDB, with the updated data.
463
- */
464
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
465
- entity,
466
- put: records.map(record => {
467
- return {
468
- ...record,
469
- ...updatedDeletedMetaFields,
470
- wbyDeleted: storageEntry.wbyDeleted,
471
- location: storageEntry.location,
472
- binOriginalFolderId: storageEntry.binOriginalFolderId
473
- };
474
- })
475
- });
476
- /**
477
- * And finally write it...
478
- */
479
- try {
480
- await entityBatch.execute();
481
- } catch (ex) {
482
- throw new _error.default(ex.message || "Could not move the entry to the bin.", ex.code || "MOVE_ENTRY_TO_BIN_ERROR", {
483
- error: ex,
484
- entry,
485
- storageEntry
486
- });
487
- }
488
- };
489
- const deleteEntry = async (initialModel, params) => {
490
- const {
491
- entry
492
- } = params;
493
- const id = entry.id || entry.entryId;
494
- const model = getStorageOperationsModel(initialModel);
495
- const queryAllParams = {
496
- entity,
497
- partitionKey: (0, _keys.createPartitionKey)({
498
- id,
499
- locale: model.locale,
500
- tenant: model.tenant
501
- }),
502
- options: {
503
- gte: " "
504
- }
505
- };
506
- let records = [];
507
- try {
508
- records = await (0, _dbDynamodb.queryAll)(queryAllParams);
509
- } catch (ex) {
510
- throw new _error.default(ex.message || "Could not load all records.", ex.code || "LOAD_ALL_RECORDS_ERROR", {
511
- error: ex,
512
- id
513
- });
514
- }
515
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
516
- entity,
517
- delete: records.map(item => {
518
- return {
519
- PK: item.PK,
520
- SK: item.SK
521
- };
522
- })
523
- });
524
- try {
525
- await entityBatch.execute();
526
- dataLoaders.clearAll({
527
- model
528
- });
529
- } catch (ex) {
530
- throw new _error.default(ex.message || "Could not delete the entry.", ex.code || "DELETE_ENTRY_ERROR", {
531
- error: ex,
532
- partitionKey: queryAllParams.partitionKey,
533
- id
534
- });
535
- }
536
- };
537
- const restoreFromBin = async (initialModel, params) => {
538
- const {
539
- entry,
540
- storageEntry: initialStorageEntry
541
- } = params;
542
- const model = getStorageOperationsModel(initialModel);
543
-
544
- /**
545
- * First we need to load all the revisions and published / latest entries.
546
- */
547
- const queryAllParams = {
548
- entity,
549
- partitionKey: (0, _keys.createPartitionKey)({
550
- id: entry.id,
551
- locale: model.locale,
552
- tenant: model.tenant
553
- }),
554
- options: {
555
- gte: " "
556
- }
557
- };
558
- let records = [];
559
- try {
560
- records = await (0, _dbDynamodb.queryAll)(queryAllParams);
561
- } catch (ex) {
562
- throw new _error.default(ex.message || "Could not load all records.", ex.code || "LOAD_ALL_RECORDS_ERROR", {
563
- error: ex,
564
- id: entry.id
565
- });
566
- }
567
- if (records.length === 0) {
568
- return initialStorageEntry;
569
- }
570
- const storageEntry = convertToStorageEntry({
571
- model,
572
- storageEntry: initialStorageEntry
573
- });
574
-
575
- /**
576
- * Let's pick the `restored` meta fields from the storage entry.
577
- */
578
- const updatedRestoredMetaFields = (0, _constants.pickEntryMetaFields)(storageEntry, _constants.isRestoredEntryMetaField);
579
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
580
- entity,
581
- put: records.map(record => {
582
- return {
583
- ...record,
584
- ...updatedRestoredMetaFields,
585
- wbyDeleted: storageEntry.wbyDeleted,
586
- location: storageEntry.location,
587
- binOriginalFolderId: storageEntry.binOriginalFolderId
588
- };
589
- })
590
- });
591
-
592
- /**
593
- * And finally write it...
594
- */
595
- try {
596
- await entityBatch.execute();
597
- dataLoaders.clearAll({
598
- model
599
- });
600
- return initialStorageEntry;
601
- } catch (ex) {
602
- throw new _error.default(ex.message || "Could not restore the entry from the bin.", ex.code || "RESTORE_ENTRY_ERROR", {
603
- error: ex,
604
- entry,
605
- storageEntry
606
- });
607
- }
608
- };
609
- const deleteRevision = async (initialModel, params) => {
610
- const {
611
- entry,
612
- latestEntry,
613
- latestStorageEntry: initialLatestStorageEntry
614
- } = params;
615
- const model = getStorageOperationsModel(initialModel);
616
- const partitionKey = (0, _keys.createPartitionKey)({
617
- id: entry.id,
618
- locale: model.locale,
619
- tenant: model.tenant
620
- });
621
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
622
- entity,
623
- delete: [{
624
- PK: partitionKey,
625
- SK: (0, _keys.createRevisionSortKey)(entry)
626
- }]
627
- });
628
- const publishedStorageEntry = await getPublishedRevisionByEntryId(model, entry);
629
-
630
- /**
631
- * If revision we are deleting is the published one as well, we need to delete those records as well.
632
- */
633
- if (publishedStorageEntry && entry.id === publishedStorageEntry.id) {
634
- entityBatch.delete({
635
- PK: partitionKey,
636
- SK: (0, _keys.createPublishedSortKey)()
637
- });
638
- }
639
- if (initialLatestStorageEntry) {
640
- const latestStorageEntry = convertToStorageEntry({
641
- storageEntry: initialLatestStorageEntry,
642
- model
643
- });
644
- entityBatch.put({
645
- ...latestStorageEntry,
646
- PK: partitionKey,
647
- SK: (0, _keys.createLatestSortKey)(),
648
- TYPE: createLatestType(),
649
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
650
- GSI1_SK: (0, _keys.createGSISortKey)(latestStorageEntry)
651
- });
652
-
653
- // Do an update on the latest revision. We need to update the latest revision's
654
- // entry-level meta fields to match the previous revision's entry-level meta fields.
655
- entityBatch.put({
656
- ...latestStorageEntry,
657
- PK: partitionKey,
658
- SK: (0, _keys.createRevisionSortKey)(initialLatestStorageEntry),
659
- TYPE: createType(),
660
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
661
- GSI1_SK: (0, _keys.createGSISortKey)(initialLatestStorageEntry)
662
- });
663
- }
664
- try {
665
- entityBatch.execute();
666
- dataLoaders.clearAll({
667
- model
668
- });
669
- } catch (ex) {
670
- throw new _error.default(ex.message, ex.code, {
671
- error: ex,
672
- entry,
673
- latestEntry
674
- });
675
- }
676
- };
677
- const deleteMultipleEntries = async (initialModel, params) => {
678
- const {
679
- entries
680
- } = params;
681
- const model = getStorageOperationsModel(initialModel);
682
- /**
683
- * First we need all the revisions of the entries we want to delete.
684
- */
685
- const revisions = await dataLoaders.getAllEntryRevisions({
686
- model,
687
- ids: entries
688
- });
689
- /**
690
- * Then we need to construct the queries for all the revisions and entries.
691
- */
692
-
693
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
694
- entity
695
- });
696
- for (const id of entries) {
697
- const partitionKey = (0, _keys.createPartitionKey)({
698
- id,
699
- locale: model.locale,
700
- tenant: model.tenant
701
- });
702
- entityBatch.delete({
703
- PK: partitionKey,
704
- SK: "L"
705
- });
706
- entityBatch.delete({
707
- PK: partitionKey,
708
- SK: "P"
709
- });
710
- }
711
- /**
712
- * Exact revisions of all the entries
713
- */
714
- for (const revision of revisions) {
715
- entityBatch.delete({
716
- PK: (0, _keys.createPartitionKey)({
717
- id: revision.id,
718
- locale: model.locale,
719
- tenant: model.tenant
720
- }),
721
- SK: (0, _keys.createRevisionSortKey)({
722
- version: revision.version
723
- })
724
- });
725
- }
726
- await entityBatch.execute();
727
- };
728
- const getLatestRevisionByEntryId = async (initialModel, params) => {
729
- const model = getStorageOperationsModel(initialModel);
730
- const items = await dataLoaders.getLatestRevisionByEntryId({
731
- model,
732
- ids: [params.id]
733
- });
734
- const item = items.shift() || null;
735
- if (!item) {
736
- return null;
737
- }
738
- return convertFromStorageEntry({
739
- storageEntry: item,
740
- model
741
- });
742
- };
743
- const getPublishedRevisionByEntryId = async (initialModel, params) => {
744
- const model = getStorageOperationsModel(initialModel);
745
- const items = await dataLoaders.getPublishedRevisionByEntryId({
746
- model,
747
- ids: [params.id]
748
- });
749
- const item = items.shift() || null;
750
- if (!item) {
751
- return null;
752
- }
753
- return convertFromStorageEntry({
754
- storageEntry: item,
755
- model
756
- });
757
- };
758
- const getRevisionById = async (initialModel, params) => {
759
- const model = getStorageOperationsModel(initialModel);
760
- const items = await dataLoaders.getRevisionById({
761
- model,
762
- ids: [params.id]
763
- });
764
- const item = items.shift() || null;
765
- if (!item) {
766
- return null;
767
- }
768
- return convertFromStorageEntry({
769
- storageEntry: item,
770
- model
771
- });
772
- };
773
- const getRevisions = async (initialModel, params) => {
774
- const model = getStorageOperationsModel(initialModel);
775
- const items = await dataLoaders.getAllEntryRevisions({
776
- model,
777
- ids: [params.id]
778
- });
779
- return items.map(item => {
780
- return convertFromStorageEntry({
781
- storageEntry: item,
782
- model
783
- });
784
- });
785
- };
786
- const getByIds = async (initialModel, params) => {
787
- const model = getStorageOperationsModel(initialModel);
788
- const items = await dataLoaders.getRevisionById({
789
- model,
790
- ids: params.ids
791
- });
792
- return items.map(item => {
793
- return convertFromStorageEntry({
794
- storageEntry: item,
795
- model
796
- });
797
- });
798
- };
799
- const getLatestByIds = async (initialModel, params) => {
800
- const model = getStorageOperationsModel(initialModel);
801
- const items = await dataLoaders.getLatestRevisionByEntryId({
802
- model,
803
- ids: params.ids
804
- });
805
- return items.map(item => {
806
- return convertFromStorageEntry({
807
- storageEntry: item,
808
- model
809
- });
810
- });
811
- };
812
- const getPublishedByIds = async (initialModel, params) => {
813
- const model = getStorageOperationsModel(initialModel);
814
- const items = await dataLoaders.getPublishedRevisionByEntryId({
815
- model,
816
- ids: params.ids
817
- });
818
- return items.map(item => {
819
- return convertFromStorageEntry({
820
- storageEntry: item,
821
- model
822
- });
823
- });
824
- };
825
- const getPreviousRevision = async (initialModel, params) => {
826
- const model = getStorageOperationsModel(initialModel);
827
- const {
828
- entryId,
829
- version
830
- } = params;
831
- const queryParams = {
832
- entity,
833
- partitionKey: (0, _keys.createPartitionKey)({
834
- tenant: model.tenant,
835
- locale: model.locale,
836
- id: entryId
837
- }),
838
- options: {
839
- lt: `REV#${(0, _zeroPad.zeroPad)(version)}`,
840
- /**
841
- * We need to have extra checks because DynamoDB will return published or latest record if there is no REV# record.
842
- */
843
- filters: [{
844
- attr: "TYPE",
845
- eq: createType()
846
- }, {
847
- attr: "version",
848
- lt: version
849
- }],
850
- reverse: true
851
- }
852
- };
853
- try {
854
- const result = await (0, _dbDynamodb.queryOne)(queryParams);
855
- const storageEntry = (0, _dbDynamodb.cleanupItem)(entity, result);
856
- if (!storageEntry) {
857
- return null;
858
- }
859
- return convertFromStorageEntry({
860
- storageEntry,
861
- model
862
- });
863
- } catch (ex) {
864
- throw new _error.default(ex.message || "Could not get previous version of given entry.", ex.code || "GET_PREVIOUS_VERSION_ERROR", {
865
- ...params,
866
- error: ex,
867
- partitionKey: queryParams.partitionKey,
868
- options: queryParams.options,
869
- model
870
- });
871
- }
872
- };
873
- const list = async (initialModel, params) => {
874
- const model = getStorageOperationsModel(initialModel);
875
- const {
876
- limit: initialLimit = 10,
877
- where: initialWhere,
878
- after,
879
- sort: sortBy,
880
- fields,
881
- search
882
- } = params;
883
- const limit = initialLimit <= 0 || initialLimit >= MAX_LIST_LIMIT ? MAX_LIST_LIMIT : initialLimit;
884
- const type = initialWhere.published ? "P" : "L";
885
- const queryAllParams = {
886
- entity,
887
- partitionKey: (0, _keys.createGSIPartitionKey)(model, type),
888
- options: {
889
- index: "GSI1",
890
- gte: " "
891
- }
892
- };
893
- let storageEntries = [];
894
- try {
895
- storageEntries = await (0, _dbDynamodb.queryAll)(queryAllParams);
896
- } catch (ex) {
897
- throw new _error.default(ex.message, "QUERY_ENTRIES_ERROR", {
898
- error: ex,
899
- partitionKey: queryAllParams.partitionKey,
900
- options: queryAllParams.options
901
- });
902
- }
903
- if (storageEntries.length === 0) {
904
- return {
905
- hasMoreItems: false,
906
- totalCount: 0,
907
- cursor: null,
908
- items: []
909
- };
910
- }
911
- const where = {
912
- ...initialWhere
913
- };
914
- delete where["published"];
915
- delete where["latest"];
916
- /**
917
- * We need an object containing field, transformers and paths.
918
- * Just build it here and pass on into other methods that require it to avoid mapping multiple times.
919
- */
920
- const modelFields = (0, _createFields.createFields)({
921
- plugins,
922
- fields: model.fields
923
- });
924
- const fromStorage = createStorageTransformCallable(model);
925
- /**
926
- * Let's transform records from storage ones to regular ones, so we do not need to do it later.
927
- *
928
- * This is always being done, but at least its in parallel.
929
- */
930
- const records = await Promise.all(storageEntries.map(async storageEntry => {
931
- const entry = convertFromStorageEntry({
932
- storageEntry,
933
- model
934
- });
935
- for (const field of model.fields) {
936
- entry.values[field.fieldId] = await fromStorage(field, entry.values[field.fieldId]);
937
- }
938
- return entry;
939
- }));
940
- /**
941
- * Filter the read items via the code.
942
- * It will build the filters out of the where input and transform the values it is using.
943
- */
944
- const filteredItems = (0, _filtering.filter)({
945
- items: records,
946
- where,
947
- plugins,
948
- fields: modelFields,
949
- fullTextSearch: {
950
- term: search,
951
- fields: fields || []
952
- }
953
- });
954
- const totalCount = filteredItems.length;
955
-
956
- /**
957
- * Sorting is also done via the code.
958
- * It takes the sort input and sorts by it via the lodash sortBy method.
959
- */
960
- const sortedItems = (0, _filtering.sort)({
961
- model,
962
- plugins,
963
- items: filteredItems,
964
- sort: sortBy,
965
- fields: modelFields
966
- });
967
- const start = parseInt((0, _cursor.decodeCursor)(after) || "0") || 0;
968
- const hasMoreItems = totalCount > start + limit;
969
- const end = limit > totalCount + start + limit ? undefined : start + limit;
970
- const slicedItems = sortedItems.slice(start, end);
971
- /**
972
- * Although we do not need a cursor here, we will use it as such to keep it standardized.
973
- * Number is simply encoded.
974
- */
975
- const cursor = (0, _cursor.encodeCursor)(`${start + limit}`);
976
- return {
977
- hasMoreItems,
978
- totalCount,
979
- cursor,
980
- items: (0, _dbDynamodb.cleanupItems)(entity, slicedItems)
981
- };
982
- };
983
- const get = async (initialModel, params) => {
984
- const model = getStorageOperationsModel(initialModel);
985
- const {
986
- items
987
- } = await list(model, {
988
- ...params,
989
- limit: 1
990
- });
991
- return items.shift() || null;
992
- };
993
- const publish = async (initialModel, params) => {
994
- const {
995
- entry,
996
- storageEntry: initialStorageEntry
997
- } = params;
998
- const model = getStorageOperationsModel(initialModel);
999
- const partitionKey = (0, _keys.createPartitionKey)({
1000
- id: entry.id,
1001
- locale: model.locale,
1002
- tenant: model.tenant
1003
- });
1004
-
1005
- /**
1006
- * We need the latest and published entries to see if something needs to be updated alongside the publishing one.
1007
- */
1008
- const initialLatestStorageEntry = await getLatestRevisionByEntryId(model, entry);
1009
- if (!initialLatestStorageEntry) {
1010
- throw new _error.default(`Could not publish entry. Could not load latest ("L") record.`, "PUBLISH_ERROR", {
1011
- entry
1012
- });
1013
- }
1014
- const initialPublishedStorageEntry = await getPublishedRevisionByEntryId(model, entry);
1015
- const storageEntry = convertToStorageEntry({
1016
- model,
1017
- storageEntry: initialStorageEntry
1018
- });
1019
-
1020
- // 1. Update REV# and P records with new data.
1021
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
1022
- entity,
1023
- put: [{
1024
- ...storageEntry,
1025
- PK: partitionKey,
1026
- SK: (0, _keys.createRevisionSortKey)(entry),
1027
- TYPE: createType(),
1028
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
1029
- GSI1_SK: (0, _keys.createGSISortKey)(entry)
1030
- }, {
1031
- ...storageEntry,
1032
- PK: partitionKey,
1033
- SK: (0, _keys.createPublishedSortKey)(),
1034
- TYPE: createPublishedType(),
1035
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "P"),
1036
- GSI1_SK: (0, _keys.createGSISortKey)(entry)
1037
- }]
1038
- });
1039
-
1040
- // 2. When it comes to the latest record, we need to perform a couple of different
1041
- // updates, based on whether the entry being published is the latest revision or not.
1042
- const publishedRevisionId = initialPublishedStorageEntry?.id;
1043
- const publishingLatestRevision = entry.id === initialLatestStorageEntry.id;
1044
- if (publishingLatestRevision) {
1045
- // 2.1 If we're publishing the latest revision, we first need to update the L record.
1046
- entityBatch.put({
1047
- ...storageEntry,
1048
- PK: partitionKey,
1049
- SK: (0, _keys.createLatestSortKey)(),
1050
- TYPE: createLatestType(),
1051
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
1052
- GSI1_SK: (0, _keys.createGSISortKey)(entry)
1053
- });
1054
-
1055
- // 2.2 Additionally, if we have a previously published entry, we need to mark it as unpublished.
1056
- if (publishedRevisionId && publishedRevisionId !== entry.id) {
1057
- const publishedStorageEntry = convertToStorageEntry({
1058
- storageEntry: initialPublishedStorageEntry,
1059
- model
1060
- });
1061
- entityBatch.put({
1062
- ...publishedStorageEntry,
1063
- PK: partitionKey,
1064
- SK: (0, _keys.createRevisionSortKey)(publishedStorageEntry),
1065
- TYPE: createType(),
1066
- status: _types.CONTENT_ENTRY_STATUS.UNPUBLISHED,
1067
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
1068
- GSI1_SK: (0, _keys.createGSISortKey)(publishedStorageEntry)
1069
- });
1070
- }
1071
- } else {
1072
- // 2.3 If the published revision is not the latest one, the situation is a bit
1073
- // more complex. We first need to update the L and REV# records with the new
1074
- // values of *only entry-level* meta fields.
1075
- const updatedEntryLevelMetaFields = (0, _constants.pickEntryMetaFields)(entry, _constants.isEntryLevelEntryMetaField);
1076
- const latestStorageEntry = convertToStorageEntry({
1077
- storageEntry: initialLatestStorageEntry,
1078
- model
1079
- });
1080
-
1081
- // 2.3.1 Update L record. Apart from updating the entry-level meta fields, we also need
1082
- // to change the status from "published" to "unpublished" (if the status is set to "published").
1083
- let latestRevisionStatus = latestStorageEntry.status;
1084
- if (latestRevisionStatus === _types.CONTENT_ENTRY_STATUS.PUBLISHED) {
1085
- latestRevisionStatus = _types.CONTENT_ENTRY_STATUS.UNPUBLISHED;
1086
- }
1087
- const latestStorageEntryFields = {
1088
- ...latestStorageEntry,
1089
- ...updatedEntryLevelMetaFields,
1090
- status: latestRevisionStatus
1091
- };
1092
- entityBatch.put({
1093
- ...latestStorageEntryFields,
1094
- PK: partitionKey,
1095
- SK: (0, _keys.createLatestSortKey)(),
1096
- TYPE: createLatestType(),
1097
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
1098
- GSI1_SK: (0, _keys.createGSISortKey)(latestStorageEntry)
1099
- });
1100
-
1101
- // 2.3.2 Update REV# record.
1102
- entityBatch.put({
1103
- ...latestStorageEntryFields,
1104
- PK: partitionKey,
1105
- SK: (0, _keys.createRevisionSortKey)(latestStorageEntry),
1106
- TYPE: createType(),
1107
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
1108
- GSI1_SK: (0, _keys.createGSISortKey)(latestStorageEntry)
1109
- });
1110
-
1111
- // 2.3.3 Finally, if we got a published entry, but it wasn't the latest one, we need to take
1112
- // an extra step and mark it as unpublished.
1113
- const publishedRevisionDifferentFromLatest = publishedRevisionId && publishedRevisionId !== latestStorageEntry.id;
1114
- if (publishedRevisionDifferentFromLatest) {
1115
- const publishedStorageEntry = convertToStorageEntry({
1116
- storageEntry: initialPublishedStorageEntry,
1117
- model
1118
- });
1119
- entityBatch.put({
1120
- ...publishedStorageEntry,
1121
- PK: partitionKey,
1122
- SK: (0, _keys.createRevisionSortKey)(publishedStorageEntry),
1123
- TYPE: createType(),
1124
- status: _types.CONTENT_ENTRY_STATUS.UNPUBLISHED,
1125
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
1126
- GSI1_SK: (0, _keys.createGSISortKey)(publishedStorageEntry)
1127
- });
1128
- }
1129
- }
1130
- try {
1131
- await entityBatch.execute();
1132
- dataLoaders.clearAll({
1133
- model
1134
- });
1135
- return initialStorageEntry;
1136
- } catch (ex) {
1137
- throw new _error.default(ex.message || "Could not execute the publishing batch.", ex.code || "PUBLISH_ERROR", {
1138
- entry,
1139
- latestStorageEntry: initialLatestStorageEntry,
1140
- publishedStorageEntry: initialPublishedStorageEntry
1141
- });
1142
- }
1143
- };
1144
- const unpublish = async (initialModel, params) => {
1145
- const {
1146
- entry,
1147
- storageEntry: initialStorageEntry
1148
- } = params;
1149
- const model = getStorageOperationsModel(initialModel);
1150
- const partitionKey = (0, _keys.createPartitionKey)({
1151
- id: entry.id,
1152
- locale: model.locale,
1153
- tenant: model.tenant
1154
- });
1155
- const storageEntry = convertToStorageEntry({
1156
- storageEntry: initialStorageEntry,
1157
- model
1158
- });
1159
- /**
1160
- * We need to:
1161
- * - delete currently published entry
1162
- * - update current entry revision with new data
1163
- * - update the latest entry status - if entry being unpublished is latest
1164
- */
1165
- const entityBatch = (0, _dbDynamodb.createEntityWriteBatch)({
1166
- entity,
1167
- delete: [{
1168
- PK: partitionKey,
1169
- SK: (0, _keys.createPublishedSortKey)()
1170
- }],
1171
- put: [{
1172
- ...storageEntry,
1173
- PK: partitionKey,
1174
- SK: (0, _keys.createRevisionSortKey)(entry),
1175
- TYPE: createType(),
1176
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
1177
- GSI1_SK: (0, _keys.createGSISortKey)(entry)
1178
- }]
1179
- });
1180
-
1181
- /**
1182
- * We need the latest entry to see if something needs to be updated alongside the unpublishing one.
1183
- */
1184
- const initialLatestStorageEntry = await getLatestRevisionByEntryId(model, entry);
1185
- if (initialLatestStorageEntry) {
1186
- const unpublishingLatestRevision = entry.id === initialLatestStorageEntry.id;
1187
- if (unpublishingLatestRevision) {
1188
- entityBatch.put({
1189
- ...storageEntry,
1190
- PK: partitionKey,
1191
- SK: (0, _keys.createLatestSortKey)(),
1192
- TYPE: createLatestType(),
1193
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
1194
- GSI1_SK: (0, _keys.createGSISortKey)(entry)
1195
- });
1196
- } else {
1197
- const latestStorageEntry = convertToStorageEntry({
1198
- storageEntry: initialLatestStorageEntry,
1199
- model
1200
- });
1201
-
1202
- // If the unpublished revision is not the latest one, we still need to
1203
- // update the latest record with the new values of entry-level meta fields.
1204
- const updatedEntryLevelMetaFields = (0, _constants.pickEntryMetaFields)(entry, _constants.isEntryLevelEntryMetaField);
1205
-
1206
- // 1. Update actual revision record.
1207
- entityBatch.put({
1208
- ...latestStorageEntry,
1209
- ...updatedEntryLevelMetaFields,
1210
- PK: partitionKey,
1211
- SK: (0, _keys.createRevisionSortKey)(latestStorageEntry),
1212
- TYPE: createType(),
1213
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "A"),
1214
- GSI1_SK: (0, _keys.createGSISortKey)(latestStorageEntry)
1215
- });
1216
-
1217
- // 2. Update latest record.
1218
- entityBatch.put({
1219
- ...latestStorageEntry,
1220
- ...updatedEntryLevelMetaFields,
1221
- PK: partitionKey,
1222
- SK: (0, _keys.createLatestSortKey)(),
1223
- TYPE: createLatestType(),
1224
- GSI1_PK: (0, _keys.createGSIPartitionKey)(model, "L"),
1225
- GSI1_SK: (0, _keys.createGSISortKey)(latestStorageEntry)
1226
- });
1227
- }
1228
- }
1229
- try {
1230
- await entityBatch.execute();
1231
- dataLoaders.clearAll({
1232
- model
1233
- });
1234
- return initialStorageEntry;
1235
- } catch (ex) {
1236
- throw new _error.default(ex.message || "Could not execute unpublish batch.", ex.code || "UNPUBLISH_ERROR", {
1237
- entry,
1238
- storageEntry
1239
- });
1240
- }
1241
- };
1242
- const getUniqueFieldValues = async (model, params) => {
1243
- const {
1244
- where,
1245
- fieldId
1246
- } = params;
1247
- const field = model.fields.find(f => f.fieldId === fieldId);
1248
- if (!field) {
1249
- throw new _error.default(`Could not find field with given "fieldId" value.`, "FIELD_NOT_FOUND", {
1250
- fieldId
1251
- });
1252
- }
1253
- const {
1254
- items
1255
- } = await list(model, {
1256
- where,
1257
- limit: MAX_LIST_LIMIT
1258
- });
1259
- const result = {};
1260
- for (const item of items) {
1261
- const fieldValue = item.values[field.fieldId];
1262
- if (!fieldValue) {
1263
- continue;
1264
- }
1265
- const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue];
1266
- if (values.length === 0) {
1267
- continue;
1268
- }
1269
- for (const value of values) {
1270
- result[value] = {
1271
- value,
1272
- count: (result[value]?.count || 0) + 1
1273
- };
1274
- }
1275
- }
1276
- return Object.values(result).sort((a, b) => a.value > b.value ? 1 : b.value > a.value ? -1 : 0).sort((a, b) => b.count - a.count);
1277
- };
1278
- return {
1279
- create,
1280
- createRevisionFrom,
1281
- update,
1282
- move,
1283
- delete: deleteEntry,
1284
- moveToBin,
1285
- restoreFromBin,
1286
- deleteRevision,
1287
- deleteMultipleEntries,
1288
- getPreviousRevision,
1289
- getPublishedByIds,
1290
- getLatestByIds,
1291
- getByIds,
1292
- getRevisionById,
1293
- getPublishedRevisionByEntryId,
1294
- getLatestRevisionByEntryId,
1295
- get,
1296
- getRevisions,
1297
- publish,
1298
- list,
1299
- unpublish,
1300
- dataLoaders,
1301
- getUniqueFieldValues
1302
- };
1303
- };
1304
- exports.createEntriesStorageOperations = createEntriesStorageOperations;
1305
-
1306
- //# sourceMappingURL=index.js.map