@webiny/api-headless-cms 0.0.0-unstable.9e825fd5fb → 0.0.0-unstable.a9593f74dd

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