@webiny/api-headless-cms 0.0.0-unstable.da99e0b846 → 0.0.0-unstable.de38392959

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 (542) hide show
  1. package/constants.d.ts +32 -0
  2. package/constants.js +57 -0
  3. package/constants.js.map +1 -0
  4. package/context.js +73 -36
  5. package/context.js.map +1 -1
  6. package/crud/contentEntry/afterDelete.js +3 -1
  7. package/crud/contentEntry/afterDelete.js.map +1 -1
  8. package/crud/contentEntry/beforeCreate.js +3 -1
  9. package/crud/contentEntry/beforeCreate.js.map +1 -1
  10. package/crud/contentEntry/beforeUpdate.js +3 -1
  11. package/crud/contentEntry/beforeUpdate.js.map +1 -1
  12. package/crud/contentEntry/entryDataFactories/createEntryData.d.ts +20 -0
  13. package/crud/contentEntry/entryDataFactories/createEntryData.js +228 -0
  14. package/crud/contentEntry/entryDataFactories/createEntryData.js.map +1 -0
  15. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.d.ts +21 -0
  16. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js +114 -0
  17. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js.map +1 -0
  18. package/crud/contentEntry/entryDataFactories/createPublishEntryData.d.ts +13 -0
  19. package/crud/contentEntry/entryDataFactories/createPublishEntryData.js +61 -0
  20. package/crud/contentEntry/entryDataFactories/createPublishEntryData.js.map +1 -0
  21. package/crud/contentEntry/entryDataFactories/createRepublishEntryData.d.ts +12 -0
  22. package/crud/contentEntry/entryDataFactories/createRepublishEntryData.js +57 -0
  23. package/crud/contentEntry/entryDataFactories/createRepublishEntryData.js.map +1 -0
  24. package/crud/contentEntry/entryDataFactories/createUnpublishEntryData.d.ts +12 -0
  25. package/crud/contentEntry/entryDataFactories/createUnpublishEntryData.js +38 -0
  26. package/crud/contentEntry/entryDataFactories/createUnpublishEntryData.js.map +1 -0
  27. package/crud/contentEntry/entryDataFactories/createUpdateEntryData.d.ts +20 -0
  28. package/crud/contentEntry/entryDataFactories/createUpdateEntryData.js +122 -0
  29. package/crud/contentEntry/entryDataFactories/createUpdateEntryData.js.map +1 -0
  30. package/crud/contentEntry/entryDataFactories/index.d.ts +8 -0
  31. package/crud/contentEntry/entryDataFactories/index.js +95 -0
  32. package/crud/contentEntry/entryDataFactories/index.js.map +1 -0
  33. package/crud/contentEntry/entryDataFactories/mapAndCleanUpdatedInputData.d.ts +5 -0
  34. package/crud/contentEntry/entryDataFactories/mapAndCleanUpdatedInputData.js +36 -0
  35. package/crud/contentEntry/entryDataFactories/mapAndCleanUpdatedInputData.js.map +1 -0
  36. package/crud/contentEntry/entryDataFactories/statuses.d.ts +4 -0
  37. package/crud/contentEntry/entryDataFactories/statuses.js +15 -0
  38. package/crud/contentEntry/entryDataFactories/statuses.js.map +1 -0
  39. package/crud/contentEntry/entryDataValidation.d.ts +4 -2
  40. package/crud/contentEntry/entryDataValidation.js +223 -45
  41. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  42. package/crud/contentEntry/markLockedFields.js +17 -10
  43. package/crud/contentEntry/markLockedFields.js.map +1 -1
  44. package/crud/contentEntry/referenceFieldsMapping.d.ts +6 -0
  45. package/crud/contentEntry/referenceFieldsMapping.js +142 -90
  46. package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  47. package/crud/contentEntry/searchableFields.js +5 -4
  48. package/crud/contentEntry/searchableFields.js.map +1 -1
  49. package/crud/contentEntry.crud.d.ts +4 -3
  50. package/crud/contentEntry.crud.js +557 -463
  51. package/crud/contentEntry.crud.js.map +1 -1
  52. package/crud/contentModel/beforeCreate.d.ts +1 -1
  53. package/crud/contentModel/beforeCreate.js +11 -9
  54. package/crud/contentModel/beforeCreate.js.map +1 -1
  55. package/crud/contentModel/beforeDelete.js +3 -1
  56. package/crud/contentModel/beforeDelete.js.map +1 -1
  57. package/crud/contentModel/beforeUpdate.d.ts +1 -1
  58. package/crud/contentModel/beforeUpdate.js +3 -6
  59. package/crud/contentModel/beforeUpdate.js.map +1 -1
  60. package/crud/contentModel/compatibility/modelApiName.js +3 -1
  61. package/crud/contentModel/compatibility/modelApiName.js.map +1 -1
  62. package/crud/contentModel/contentModelManagerFactory.js +3 -1
  63. package/crud/contentModel/contentModelManagerFactory.js.map +1 -1
  64. package/crud/contentModel/createFieldStorageId.js +3 -1
  65. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  66. package/crud/contentModel/defaultFields.js +3 -1
  67. package/crud/contentModel/defaultFields.js.map +1 -1
  68. package/crud/contentModel/ensureTypeTag.d.ts +5 -0
  69. package/crud/contentModel/ensureTypeTag.js +21 -0
  70. package/crud/contentModel/ensureTypeTag.js.map +1 -0
  71. package/crud/contentModel/fields/descriptionField.js +4 -2
  72. package/crud/contentModel/fields/descriptionField.js.map +1 -1
  73. package/crud/contentModel/fields/imageField.js +6 -8
  74. package/crud/contentModel/fields/imageField.js.map +1 -1
  75. package/crud/contentModel/fields/titleField.js +4 -2
  76. package/crud/contentModel/fields/titleField.js.map +1 -1
  77. package/crud/contentModel/listModelsFromDatabase.d.ts +10 -0
  78. package/crud/contentModel/listModelsFromDatabase.js +38 -0
  79. package/crud/contentModel/listModelsFromDatabase.js.map +1 -0
  80. package/crud/contentModel/validate/endingAllowed.js +3 -1
  81. package/crud/contentModel/validate/endingAllowed.js.map +1 -1
  82. package/crud/contentModel/validate/isModelEndingAllowed.js +4 -2
  83. package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -1
  84. package/crud/contentModel/validate/modelId.js +3 -1
  85. package/crud/contentModel/validate/modelId.js.map +1 -1
  86. package/crud/contentModel/validate/pluralApiName.js +3 -1
  87. package/crud/contentModel/validate/pluralApiName.js.map +1 -1
  88. package/crud/contentModel/validate/singularApiName.js +3 -1
  89. package/crud/contentModel/validate/singularApiName.js.map +1 -1
  90. package/crud/contentModel/validateModel.js +3 -1
  91. package/crud/contentModel/validateModel.js.map +1 -1
  92. package/crud/contentModel/validateModelFields.js +8 -7
  93. package/crud/contentModel/validateModelFields.js.map +1 -1
  94. package/crud/contentModel/validation.d.ts +570 -249
  95. package/crud/contentModel/validation.js +71 -11
  96. package/crud/contentModel/validation.js.map +1 -1
  97. package/crud/contentModel.crud.d.ts +2 -0
  98. package/crud/contentModel.crud.js +146 -181
  99. package/crud/contentModel.crud.js.map +1 -1
  100. package/crud/contentModelGroup/beforeCreate.d.ts +1 -1
  101. package/crud/contentModelGroup/beforeCreate.js +15 -1
  102. package/crud/contentModelGroup/beforeCreate.js.map +1 -1
  103. package/crud/contentModelGroup/beforeDelete.js +3 -1
  104. package/crud/contentModelGroup/beforeDelete.js.map +1 -1
  105. package/crud/contentModelGroup/beforeUpdate.js +3 -1
  106. package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
  107. package/crud/contentModelGroup/listGroupsFromDatabase.d.ts +8 -0
  108. package/crud/contentModelGroup/listGroupsFromDatabase.js +22 -0
  109. package/crud/contentModelGroup/listGroupsFromDatabase.js.map +1 -0
  110. package/crud/contentModelGroup/validation.d.ts +10 -7
  111. package/crud/contentModelGroup/validation.js +5 -2
  112. package/crud/contentModelGroup/validation.js.map +1 -1
  113. package/crud/contentModelGroup.crud.d.ts +3 -1
  114. package/crud/contentModelGroup.crud.js +139 -123
  115. package/crud/contentModelGroup.crud.js.map +1 -1
  116. package/crud/system.crud.js +8 -11
  117. package/crud/system.crud.js.map +1 -1
  118. package/export/crud/exporting.d.ts +3 -0
  119. package/export/crud/exporting.js +49 -0
  120. package/export/crud/exporting.js.map +1 -0
  121. package/export/crud/importing.d.ts +3 -0
  122. package/export/crud/importing.js +79 -0
  123. package/export/crud/importing.js.map +1 -0
  124. package/export/crud/imports/importData.d.ts +14 -0
  125. package/export/crud/imports/importData.js +52 -0
  126. package/export/crud/imports/importData.js.map +1 -0
  127. package/export/crud/imports/importGroups.d.ts +8 -0
  128. package/export/crud/imports/importGroups.js +104 -0
  129. package/export/crud/imports/importGroups.js.map +1 -0
  130. package/export/crud/imports/importModels.d.ts +8 -0
  131. package/export/crud/imports/importModels.js +136 -0
  132. package/export/crud/imports/importModels.js.map +1 -0
  133. package/export/crud/imports/validateGroups.d.ts +8 -0
  134. package/export/crud/imports/validateGroups.js +112 -0
  135. package/export/crud/imports/validateGroups.js.map +1 -0
  136. package/export/crud/imports/validateInput.d.ts +19 -0
  137. package/export/crud/imports/validateInput.js +55 -0
  138. package/export/crud/imports/validateInput.js.map +1 -0
  139. package/export/crud/imports/validateModels.d.ts +12 -0
  140. package/export/crud/imports/validateModels.js +203 -0
  141. package/export/crud/imports/validateModels.js.map +1 -0
  142. package/export/crud/index.d.ts +4 -0
  143. package/export/crud/index.js +15 -0
  144. package/export/crud/index.js.map +1 -0
  145. package/export/crud/sanitize.d.ts +4 -0
  146. package/export/crud/sanitize.js +35 -0
  147. package/export/crud/sanitize.js.map +1 -0
  148. package/export/graphql/index.d.ts +3 -0
  149. package/export/graphql/index.js +188 -0
  150. package/export/graphql/index.js.map +1 -0
  151. package/export/index.d.ts +2 -0
  152. package/export/index.js +29 -0
  153. package/export/index.js.map +1 -0
  154. package/export/types.d.ts +113 -0
  155. package/export/types.js +22 -0
  156. package/export/types.js.map +1 -0
  157. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js +4 -7
  158. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -1
  159. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +5 -8
  160. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
  161. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +47 -38
  162. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  163. package/fieldConverters/index.js +3 -1
  164. package/fieldConverters/index.js.map +1 -1
  165. package/graphql/buildSchemaPlugins.js +7 -1
  166. package/graphql/buildSchemaPlugins.js.map +1 -1
  167. package/graphql/checkEndpointAccess.js +3 -1
  168. package/graphql/checkEndpointAccess.js.map +1 -1
  169. package/graphql/createExecutableSchema.js +3 -1
  170. package/graphql/createExecutableSchema.js.map +1 -1
  171. package/graphql/createRequestBody.js +3 -1
  172. package/graphql/createRequestBody.js.map +1 -1
  173. package/graphql/formatErrorPayload.js +3 -1
  174. package/graphql/formatErrorPayload.js.map +1 -1
  175. package/graphql/generateSchema.js +3 -1
  176. package/graphql/generateSchema.js.map +1 -1
  177. package/graphql/getSchema.d.ts +0 -1
  178. package/graphql/getSchema.js +35 -19
  179. package/graphql/getSchema.js.map +1 -1
  180. package/graphql/graphQLHandlerFactory.js +3 -1
  181. package/graphql/graphQLHandlerFactory.js.map +1 -1
  182. package/graphql/handleRequest.js +3 -5
  183. package/graphql/handleRequest.js.map +1 -1
  184. package/graphql/index.d.ts +1 -1
  185. package/graphql/index.js +4 -2
  186. package/graphql/index.js.map +1 -1
  187. package/graphql/schema/baseContentSchema.js +9 -8
  188. package/graphql/schema/baseContentSchema.js.map +1 -1
  189. package/graphql/schema/baseSchema.d.ts +2 -3
  190. package/graphql/schema/baseSchema.js +95 -2
  191. package/graphql/schema/baseSchema.js.map +1 -1
  192. package/graphql/schema/contentEntries.js +54 -16
  193. package/graphql/schema/contentEntries.js.map +1 -1
  194. package/graphql/schema/contentModelGroups.js +5 -2
  195. package/graphql/schema/contentModelGroups.js.map +1 -1
  196. package/graphql/schema/contentModels.js +10 -10
  197. package/graphql/schema/contentModels.js.map +1 -1
  198. package/graphql/schema/createFieldResolvers.d.ts +1 -1
  199. package/graphql/schema/createFieldResolvers.js +18 -22
  200. package/graphql/schema/createFieldResolvers.js.map +1 -1
  201. package/graphql/schema/createFieldTypePluginRecords.d.ts +3 -0
  202. package/graphql/schema/createFieldTypePluginRecords.js +15 -0
  203. package/graphql/schema/createFieldTypePluginRecords.js.map +1 -0
  204. package/graphql/schema/createManageResolvers.d.ts +1 -1
  205. package/graphql/schema/createManageResolvers.js +27 -10
  206. package/graphql/schema/createManageResolvers.js.map +1 -1
  207. package/graphql/schema/createManageSDL.js +83 -42
  208. package/graphql/schema/createManageSDL.js.map +1 -1
  209. package/graphql/schema/createPreviewResolvers.js +7 -6
  210. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  211. package/graphql/schema/createReadResolvers.js +7 -6
  212. package/graphql/schema/createReadResolvers.js.map +1 -1
  213. package/graphql/schema/createReadSDL.js +35 -24
  214. package/graphql/schema/createReadSDL.js.map +1 -1
  215. package/graphql/schema/resolvers/manage/resolveCreate.d.ts +2 -1
  216. package/graphql/schema/resolvers/manage/resolveCreate.js +4 -2
  217. package/graphql/schema/resolvers/manage/resolveCreate.js.map +1 -1
  218. package/graphql/schema/resolvers/manage/resolveCreateFrom.d.ts +2 -1
  219. package/graphql/schema/resolvers/manage/resolveCreateFrom.js +4 -2
  220. package/graphql/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
  221. package/graphql/schema/resolvers/manage/resolveDelete.d.ts +2 -1
  222. package/graphql/schema/resolvers/manage/resolveDelete.js +16 -4
  223. package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
  224. package/graphql/schema/resolvers/manage/resolveDeleteMultiple.d.ts +7 -0
  225. package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js +22 -0
  226. package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js.map +1 -0
  227. package/graphql/schema/resolvers/manage/resolveGet.js +12 -5
  228. package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
  229. package/graphql/schema/resolvers/manage/resolveGetByIds.js +3 -1
  230. package/graphql/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
  231. package/graphql/schema/resolvers/manage/resolveGetRevisions.js +3 -1
  232. package/graphql/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
  233. package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.d.ts +4 -0
  234. package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js +20 -0
  235. package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js.map +1 -0
  236. package/graphql/schema/resolvers/manage/resolveList.js +3 -1
  237. package/graphql/schema/resolvers/manage/resolveList.js.map +1 -1
  238. package/graphql/schema/resolvers/manage/resolveMove.d.ts +8 -0
  239. package/graphql/schema/resolvers/manage/resolveMove.js +27 -0
  240. package/graphql/schema/resolvers/manage/resolveMove.js.map +1 -0
  241. package/graphql/schema/resolvers/manage/resolvePublish.js +3 -1
  242. package/graphql/schema/resolvers/manage/resolvePublish.js.map +1 -1
  243. package/graphql/schema/resolvers/manage/resolveRepublish.js +3 -1
  244. package/graphql/schema/resolvers/manage/resolveRepublish.js.map +1 -1
  245. package/graphql/schema/resolvers/manage/resolveUnpublish.js +3 -1
  246. package/graphql/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
  247. package/graphql/schema/resolvers/manage/resolveUpdate.d.ts +2 -1
  248. package/graphql/schema/resolvers/manage/resolveUpdate.js +4 -2
  249. package/graphql/schema/resolvers/manage/resolveUpdate.js.map +1 -1
  250. package/graphql/schema/resolvers/manage/resolveValidate.d.ts +8 -0
  251. package/graphql/schema/resolvers/manage/resolveValidate.js +20 -0
  252. package/graphql/schema/resolvers/manage/resolveValidate.js.map +1 -0
  253. package/graphql/schema/resolvers/preview/resolveGet.js +6 -5
  254. package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
  255. package/graphql/schema/resolvers/preview/resolveList.js +3 -1
  256. package/graphql/schema/resolvers/preview/resolveList.js.map +1 -1
  257. package/graphql/schema/resolvers/read/resolveGet.js +6 -5
  258. package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
  259. package/graphql/schema/resolvers/read/resolveList.js +3 -1
  260. package/graphql/schema/resolvers/read/resolveList.js.map +1 -1
  261. package/graphql/schema/schemaPlugins.js +5 -12
  262. package/graphql/schema/schemaPlugins.js.map +1 -1
  263. package/graphql/system.d.ts +2 -5
  264. package/graphql/system.js +4 -12
  265. package/graphql/system.js.map +1 -1
  266. package/graphqlFields/boolean.js +3 -1
  267. package/graphqlFields/boolean.js.map +1 -1
  268. package/graphqlFields/datetime.js +5 -5
  269. package/graphqlFields/datetime.js.map +1 -1
  270. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +1 -1
  271. package/graphqlFields/dynamicZone/dynamicZoneField.js +75 -25
  272. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -1
  273. package/graphqlFields/dynamicZone/dynamicZoneStorage.js +60 -12
  274. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -1
  275. package/graphqlFields/dynamicZone/index.js +3 -1
  276. package/graphqlFields/dynamicZone/index.js.map +1 -1
  277. package/graphqlFields/file.js +3 -1
  278. package/graphqlFields/file.js.map +1 -1
  279. package/graphqlFields/helpers.d.ts +0 -1
  280. package/graphqlFields/helpers.js +6 -18
  281. package/graphqlFields/helpers.js.map +1 -1
  282. package/graphqlFields/index.js +5 -2
  283. package/graphqlFields/index.js.map +1 -1
  284. package/graphqlFields/json.d.ts +2 -0
  285. package/graphqlFields/json.js +49 -0
  286. package/graphqlFields/json.js.map +1 -0
  287. package/graphqlFields/longText.js +14 -3
  288. package/graphqlFields/longText.js.map +1 -1
  289. package/graphqlFields/number.js +4 -1
  290. package/graphqlFields/number.js.map +1 -1
  291. package/graphqlFields/object.js +26 -46
  292. package/graphqlFields/object.js.map +1 -1
  293. package/graphqlFields/ref.js +28 -16
  294. package/graphqlFields/ref.js.map +1 -1
  295. package/graphqlFields/richText/RichTextPluginsProcessor.d.ts +6 -0
  296. package/graphqlFields/richText/RichTextPluginsProcessor.js +34 -0
  297. package/graphqlFields/richText/RichTextPluginsProcessor.js.map +1 -0
  298. package/graphqlFields/richText/richTextResolver.d.ts +7 -0
  299. package/graphqlFields/richText/richTextResolver.js +39 -0
  300. package/graphqlFields/richText/richTextResolver.js.map +1 -0
  301. package/graphqlFields/richText.js +11 -3
  302. package/graphqlFields/richText.js.map +1 -1
  303. package/graphqlFields/text.js +5 -1
  304. package/graphqlFields/text.js.map +1 -1
  305. package/htmlRenderer/LexicalRenderer.d.ts +5 -0
  306. package/htmlRenderer/LexicalRenderer.js +28 -0
  307. package/htmlRenderer/LexicalRenderer.js.map +1 -0
  308. package/htmlRenderer/createLexicalHTMLRenderer.d.ts +2 -0
  309. package/htmlRenderer/createLexicalHTMLRenderer.js +31 -0
  310. package/htmlRenderer/createLexicalHTMLRenderer.js.map +1 -0
  311. package/index.d.ts +2 -1
  312. package/index.js +20 -5
  313. package/index.js.map +1 -1
  314. package/modelManager/DefaultCmsModelManager.js +3 -5
  315. package/modelManager/DefaultCmsModelManager.js.map +1 -1
  316. package/modelManager/index.js +3 -1
  317. package/modelManager/index.js.map +1 -1
  318. package/package.json +36 -39
  319. package/parameters/context.js +4 -2
  320. package/parameters/context.js.map +1 -1
  321. package/parameters/header.js +7 -6
  322. package/parameters/header.js.map +1 -1
  323. package/parameters/index.js +3 -1
  324. package/parameters/index.js.map +1 -1
  325. package/parameters/manual.js +9 -4
  326. package/parameters/manual.js.map +1 -1
  327. package/parameters/path.js +4 -3
  328. package/parameters/path.js.map +1 -1
  329. package/plugins/CmsGraphQLSchemaPlugin.js +5 -4
  330. package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -1
  331. package/plugins/CmsGraphQLSchemaSorterPlugin.js +4 -5
  332. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -1
  333. package/plugins/CmsGroupPlugin.d.ts +6 -3
  334. package/plugins/CmsGroupPlugin.js +8 -6
  335. package/plugins/CmsGroupPlugin.js.map +1 -1
  336. package/plugins/CmsModelFieldConverterPlugin.js +5 -4
  337. package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
  338. package/plugins/CmsModelPlugin.d.ts +8 -4
  339. package/plugins/CmsModelPlugin.js +56 -27
  340. package/plugins/CmsModelPlugin.js.map +1 -1
  341. package/plugins/CmsParametersPlugin.js +7 -4
  342. package/plugins/CmsParametersPlugin.js.map +1 -1
  343. package/plugins/CmsRichTextRendererPlugin.d.ts +24 -0
  344. package/plugins/CmsRichTextRendererPlugin.js +28 -0
  345. package/plugins/CmsRichTextRendererPlugin.js.map +1 -0
  346. package/plugins/StorageOperationsCmsModelPlugin.js +5 -6
  347. package/plugins/StorageOperationsCmsModelPlugin.js.map +1 -1
  348. package/plugins/StorageTransformPlugin.d.ts +2 -2
  349. package/plugins/StorageTransformPlugin.js +3 -4
  350. package/plugins/StorageTransformPlugin.js.map +1 -1
  351. package/plugins/index.d.ts +1 -0
  352. package/plugins/index.js +14 -1
  353. package/plugins/index.js.map +1 -1
  354. package/storage/default.js +3 -1
  355. package/storage/default.js.map +1 -1
  356. package/storage/index.d.ts +1 -0
  357. package/storage/index.js +15 -0
  358. package/storage/index.js.map +1 -0
  359. package/storage/json.d.ts +2 -0
  360. package/storage/json.js +27 -0
  361. package/storage/json.js.map +1 -0
  362. package/storage/object.js +8 -8
  363. package/storage/object.js.map +1 -1
  364. package/types.d.ts +397 -273
  365. package/types.js +20 -20
  366. package/types.js.map +1 -1
  367. package/utils/access.d.ts +9 -8
  368. package/utils/access.js +12 -62
  369. package/utils/access.js.map +1 -1
  370. package/utils/caching/Cache.d.ts +2 -0
  371. package/utils/caching/Cache.js +51 -0
  372. package/utils/caching/Cache.js.map +1 -0
  373. package/utils/caching/CacheKey.d.ts +2 -0
  374. package/utils/caching/CacheKey.js +40 -0
  375. package/utils/caching/CacheKey.js.map +1 -0
  376. package/utils/caching/index.d.ts +2 -0
  377. package/utils/caching/index.js +29 -0
  378. package/utils/caching/index.js.map +1 -0
  379. package/utils/caching/types.d.ts +11 -0
  380. package/utils/caching/types.js +7 -0
  381. package/utils/caching/types.js.map +1 -0
  382. package/utils/converters/Converter.js +4 -5
  383. package/utils/converters/Converter.js.map +1 -1
  384. package/utils/converters/ConverterCollection.js +13 -7
  385. package/utils/converters/ConverterCollection.js.map +1 -1
  386. package/utils/converters/valueKeyStorageConverter.js +16 -6
  387. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  388. package/utils/createTypeFromFields.js +7 -2
  389. package/utils/createTypeFromFields.js.map +1 -1
  390. package/utils/createTypeName.js +3 -1
  391. package/utils/createTypeName.js.map +1 -1
  392. package/utils/date.d.ts +10 -0
  393. package/utils/date.js +36 -0
  394. package/utils/date.js.map +1 -0
  395. package/utils/entryStorage.d.ts +4 -4
  396. package/utils/entryStorage.js +6 -4
  397. package/utils/entryStorage.js.map +1 -1
  398. package/utils/filterAsync.js +9 -8
  399. package/utils/filterAsync.js.map +1 -1
  400. package/utils/getBaseFieldType.d.ts +1 -3
  401. package/utils/getBaseFieldType.js +3 -1
  402. package/utils/getBaseFieldType.js.map +1 -1
  403. package/utils/getEntryDescription.d.ts +1 -1
  404. package/utils/getEntryDescription.js +3 -1
  405. package/utils/getEntryDescription.js.map +1 -1
  406. package/utils/getEntryImage.d.ts +1 -1
  407. package/utils/getEntryImage.js +3 -1
  408. package/utils/getEntryImage.js.map +1 -1
  409. package/utils/getEntryTitle.d.ts +1 -1
  410. package/utils/getEntryTitle.js +3 -1
  411. package/utils/getEntryTitle.js.map +1 -1
  412. package/utils/getSchemaFromFieldPlugins.d.ts +13 -2
  413. package/utils/getSchemaFromFieldPlugins.js +22 -4
  414. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  415. package/utils/identity.d.ts +2 -0
  416. package/utils/identity.js +20 -0
  417. package/utils/identity.js.map +1 -0
  418. package/utils/incrementEntryIdVersion.js +3 -1
  419. package/utils/incrementEntryIdVersion.js.map +1 -1
  420. package/utils/index.d.ts +1 -0
  421. package/utils/index.js +18 -0
  422. package/utils/index.js.map +1 -0
  423. package/utils/permissions/EntriesPermissions.d.ts +4 -0
  424. package/utils/permissions/EntriesPermissions.js +11 -0
  425. package/utils/permissions/EntriesPermissions.js.map +1 -0
  426. package/utils/permissions/ModelGroupsPermissions.d.ts +9 -0
  427. package/utils/permissions/ModelGroupsPermissions.js +50 -0
  428. package/utils/permissions/ModelGroupsPermissions.js.map +1 -0
  429. package/utils/permissions/ModelsPermissions.d.ts +22 -0
  430. package/utils/permissions/ModelsPermissions.js +90 -0
  431. package/utils/permissions/ModelsPermissions.js.map +1 -0
  432. package/utils/renderFields.d.ts +2 -1
  433. package/utils/renderFields.js +5 -2
  434. package/utils/renderFields.js.map +1 -1
  435. package/utils/renderGetFilterFields.d.ts +2 -2
  436. package/utils/renderGetFilterFields.js +9 -21
  437. package/utils/renderGetFilterFields.js.map +1 -1
  438. package/utils/renderInputFields.d.ts +2 -1
  439. package/utils/renderInputFields.js +17 -7
  440. package/utils/renderInputFields.js.map +1 -1
  441. package/utils/renderListFilterFields.d.ts +3 -1
  442. package/utils/renderListFilterFields.js +25 -22
  443. package/utils/renderListFilterFields.js.map +1 -1
  444. package/utils/renderSortEnum.d.ts +3 -2
  445. package/utils/renderSortEnum.js +10 -3
  446. package/utils/renderSortEnum.js.map +1 -1
  447. package/utils/toSlug.js +3 -1
  448. package/utils/toSlug.js.map +1 -1
  449. package/validators/dateGte.js +3 -1
  450. package/validators/dateGte.js.map +1 -1
  451. package/validators/dateLte.js +3 -1
  452. package/validators/dateLte.js.map +1 -1
  453. package/validators/gte.js +4 -3
  454. package/validators/gte.js.map +1 -1
  455. package/validators/in.js +4 -3
  456. package/validators/in.js.map +1 -1
  457. package/validators/index.js +4 -3
  458. package/validators/index.js.map +1 -1
  459. package/validators/lte.js +4 -3
  460. package/validators/lte.js.map +1 -1
  461. package/validators/maxLength.js +4 -3
  462. package/validators/maxLength.js.map +1 -1
  463. package/validators/minLength.js +4 -3
  464. package/validators/minLength.js.map +1 -1
  465. package/validators/pattern.js +5 -3
  466. package/validators/pattern.js.map +1 -1
  467. package/validators/patternPlugins/email.js +3 -1
  468. package/validators/patternPlugins/email.js.map +1 -1
  469. package/validators/patternPlugins/index.js +3 -1
  470. package/validators/patternPlugins/index.js.map +1 -1
  471. package/validators/patternPlugins/lowerCase.js +3 -1
  472. package/validators/patternPlugins/lowerCase.js.map +1 -1
  473. package/validators/patternPlugins/lowerCaseSpace.js +3 -1
  474. package/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
  475. package/validators/patternPlugins/upperCase.js +3 -1
  476. package/validators/patternPlugins/upperCase.js.map +1 -1
  477. package/validators/patternPlugins/upperCaseSpace.js +3 -1
  478. package/validators/patternPlugins/upperCaseSpace.js.map +1 -1
  479. package/validators/patternPlugins/url.js +3 -1
  480. package/validators/patternPlugins/url.js.map +1 -1
  481. package/validators/required.js +3 -1
  482. package/validators/required.js.map +1 -1
  483. package/validators/timeGte.js +4 -3
  484. package/validators/timeGte.js.map +1 -1
  485. package/validators/timeLte.js +4 -3
  486. package/validators/timeLte.js.map +1 -1
  487. package/validators/unique.js +4 -2
  488. package/validators/unique.js.map +1 -1
  489. package/crud/contentModel/afterCreate.d.ts +0 -8
  490. package/crud/contentModel/afterCreate.js +0 -16
  491. package/crud/contentModel/afterCreate.js.map +0 -1
  492. package/crud/contentModel/afterCreateFrom.d.ts +0 -8
  493. package/crud/contentModel/afterCreateFrom.js +0 -16
  494. package/crud/contentModel/afterCreateFrom.js.map +0 -1
  495. package/crud/contentModel/afterDelete.d.ts +0 -8
  496. package/crud/contentModel/afterDelete.js +0 -16
  497. package/crud/contentModel/afterDelete.js.map +0 -1
  498. package/crud/contentModel/afterUpdate.d.ts +0 -8
  499. package/crud/contentModel/afterUpdate.js +0 -16
  500. package/crud/contentModel/afterUpdate.js.map +0 -1
  501. package/crud/contentModel/createFieldModels.d.ts +0 -2
  502. package/crud/contentModel/createFieldModels.js +0 -26
  503. package/crud/contentModel/createFieldModels.js.map +0 -1
  504. package/crud/contentModel/fieldIdValidation.d.ts +0 -1
  505. package/crud/contentModel/fieldIdValidation.js +0 -25
  506. package/crud/contentModel/fieldIdValidation.js.map +0 -1
  507. package/crud/contentModel/idValidation.d.ts +0 -1
  508. package/crud/contentModel/idValidation.js +0 -22
  509. package/crud/contentModel/idValidation.js.map +0 -1
  510. package/crud/contentModel/models.d.ts +0 -4
  511. package/crud/contentModel/models.js +0 -192
  512. package/crud/contentModel/models.js.map +0 -1
  513. package/crud/contentModel/systemFields.d.ts +0 -1
  514. package/crud/contentModel/systemFields.js +0 -8
  515. package/crud/contentModel/systemFields.js.map +0 -1
  516. package/crud/contentModel/validateLayout.d.ts +0 -2
  517. package/crud/contentModel/validateLayout.js +0 -28
  518. package/crud/contentModel/validateLayout.js.map +0 -1
  519. package/crud/settings.crud.d.ts +0 -10
  520. package/crud/settings.crud.js +0 -66
  521. package/crud/settings.crud.js.map +0 -1
  522. package/graphql/schema/resolvers/commonFieldResolvers.d.ts +0 -7
  523. package/graphql/schema/resolvers/commonFieldResolvers.js +0 -13
  524. package/graphql/schema/resolvers/commonFieldResolvers.js.map +0 -1
  525. package/upgrades/5.33.0/index.d.ts +0 -3
  526. package/upgrades/5.33.0/index.js +0 -182
  527. package/upgrades/5.33.0/index.js.map +0 -1
  528. package/upgrades/index.d.ts +0 -1
  529. package/upgrades/index.js +0 -12
  530. package/upgrades/index.js.map +0 -1
  531. package/utils/ownership.d.ts +0 -8
  532. package/utils/ownership.js +0 -33
  533. package/utils/ownership.js.map +0 -1
  534. package/utils/permissions.d.ts +0 -7
  535. package/utils/permissions.js +0 -91
  536. package/utils/permissions.js.map +0 -1
  537. package/utils/pluralizedTypeName.d.ts +0 -1
  538. package/utils/pluralizedTypeName.js +0 -26
  539. package/utils/pluralizedTypeName.js.map +0 -1
  540. package/validators/dynamicZone.d.ts +0 -2
  541. package/validators/dynamicZone.js +0 -20
  542. package/validators/dynamicZone.js.map +0 -1
@@ -4,193 +4,37 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.createContentEntryCrud = exports.STATUS_UNPUBLISHED = exports.STATUS_PUBLISHED = exports.STATUS_DRAFT = void 0;
8
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
- var _merge = _interopRequireDefault(require("lodash/merge"));
10
- var _mdbid = _interopRequireDefault(require("mdbid"));
7
+ exports.createContentEntryCrud = void 0;
8
+ var _utils = require("@webiny/utils");
11
9
  var _error = _interopRequireDefault(require("@webiny/error"));
12
10
  var _handlerGraphql = require("@webiny/handler-graphql");
13
11
  var _entryDataValidation = require("./contentEntry/entryDataValidation");
14
12
  var _pubsub = require("@webiny/pubsub");
15
13
  var _beforeCreate = require("./contentEntry/beforeCreate");
16
14
  var _beforeUpdate = require("./contentEntry/beforeUpdate");
17
- var _utils = require("@webiny/utils");
18
15
  var _afterDelete = require("./contentEntry/afterDelete");
19
- var _referenceFieldsMapping = require("./contentEntry/referenceFieldsMapping");
20
- var _permissions = require("../utils/permissions");
21
- var _access = require("../utils/access");
22
- var _ownership = require("../utils/ownership");
23
16
  var _entryStorage = require("../utils/entryStorage");
24
17
  var _searchableFields = require("./contentEntry/searchableFields");
25
- /**
26
- * Package mdbid does not have types.
27
- */
28
- // @ts-ignore
29
-
30
- const STATUS_DRAFT = "draft";
31
- exports.STATUS_DRAFT = STATUS_DRAFT;
32
- const STATUS_PUBLISHED = "published";
33
- exports.STATUS_PUBLISHED = STATUS_PUBLISHED;
34
- const STATUS_UNPUBLISHED = "unpublished";
35
- exports.STATUS_UNPUBLISHED = STATUS_UNPUBLISHED;
36
- /**
37
- * Used for some fields to convert their values.
38
- */
39
- const convertDefaultValue = (field, value) => {
40
- switch (field.type) {
41
- case "boolean":
42
- return Boolean(value);
43
- case "number":
44
- return Number(value);
45
- default:
46
- return value;
47
- }
48
- };
49
- const getDefaultValue = field => {
50
- const {
51
- settings,
52
- multipleValues
53
- } = field;
54
- if (settings && settings.defaultValue !== undefined) {
55
- return convertDefaultValue(field, settings.defaultValue);
18
+ var _filterAsync = require("../utils/filterAsync");
19
+ var _apiSecurity = require("@webiny/api-security");
20
+ var _constants = require("../constants");
21
+ var _entryDataFactories = require("./contentEntry/entryDataFactories");
22
+ const createSort = sort => {
23
+ if (Array.isArray(sort) && sort.filter(Boolean).length > 0) {
24
+ return sort;
56
25
  }
57
- const {
58
- predefinedValues
59
- } = field;
60
- if (!predefinedValues || !predefinedValues.enabled || Array.isArray(predefinedValues.values) === false) {
61
- return undefined;
62
- }
63
- if (!multipleValues) {
64
- const selectedValue = predefinedValues.values.find(value => {
65
- return !!value.selected;
66
- });
67
- if (selectedValue) {
68
- return convertDefaultValue(field, selectedValue.value);
69
- }
70
- return undefined;
71
- }
72
- return predefinedValues.values.filter(({
73
- selected
74
- }) => !!selected).map(({
75
- value
76
- }) => {
77
- return convertDefaultValue(field, value);
78
- });
79
- };
80
- /**
81
- * Cleans and adds default values to create input data.
82
- */
83
- const mapAndCleanCreateInputData = (model, input) => {
84
- return model.fields.reduce((acc, field) => {
85
- /**
86
- * This should never happen, but let's make it sure.
87
- * The fix would be for the user to add the fieldId on the field definition.
88
- */
89
- if (!field.fieldId) {
90
- throw new _error.default("Field does not have an fieldId.", "MISSING_FIELD_ID", {
91
- field
92
- });
93
- }
94
- const value = input[field.fieldId];
95
- /**
96
- * We set the default value on create input if value is not defined.
97
- */
98
- acc[field.fieldId] = value === undefined ? getDefaultValue(field) : value;
99
- return acc;
100
- }, {});
101
- };
102
- /**
103
- * Cleans the update input entry data.
104
- */
105
- const mapAndCleanUpdatedInputData = (model, input) => {
106
- return model.fields.reduce((acc, field) => {
107
- /**
108
- * This should never happen, but let's make it sure.
109
- * The fix would be for the user to add the fieldId on the field definition.
110
- */
111
- if (!field.fieldId) {
112
- throw new _error.default("Field does not have an fieldId.", "MISSING_FIELD_ID", {
113
- field
114
- });
115
- }
116
- /**
117
- * We cannot set default value here because user might want to update only certain field values.
118
- */
119
- const value = input[field.fieldId];
120
- if (value === undefined) {
121
- return acc;
122
- }
123
- acc[field.fieldId] = value;
124
- return acc;
125
- }, {});
126
- };
127
- /**
128
- * This method takes original entry meta and new input.
129
- * When new meta is merged onto the existing one, everything that has undefined or null value is removed.
130
- */
131
- const createEntryMeta = (input, original) => {
132
- const meta = (0, _merge.default)(original || {}, input || {});
133
- return (0, _utils.removeUndefinedValues)((0, _utils.removeNullValues)(meta));
134
- };
135
- const createEntryId = input => {
136
- let entryId = (0, _mdbid.default)();
137
- if (input.id) {
138
- if (input.id.match(/^([a-zA-Z0-9])([a-zA-Z0-9\-]+)([a-zA-Z0-9])$/) === null) {
139
- throw new _error.default("The provided ID is not valid. It must be a string which can be A-Z, a-z, 0-9, - and it cannot start or end with a -.", "INVALID_ID", {
140
- id: input.id
141
- });
142
- }
143
- entryId = input.id;
144
- }
145
- const version = 1;
146
- return {
147
- entryId,
148
- version,
149
- id: (0, _utils.createIdentifier)({
150
- id: entryId,
151
- version
152
- })
153
- };
154
- };
155
- const increaseEntryIdVersion = id => {
156
- const {
157
- id: entryId,
158
- version
159
- } = (0, _utils.parseIdentifier)(id);
160
- if (!version) {
161
- throw new _error.default("Cannot increase version on the ID without the version part.", "WRONG_ID", {
162
- id
163
- });
164
- }
165
- return {
166
- entryId,
167
- version: version + 1,
168
- id: (0, _utils.createIdentifier)({
169
- id: entryId,
170
- version: version + 1
171
- })
172
- };
173
- };
174
- const allowedEntryStatus = ["draft", "published", "unpublished"];
175
- const transformEntryStatus = status => {
176
- return allowedEntryStatus.includes(status) ? status : "draft";
26
+ return ["revisionCreatedOn_DESC"];
177
27
  };
178
28
  const createContentEntryCrud = params => {
179
29
  const {
180
30
  storageOperations,
31
+ entriesPermissions,
32
+ modelsPermissions,
181
33
  context,
182
- getIdentity,
34
+ getIdentity: getSecurityIdentity,
183
35
  getTenant,
184
36
  getLocale
185
37
  } = params;
186
- const getCreatedBy = () => {
187
- const identity = getIdentity();
188
- return {
189
- id: identity.id,
190
- displayName: identity.displayName,
191
- type: identity.type
192
- };
193
- };
194
38
 
195
39
  /**
196
40
  * Create
@@ -213,6 +57,13 @@ const createContentEntryCrud = params => {
213
57
  const onEntryAfterUpdate = (0, _pubsub.createTopic)("cms.onEntryAfterUpdate");
214
58
  const onEntryUpdateError = (0, _pubsub.createTopic)("cms.onEntryUpdateError");
215
59
 
60
+ /**
61
+ * Move
62
+ */
63
+ const onEntryBeforeMove = (0, _pubsub.createTopic)("cms.onEntryBeforeMove");
64
+ const onEntryAfterMove = (0, _pubsub.createTopic)("cms.onEntryAfterMove");
65
+ const onEntryMoveError = (0, _pubsub.createTopic)("cms.onEntryMoveError");
66
+
216
67
  /**
217
68
  * Publish
218
69
  */
@@ -247,6 +98,12 @@ const createContentEntryCrud = params => {
247
98
  const onEntryRevisionBeforeDelete = (0, _pubsub.createTopic)("cms.onEntryRevisionBeforeDelete");
248
99
  const onEntryRevisionAfterDelete = (0, _pubsub.createTopic)("cms.onEntryRevisionAfterDelete");
249
100
  const onEntryRevisionDeleteError = (0, _pubsub.createTopic)("cms.onEntryRevisionDeleteError");
101
+ /**
102
+ * Delete multiple entries
103
+ */
104
+ const onEntryBeforeDeleteMultiple = (0, _pubsub.createTopic)("cms.onEntryBeforeDeleteMultiple");
105
+ const onEntryAfterDeleteMultiple = (0, _pubsub.createTopic)("cms.onEntryAfterDeleteMultiple");
106
+ const onEntryDeleteMultipleError = (0, _pubsub.createTopic)("cms.onEntryDeleteMultipleError");
250
107
 
251
108
  /**
252
109
  * Get entry
@@ -273,56 +130,59 @@ const createContentEntryCrud = params => {
273
130
  context,
274
131
  onEntryAfterDelete
275
132
  });
276
- const checkEntryPermissions = check => {
277
- return (0, _permissions.checkPermissions)(context, "cms.contentEntry", check);
278
- };
279
133
 
280
134
  /**
281
135
  * A helper to delete the entire entry.
282
136
  */
283
137
  const deleteEntryHelper = async params => {
284
- return context.benchmark.measure("headlessCms.crud.entries.deleteEntry", async () => {
285
- const {
138
+ const {
139
+ model,
140
+ entry
141
+ } = params;
142
+ try {
143
+ await onEntryBeforeDelete.publish({
144
+ entry,
145
+ model
146
+ });
147
+ await storageOperations.entries.delete(model, {
148
+ entry
149
+ });
150
+ await onEntryAfterDelete.publish({
151
+ entry,
152
+ model
153
+ });
154
+ } catch (ex) {
155
+ await onEntryDeleteError.publish({
156
+ entry,
286
157
  model,
158
+ error: ex
159
+ });
160
+ throw new _error.default(ex.message || "Could not delete entry.", ex.code || "DELETE_ERROR", {
287
161
  entry
288
- } = params;
289
- try {
290
- await onEntryBeforeDelete.publish({
291
- entry,
292
- model
293
- });
294
- await storageOperations.entries.delete(model, {
295
- entry
296
- });
297
- await onEntryAfterDelete.publish({
298
- entry,
299
- model
300
- });
301
- } catch (ex) {
302
- await onEntryDeleteError.publish({
303
- entry,
304
- model,
305
- error: ex
306
- });
307
- throw new _error.default(ex.message || "Could not delete entry.", ex.code || "DELETE_ERROR", {
308
- entry
309
- });
310
- }
311
- });
162
+ });
163
+ }
312
164
  };
313
165
  /**
314
166
  * A helper to get entries by revision IDs
315
167
  */
316
168
  const getEntriesByIds = async (model, ids) => {
317
169
  return context.benchmark.measure("headlessCms.crud.entries.getEntriesByIds", async () => {
318
- const permission = await checkEntryPermissions({
170
+ await entriesPermissions.ensure({
319
171
  rwd: "r"
320
172
  });
321
- await (0, _access.checkModelAccess)(context, model);
173
+ await modelsPermissions.ensureCanAccessModel({
174
+ model
175
+ });
322
176
  const entries = await storageOperations.entries.getByIds(model, {
323
177
  ids
324
178
  });
325
- return entries.filter(entry => (0, _ownership.validateOwnership)(context, permission, entry));
179
+ return (0, _filterAsync.filterAsync)(entries, async entry => {
180
+ return entriesPermissions.ensure({
181
+ owns: entry.revisionCreatedBy
182
+ }, {
183
+ throw: false
184
+ });
185
+ });
326
186
  });
327
187
  };
328
188
  const getEntryById = async (model, id) => {
@@ -340,27 +200,43 @@ const createContentEntryCrud = params => {
340
200
  return entry;
341
201
  };
342
202
  const getPublishedEntriesByIds = async (model, ids) => {
343
- const permission = await checkEntryPermissions({
203
+ await entriesPermissions.ensure({
344
204
  rwd: "r"
345
205
  });
346
- await (0, _access.checkModelAccess)(context, model);
206
+ await modelsPermissions.ensureCanAccessModel({
207
+ model
208
+ });
347
209
  const entries = await storageOperations.entries.getPublishedByIds(model, {
348
210
  ids
349
211
  });
350
- return entries.filter(entry => (0, _ownership.validateOwnership)(context, permission, entry));
212
+ return (0, _filterAsync.filterAsync)(entries, async entry => {
213
+ return entriesPermissions.ensure({
214
+ owns: entry.revisionCreatedBy
215
+ }, {
216
+ throw: false
217
+ });
218
+ });
351
219
  };
352
220
  const getLatestEntriesByIds = async (model, ids) => {
353
- const permission = await checkEntryPermissions({
221
+ await entriesPermissions.ensure({
354
222
  rwd: "r"
355
223
  });
356
- await (0, _access.checkModelAccess)(context, model);
224
+ await modelsPermissions.ensureCanAccessModel({
225
+ model
226
+ });
357
227
  const entries = await storageOperations.entries.getLatestByIds(model, {
358
228
  ids
359
229
  });
360
- return entries.filter(entry => (0, _ownership.validateOwnership)(context, permission, entry));
230
+ return (0, _filterAsync.filterAsync)(entries, async entry => {
231
+ return entriesPermissions.ensure({
232
+ owns: entry.revisionCreatedBy
233
+ }, {
234
+ throw: false
235
+ });
236
+ });
361
237
  };
362
238
  const getEntry = async (model, params) => {
363
- await checkEntryPermissions({
239
+ await entriesPermissions.ensure({
364
240
  rwd: "r"
365
241
  });
366
242
  const {
@@ -388,27 +264,36 @@ const createContentEntryCrud = params => {
388
264
  });
389
265
  };
390
266
  const listEntries = async (model, params) => {
391
- const permission = await checkEntryPermissions({
392
- rwd: "r"
267
+ try {
268
+ await entriesPermissions.ensure({
269
+ rwd: "r"
270
+ });
271
+ } catch {
272
+ throw new _apiSecurity.NotAuthorizedError({
273
+ data: {
274
+ reason: 'Not allowed to perform "read" on "cms.contentEntry".'
275
+ }
276
+ });
277
+ }
278
+ await modelsPermissions.ensureCanAccessModel({
279
+ model
393
280
  });
394
- await (0, _access.checkModelAccess)(context, model);
395
281
  const {
396
282
  where: initialWhere,
397
283
  limit: initialLimit
398
284
  } = params;
399
285
  const limit = initialLimit && initialLimit > 0 ? initialLimit : 50;
400
- /**
401
- * We always assign tenant and locale because we do not allow one model to have content through multiple tenants.
402
- */
403
- const where = (0, _objectSpread2.default)({}, initialWhere);
286
+ const where = {
287
+ ...initialWhere
288
+ };
404
289
  /**
405
290
  * Possibly only get records which are owned by current user.
406
291
  * Or if searching for the owner set that value - in the case that user can see other entries than their own.
407
292
  */
408
- const ownedBy = permission.own ? getIdentity().id : where.ownedBy;
409
- if (ownedBy !== undefined) {
410
- where.ownedBy = ownedBy;
293
+ if (await entriesPermissions.canAccessOnlyOwnRecords()) {
294
+ where.createdBy = getSecurityIdentity().id;
411
295
  }
296
+
412
297
  /**
413
298
  * Where must contain either latest or published keys.
414
299
  * We cannot list entries without one of those
@@ -437,11 +322,13 @@ const createContentEntryCrud = params => {
437
322
  totalCount,
438
323
  cursor,
439
324
  items
440
- } = await storageOperations.entries.list(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
325
+ } = await storageOperations.entries.list(model, {
326
+ ...params,
327
+ sort: createSort(params.sort),
441
328
  limit,
442
329
  where,
443
330
  fields
444
- }));
331
+ });
445
332
  const meta = {
446
333
  hasMoreItems,
447
334
  totalCount,
@@ -465,55 +352,26 @@ const createContentEntryCrud = params => {
465
352
  });
466
353
  }
467
354
  };
468
- const createEntry = async (model, inputData) => {
469
- await checkEntryPermissions({
355
+ const createEntry = async (model, rawInput, options) => {
356
+ await entriesPermissions.ensure({
470
357
  rwd: "w"
471
358
  });
472
- await (0, _access.checkModelAccess)(context, model);
473
-
474
- /**
475
- * Make sure we only work with fields that are defined in the model.
476
- */
477
- const initialInput = mapAndCleanCreateInputData(model, inputData);
478
- await (0, _entryDataValidation.validateModelEntryData)({
479
- context,
480
- model,
481
- data: initialInput
359
+ await modelsPermissions.ensureCanAccessModel({
360
+ model
482
361
  });
483
- const input = await (0, _referenceFieldsMapping.referenceFieldsMapping)({
362
+ const {
363
+ entry,
364
+ input
365
+ } = await (0, _entryDataFactories.createEntryData)({
484
366
  context,
485
367
  model,
486
- input: initialInput,
487
- validateEntries: true
368
+ options,
369
+ rawInput,
370
+ getLocale,
371
+ getTenant,
372
+ getIdentity: getSecurityIdentity,
373
+ entriesPermissions
488
374
  });
489
- const locale = getLocale();
490
- const owner = getCreatedBy();
491
- const {
492
- id,
493
- entryId,
494
- version
495
- } = createEntryId(inputData);
496
- /**
497
- * There is a possibility that user sends an ID in the input, so we will use that one.
498
- * There is no check if the ID is unique or not, that is up to the user.
499
- */
500
- const entry = {
501
- webinyVersion: context.WEBINY_VERSION,
502
- tenant: getTenant().id,
503
- entryId,
504
- id,
505
- modelId: model.modelId,
506
- locale: locale.code,
507
- createdOn: new Date().toISOString(),
508
- savedOn: new Date().toISOString(),
509
- createdBy: owner,
510
- ownedBy: owner,
511
- modifiedBy: null,
512
- version,
513
- locked: false,
514
- status: STATUS_DRAFT,
515
- values: input
516
- };
517
375
  let storageEntry = null;
518
376
  try {
519
377
  await onEntryBeforeCreate.publish({
@@ -532,7 +390,7 @@ const createContentEntryCrud = params => {
532
390
  model,
533
391
  input
534
392
  });
535
- return result;
393
+ return entry;
536
394
  } catch (ex) {
537
395
  await onEntryCreateError.publish({
538
396
  error: ex,
@@ -548,16 +406,13 @@ const createContentEntryCrud = params => {
548
406
  });
549
407
  }
550
408
  };
551
- const createEntryRevisionFrom = async (model, sourceId, inputData) => {
552
- const permission = await checkEntryPermissions({
409
+ const createEntryRevisionFrom = async (model, sourceId, rawInput, options) => {
410
+ await entriesPermissions.ensure({
553
411
  rwd: "w"
554
412
  });
555
- await (0, _access.checkModelAccess)(context, model);
556
-
557
- /**
558
- * Make sure we only work with fields that are defined in the model.
559
- */
560
- const input = mapAndCleanUpdatedInputData(model, inputData);
413
+ await modelsPermissions.ensureCanAccessModel({
414
+ model
415
+ });
561
416
 
562
417
  /**
563
418
  * Entries are identified by a common parent ID + Revision number.
@@ -574,46 +429,31 @@ const createContentEntryCrud = params => {
574
429
  if (!originalStorageEntry) {
575
430
  throw new _handlerGraphql.NotFoundError(`Entry "${sourceId}" of model "${model.modelId}" was not found.`);
576
431
  }
432
+ if (!latestStorageEntry) {
433
+ throw new _handlerGraphql.NotFoundError(`Latest entry "${uniqueId}" of model "${model.modelId}" was not found.`);
434
+ }
577
435
 
578
436
  /**
579
437
  * We need to convert data from DB to its original form before using it further.
580
438
  */
581
439
  const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
582
- const initialValues = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry.values), input);
583
- await (0, _entryDataValidation.validateModelEntryData)({
584
- context,
585
- model,
586
- data: initialValues,
587
- entry: originalEntry
440
+ await entriesPermissions.ensure({
441
+ owns: originalEntry.createdBy
588
442
  });
589
- const values = await (0, _referenceFieldsMapping.referenceFieldsMapping)({
590
- context,
591
- model,
592
- input: initialValues,
593
- validateEntries: false
594
- });
595
- (0, _ownership.checkOwnership)(context, permission, originalEntry);
596
- const identity = getIdentity();
597
- const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;
598
443
  const {
599
- id,
600
- version: nextVersion
601
- } = increaseEntryIdVersion(latestId);
602
- const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
603
- id,
604
- version: nextVersion,
605
- savedOn: new Date().toISOString(),
606
- createdOn: new Date().toISOString(),
607
- createdBy: {
608
- id: identity.id,
609
- displayName: identity.displayName,
610
- type: identity.type
611
- },
612
- modifiedBy: null,
613
- locked: false,
614
- publishedOn: undefined,
615
- status: STATUS_DRAFT,
616
- values
444
+ entry,
445
+ input
446
+ } = await (0, _entryDataFactories.createEntryRevisionFromData)({
447
+ sourceId,
448
+ model,
449
+ rawInput,
450
+ options,
451
+ context,
452
+ getIdentity: getSecurityIdentity,
453
+ getTenant,
454
+ getLocale,
455
+ originalEntry,
456
+ latestStorageEntry
617
457
  });
618
458
  let storageEntry = null;
619
459
  try {
@@ -635,7 +475,7 @@ const createContentEntryCrud = params => {
635
475
  original: originalEntry,
636
476
  storageEntry: result
637
477
  });
638
- return result;
478
+ return entry;
639
479
  } catch (ex) {
640
480
  await onEntryCreateRevisionError.publish({
641
481
  entry,
@@ -653,16 +493,13 @@ const createContentEntryCrud = params => {
653
493
  });
654
494
  }
655
495
  };
656
- const updateEntry = async (model, id, inputData, metaInput) => {
657
- const permission = await checkEntryPermissions({
496
+ const updateEntry = async (model, id, rawInput, metaInput, options) => {
497
+ await entriesPermissions.ensure({
658
498
  rwd: "w"
659
499
  });
660
- await (0, _access.checkModelAccess)(context, model);
661
-
662
- /**
663
- * Make sure we only work with fields that are defined in the model.
664
- */
665
- const input = mapAndCleanUpdatedInputData(model, inputData);
500
+ await modelsPermissions.ensureCanAccessModel({
501
+ model
502
+ });
666
503
 
667
504
  /**
668
505
  * The entry we are going to update.
@@ -677,33 +514,22 @@ const createContentEntryCrud = params => {
677
514
  throw new _error.default(`Cannot update entry because it's locked.`, "CONTENT_ENTRY_UPDATE_ERROR");
678
515
  }
679
516
  const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
680
- await (0, _entryDataValidation.validateModelEntryData)({
681
- context,
682
- model,
683
- data: input,
684
- entry: originalEntry
517
+ await entriesPermissions.ensure({
518
+ owns: originalEntry.revisionCreatedBy
685
519
  });
686
- (0, _ownership.checkOwnership)(context, permission, originalEntry);
687
- const initialValues = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry.values), input);
688
- const values = await (0, _referenceFieldsMapping.referenceFieldsMapping)({
689
- context,
520
+ const {
521
+ entry,
522
+ input
523
+ } = await (0, _entryDataFactories.createUpdateEntryData)({
690
524
  model,
691
- input: initialValues,
692
- validateEntries: false
693
- });
694
- /**
695
- * If users wants to remove a key from meta values, they need to send meta key with the null value.
696
- */
697
- const meta = createEntryMeta(metaInput, originalEntry.meta);
698
- /**
699
- * We always send the full entry to the hooks and storage operations update.
700
- */
701
- const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
702
- savedOn: new Date().toISOString(),
703
- modifiedBy: getCreatedBy(),
704
- values,
705
- meta,
706
- status: transformEntryStatus(originalEntry.status)
525
+ rawInput,
526
+ options,
527
+ context,
528
+ getIdentity: getSecurityIdentity,
529
+ getTenant,
530
+ getLocale,
531
+ originalEntry,
532
+ metaInput
707
533
  });
708
534
  let storageEntry = null;
709
535
  try {
@@ -725,7 +551,7 @@ const createContentEntryCrud = params => {
725
551
  input,
726
552
  original: originalEntry
727
553
  });
728
- return result;
554
+ return entry;
729
555
  } catch (ex) {
730
556
  await onEntryUpdateError.publish({
731
557
  entry,
@@ -742,40 +568,109 @@ const createContentEntryCrud = params => {
742
568
  });
743
569
  }
744
570
  };
745
- const republishEntry = async (model, id) => {
746
- await checkEntryPermissions({
571
+ const validateEntry = async (model, id, inputData) => {
572
+ await entriesPermissions.ensure({
573
+ rwd: "w"
574
+ });
575
+ await modelsPermissions.ensureCanAccessModel({
576
+ model
577
+ });
578
+ const input = (0, _entryDataFactories.mapAndCleanUpdatedInputData)(model, inputData || {});
579
+ let originalEntry;
580
+ if (id) {
581
+ /**
582
+ * The entry we are going to update.
583
+ */
584
+ const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
585
+ id
586
+ });
587
+ if (!originalStorageEntry) {
588
+ throw new _handlerGraphql.NotFoundError(`Entry "${id}" of model "${model.modelId}" was not found.`);
589
+ }
590
+ originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
591
+ }
592
+ const result = await (0, _entryDataValidation.validateModelEntryData)({
593
+ context,
594
+ model,
595
+ data: input,
596
+ entry: originalEntry
597
+ });
598
+ return result.length > 0 ? result : [];
599
+ };
600
+ const moveEntry = async (model, id, folderId) => {
601
+ await entriesPermissions.ensure({
747
602
  rwd: "w"
748
603
  });
749
- await (0, _access.checkModelAccess)(context, model);
604
+ await modelsPermissions.ensureCanAccessModel({
605
+ model
606
+ });
750
607
  /**
751
- * Fetch the entry from the storage.
608
+ * The entry we are going to move to another folder.
752
609
  */
753
610
  const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
754
611
  id
755
612
  });
756
613
  if (!originalStorageEntry) {
757
- throw new _handlerGraphql.NotFoundError(`Entry "${id}" was not found!`);
614
+ throw new _handlerGraphql.NotFoundError(`Entry "${id}" of model "${model.modelId}" was not found.`);
758
615
  }
759
- const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
616
+ const entry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
760
617
  /**
761
- * We can only process published entries.
618
+ * No need to continue if the entry is already in the requested folder.
762
619
  */
763
- if (originalEntry.status !== "published") {
764
- throw new _error.default("Entry with given ID is not published!", "NOT_PUBLISHED_ERROR", {
765
- id,
766
- original: originalEntry
620
+ if (entry.location?.folderId === folderId) {
621
+ return entry;
622
+ }
623
+ try {
624
+ await onEntryBeforeMove.publish({
625
+ entry,
626
+ model,
627
+ folderId
628
+ });
629
+ await storageOperations.entries.move(model, id, folderId);
630
+ await onEntryAfterMove.publish({
631
+ entry,
632
+ model,
633
+ folderId
634
+ });
635
+ return entry;
636
+ } catch (ex) {
637
+ await onEntryMoveError.publish({
638
+ entry,
639
+ model,
640
+ folderId,
641
+ error: ex
767
642
  });
643
+ throw _error.default.from(ex, {
644
+ message: `Could not move entry "${id}" of model "${model.modelId}".`,
645
+ code: "MOVE_ENTRY_ERROR"
646
+ });
647
+ }
648
+ };
649
+ const republishEntry = async (model, id) => {
650
+ await entriesPermissions.ensure({
651
+ rwd: "w"
652
+ });
653
+ await modelsPermissions.ensureCanAccessModel({
654
+ model
655
+ });
656
+
657
+ /**
658
+ * Fetch the entry from the storage.
659
+ */
660
+ const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
661
+ id
662
+ });
663
+ if (!originalStorageEntry) {
664
+ throw new _handlerGraphql.NotFoundError(`Entry "${id}" was not found!`);
768
665
  }
769
- const values = await (0, _referenceFieldsMapping.referenceFieldsMapping)({
666
+ const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
667
+ const {
668
+ entry
669
+ } = await (0, _entryDataFactories.createRepublishEntryData)({
770
670
  context,
771
671
  model,
772
- input: originalEntry.values,
773
- validateEntries: false
774
- });
775
- const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
776
- savedOn: new Date().toISOString(),
777
- webinyVersion: context.WEBINY_VERSION,
778
- values
672
+ originalEntry,
673
+ getIdentity: getSecurityIdentity
779
674
  });
780
675
  const storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
781
676
  /**
@@ -806,9 +701,9 @@ const createContentEntryCrud = params => {
806
701
  await onEntryAfterRepublish.publish({
807
702
  entry,
808
703
  model,
809
- storageEntry
704
+ storageEntry: result
810
705
  });
811
- return result;
706
+ return entry;
812
707
  } catch (ex) {
813
708
  await onEntryRepublishError.publish({
814
709
  entry,
@@ -821,10 +716,12 @@ const createContentEntryCrud = params => {
821
716
  }
822
717
  };
823
718
  const deleteEntryRevision = async (model, revisionId) => {
824
- const permission = await checkEntryPermissions({
719
+ await entriesPermissions.ensure({
825
720
  rwd: "d"
826
721
  });
827
- await (0, _access.checkModelAccess)(context, model);
722
+ await modelsPermissions.ensureCanAccessModel({
723
+ model
724
+ });
828
725
  const {
829
726
  id: entryId,
830
727
  version
@@ -835,34 +732,54 @@ const createContentEntryCrud = params => {
835
732
  const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {
836
733
  id: entryId
837
734
  });
838
- const previousStorageEntry = await storageOperations.entries.getPreviousRevision(model, {
735
+ const storagePreviousEntry = await storageOperations.entries.getPreviousRevision(model, {
839
736
  entryId,
840
737
  version: version
841
738
  });
842
739
  if (!storageEntryToDelete) {
843
740
  throw new _handlerGraphql.NotFoundError(`Entry "${revisionId}" was not found!`);
844
741
  }
845
- (0, _ownership.checkOwnership)(context, permission, storageEntryToDelete);
742
+ await entriesPermissions.ensure({
743
+ owns: storageEntryToDelete.revisionCreatedBy
744
+ });
846
745
  const latestEntryRevisionId = latestStorageEntry ? latestStorageEntry.id : null;
847
746
  const entryToDelete = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntryToDelete);
747
+
848
748
  /**
849
- * If targeted record is the latest entry record and there is no previous one, we need to run full delete with hooks.
850
- * At this point deleteRevision hooks are not fired.
749
+ * If targeted record is the latest entry record and there is no previous one, we need
750
+ * to run full delete with hooks. In this case, `deleteRevision` hooks are not fired.
851
751
  */
852
- if (entryToDelete.id === latestEntryRevisionId && !previousStorageEntry) {
752
+ if (entryToDelete.id === latestEntryRevisionId && !storagePreviousEntry) {
853
753
  return await deleteEntryHelper({
854
754
  model,
855
755
  entry: entryToDelete
856
756
  });
857
757
  }
858
758
  /**
859
- * If targeted record is latest entry revision, set the previous one as the new latest
759
+ * If targeted record is the latest entry revision, set the previous one as the new latest.
860
760
  */
861
761
  let entryToSetAsLatest = null;
862
762
  let storageEntryToSetAsLatest = null;
863
- if (entryToDelete.id === latestEntryRevisionId && previousStorageEntry) {
864
- entryToSetAsLatest = await (0, _entryStorage.entryFromStorageTransform)(context, model, previousStorageEntry);
865
- storageEntryToSetAsLatest = previousStorageEntry;
763
+ let updatedEntryToSetAsLatest = null;
764
+ let storageUpdatedEntryToSetAsLatest = null;
765
+ if (entryToDelete.id === latestEntryRevisionId && storagePreviousEntry) {
766
+ entryToSetAsLatest = await (0, _entryStorage.entryFromStorageTransform)(context, model, storagePreviousEntry);
767
+ storageEntryToSetAsLatest = storagePreviousEntry;
768
+
769
+ /**
770
+ * Since we're setting a different revision as the latest, we need to update entry-level meta
771
+ * fields. The values are taken from the latest revision we're about to delete. The update of the
772
+ * new latest revision is performed within storage operations.
773
+ */
774
+ const pickedEntryLevelMetaFields = (0, _constants.pickEntryMetaFields)(entryToDelete, _constants.isEntryLevelEntryMetaField);
775
+ updatedEntryToSetAsLatest = {
776
+ ...entryToSetAsLatest,
777
+ ...pickedEntryLevelMetaFields
778
+ };
779
+ storageUpdatedEntryToSetAsLatest = {
780
+ ...storageEntryToSetAsLatest,
781
+ ...pickedEntryLevelMetaFields
782
+ };
866
783
  }
867
784
  try {
868
785
  await onEntryRevisionBeforeDelete.publish({
@@ -872,8 +789,8 @@ const createContentEntryCrud = params => {
872
789
  await storageOperations.entries.deleteRevision(model, {
873
790
  entry: entryToDelete,
874
791
  storageEntry: storageEntryToDelete,
875
- latestEntry: entryToSetAsLatest,
876
- latestStorageEntry: storageEntryToSetAsLatest
792
+ latestEntry: updatedEntryToSetAsLatest,
793
+ latestStorageEntry: storageUpdatedEntryToSetAsLatest
877
794
  });
878
795
  await onEntryRevisionAfterDelete.publish({
879
796
  entry: entryToDelete,
@@ -889,23 +806,127 @@ const createContentEntryCrud = params => {
889
806
  error: ex,
890
807
  entry: entryToDelete,
891
808
  storageEntry: storageEntryToDelete,
892
- latestEntry: entryToSetAsLatest,
893
- latestStorageEntry: storageEntryToSetAsLatest
809
+ latestEntry: updatedEntryToSetAsLatest,
810
+ latestStorageEntry: storageUpdatedEntryToSetAsLatest
894
811
  });
895
812
  }
896
813
  };
897
- const deleteEntry = async (model, entryId) => {
898
- const permission = await checkEntryPermissions({
814
+ const deleteMultipleEntries = async (model, params) => {
815
+ const {
816
+ entries: input
817
+ } = params;
818
+ const maxDeletableEntries = 50;
819
+ const entryIdList = new Set();
820
+ for (const id of input) {
821
+ const {
822
+ id: entryId
823
+ } = (0, _utils.parseIdentifier)(id);
824
+ entryIdList.add(entryId);
825
+ }
826
+ const ids = Array.from(entryIdList);
827
+ if (ids.length > maxDeletableEntries) {
828
+ throw new _error.default("Cannot delete more than 50 entries at once.", "DELETE_ENTRIES_MAX", {
829
+ entries: ids
830
+ });
831
+ }
832
+ await entriesPermissions.ensure({
899
833
  rwd: "d"
900
834
  });
901
- await (0, _access.checkModelAccess)(context, model);
835
+ await modelsPermissions.ensureCanAccessModel({
836
+ model
837
+ });
838
+ const {
839
+ items: entries
840
+ } = await storageOperations.entries.list(model, {
841
+ where: {
842
+ latest: true,
843
+ entryId_in: ids
844
+ },
845
+ limit: maxDeletableEntries + 1
846
+ });
847
+ /**
848
+ * We do not want to allow deleting entries that user does not own or cannot access.
849
+ */
850
+ const items = (await (0, _filterAsync.filterAsync)(entries, async entry => {
851
+ return entriesPermissions.ensure({
852
+ owns: entry.createdBy
853
+ }, {
854
+ throw: false
855
+ });
856
+ })).map(entry => entry.id);
857
+ try {
858
+ await onEntryBeforeDeleteMultiple.publish({
859
+ entries,
860
+ ids,
861
+ model
862
+ });
863
+ await storageOperations.entries.deleteMultipleEntries(model, {
864
+ entries: items
865
+ });
866
+ await onEntryAfterDeleteMultiple.publish({
867
+ entries,
868
+ ids,
869
+ model
870
+ });
871
+ return items.map(id => {
872
+ return {
873
+ id
874
+ };
875
+ });
876
+ } catch (ex) {
877
+ await onEntryDeleteMultipleError.publish({
878
+ entries,
879
+ ids,
880
+ model,
881
+ error: ex
882
+ });
883
+ throw new _error.default(ex.message, ex.code || "DELETE_ENTRIES_MULTIPLE_ERROR", {
884
+ error: ex,
885
+ entries
886
+ });
887
+ }
888
+ };
889
+ const deleteEntry = async (model, id, options) => {
890
+ await entriesPermissions.ensure({
891
+ rwd: "d"
892
+ });
893
+ await modelsPermissions.ensureCanAccessModel({
894
+ model
895
+ });
896
+ const {
897
+ force
898
+ } = options || {};
902
899
  const storageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {
903
- id: entryId
900
+ id
904
901
  });
905
- if (!storageEntry) {
906
- throw new _handlerGraphql.NotFoundError(`Entry "${entryId}" was not found!`);
902
+ /**
903
+ * If there is no entry, and we do not force the deletion, just throw an error.
904
+ */
905
+ if (!storageEntry && !force) {
906
+ throw new _handlerGraphql.NotFoundError(`Entry "${id}" was not found!`);
907
+ }
908
+ /**
909
+ * In the case we are forcing the deletion, we do not need the storageEntry to exist as it might be an error when loading single database record.
910
+ *
911
+ * This happens, sometimes, in the Elasticsearch system as the entry might get deleted from the DynamoDB but not from the Elasticsearch.
912
+ * This is due to high load on the Elasticsearch at the time of the deletion.
913
+ */
914
+ //
915
+ else if (!storageEntry && force) {
916
+ const {
917
+ id: entryId
918
+ } = (0, _utils.parseIdentifier)(id);
919
+ return await deleteEntryHelper({
920
+ model,
921
+ entry: {
922
+ id,
923
+ entryId
924
+ }
925
+ });
907
926
  }
908
- (0, _ownership.checkOwnership)(context, permission, storageEntry);
927
+ await entriesPermissions.ensure({
928
+ owns: storageEntry.createdBy
929
+ });
909
930
  const entry = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntry);
910
931
  return await deleteEntryHelper({
911
932
  model,
@@ -913,28 +934,44 @@ const createContentEntryCrud = params => {
913
934
  });
914
935
  };
915
936
  const publishEntry = async (model, id) => {
916
- const permission = await checkEntryPermissions({
937
+ await entriesPermissions.ensure({
917
938
  pw: "p"
918
939
  });
919
- await (0, _access.checkModelAccess)(context, model);
940
+ await modelsPermissions.ensureCanAccessModel({
941
+ model
942
+ });
920
943
  const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
921
944
  id
922
945
  });
923
946
  if (!originalStorageEntry) {
924
947
  throw new _handlerGraphql.NotFoundError(`Entry "${id}" in the model "${model.modelId}" was not found.`);
925
948
  }
926
- (0, _ownership.checkOwnership)(context, permission, originalStorageEntry);
949
+ await entriesPermissions.ensure({
950
+ owns: originalStorageEntry.revisionCreatedBy
951
+ });
927
952
  const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
928
- const currentDate = new Date().toISOString();
929
- const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
930
- status: STATUS_PUBLISHED,
931
- locked: true,
932
- savedOn: currentDate,
933
- publishedOn: currentDate
953
+
954
+ // We need the latest entry to get the latest entry-level meta fields.
955
+ const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {
956
+ id: originalEntry.entryId
957
+ });
958
+ if (!latestStorageEntry) {
959
+ throw new _handlerGraphql.NotFoundError(`Entry "${id}" in the model "${model.modelId}" was not found.`);
960
+ }
961
+ const latestEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, latestStorageEntry);
962
+ const {
963
+ entry
964
+ } = await (0, _entryDataFactories.createPublishEntryData)({
965
+ context,
966
+ model,
967
+ originalEntry,
968
+ latestEntry,
969
+ getIdentity: getSecurityIdentity
934
970
  });
935
971
  let storageEntry = null;
936
972
  try {
937
973
  await onEntryBeforePublish.publish({
974
+ original: originalEntry,
938
975
  entry,
939
976
  model
940
977
  });
@@ -944,13 +981,15 @@ const createContentEntryCrud = params => {
944
981
  storageEntry
945
982
  });
946
983
  await onEntryAfterPublish.publish({
984
+ original: originalEntry,
947
985
  entry,
948
986
  storageEntry: result,
949
987
  model
950
988
  });
951
- return result;
989
+ return entry;
952
990
  } catch (ex) {
953
991
  await onEntryPublishError.publish({
992
+ original: originalEntry,
954
993
  entry,
955
994
  model,
956
995
  error: ex
@@ -965,7 +1004,7 @@ const createContentEntryCrud = params => {
965
1004
  }
966
1005
  };
967
1006
  const unpublishEntry = async (model, id) => {
968
- const permission = await checkEntryPermissions({
1007
+ await entriesPermissions.ensure({
969
1008
  pw: "u"
970
1009
  });
971
1010
  const {
@@ -982,10 +1021,17 @@ const createContentEntryCrud = params => {
982
1021
  entry: originalStorageEntry
983
1022
  });
984
1023
  }
985
- (0, _ownership.checkOwnership)(context, permission, originalStorageEntry);
1024
+ await entriesPermissions.ensure({
1025
+ owns: originalStorageEntry.revisionCreatedBy
1026
+ });
986
1027
  const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
987
- const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
988
- status: STATUS_UNPUBLISHED
1028
+ const {
1029
+ entry
1030
+ } = await (0, _entryDataFactories.createUnpublishEntryData)({
1031
+ context,
1032
+ model,
1033
+ originalEntry,
1034
+ getIdentity: getSecurityIdentity
989
1035
  });
990
1036
  let storageEntry = null;
991
1037
  try {
@@ -1003,7 +1049,7 @@ const createContentEntryCrud = params => {
1003
1049
  storageEntry: result,
1004
1050
  model
1005
1051
  });
1006
- return result;
1052
+ return entry;
1007
1053
  } catch (ex) {
1008
1054
  await onEntryUnpublishError.publish({
1009
1055
  entry,
@@ -1018,73 +1064,97 @@ const createContentEntryCrud = params => {
1018
1064
  });
1019
1065
  }
1020
1066
  };
1021
- return {
1067
+ const getUniqueFieldValues = async (model, params) => {
1068
+ await entriesPermissions.ensure({
1069
+ rwd: "r"
1070
+ });
1071
+ await modelsPermissions.ensureCanAccessModel({
1072
+ model
1073
+ });
1074
+ const {
1075
+ where: initialWhere,
1076
+ fieldId
1077
+ } = params;
1078
+ const where = {
1079
+ ...initialWhere
1080
+ };
1022
1081
  /**
1023
- * Deprecated - will be removed in 5.35.0
1082
+ * Possibly only get records which are owned by current user.
1083
+ * Or if searching for the owner set that value - in the case that user can see other entries than their own.
1024
1084
  */
1025
- onBeforeEntryCreate: onEntryBeforeCreate,
1026
- onAfterEntryCreate: onEntryAfterCreate,
1027
- onBeforeEntryCreateRevision: onEntryBeforeCreateRevision,
1028
- onAfterEntryCreateRevision: onEntryRevisionAfterCreate,
1029
- onBeforeEntryUpdate: onEntryBeforeUpdate,
1030
- onAfterEntryUpdate: onEntryAfterUpdate,
1031
- onBeforeEntryDelete: onEntryBeforeDelete,
1032
- onAfterEntryDelete: onEntryAfterDelete,
1033
- onBeforeEntryDeleteRevision: onEntryRevisionBeforeDelete,
1034
- onAfterEntryDeleteRevision: onEntryRevisionAfterDelete,
1035
- onBeforeEntryPublish: onEntryBeforePublish,
1036
- onAfterEntryPublish: onEntryAfterPublish,
1037
- onBeforeEntryUnpublish: onEntryBeforeUnpublish,
1038
- onAfterEntryUnpublish: onEntryAfterUnpublish,
1039
- onBeforeEntryGet: onEntryBeforeGet,
1040
- onBeforeEntryList: onEntryBeforeList,
1085
+ if (await entriesPermissions.canAccessOnlyOwnRecords()) {
1086
+ where.createdBy = getSecurityIdentity().id;
1087
+ }
1088
+
1041
1089
  /**
1042
- * Released in 5.34.0
1043
- *
1044
- * Create
1090
+ * Where must contain either latest or published keys.
1091
+ * We cannot list entries without one of those
1092
+ */
1093
+ if (where.latest && where.published) {
1094
+ throw new _error.default("Cannot list entries that are both published and latest.", "LIST_ENTRIES_ERROR", {
1095
+ where
1096
+ });
1097
+ } else if (!where.latest && !where.published) {
1098
+ throw new _error.default("Cannot list entries if we do not have latest or published defined.", "LIST_ENTRIES_ERROR", {
1099
+ where
1100
+ });
1101
+ }
1102
+ /**
1103
+ * We need to verify that the field in question is searchable.
1045
1104
  */
1105
+ const fields = (0, _searchableFields.getSearchableFields)({
1106
+ fields: model.fields,
1107
+ plugins: context.plugins,
1108
+ input: []
1109
+ });
1110
+ if (!fields.includes(fieldId)) {
1111
+ throw new _error.default("Cannot list unique entry field values if the field is not searchable.", "LIST_UNIQUE_ENTRY_VALUES_ERROR", {
1112
+ fieldId
1113
+ });
1114
+ }
1115
+ try {
1116
+ return await storageOperations.entries.getUniqueFieldValues(model, {
1117
+ where,
1118
+ fieldId
1119
+ });
1120
+ } catch (ex) {
1121
+ throw new _error.default("Error while fetching unique entry values from storage.", "LIST_UNIQUE_ENTRY_VALUES_ERROR", {
1122
+ error: {
1123
+ message: ex.message,
1124
+ code: ex.code,
1125
+ data: ex.data
1126
+ },
1127
+ model,
1128
+ where,
1129
+ fieldId
1130
+ });
1131
+ }
1132
+ };
1133
+ return {
1046
1134
  onEntryBeforeCreate,
1047
1135
  onEntryAfterCreate,
1048
1136
  onEntryCreateError,
1049
- /**
1050
- * Create revision
1051
- */
1052
1137
  onEntryRevisionBeforeCreate: onEntryBeforeCreateRevision,
1053
1138
  onEntryRevisionAfterCreate,
1054
1139
  onEntryRevisionCreateError: onEntryCreateRevisionError,
1055
- /**
1056
- * Update
1057
- */
1058
1140
  onEntryBeforeUpdate,
1059
1141
  onEntryAfterUpdate,
1060
1142
  onEntryUpdateError,
1061
- /**
1062
- * Delete whole entry
1063
- */
1143
+ onEntryBeforeMove,
1144
+ onEntryAfterMove,
1145
+ onEntryMoveError,
1064
1146
  onEntryBeforeDelete,
1065
1147
  onEntryAfterDelete,
1066
1148
  onEntryDeleteError,
1067
- /**
1068
- * Delete entry revision
1069
- */
1070
1149
  onEntryRevisionBeforeDelete,
1071
1150
  onEntryRevisionAfterDelete,
1072
1151
  onEntryRevisionDeleteError,
1073
- /**
1074
- * Publish
1075
- */
1076
1152
  onEntryBeforePublish,
1077
1153
  onEntryAfterPublish,
1078
1154
  onEntryPublishError,
1079
- /**
1080
- * Republish
1081
- */
1082
1155
  onEntryBeforeRepublish,
1083
1156
  onEntryAfterRepublish,
1084
1157
  onEntryRepublishError,
1085
- /**
1086
- * Unpublish
1087
- */
1088
1158
  onEntryBeforeUnpublish,
1089
1159
  onEntryAfterUnpublish,
1090
1160
  onEntryUnpublishError,
@@ -1144,38 +1214,50 @@ const createContentEntryCrud = params => {
1144
1214
  });
1145
1215
  },
1146
1216
  async listLatestEntries(model, params) {
1147
- const where = (params === null || params === void 0 ? void 0 : params.where) || {};
1148
- return this.listEntries(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({
1149
- sort: ["createdOn_DESC"]
1150
- }, params || {}), {}, {
1151
- where: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, where), {}, {
1217
+ const where = params?.where || {};
1218
+ return this.listEntries(model, {
1219
+ sort: ["createdOn_DESC"],
1220
+ ...(params || {}),
1221
+ where: {
1222
+ ...where,
1152
1223
  latest: true
1153
- })
1154
- }));
1224
+ }
1225
+ });
1155
1226
  },
1156
1227
  async listPublishedEntries(model, params) {
1157
- const where = (params === null || params === void 0 ? void 0 : params.where) || {};
1158
- return this.listEntries(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({
1159
- sort: ["createdOn_DESC"]
1160
- }, params || {}), {}, {
1161
- where: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, where), {}, {
1228
+ const where = params?.where || {};
1229
+ return this.listEntries(model, {
1230
+ sort: ["createdOn_DESC"],
1231
+ ...(params || {}),
1232
+ where: {
1233
+ ...where,
1162
1234
  published: true
1163
- })
1164
- }));
1235
+ }
1236
+ });
1165
1237
  },
1166
- async createEntry(model, input) {
1238
+ async createEntry(model, input, options) {
1167
1239
  return context.benchmark.measure("headlessCms.crud.entries.createEntry", async () => {
1168
- return createEntry(model, input);
1240
+ return createEntry(model, input, options);
1169
1241
  });
1170
1242
  },
1171
- async createEntryRevisionFrom(model, sourceId, input) {
1243
+ async createEntryRevisionFrom(model, sourceId, input, options) {
1172
1244
  return context.benchmark.measure("headlessCms.crud.entries.createEntryRevisionFrom", async () => {
1173
- return createEntryRevisionFrom(model, sourceId, input);
1245
+ return createEntryRevisionFrom(model, sourceId, input, options);
1174
1246
  });
1175
1247
  },
1176
- async updateEntry(model, id, input, meta) {
1248
+ async updateEntry(model, id, input, meta, options) {
1177
1249
  return context.benchmark.measure("headlessCms.crud.entries.updateEntry", async () => {
1178
- return updateEntry(model, id, input, meta);
1250
+ return updateEntry(model, id, input, meta, options);
1251
+ });
1252
+ },
1253
+ async validateEntry(model, id, input) {
1254
+ return context.benchmark.measure("headlessCms.crud.entries.validateEntry", async () => {
1255
+ return validateEntry(model, id, input);
1256
+ });
1257
+ },
1258
+ async moveEntry(model, id, folderId) {
1259
+ return context.benchmark.measure("headlessCms.crud.entries.moveEntry", async () => {
1260
+ return moveEntry(model, id, folderId);
1179
1261
  });
1180
1262
  },
1181
1263
  /**
@@ -1192,9 +1274,14 @@ const createContentEntryCrud = params => {
1192
1274
  return deleteEntryRevision(model, id);
1193
1275
  });
1194
1276
  },
1195
- async deleteEntry(model, entryId) {
1277
+ async deleteEntry(model, entryId, options) {
1196
1278
  return context.benchmark.measure("headlessCms.crud.entries.deleteEntry", async () => {
1197
- return deleteEntry(model, entryId);
1279
+ return deleteEntry(model, entryId, options);
1280
+ });
1281
+ },
1282
+ async deleteMultipleEntries(model, ids) {
1283
+ return context.benchmark.measure("headlessCms.crud.entries.deleteMultipleEntries", async () => {
1284
+ return deleteMultipleEntries(model, ids);
1198
1285
  });
1199
1286
  },
1200
1287
  async publishEntry(model, id) {
@@ -1206,7 +1293,14 @@ const createContentEntryCrud = params => {
1206
1293
  return context.benchmark.measure("headlessCms.crud.entries.unpublishEntry", async () => {
1207
1294
  return unpublishEntry(model, id);
1208
1295
  });
1296
+ },
1297
+ async getUniqueFieldValues(model, params) {
1298
+ return context.benchmark.measure("headlessCms.crud.entries.getUniqueFieldValues", async () => {
1299
+ return getUniqueFieldValues(model, params);
1300
+ });
1209
1301
  }
1210
1302
  };
1211
1303
  };
1212
- exports.createContentEntryCrud = createContentEntryCrud;
1304
+ exports.createContentEntryCrud = createContentEntryCrud;
1305
+
1306
+ //# sourceMappingURL=contentEntry.crud.js.map