@webiny/api-headless-cms 0.0.0-unstable.990c3ab1b6 → 0.0.0-unstable.99666aeb00

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