@webiny/api-headless-cms 0.0.0-unstable.615a930a68 → 0.0.0-unstable.6509387258

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