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

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 (374) hide show
  1. package/context.d.ts +5 -2
  2. package/context.js +60 -23
  3. package/context.js.map +1 -1
  4. package/crud/contentEntry/afterDelete.js +0 -5
  5. package/crud/contentEntry/afterDelete.js.map +1 -1
  6. package/crud/contentEntry/beforeCreate.js +0 -3
  7. package/crud/contentEntry/beforeCreate.js.map +1 -1
  8. package/crud/contentEntry/beforeUpdate.js +0 -3
  9. package/crud/contentEntry/beforeUpdate.js.map +1 -1
  10. package/crud/contentEntry/entryDataValidation.js +1 -40
  11. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  12. package/crud/contentEntry/markLockedFields.d.ts +1 -1
  13. package/crud/contentEntry/markLockedFields.js +15 -28
  14. package/crud/contentEntry/markLockedFields.js.map +1 -1
  15. package/crud/contentEntry/referenceFieldsMapping.js +5 -61
  16. package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  17. package/crud/contentEntry/searchableFields.js +1 -12
  18. package/crud/contentEntry/searchableFields.js.map +1 -1
  19. package/crud/contentEntry.crud.d.ts +4 -1
  20. package/crud/contentEntry.crud.js +964 -916
  21. package/crud/contentEntry.crud.js.map +1 -1
  22. package/crud/contentModel/afterCreate.js +0 -2
  23. package/crud/contentModel/afterCreate.js.map +1 -1
  24. package/crud/contentModel/afterCreateFrom.js +0 -2
  25. package/crud/contentModel/afterCreateFrom.js.map +1 -1
  26. package/crud/contentModel/afterDelete.js +0 -2
  27. package/crud/contentModel/afterDelete.js.map +1 -1
  28. package/crud/contentModel/afterUpdate.js +0 -2
  29. package/crud/contentModel/afterUpdate.js.map +1 -1
  30. package/crud/contentModel/beforeCreate.d.ts +2 -3
  31. package/crud/contentModel/beforeCreate.js +43 -109
  32. package/crud/contentModel/beforeCreate.js.map +1 -1
  33. package/crud/contentModel/beforeDelete.js +0 -10
  34. package/crud/contentModel/beforeDelete.js.map +1 -1
  35. package/crud/contentModel/beforeUpdate.d.ts +2 -4
  36. package/crud/contentModel/beforeUpdate.js +33 -10
  37. package/crud/contentModel/beforeUpdate.js.map +1 -1
  38. package/crud/contentModel/compatibility/modelApiName.d.ts +3 -0
  39. package/crud/contentModel/compatibility/modelApiName.js +24 -0
  40. package/crud/contentModel/compatibility/modelApiName.js.map +1 -0
  41. package/crud/contentModel/contentModelManagerFactory.js +0 -7
  42. package/crud/contentModel/contentModelManagerFactory.js.map +1 -1
  43. package/crud/contentModel/createFieldStorageId.js +0 -3
  44. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  45. package/crud/contentModel/defaultFields.d.ts +5 -0
  46. package/crud/contentModel/defaultFields.js +58 -0
  47. package/crud/contentModel/defaultFields.js.map +1 -0
  48. package/crud/contentModel/fields/descriptionField.d.ts +2 -0
  49. package/crud/contentModel/fields/descriptionField.js +42 -0
  50. package/crud/contentModel/fields/descriptionField.js.map +1 -0
  51. package/crud/contentModel/fields/imageField.d.ts +2 -0
  52. package/crud/contentModel/fields/imageField.js +46 -0
  53. package/crud/contentModel/fields/imageField.js.map +1 -0
  54. package/crud/contentModel/fields/titleField.d.ts +2 -0
  55. package/crud/contentModel/fields/titleField.js +58 -0
  56. package/crud/contentModel/fields/titleField.js.map +1 -0
  57. package/crud/contentModel/validate/endingAllowed.d.ts +6 -0
  58. package/crud/contentModel/validate/endingAllowed.js +26 -0
  59. package/crud/contentModel/validate/endingAllowed.js.map +1 -0
  60. package/crud/contentModel/validate/isModelEndingAllowed.d.ts +6 -0
  61. package/crud/contentModel/validate/isModelEndingAllowed.js +24 -0
  62. package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -0
  63. package/crud/contentModel/validate/modelId.d.ts +11 -0
  64. package/crud/contentModel/validate/modelId.js +36 -0
  65. package/crud/contentModel/validate/modelId.js.map +1 -0
  66. package/crud/contentModel/validate/pluralApiName.d.ts +7 -0
  67. package/crud/contentModel/validate/pluralApiName.js +24 -0
  68. package/crud/contentModel/validate/pluralApiName.js.map +1 -0
  69. package/crud/contentModel/validate/singularApiName.d.ts +7 -0
  70. package/crud/contentModel/validate/singularApiName.js +24 -0
  71. package/crud/contentModel/validate/singularApiName.js.map +1 -0
  72. package/crud/contentModel/validateLayout.js +0 -8
  73. package/crud/contentModel/validateLayout.js.map +1 -1
  74. package/crud/contentModel/validateModel.d.ts +4 -4
  75. package/crud/contentModel/validateModel.js +6 -11
  76. package/crud/contentModel/validateModel.js.map +1 -1
  77. package/crud/contentModel/validateModelFields.d.ts +4 -4
  78. package/crud/contentModel/validateModelFields.js +119 -144
  79. package/crud/contentModel/validateModelFields.js.map +1 -1
  80. package/crud/contentModel/validation.d.ts +519 -0
  81. package/crud/contentModel/validation.js +145 -0
  82. package/crud/contentModel/validation.js.map +1 -0
  83. package/crud/contentModel.crud.js +364 -375
  84. package/crud/contentModel.crud.js.map +1 -1
  85. package/crud/contentModelGroup/beforeCreate.js +0 -12
  86. package/crud/contentModelGroup/beforeCreate.js.map +1 -1
  87. package/crud/contentModelGroup/beforeDelete.js +0 -8
  88. package/crud/contentModelGroup/beforeDelete.js.map +1 -1
  89. package/crud/contentModelGroup/beforeUpdate.js +0 -5
  90. package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
  91. package/crud/contentModelGroup/validation.d.ts +30 -0
  92. package/crud/contentModelGroup/validation.js +34 -0
  93. package/crud/contentModelGroup/validation.js.map +1 -0
  94. package/crud/contentModelGroup.crud.js +194 -208
  95. package/crud/contentModelGroup.crud.js.map +1 -1
  96. package/crud/settings.crud.d.ts +1 -1
  97. package/crud/settings.crud.js +5 -22
  98. package/crud/settings.crud.js.map +1 -1
  99. package/crud/system.crud.js +1 -96
  100. package/crud/system.crud.js.map +1 -1
  101. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js +0 -13
  102. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -1
  103. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.d.ts +11 -0
  104. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +203 -0
  105. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -0
  106. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +0 -53
  107. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  108. package/fieldConverters/index.d.ts +2 -1
  109. package/fieldConverters/index.js +2 -5
  110. package/fieldConverters/index.js.map +1 -1
  111. package/graphql/buildSchemaPlugins.d.ts +8 -3
  112. package/graphql/buildSchemaPlugins.js +6 -14
  113. package/graphql/buildSchemaPlugins.js.map +1 -1
  114. package/graphql/createExecutableSchema.d.ts +6 -0
  115. package/graphql/createExecutableSchema.js +29 -0
  116. package/graphql/createExecutableSchema.js.map +1 -0
  117. package/graphql/generateSchema.d.ts +8 -0
  118. package/graphql/generateSchema.js +31 -0
  119. package/graphql/generateSchema.js.map +1 -0
  120. package/graphql/graphQLHandlerFactory.js +134 -110
  121. package/graphql/graphQLHandlerFactory.js.map +1 -1
  122. package/graphql/index.d.ts +1 -3
  123. package/graphql/index.js +2 -46
  124. package/graphql/index.js.map +1 -1
  125. package/graphql/schema/baseContentSchema.d.ts +6 -2
  126. package/graphql/schema/baseContentSchema.js +10 -20
  127. package/graphql/schema/baseContentSchema.js.map +1 -1
  128. package/graphql/schema/baseSchema.d.ts +3 -0
  129. package/graphql/schema/baseSchema.js +53 -0
  130. package/graphql/schema/baseSchema.js.map +1 -0
  131. package/graphql/schema/contentEntries.d.ts +6 -2
  132. package/graphql/schema/contentEntries.js +118 -107
  133. package/graphql/schema/contentEntries.js.map +1 -1
  134. package/graphql/schema/contentModelGroups.d.ts +6 -2
  135. package/graphql/schema/contentModelGroups.js +16 -29
  136. package/graphql/schema/contentModelGroups.js.map +1 -1
  137. package/graphql/schema/contentModels.d.ts +6 -2
  138. package/graphql/schema/contentModels.js +46 -27
  139. package/graphql/schema/contentModels.js.map +1 -1
  140. package/graphql/schema/createFieldResolvers.js +13 -24
  141. package/graphql/schema/createFieldResolvers.js.map +1 -1
  142. package/graphql/schema/createManageResolvers.d.ts +1 -1
  143. package/graphql/schema/createManageResolvers.js +33 -43
  144. package/graphql/schema/createManageResolvers.js.map +1 -1
  145. package/graphql/schema/createManageSDL.d.ts +3 -0
  146. package/graphql/schema/createManageSDL.js +61 -65
  147. package/graphql/schema/createManageSDL.js.map +1 -1
  148. package/graphql/schema/createPreviewResolvers.js +3 -17
  149. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  150. package/graphql/schema/createReadResolvers.js +8 -17
  151. package/graphql/schema/createReadResolvers.js.map +1 -1
  152. package/graphql/schema/createReadSDL.d.ts +3 -0
  153. package/graphql/schema/createReadSDL.js +30 -34
  154. package/graphql/schema/createReadSDL.js.map +1 -1
  155. package/graphql/schema/resolvers/commonFieldResolvers.d.ts +3 -2
  156. package/graphql/schema/resolvers/commonFieldResolvers.js +2 -3
  157. package/graphql/schema/resolvers/commonFieldResolvers.js.map +1 -1
  158. package/graphql/schema/resolvers/manage/resolveCreate.js +0 -3
  159. package/graphql/schema/resolvers/manage/resolveCreate.js.map +1 -1
  160. package/graphql/schema/resolvers/manage/resolveCreateFrom.js +0 -3
  161. package/graphql/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
  162. package/graphql/schema/resolvers/manage/resolveDelete.js +0 -6
  163. package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
  164. package/graphql/schema/resolvers/manage/resolveGet.js +0 -16
  165. package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
  166. package/graphql/schema/resolvers/manage/resolveGetByIds.js +0 -3
  167. package/graphql/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
  168. package/graphql/schema/resolvers/manage/resolveGetRevisions.js +0 -3
  169. package/graphql/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
  170. package/graphql/schema/resolvers/manage/resolveList.js +0 -3
  171. package/graphql/schema/resolvers/manage/resolveList.js.map +1 -1
  172. package/graphql/schema/resolvers/manage/resolvePublish.js +0 -3
  173. package/graphql/schema/resolvers/manage/resolvePublish.js.map +1 -1
  174. package/graphql/schema/resolvers/manage/resolveRepublish.js +0 -3
  175. package/graphql/schema/resolvers/manage/resolveRepublish.js.map +1 -1
  176. package/graphql/schema/resolvers/manage/resolveUnpublish.js +0 -3
  177. package/graphql/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
  178. package/graphql/schema/resolvers/manage/resolveUpdate.js +0 -3
  179. package/graphql/schema/resolvers/manage/resolveUpdate.js.map +1 -1
  180. package/graphql/schema/resolvers/preview/resolveGet.js +0 -8
  181. package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
  182. package/graphql/schema/resolvers/preview/resolveList.js +0 -3
  183. package/graphql/schema/resolvers/preview/resolveList.js.map +1 -1
  184. package/graphql/schema/resolvers/read/resolveGet.js +0 -8
  185. package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
  186. package/graphql/schema/resolvers/read/resolveList.js +0 -3
  187. package/graphql/schema/resolvers/read/resolveList.js.map +1 -1
  188. package/graphql/schema/schemaPlugins.d.ts +8 -3
  189. package/graphql/schema/schemaPlugins.js +64 -66
  190. package/graphql/schema/schemaPlugins.js.map +1 -1
  191. package/graphql/system.js +55 -87
  192. package/graphql/system.js.map +1 -1
  193. package/graphqlFields/boolean.js +0 -12
  194. package/graphqlFields/boolean.js.map +1 -1
  195. package/graphqlFields/datetime.js +0 -17
  196. package/graphqlFields/datetime.js.map +1 -1
  197. package/graphqlFields/dynamicZone/dynamicZoneField.js +37 -30
  198. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -1
  199. package/graphqlFields/dynamicZone/dynamicZoneStorage.js +2 -18
  200. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -1
  201. package/graphqlFields/dynamicZone/index.js +0 -2
  202. package/graphqlFields/dynamicZone/index.js.map +1 -1
  203. package/graphqlFields/file.js +0 -8
  204. package/graphqlFields/file.js.map +1 -1
  205. package/graphqlFields/helpers.js +0 -10
  206. package/graphqlFields/helpers.js.map +1 -1
  207. package/graphqlFields/index.js +0 -12
  208. package/graphqlFields/index.js.map +1 -1
  209. package/graphqlFields/longText.js +0 -10
  210. package/graphqlFields/longText.js.map +1 -1
  211. package/graphqlFields/number.js +0 -12
  212. package/graphqlFields/number.js.map +1 -1
  213. package/graphqlFields/object.js +46 -50
  214. package/graphqlFields/object.js.map +1 -1
  215. package/graphqlFields/ref.js +64 -66
  216. package/graphqlFields/ref.js.map +1 -1
  217. package/graphqlFields/richText.js +0 -9
  218. package/graphqlFields/richText.js.map +1 -1
  219. package/graphqlFields/text.js +0 -11
  220. package/graphqlFields/text.js.map +1 -1
  221. package/index.d.ts +5 -3
  222. package/index.js +23 -29
  223. package/index.js.map +1 -1
  224. package/modelManager/DefaultCmsModelManager.js +0 -16
  225. package/modelManager/DefaultCmsModelManager.js.map +1 -1
  226. package/modelManager/index.js +0 -4
  227. package/modelManager/index.js.map +1 -1
  228. package/package.json +26 -28
  229. package/parameters/context.js +0 -4
  230. package/parameters/context.js.map +1 -1
  231. package/parameters/header.js +0 -11
  232. package/parameters/header.js.map +1 -1
  233. package/parameters/index.js +0 -8
  234. package/parameters/index.js.map +1 -1
  235. package/parameters/manual.js +1 -8
  236. package/parameters/manual.js.map +1 -1
  237. package/parameters/path.js +0 -11
  238. package/parameters/path.js.map +1 -1
  239. package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
  240. package/plugins/CmsGraphQLSchemaPlugin.js +12 -0
  241. package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
  242. package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +20 -0
  243. package/plugins/CmsGraphQLSchemaSorterPlugin.js +28 -0
  244. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -0
  245. package/plugins/CmsGroupPlugin.js +0 -8
  246. package/plugins/CmsGroupPlugin.js.map +1 -1
  247. package/plugins/CmsModelFieldConverterPlugin.d.ts +2 -2
  248. package/plugins/CmsModelFieldConverterPlugin.js +0 -5
  249. package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
  250. package/plugins/CmsModelPlugin.d.ts +19 -3
  251. package/plugins/CmsModelPlugin.js +30 -40
  252. package/plugins/CmsModelPlugin.js.map +1 -1
  253. package/plugins/CmsParametersPlugin.js +0 -7
  254. package/plugins/CmsParametersPlugin.js.map +1 -1
  255. package/plugins/StorageTransformPlugin.js +0 -9
  256. package/plugins/StorageTransformPlugin.js.map +1 -1
  257. package/plugins/index.d.ts +2 -0
  258. package/plugins/index.js +22 -10
  259. package/plugins/index.js.map +1 -1
  260. package/storage/default.js +0 -3
  261. package/storage/default.js.map +1 -1
  262. package/storage/object.js +0 -19
  263. package/storage/object.js.map +1 -1
  264. package/types.d.ts +234 -43
  265. package/types.js +53 -64
  266. package/types.js.map +1 -1
  267. package/utils/access.js +11 -25
  268. package/utils/access.js.map +1 -1
  269. package/utils/converters/Converter.js +0 -13
  270. package/utils/converters/Converter.js.map +1 -1
  271. package/utils/converters/ConverterCollection.js +9 -33
  272. package/utils/converters/ConverterCollection.js.map +1 -1
  273. package/utils/converters/valueKeyStorageConverter.d.ts +2 -2
  274. package/utils/converters/valueKeyStorageConverter.js +8 -27
  275. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  276. package/utils/createTypeFromFields.d.ts +1 -0
  277. package/utils/createTypeFromFields.js +11 -19
  278. package/utils/createTypeFromFields.js.map +1 -1
  279. package/utils/createTypeName.js +0 -9
  280. package/utils/createTypeName.js.map +1 -1
  281. package/utils/entryStorage.js +17 -34
  282. package/utils/entryStorage.js.map +1 -1
  283. package/utils/filterAsync.js +0 -5
  284. package/utils/filterAsync.js.map +1 -1
  285. package/utils/getBaseFieldType.js +0 -2
  286. package/utils/getBaseFieldType.js.map +1 -1
  287. package/utils/getEntryDescription.d.ts +2 -0
  288. package/utils/getEntryDescription.js +17 -0
  289. package/utils/getEntryDescription.js.map +1 -0
  290. package/utils/getEntryImage.d.ts +2 -0
  291. package/utils/getEntryImage.js +17 -0
  292. package/utils/getEntryImage.js.map +1 -0
  293. package/utils/getEntryTitle.js +0 -9
  294. package/utils/getEntryTitle.js.map +1 -1
  295. package/utils/getSchemaFromFieldPlugins.d.ts +4 -7
  296. package/utils/getSchemaFromFieldPlugins.js +23 -19
  297. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  298. package/utils/incrementEntryIdVersion.d.ts +5 -0
  299. package/utils/incrementEntryIdVersion.js +29 -0
  300. package/utils/incrementEntryIdVersion.js.map +1 -0
  301. package/utils/ownership.d.ts +3 -3
  302. package/utils/ownership.js +0 -8
  303. package/utils/ownership.js.map +1 -1
  304. package/utils/permissions.js +8 -23
  305. package/utils/permissions.js.map +1 -1
  306. package/utils/renderFields.d.ts +2 -1
  307. package/utils/renderFields.js +8 -10
  308. package/utils/renderFields.js.map +1 -1
  309. package/utils/renderGetFilterFields.js +0 -13
  310. package/utils/renderGetFilterFields.js.map +1 -1
  311. package/utils/renderInputFields.d.ts +2 -1
  312. package/utils/renderInputFields.js +4 -9
  313. package/utils/renderInputFields.js.map +1 -1
  314. package/utils/renderListFilterFields.js +1 -10
  315. package/utils/renderListFilterFields.js.map +1 -1
  316. package/utils/renderSortEnum.d.ts +7 -4
  317. package/utils/renderSortEnum.js +19 -11
  318. package/utils/renderSortEnum.js.map +1 -1
  319. package/utils/toSlug.js +0 -4
  320. package/utils/toSlug.js.map +1 -1
  321. package/validators/dateGte.js +0 -7
  322. package/validators/dateGte.js.map +1 -1
  323. package/validators/dateLte.js +0 -7
  324. package/validators/dateLte.js.map +1 -1
  325. package/validators/dynamicZone.js +0 -4
  326. package/validators/dynamicZone.js.map +1 -1
  327. package/validators/gte.js +0 -8
  328. package/validators/gte.js.map +1 -1
  329. package/validators/in.js +0 -8
  330. package/validators/in.js.map +1 -1
  331. package/validators/index.js +0 -16
  332. package/validators/index.js.map +1 -1
  333. package/validators/lte.js +0 -8
  334. package/validators/lte.js.map +1 -1
  335. package/validators/maxLength.js +0 -8
  336. package/validators/maxLength.js.map +1 -1
  337. package/validators/minLength.js +0 -8
  338. package/validators/minLength.js.map +1 -1
  339. package/validators/pattern.js +0 -9
  340. package/validators/pattern.js.map +1 -1
  341. package/validators/patternPlugins/email.js +0 -2
  342. package/validators/patternPlugins/email.js.map +1 -1
  343. package/validators/patternPlugins/index.js +0 -8
  344. package/validators/patternPlugins/index.js.map +1 -1
  345. package/validators/patternPlugins/lowerCase.js +0 -2
  346. package/validators/patternPlugins/lowerCase.js.map +1 -1
  347. package/validators/patternPlugins/lowerCaseSpace.js +0 -2
  348. package/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
  349. package/validators/patternPlugins/upperCase.js +0 -2
  350. package/validators/patternPlugins/upperCase.js.map +1 -1
  351. package/validators/patternPlugins/upperCaseSpace.js +0 -2
  352. package/validators/patternPlugins/upperCaseSpace.js.map +1 -1
  353. package/validators/patternPlugins/url.js +0 -2
  354. package/validators/patternPlugins/url.js.map +1 -1
  355. package/validators/required.js +0 -5
  356. package/validators/required.js.map +1 -1
  357. package/validators/timeGte.js +0 -8
  358. package/validators/timeGte.js.map +1 -1
  359. package/validators/timeLte.js +0 -8
  360. package/validators/timeLte.js.map +1 -1
  361. package/validators/unique.js +0 -7
  362. package/validators/unique.js.map +1 -1
  363. package/crud/index.d.ts +0 -6
  364. package/crud/index.js +0 -85
  365. package/crud/index.js.map +0 -1
  366. package/graphql/schema/resolvers/manage/resolveRequestChanges.d.ts +0 -7
  367. package/graphql/schema/resolvers/manage/resolveRequestChanges.js +0 -21
  368. package/graphql/schema/resolvers/manage/resolveRequestChanges.js.map +0 -1
  369. package/graphql/schema/resolvers/manage/resolveRequestReview.d.ts +0 -7
  370. package/graphql/schema/resolvers/manage/resolveRequestReview.js +0 -21
  371. package/graphql/schema/resolvers/manage/resolveRequestReview.js.map +0 -1
  372. package/utils/filterModelFields.d.ts +0 -16
  373. package/utils/filterModelFields.js +0 -77
  374. package/utils/filterModelFields.js.map +0 -1
@@ -1,122 +1,46 @@
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.createModelsCrud = void 0;
9
-
8
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
9
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
-
12
10
  var _dataloader = _interopRequireDefault(require("dataloader"));
13
-
11
+ var _error = _interopRequireDefault(require("@webiny/error"));
14
12
  var _handlerGraphql = require("@webiny/handler-graphql");
15
-
16
13
  var _contentModelManagerFactory = require("./contentModel/contentModelManagerFactory");
17
-
18
- var _models = require("./contentModel/models");
19
-
20
- var _createFieldModels = require("./contentModel/createFieldModels");
21
-
22
- var _error = _interopRequireDefault(require("@webiny/error"));
23
-
24
14
  var _pubsub = require("@webiny/pubsub");
25
-
26
15
  var _beforeCreate = require("./contentModel/beforeCreate");
27
-
28
16
  var _beforeUpdate = require("./contentModel/beforeUpdate");
29
-
30
17
  var _beforeDelete = require("./contentModel/beforeDelete");
31
-
32
18
  var _afterCreate = require("./contentModel/afterCreate");
33
-
34
19
  var _afterUpdate = require("./contentModel/afterUpdate");
35
-
36
20
  var _afterDelete = require("./contentModel/afterDelete");
37
-
38
21
  var _afterCreateFrom = require("./contentModel/afterCreateFrom");
39
-
40
22
  var _CmsModelPlugin = require("../plugins/CmsModelPlugin");
41
-
42
23
  var _permissions = require("../utils/permissions");
43
-
44
24
  var _filterAsync = require("../utils/filterAsync");
45
-
46
25
  var _ownership = require("../utils/ownership");
47
-
48
26
  var _access = require("../utils/access");
49
-
50
- var _validateModelFields = require("./contentModel/validateModelFields");
51
-
52
- var _semver = _interopRequireDefault(require("semver"));
53
-
54
- /**
55
- * TODO: remove for 5.34.0
56
- * Required because of the 5.33.0 upgrade.
57
- * Until the upgrade is done, API will break because there is no storageId assigned.
58
- */
59
- const featureVersion = _semver.default.coerce("5.33.0");
60
-
61
- const attachStorageIdToFields = fields => {
62
- return fields.map(field => {
63
- var _field$settings;
64
-
65
- if ((_field$settings = field.settings) !== null && _field$settings !== void 0 && _field$settings.fields) {
66
- field.settings.fields = attachStorageIdToFields(field.settings.fields);
67
- }
68
-
69
- if (!field.storageId) {
70
- field.storageId = field.fieldId;
71
- }
72
-
73
- return field;
74
- });
75
- };
76
-
77
- const attachStorageIdToModelFields = model => {
78
- if (!model.webinyVersion) {
79
- return model.fields;
80
- }
81
-
82
- const version = _semver.default.coerce(model.webinyVersion);
83
-
84
- if (!version) {
85
- return model.fields;
86
- }
87
- /**
88
- * Unfortunately we need to check for beta and next.
89
- * TODO remove after 5.33.0
90
- */
91
-
92
-
93
- if (model.webinyVersion.match(/beta|next/)) {
94
- return attachStorageIdToFields(model.fields);
95
- }
96
-
97
- if (_semver.default.compare(version, featureVersion) >= 0) {
98
- return model.fields;
99
- }
100
-
101
- return attachStorageIdToFields(model.fields);
102
- };
27
+ var _validation = require("./contentModel/validation");
28
+ var _utils = require("@webiny/utils");
29
+ var _defaultFields = require("./contentModel/defaultFields");
30
+ var _modelApiName = require("./contentModel/compatibility/modelApiName");
31
+ const _excluded = ["defaultFields"];
103
32
  /**
104
33
  * Given a model, return an array of tags ensuring the `type` tag is set.
105
34
  */
106
-
107
-
108
35
  const ensureTypeTag = model => {
109
36
  // Let's make sure we have a `type` tag assigned.
110
- // If `type` tag is not set, set it to a default one (`contentModel`).
37
+ // If `type` tag is not set, set it to a default one (`model`).
111
38
  const tags = model.tags || [];
112
-
113
- if (!tags.find(tag => tag.startsWith("type:"))) {
39
+ if (!tags.some(tag => tag.startsWith("type:"))) {
114
40
  tags.push("type:model");
115
41
  }
116
-
117
42
  return tags;
118
43
  };
119
-
120
44
  const createModelsCrud = params => {
121
45
  const {
122
46
  getTenant,
@@ -136,54 +60,51 @@ const createModelsCrud = params => {
136
60
  return [models.map(model => {
137
61
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
138
62
  tags: ensureTypeTag(model),
139
- fields: attachStorageIdToModelFields(model),
140
63
  tenant: model.tenant || getTenant().id,
141
- locale: model.locale || getLocale().code
64
+ locale: model.locale || getLocale().code,
65
+ /**
66
+ * TODO: remove in v5.36.0
67
+ * This is for backward compatibility while migrations are not yet executed.
68
+ */
69
+ singularApiName: (0, _modelApiName.ensureSingularApiName)(model),
70
+ pluralApiName: (0, _modelApiName.ensurePluralApiName)(model)
142
71
  });
143
72
  })];
144
73
  })
145
74
  };
146
-
147
75
  const clearModelsCache = () => {
148
76
  for (const loader of Object.values(loaders)) {
149
77
  loader.clearAll();
150
78
  }
151
79
  };
152
-
153
80
  const managers = new Map();
154
-
155
81
  const updateManager = async (context, model) => {
156
82
  const manager = await (0, _contentModelManagerFactory.contentModelManagerFactory)(context, model);
157
83
  managers.set(model.modelId, manager);
158
84
  return manager;
159
85
  };
160
-
161
86
  const checkModelPermissions = check => {
162
87
  return (0, _permissions.checkPermissions)(context, "cms.contentModel", {
163
88
  rwd: check
164
89
  });
165
90
  };
166
-
167
91
  const getModelsAsPlugins = () => {
168
92
  const tenant = getTenant().id;
169
93
  const locale = getLocale().code;
170
- const models = context.plugins.byType(_CmsModelPlugin.CmsModelPlugin.type)
94
+ return context.plugins.byType(_CmsModelPlugin.CmsModelPlugin.type)
171
95
  /**
172
96
  * We need to filter out models that are not for this tenant or locale.
173
97
  * If it does not have tenant or locale define, it is for every locale and tenant
174
- */
175
- .filter(plugin => {
98
+ */.filter(plugin => {
176
99
  const {
177
- tenant: t,
178
- locale: l
100
+ tenant: modelTenant,
101
+ locale: modelLocale
179
102
  } = plugin.contentModel;
180
-
181
- if (t && t !== tenant) {
103
+ if (modelTenant && modelTenant !== tenant) {
182
104
  return false;
183
- } else if (l && l !== locale) {
105
+ } else if (modelLocale && modelLocale !== locale) {
184
106
  return false;
185
107
  }
186
-
187
108
  return true;
188
109
  }).map(plugin => {
189
110
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, plugin.contentModel), {}, {
@@ -193,108 +114,100 @@ const createModelsCrud = params => {
193
114
  webinyVersion: context.WEBINY_VERSION
194
115
  });
195
116
  });
196
- /**
197
- * Only point where we can truly validate the user model is in the runtime.
198
- */
199
-
200
- for (const model of models) {
201
- (0, _validateModelFields.validateModelFields)({
202
- model,
203
- plugins: context.plugins
204
- });
205
- }
206
-
207
- return models;
208
117
  };
209
-
210
118
  const modelsGet = async modelId => {
211
119
  const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);
212
-
213
120
  if (pluginModel) {
214
121
  return pluginModel;
215
122
  }
216
-
217
123
  const model = await storageOperations.models.get({
218
124
  tenant: getTenant().id,
219
125
  locale: getLocale().code,
220
126
  modelId
221
127
  });
222
-
223
128
  if (!model) {
224
129
  throw new _handlerGraphql.NotFoundError(`Content model "${modelId}" was not found!`);
225
130
  }
226
-
227
131
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
228
132
  tags: ensureTypeTag(model),
229
133
  tenant: model.tenant || getTenant().id,
230
134
  locale: model.locale || getLocale().code
231
135
  });
232
136
  };
233
-
234
137
  const modelsList = async () => {
235
138
  const databaseModels = await loaders.listModels.load("listModels");
236
139
  const pluginsModels = getModelsAsPlugins();
237
140
  return databaseModels.concat(pluginsModels);
238
141
  };
239
-
240
142
  const listModels = async () => {
241
- const permission = await checkModelPermissions("r");
242
- const models = await modelsList();
243
- return (0, _filterAsync.filterAsync)(models, async model => {
244
- if (!(0, _ownership.validateOwnership)(context, permission, model)) {
245
- return false;
246
- }
247
-
248
- return (0, _access.validateModelAccess)(context, model);
143
+ return context.benchmark.measure("headlessCms.crud.models.listModels", async () => {
144
+ const permission = await checkModelPermissions("r");
145
+ const models = await modelsList();
146
+ return (0, _filterAsync.filterAsync)(models, async model => {
147
+ if (!(0, _ownership.validateOwnership)(context, permission, model)) {
148
+ return false;
149
+ }
150
+ return (0, _access.validateModelAccess)(context, model);
151
+ });
249
152
  });
250
153
  };
251
-
252
154
  const getModel = async modelId => {
253
- const permission = await checkModelPermissions("r");
254
- const model = await modelsGet(modelId);
255
- (0, _ownership.checkOwnership)(context, permission, model);
256
- await (0, _access.checkModelAccess)(context, model);
257
- return model;
155
+ return context.benchmark.measure("headlessCms.crud.models.getModel", async () => {
156
+ const permission = await checkModelPermissions("r");
157
+ const model = await modelsGet(modelId);
158
+ (0, _ownership.checkOwnership)(context, permission, model);
159
+ await (0, _access.checkModelAccess)(context, model);
160
+ return model;
161
+ });
258
162
  };
259
-
260
163
  const getModelManager = async target => {
261
164
  const modelId = typeof target === "string" ? target : target.modelId;
262
-
263
165
  if (managers.has(modelId)) {
264
166
  return managers.get(modelId);
265
167
  }
266
-
267
168
  const models = await modelsList();
268
169
  const model = models.find(m => m.modelId === modelId);
269
-
270
170
  if (!model) {
271
171
  throw new _handlerGraphql.NotFoundError(`There is no content model "${modelId}".`);
272
172
  }
273
-
274
173
  return await updateManager(context, model);
275
- }; // create
276
-
174
+ };
277
175
 
176
+ /**
177
+ * Create
178
+ */
278
179
  const onModelBeforeCreate = (0, _pubsub.createTopic)("cms.onModelBeforeCreate");
279
- const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate"); // create from
280
-
180
+ const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate");
181
+ const onModelCreateError = (0, _pubsub.createTopic)("cms.onModelCreateError");
182
+ /**
183
+ * Create from / clone
184
+ */
281
185
  const onModelBeforeCreateFrom = (0, _pubsub.createTopic)("cms.onModelBeforeCreateFrom");
282
- const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom"); // update
283
-
186
+ const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom");
187
+ const onModelCreateFromError = (0, _pubsub.createTopic)("cms.onModelCreateFromError");
188
+ /**
189
+ * Update
190
+ */
284
191
  const onModelBeforeUpdate = (0, _pubsub.createTopic)("cms.onModelBeforeUpdate");
285
- const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate"); // delete
286
-
192
+ const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate");
193
+ const onModelUpdateError = (0, _pubsub.createTopic)("cms.onModelUpdateError");
194
+ /**
195
+ * Delete
196
+ */
287
197
  const onModelBeforeDelete = (0, _pubsub.createTopic)("cms.onModelBeforeDelete");
288
198
  const onModelAfterDelete = (0, _pubsub.createTopic)("cms.onModelAfterDelete");
199
+ const onModelDeleteError = (0, _pubsub.createTopic)("cms.onModelDeleteError");
200
+ /**
201
+ * Initialize
202
+ */
289
203
  const onModelInitialize = (0, _pubsub.createTopic)("cms.onModelInitialize");
290
204
  /**
291
205
  * We need to assign some default behaviors.
292
206
  */
293
-
294
207
  (0, _beforeCreate.assignModelBeforeCreate)({
295
208
  onModelBeforeCreate,
296
209
  onModelBeforeCreateFrom,
297
- plugins: context.plugins,
210
+ context,
298
211
  storageOperations
299
212
  });
300
213
  (0, _afterCreate.assignModelAfterCreate)({
@@ -303,8 +216,7 @@ const createModelsCrud = params => {
303
216
  });
304
217
  (0, _beforeUpdate.assignModelBeforeUpdate)({
305
218
  onModelBeforeUpdate,
306
- plugins: context.plugins,
307
- storageOperations
219
+ context
308
220
  });
309
221
  (0, _afterUpdate.assignModelAfterUpdate)({
310
222
  context,
@@ -323,77 +235,62 @@ const createModelsCrud = params => {
323
235
  context,
324
236
  onModelAfterDelete
325
237
  });
326
- return {
327
- /**
328
- * Deprecated - will be removed in 5.36.0
329
- */
330
- onBeforeModelCreate: onModelBeforeCreate,
331
- onAfterModelCreate: onModelAfterCreate,
332
- onBeforeModelCreateFrom: onModelBeforeCreateFrom,
333
- onAfterModelCreateFrom: onModelAfterCreateFrom,
334
- onBeforeModelUpdate: onModelBeforeUpdate,
335
- onAfterModelUpdate: onModelAfterUpdate,
336
- onBeforeModelDelete: onModelBeforeDelete,
337
- onAfterModelDelete: onModelAfterDelete,
338
238
 
239
+ /**
240
+ * CRUD methods
241
+ */
242
+ const createModel = async input => {
243
+ await checkModelPermissions("w");
244
+ const result = await (0, _validation.createModelCreateValidation)().safeParseAsync(input);
245
+ if (!result.success) {
246
+ throw (0, _utils.createZodError)(result.error);
247
+ }
339
248
  /**
340
- * Released in 5.34.0
249
+ * We need to extract the defaultFields because it is not for the CmsModel object.
341
250
  */
342
- onModelBeforeCreate,
343
- onModelAfterCreate,
344
- onModelBeforeCreateFrom,
345
- onModelAfterCreateFrom,
346
- onModelBeforeUpdate,
347
- onModelAfterUpdate,
348
- onModelBeforeDelete,
349
- onModelAfterDelete,
350
- onModelInitialize,
351
- clearModelsCache,
352
- getModel,
353
- listModels,
354
-
355
- async createModel(inputData) {
356
- await checkModelPermissions("w");
357
- const createdData = new _models.CreateContentModelModel().populate(inputData);
358
- await createdData.validate();
359
- const input = await createdData.toJSON();
360
- context.security.disableAuthorization();
361
- const group = await context.cms.getGroup(input.group);
362
- context.security.enableAuthorization();
363
-
364
- if (!group) {
365
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
366
- }
367
-
368
- const fields = await (0, _createFieldModels.createFieldModels)(input.fields);
369
- const identity = getIdentity();
370
- const model = {
371
- name: input.name,
372
- description: input.description || "",
373
- modelId: input.modelId || "",
374
- titleFieldId: "id",
375
- locale: getLocale().code,
376
- tenant: getTenant().id,
377
- group: {
378
- id: group.id,
379
- name: group.name
380
- },
381
- createdBy: {
382
- id: identity.id,
383
- displayName: identity.displayName,
384
- type: identity.type
385
- },
386
- createdOn: new Date().toISOString(),
387
- savedOn: new Date().toISOString(),
388
- fields,
389
- lockedFields: [],
390
- layout: input.layout || [],
391
- tags: [...(input.tags || [])],
392
- webinyVersion: context.WEBINY_VERSION
393
- };
394
- model.tags = ensureTypeTag(model);
251
+ const _removeUndefinedValue = (0, _utils.removeUndefinedValues)(result.data),
252
+ {
253
+ defaultFields
254
+ } = _removeUndefinedValue,
255
+ data = (0, _objectWithoutProperties2.default)(_removeUndefinedValue, _excluded);
256
+ if (defaultFields) {
257
+ (0, _defaultFields.assignModelDefaultFields)(data);
258
+ }
259
+ const group = await context.security.withoutAuthorization(async () => {
260
+ return context.cms.getGroup(data.group);
261
+ });
262
+ if (!group) {
263
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
264
+ }
265
+ const identity = getIdentity();
266
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, data), {}, {
267
+ modelId: data.modelId || "",
268
+ singularApiName: data.singularApiName,
269
+ pluralApiName: data.pluralApiName,
270
+ titleFieldId: "id",
271
+ descriptionFieldId: null,
272
+ imageFieldId: null,
273
+ description: data.description || "",
274
+ locale: getLocale().code,
275
+ tenant: getTenant().id,
276
+ group: {
277
+ id: group.id,
278
+ name: group.name
279
+ },
280
+ createdBy: {
281
+ id: identity.id,
282
+ displayName: identity.displayName,
283
+ type: identity.type
284
+ },
285
+ createdOn: new Date().toISOString(),
286
+ savedOn: new Date().toISOString(),
287
+ lockedFields: [],
288
+ webinyVersion: context.WEBINY_VERSION
289
+ });
290
+ model.tags = ensureTypeTag(model);
291
+ try {
395
292
  await onModelBeforeCreate.publish({
396
- input,
293
+ input: data,
397
294
  model
398
295
  });
399
296
  const createdModel = await storageOperations.models.create({
@@ -402,26 +299,101 @@ const createModelsCrud = params => {
402
299
  loaders.listModels.clearAll();
403
300
  await updateManager(context, model);
404
301
  await onModelAfterCreate.publish({
405
- input,
302
+ input: data,
406
303
  model: createdModel
407
304
  });
408
305
  return createdModel;
409
- },
410
-
411
- /**
412
- * Method does not check for permissions or ownership.
413
- * @internal
414
- */
415
- async updateModelDirect(params) {
416
- const {
417
- model: initialModel,
418
- original
419
- } = params;
420
- const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, initialModel), {}, {
421
- tenant: initialModel.tenant || getTenant().id,
422
- locale: initialModel.locale || getLocale().code,
423
- webinyVersion: context.WEBINY_VERSION
306
+ } catch (ex) {
307
+ await onModelCreateError.publish({
308
+ input: data,
309
+ model,
310
+ error: ex
311
+ });
312
+ throw ex;
313
+ }
314
+ };
315
+ const updateModel = async (modelId, input) => {
316
+ await checkModelPermissions("w");
317
+
318
+ // Get a model record; this will also perform ownership validation.
319
+ const original = await getModel(modelId);
320
+ const result = await (0, _validation.createModelUpdateValidation)().safeParseAsync(input);
321
+ if (!result.success) {
322
+ throw (0, _utils.createZodError)(result.error);
323
+ }
324
+ const data = (0, _utils.removeUndefinedValues)(result.data);
325
+ if (Object.keys(data).length === 0) {
326
+ /**
327
+ * We need to return the original if nothing is to be updated.
328
+ */
329
+ return original;
330
+ }
331
+ let group = {
332
+ id: original.group.id,
333
+ name: original.group.name
334
+ };
335
+ const groupId = data.group;
336
+ if (groupId) {
337
+ const groupData = await context.security.withoutAuthorization(async () => {
338
+ return context.cms.getGroup(groupId);
339
+ });
340
+ if (!groupData) {
341
+ throw new _handlerGraphql.NotFoundError(`There is no group "${groupId}".`);
342
+ }
343
+ group = {
344
+ id: groupData.id,
345
+ name: groupData.name
346
+ };
347
+ }
348
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), data), {}, {
349
+ titleFieldId: data.titleFieldId === undefined ? original.titleFieldId : data.titleFieldId,
350
+ descriptionFieldId: data.descriptionFieldId === undefined ? original.descriptionFieldId : data.descriptionFieldId,
351
+ imageFieldId: data.imageFieldId === undefined ? original.imageFieldId : data.imageFieldId,
352
+ group,
353
+ description: data.description || original.description,
354
+ tenant: original.tenant || getTenant().id,
355
+ locale: original.locale || getLocale().code,
356
+ webinyVersion: context.WEBINY_VERSION,
357
+ savedOn: new Date().toISOString()
358
+ });
359
+ model.tags = ensureTypeTag(model);
360
+ try {
361
+ await onModelBeforeUpdate.publish({
362
+ input: data,
363
+ original,
364
+ model
424
365
  });
366
+ const resultModel = await storageOperations.models.update({
367
+ model
368
+ });
369
+ await updateManager(context, resultModel);
370
+ await onModelAfterUpdate.publish({
371
+ input: data,
372
+ original,
373
+ model: resultModel
374
+ });
375
+ return resultModel;
376
+ } catch (ex) {
377
+ await onModelUpdateError.publish({
378
+ input: data,
379
+ model,
380
+ original,
381
+ error: ex
382
+ });
383
+ throw ex;
384
+ }
385
+ };
386
+ const updateModelDirect = async params => {
387
+ const {
388
+ model: initialModel,
389
+ original
390
+ } = params;
391
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, initialModel), {}, {
392
+ tenant: initialModel.tenant || getTenant().id,
393
+ locale: initialModel.locale || getLocale().code,
394
+ webinyVersion: context.WEBINY_VERSION
395
+ });
396
+ try {
425
397
  await onModelBeforeUpdate.publish({
426
398
  input: {},
427
399
  original,
@@ -438,66 +410,70 @@ const createModelsCrud = params => {
438
410
  model: resultModel
439
411
  });
440
412
  return resultModel;
441
- },
442
-
443
- async createModelFrom(modelId, data) {
444
- await checkModelPermissions("w");
445
- /**
446
- * Get a model record; this will also perform ownership validation.
447
- */
448
-
449
- const original = await getModel(modelId);
450
- const createdData = new _models.CreateContentModelModelFrom().populate({
451
- name: data.name,
452
- modelId: data.modelId,
453
- description: data.description || original.description,
454
- group: data.group,
455
- locale: data.locale
456
- });
457
- await createdData.validate();
458
- const input = await createdData.toJSON();
459
- const locale = await context.i18n.getLocale(input.locale || original.locale);
460
-
461
- if (!locale) {
462
- throw new _handlerGraphql.NotFoundError(`There is no locale "${input.locale}".`);
463
- }
464
- /**
465
- * Use storage operations directly because we cannot get group from different locale via context methods.
466
- */
467
-
468
-
469
- const group = await context.cms.storageOperations.groups.get({
470
- id: input.group,
471
- tenant: original.tenant,
472
- locale: locale.code
473
- });
474
-
475
- if (!group) {
476
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
477
- }
478
-
479
- const identity = getIdentity();
480
- const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), {}, {
481
- locale: locale.code,
482
- group: {
483
- id: group.id,
484
- name: group.name
485
- },
486
- name: input.name,
487
- modelId: input.modelId || "",
488
- description: input.description || "",
489
- createdBy: {
490
- id: identity.id,
491
- displayName: identity.displayName,
492
- type: identity.type
493
- },
494
- createdOn: new Date().toISOString(),
495
- savedOn: new Date().toISOString(),
496
- lockedFields: [],
497
- webinyVersion: context.WEBINY_VERSION
413
+ } catch (ex) {
414
+ await onModelUpdateError.publish({
415
+ input: {},
416
+ original,
417
+ model,
418
+ error: ex
498
419
  });
420
+ throw ex;
421
+ }
422
+ };
423
+ const createModelFrom = async (modelId, input) => {
424
+ await checkModelPermissions("w");
425
+ /**
426
+ * Get a model record; this will also perform ownership validation.
427
+ */
428
+ const original = await getModel(modelId);
429
+ const result = await (0, _validation.createModelCreateFromValidation)().safeParseAsync((0, _objectSpread2.default)((0, _objectSpread2.default)({}, input), {}, {
430
+ description: input.description || original.description
431
+ }));
432
+ if (!result.success) {
433
+ throw (0, _utils.createZodError)(result.error);
434
+ }
435
+ const data = (0, _utils.removeUndefinedValues)(result.data);
436
+ const locale = await context.i18n.getLocale(data.locale || original.locale);
437
+ if (!locale) {
438
+ throw new _handlerGraphql.NotFoundError(`There is no locale "${data.locale}".`);
439
+ }
440
+ /**
441
+ * Use storage operations directly because we cannot get group from different locale via context methods.
442
+ */
443
+ const group = await context.cms.storageOperations.groups.get({
444
+ id: data.group,
445
+ tenant: original.tenant,
446
+ locale: locale.code
447
+ });
448
+ if (!group) {
449
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
450
+ }
451
+ const identity = getIdentity();
452
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), {}, {
453
+ singularApiName: data.singularApiName,
454
+ pluralApiName: data.pluralApiName,
455
+ locale: locale.code,
456
+ group: {
457
+ id: group.id,
458
+ name: group.name
459
+ },
460
+ icon: data.icon,
461
+ name: data.name,
462
+ modelId: data.modelId || "",
463
+ description: data.description || "",
464
+ createdBy: {
465
+ id: identity.id,
466
+ displayName: identity.displayName,
467
+ type: identity.type
468
+ },
469
+ createdOn: new Date().toISOString(),
470
+ savedOn: new Date().toISOString(),
471
+ lockedFields: [],
472
+ webinyVersion: context.WEBINY_VERSION
473
+ });
474
+ try {
499
475
  await onModelBeforeCreateFrom.publish({
500
- input,
476
+ input: data,
501
477
  model,
502
478
  original
503
479
  });
@@ -507,84 +483,28 @@ const createModelsCrud = params => {
507
483
  loaders.listModels.clearAll();
508
484
  await updateManager(context, model);
509
485
  await onModelAfterCreateFrom.publish({
510
- input,
486
+ input: data,
511
487
  original,
512
488
  model: createdModel
513
489
  });
514
490
  return createdModel;
515
- },
516
-
517
- async updateModel(modelId, inputData) {
518
- await checkModelPermissions("w"); // Get a model record; this will also perform ownership validation.
519
-
520
- const original = await getModel(modelId);
521
- const updatedData = new _models.UpdateContentModelModel().populate(inputData);
522
- await updatedData.validate();
523
- const input = await updatedData.toJSON({
524
- onlyDirty: true
525
- });
526
-
527
- if (Object.keys(input).length === 0) {
528
- /**
529
- * We need to return the original if nothing is to be updated.
530
- */
531
- return original;
532
- }
533
-
534
- let group = {
535
- id: original.group.id,
536
- name: original.group.name
537
- };
538
-
539
- if (input.group) {
540
- context.security.disableAuthorization();
541
- const groupData = await context.cms.getGroup(input.group);
542
- context.security.enableAuthorization();
543
-
544
- if (!groupData) {
545
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
546
- }
547
-
548
- group = {
549
- id: groupData.id,
550
- name: groupData.name
551
- };
552
- }
553
-
554
- const fields = await (0, _createFieldModels.createFieldModels)(inputData.fields);
555
- const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), input), {}, {
556
- group,
557
- tenant: original.tenant || getTenant().id,
558
- locale: original.locale || getLocale().code,
559
- webinyVersion: context.WEBINY_VERSION,
560
- fields,
561
- savedOn: new Date().toISOString()
562
- });
563
- model.tags = ensureTypeTag(model);
564
- await onModelBeforeUpdate.publish({
565
- input,
566
- original,
567
- model
568
- });
569
- const resultModel = await storageOperations.models.update({
570
- model
571
- });
572
- await updateManager(context, resultModel);
573
- await onModelAfterUpdate.publish({
574
- input,
491
+ } catch (ex) {
492
+ await onModelCreateFromError.publish({
493
+ input: data,
575
494
  original,
576
- model: resultModel
495
+ model,
496
+ error: ex
577
497
  });
578
- return resultModel;
579
- },
580
-
581
- async deleteModel(modelId) {
582
- await checkModelPermissions("d");
583
- const model = await getModel(modelId);
498
+ throw ex;
499
+ }
500
+ };
501
+ const deleteModel = async modelId => {
502
+ await checkModelPermissions("d");
503
+ const model = await getModel(modelId);
504
+ try {
584
505
  await onModelBeforeDelete.publish({
585
506
  model
586
507
  });
587
-
588
508
  try {
589
509
  await storageOperations.models.delete({
590
510
  model
@@ -595,26 +515,96 @@ const createModelsCrud = params => {
595
515
  modelId: model.modelId
596
516
  });
597
517
  }
598
-
599
518
  await onModelAfterDelete.publish({
600
519
  model
601
520
  });
602
521
  managers.delete(model.modelId);
522
+ } catch (ex) {
523
+ await onModelDeleteError.publish({
524
+ model,
525
+ error: ex
526
+ });
527
+ throw ex;
528
+ }
529
+ };
530
+ const initializeModel = async (modelId, data) => {
531
+ /**
532
+ * We require that users have write permissions to initialize models.
533
+ * Maybe introduce another permission for it?
534
+ */
535
+ await checkModelPermissions("w");
536
+ const model = await getModel(modelId);
537
+ await onModelInitialize.publish({
538
+ model,
539
+ data
540
+ });
541
+ return true;
542
+ };
543
+ return {
544
+ /**
545
+ * Deprecated - will be removed in 5.36.0
546
+ */
547
+ onBeforeModelCreate: onModelBeforeCreate,
548
+ onAfterModelCreate: onModelAfterCreate,
549
+ onBeforeModelCreateFrom: onModelBeforeCreateFrom,
550
+ onAfterModelCreateFrom: onModelAfterCreateFrom,
551
+ onBeforeModelUpdate: onModelBeforeUpdate,
552
+ onAfterModelUpdate: onModelAfterUpdate,
553
+ onBeforeModelDelete: onModelBeforeDelete,
554
+ onAfterModelDelete: onModelAfterDelete,
555
+ /**
556
+ * Released in 5.34.0
557
+ */
558
+ onModelBeforeCreate,
559
+ onModelAfterCreate,
560
+ onModelCreateError,
561
+ onModelBeforeCreateFrom,
562
+ onModelAfterCreateFrom,
563
+ onModelCreateFromError,
564
+ onModelBeforeUpdate,
565
+ onModelAfterUpdate,
566
+ onModelUpdateError,
567
+ onModelBeforeDelete,
568
+ onModelAfterDelete,
569
+ onModelDeleteError,
570
+ onModelInitialize,
571
+ clearModelsCache,
572
+ getModel,
573
+ listModels,
574
+ async createModel(input) {
575
+ return context.benchmark.measure("headlessCms.crud.models.createModel", async () => {
576
+ return createModel(input);
577
+ });
603
578
  },
604
-
605
- async initializeModel(modelId) {
606
- /**
607
- * We require that users have write permissions to initialize models.
608
- * Maybe introduce another permission for it?
609
- */
610
- await checkModelPermissions("w");
611
- const model = await getModel(modelId);
612
- await onModelInitialize.publish({
613
- model
579
+ /**
580
+ * Method does not check for permissions or ownership.
581
+ * @internal
582
+ */
583
+ async updateModelDirect(params) {
584
+ return context.benchmark.measure("headlessCms.crud.models.updateModelDirect", async () => {
585
+ return updateModelDirect(params);
586
+ });
587
+ },
588
+ async createModelFrom(modelId, userInput) {
589
+ return context.benchmark.measure("headlessCms.crud.models.createModelFrom", async () => {
590
+ return createModelFrom(modelId, userInput);
591
+ });
592
+ },
593
+ async updateModel(modelId, input) {
594
+ return context.benchmark.measure("headlessCms.crud.models.updateModel", async () => {
595
+ return updateModel(modelId, input);
596
+ });
597
+ },
598
+ async deleteModel(modelId) {
599
+ return context.benchmark.measure("headlessCms.crud.models.deleteModel", async () => {
600
+ return deleteModel(modelId);
601
+ });
602
+ },
603
+ async initializeModel(modelId, data) {
604
+ return context.benchmark.measure("headlessCms.crud.models.initializeModel", async () => {
605
+ return initializeModel(modelId, data);
614
606
  });
615
- return true;
616
607
  },
617
-
618
608
  getModelManager,
619
609
  getEntryManager: async model => {
620
610
  return getModelManager(model);
@@ -623,5 +613,4 @@ const createModelsCrud = params => {
623
613
  getEntryManagers: () => managers
624
614
  };
625
615
  };
626
-
627
616
  exports.createModelsCrud = createModelsCrud;