@webiny/api-headless-cms 0.0.0-unstable.97a151f74d → 0.0.0-unstable.98511f29f1

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