@webiny/api-headless-cms 0.0.0-unstable.40876133bb → 0.0.0-unstable.60e968001a

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 (146) hide show
  1. package/context.d.ts +5 -2
  2. package/context.js +63 -4
  3. package/context.js.map +1 -1
  4. package/crud/contentEntry/markLockedFields.js +5 -2
  5. package/crud/contentEntry/markLockedFields.js.map +1 -1
  6. package/crud/contentEntry/referenceFieldsMapping.js +9 -5
  7. package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  8. package/crud/contentEntry/searchableFields.d.ts +9 -0
  9. package/crud/contentEntry/searchableFields.js +83 -0
  10. package/crud/contentEntry/searchableFields.js.map +1 -0
  11. package/crud/contentEntry.crud.js +65 -40
  12. package/crud/contentEntry.crud.js.map +1 -1
  13. package/crud/contentModel/createFieldStorageId.js +5 -1
  14. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  15. package/crud/contentModel/models.js +12 -0
  16. package/crud/contentModel/models.js.map +1 -1
  17. package/crud/contentModel/validateModelFields.js +46 -37
  18. package/crud/contentModel/validateModelFields.js.map +1 -1
  19. package/crud/contentModel/validation.d.ts +477 -0
  20. package/crud/contentModel/validation.js +109 -0
  21. package/crud/contentModel/validation.js.map +1 -0
  22. package/crud/contentModel.crud.js +227 -175
  23. package/crud/contentModel.crud.js.map +1 -1
  24. package/crud/contentModelGroup/validation.d.ts +30 -0
  25. package/crud/contentModelGroup/validation.js +43 -0
  26. package/crud/contentModelGroup/validation.js.map +1 -0
  27. package/crud/contentModelGroup.crud.js +54 -54
  28. package/crud/contentModelGroup.crud.js.map +1 -1
  29. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.d.ts +11 -0
  30. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +239 -0
  31. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -0
  32. package/fieldConverters/index.d.ts +2 -1
  33. package/fieldConverters/index.js +3 -1
  34. package/fieldConverters/index.js.map +1 -1
  35. package/graphql/buildSchemaPlugins.d.ts +2 -2
  36. package/graphql/buildSchemaPlugins.js.map +1 -1
  37. package/graphql/graphQLHandlerFactory.js +58 -28
  38. package/graphql/graphQLHandlerFactory.js.map +1 -1
  39. package/graphql/index.d.ts +2 -2
  40. package/graphql/index.js +49 -38
  41. package/graphql/index.js.map +1 -1
  42. package/graphql/schema/baseContentSchema.d.ts +2 -2
  43. package/graphql/schema/baseContentSchema.js +3 -3
  44. package/graphql/schema/baseContentSchema.js.map +1 -1
  45. package/graphql/schema/contentEntries.d.ts +2 -2
  46. package/graphql/schema/contentEntries.js +5 -5
  47. package/graphql/schema/contentEntries.js.map +1 -1
  48. package/graphql/schema/contentModelGroups.d.ts +2 -2
  49. package/graphql/schema/contentModelGroups.js +3 -3
  50. package/graphql/schema/contentModelGroups.js.map +1 -1
  51. package/graphql/schema/contentModels.d.ts +2 -2
  52. package/graphql/schema/contentModels.js +26 -7
  53. package/graphql/schema/contentModels.js.map +1 -1
  54. package/graphql/schema/createFieldResolvers.d.ts +1 -1
  55. package/graphql/schema/createFieldResolvers.js +23 -7
  56. package/graphql/schema/createFieldResolvers.js.map +1 -1
  57. package/graphql/schema/createManageSDL.d.ts +2 -0
  58. package/graphql/schema/createManageSDL.js +9 -6
  59. package/graphql/schema/createManageSDL.js.map +1 -1
  60. package/graphql/schema/createReadResolvers.js +5 -0
  61. package/graphql/schema/createReadResolvers.js.map +1 -1
  62. package/graphql/schema/createReadSDL.d.ts +2 -0
  63. package/graphql/schema/createReadSDL.js +11 -5
  64. package/graphql/schema/createReadSDL.js.map +1 -1
  65. package/graphql/schema/schemaPlugins.d.ts +2 -2
  66. package/graphql/schema/schemaPlugins.js +11 -8
  67. package/graphql/schema/schemaPlugins.js.map +1 -1
  68. package/graphql/system.js +79 -82
  69. package/graphql/system.js.map +1 -1
  70. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +2 -0
  71. package/graphqlFields/dynamicZone/dynamicZoneField.js +234 -0
  72. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -0
  73. package/graphqlFields/dynamicZone/dynamicZoneStorage.d.ts +3 -0
  74. package/graphqlFields/dynamicZone/dynamicZoneStorage.js +79 -0
  75. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -0
  76. package/graphqlFields/dynamicZone/index.d.ts +2 -0
  77. package/graphqlFields/dynamicZone/index.js +21 -0
  78. package/graphqlFields/dynamicZone/index.js.map +1 -0
  79. package/graphqlFields/index.d.ts +1 -1
  80. package/graphqlFields/index.js +3 -1
  81. package/graphqlFields/index.js.map +1 -1
  82. package/graphqlFields/number.js +4 -0
  83. package/graphqlFields/number.js.map +1 -1
  84. package/graphqlFields/object.js +122 -72
  85. package/graphqlFields/object.js.map +1 -1
  86. package/graphqlFields/ref.js +34 -48
  87. package/graphqlFields/ref.js.map +1 -1
  88. package/index.d.ts +3 -3
  89. package/index.js +4 -8
  90. package/index.js.map +1 -1
  91. package/package.json +26 -26
  92. package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
  93. package/plugins/CmsGraphQLSchemaPlugin.js +17 -0
  94. package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
  95. package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +20 -0
  96. package/plugins/CmsGraphQLSchemaSorterPlugin.js +38 -0
  97. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -0
  98. package/plugins/CmsModelFieldConverterPlugin.d.ts +2 -2
  99. package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
  100. package/plugins/StorageTransformPlugin.d.ts +11 -11
  101. package/plugins/StorageTransformPlugin.js.map +1 -1
  102. package/plugins/index.d.ts +2 -0
  103. package/plugins/index.js +26 -0
  104. package/plugins/index.js.map +1 -1
  105. package/storage/object.js +5 -2
  106. package/storage/object.js.map +1 -1
  107. package/types.d.ts +203 -55
  108. package/types.js +55 -7
  109. package/types.js.map +1 -1
  110. package/utils/converters/ConverterCollection.js +6 -2
  111. package/utils/converters/ConverterCollection.js.map +1 -1
  112. package/utils/createTypeFromFields.d.ts +15 -0
  113. package/utils/createTypeFromFields.js +75 -0
  114. package/utils/createTypeFromFields.js.map +1 -0
  115. package/utils/createTypeName.js +3 -1
  116. package/utils/createTypeName.js.map +1 -1
  117. package/utils/entryStorage.js +15 -12
  118. package/utils/entryStorage.js.map +1 -1
  119. package/utils/getBaseFieldType.d.ts +4 -0
  120. package/utils/getBaseFieldType.js +12 -0
  121. package/utils/getBaseFieldType.js.map +1 -0
  122. package/utils/renderFields.js +3 -1
  123. package/utils/renderFields.js.map +1 -1
  124. package/utils/renderGetFilterFields.js +8 -3
  125. package/utils/renderGetFilterFields.js.map +1 -1
  126. package/utils/renderInputFields.js +3 -1
  127. package/utils/renderInputFields.js.map +1 -1
  128. package/utils/renderListFilterFields.js +5 -2
  129. package/utils/renderListFilterFields.js.map +1 -1
  130. package/utils/renderSortEnum.d.ts +7 -4
  131. package/utils/renderSortEnum.js +23 -4
  132. package/utils/renderSortEnum.js.map +1 -1
  133. package/validators/dynamicZone.d.ts +2 -0
  134. package/validators/dynamicZone.js +24 -0
  135. package/validators/dynamicZone.js.map +1 -0
  136. package/validators/index.js +3 -1
  137. package/validators/index.js.map +1 -1
  138. package/crud/index.d.ts +0 -6
  139. package/crud/index.js +0 -85
  140. package/crud/index.js.map +0 -1
  141. package/graphql/schema/resolvers/manage/resolveRequestChanges.d.ts +0 -7
  142. package/graphql/schema/resolvers/manage/resolveRequestChanges.js +0 -21
  143. package/graphql/schema/resolvers/manage/resolveRequestChanges.js.map +0 -1
  144. package/graphql/schema/resolvers/manage/resolveRequestReview.d.ts +0 -7
  145. package/graphql/schema/resolvers/manage/resolveRequestReview.js +0 -21
  146. package/graphql/schema/resolvers/manage/resolveRequestReview.js.map +0 -1
@@ -11,16 +11,12 @@ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/obje
11
11
 
12
12
  var _dataloader = _interopRequireDefault(require("dataloader"));
13
13
 
14
+ var _error = _interopRequireDefault(require("@webiny/error"));
15
+
14
16
  var _handlerGraphql = require("@webiny/handler-graphql");
15
17
 
16
18
  var _contentModelManagerFactory = require("./contentModel/contentModelManagerFactory");
17
19
 
18
- var _models = require("./contentModel/models");
19
-
20
- var _createFieldModels = require("./contentModel/createFieldModels");
21
-
22
- var _error = _interopRequireDefault(require("@webiny/error"));
23
-
24
20
  var _pubsub = require("@webiny/pubsub");
25
21
 
26
22
  var _beforeCreate = require("./contentModel/beforeCreate");
@@ -49,56 +45,23 @@ var _access = require("../utils/access");
49
45
 
50
46
  var _validateModelFields = require("./contentModel/validateModelFields");
51
47
 
52
- var _semver = _interopRequireDefault(require("semver"));
48
+ var _validation = require("./contentModel/validation");
49
+
50
+ var _utils = require("@webiny/utils");
53
51
 
54
52
  /**
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.
53
+ * Given a model, return an array of tags ensuring the `type` tag is set.
58
54
  */
59
- const featureVersion = _semver.default.coerce("5.33.0");
60
-
61
- const attachStorageIdToFields = fields => {
62
- return fields.map(field => {
63
- var _field$settings;
64
-
65
- if ((_field$settings = field.settings) !== null && _field$settings !== void 0 && _field$settings.fields) {
66
- field.settings.fields = attachStorageIdToFields(field.settings.fields);
67
- }
68
-
69
- if (!field.storageId) {
70
- field.storageId = field.fieldId;
71
- }
72
-
73
- return field;
74
- });
75
- };
76
-
77
- const attachStorageIdToModelFields = model => {
78
- if (!model.webinyVersion) {
79
- return model.fields;
80
- }
81
-
82
- const version = _semver.default.coerce(model.webinyVersion);
83
-
84
- if (!version) {
85
- return model.fields;
86
- }
87
- /**
88
- * Unfortunately we need to check for beta and next.
89
- * TODO remove after 5.33.0
90
- */
91
-
92
-
93
- if (model.webinyVersion.match(/beta|next/)) {
94
- return attachStorageIdToFields(model.fields);
95
- }
55
+ const ensureTypeTag = model => {
56
+ // Let's make sure we have a `type` tag assigned.
57
+ // If `type` tag is not set, set it to a default one (`model`).
58
+ const tags = model.tags || [];
96
59
 
97
- if (_semver.default.compare(version, featureVersion) >= 0) {
98
- return model.fields;
60
+ if (!tags.some(tag => tag.startsWith("type:"))) {
61
+ tags.push("type:model");
99
62
  }
100
63
 
101
- return attachStorageIdToFields(model.fields);
64
+ return tags;
102
65
  };
103
66
 
104
67
  const createModelsCrud = params => {
@@ -119,7 +82,7 @@ const createModelsCrud = params => {
119
82
  });
120
83
  return [models.map(model => {
121
84
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
122
- fields: attachStorageIdToModelFields(model),
85
+ tags: ensureTypeTag(model),
123
86
  tenant: model.tenant || getTenant().id,
124
87
  locale: model.locale || getLocale().code
125
88
  });
@@ -157,19 +120,20 @@ const createModelsCrud = params => {
157
120
  */
158
121
  .filter(plugin => {
159
122
  const {
160
- tenant: t,
161
- locale: l
123
+ tenant: modelTenant,
124
+ locale: modelLocale
162
125
  } = plugin.contentModel;
163
126
 
164
- if (t && t !== tenant) {
127
+ if (modelTenant && modelTenant !== tenant) {
165
128
  return false;
166
- } else if (l && l !== locale) {
129
+ } else if (modelLocale && modelLocale !== locale) {
167
130
  return false;
168
131
  }
169
132
 
170
133
  return true;
171
134
  }).map(plugin => {
172
135
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, plugin.contentModel), {}, {
136
+ tags: ensureTypeTag(plugin.contentModel),
173
137
  tenant,
174
138
  locale,
175
139
  webinyVersion: context.WEBINY_VERSION
@@ -207,6 +171,7 @@ const createModelsCrud = params => {
207
171
  }
208
172
 
209
173
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
174
+ tags: ensureTypeTag(model),
210
175
  tenant: model.tenant || getTenant().id,
211
176
  locale: model.locale || getLocale().code
212
177
  });
@@ -253,20 +218,40 @@ const createModelsCrud = params => {
253
218
  }
254
219
 
255
220
  return await updateManager(context, model);
256
- }; // create
221
+ };
222
+ /**
223
+ * Create
224
+ */
257
225
 
258
226
 
259
227
  const onModelBeforeCreate = (0, _pubsub.createTopic)("cms.onModelBeforeCreate");
260
- const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate"); // create from
228
+ const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate");
229
+ const onModelCreateError = (0, _pubsub.createTopic)("cms.onModelCreateError");
230
+ /**
231
+ * Create from / clone
232
+ */
261
233
 
262
234
  const onModelBeforeCreateFrom = (0, _pubsub.createTopic)("cms.onModelBeforeCreateFrom");
263
- const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom"); // update
235
+ const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom");
236
+ const onModelCreateFromError = (0, _pubsub.createTopic)("cms.onModelCreateFromError");
237
+ /**
238
+ * Update
239
+ */
264
240
 
265
241
  const onModelBeforeUpdate = (0, _pubsub.createTopic)("cms.onModelBeforeUpdate");
266
- const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate"); // delete
242
+ const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate");
243
+ const onModelUpdateError = (0, _pubsub.createTopic)("cms.onModelUpdateError");
244
+ /**
245
+ * Delete
246
+ */
267
247
 
268
248
  const onModelBeforeDelete = (0, _pubsub.createTopic)("cms.onModelBeforeDelete");
269
249
  const onModelAfterDelete = (0, _pubsub.createTopic)("cms.onModelAfterDelete");
250
+ const onModelDeleteError = (0, _pubsub.createTopic)("cms.onModelDeleteError");
251
+ /**
252
+ * Initialize
253
+ */
254
+
270
255
  const onModelInitialize = (0, _pubsub.createTopic)("cms.onModelInitialize");
271
256
  /**
272
257
  * We need to assign some default behaviors.
@@ -322,36 +307,43 @@ const createModelsCrud = params => {
322
307
  */
323
308
  onModelBeforeCreate,
324
309
  onModelAfterCreate,
310
+ onModelCreateError,
325
311
  onModelBeforeCreateFrom,
326
312
  onModelAfterCreateFrom,
313
+ onModelCreateFromError,
327
314
  onModelBeforeUpdate,
328
315
  onModelAfterUpdate,
316
+ onModelUpdateError,
329
317
  onModelBeforeDelete,
330
318
  onModelAfterDelete,
319
+ onModelDeleteError,
331
320
  onModelInitialize,
332
321
  clearModelsCache,
333
322
  getModel,
334
323
  listModels,
335
324
 
336
- async createModel(inputData) {
325
+ async createModel(input) {
337
326
  await checkModelPermissions("w");
338
- const createdData = new _models.CreateContentModelModel().populate(inputData);
339
- await createdData.validate();
340
- const input = await createdData.toJSON();
327
+ const result = await (0, _validation.createModelCreateValidation)().safeParseAsync(input);
328
+
329
+ if (!result.success) {
330
+ throw (0, _utils.createZodError)(result.error);
331
+ }
332
+
333
+ const data = result.data;
341
334
  context.security.disableAuthorization();
342
- const group = await context.cms.getGroup(input.group);
335
+ const group = await context.cms.getGroup(data.group);
343
336
  context.security.enableAuthorization();
344
337
 
345
338
  if (!group) {
346
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
339
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
347
340
  }
348
341
 
349
- const fields = await (0, _createFieldModels.createFieldModels)(input.fields);
350
342
  const identity = getIdentity();
351
343
  const model = {
352
- name: input.name,
353
- description: input.description || "",
354
- modelId: input.modelId || "",
344
+ name: data.name,
345
+ description: data.description || "",
346
+ modelId: data.modelId || "",
355
347
  titleFieldId: "id",
356
348
  locale: getLocale().code,
357
349
  tenant: getTenant().id,
@@ -366,25 +358,37 @@ const createModelsCrud = params => {
366
358
  },
367
359
  createdOn: new Date().toISOString(),
368
360
  savedOn: new Date().toISOString(),
369
- fields,
361
+ fields: data.fields,
370
362
  lockedFields: [],
371
- layout: input.layout || [],
363
+ layout: data.layout || [],
364
+ tags: [...(data.tags || [])],
372
365
  webinyVersion: context.WEBINY_VERSION
373
366
  };
374
- await onModelBeforeCreate.publish({
375
- input,
376
- model
377
- });
378
- const createdModel = await storageOperations.models.create({
379
- model
380
- });
381
- loaders.listModels.clearAll();
382
- await updateManager(context, model);
383
- await onModelAfterCreate.publish({
384
- input,
385
- model: createdModel
386
- });
387
- return createdModel;
367
+ model.tags = ensureTypeTag(model);
368
+
369
+ try {
370
+ await onModelBeforeCreate.publish({
371
+ input: data,
372
+ model
373
+ });
374
+ const createdModel = await storageOperations.models.create({
375
+ model
376
+ });
377
+ loaders.listModels.clearAll();
378
+ await updateManager(context, model);
379
+ await onModelAfterCreate.publish({
380
+ input: data,
381
+ model: createdModel
382
+ });
383
+ return createdModel;
384
+ } catch (ex) {
385
+ await onModelCreateError.publish({
386
+ input: data,
387
+ model,
388
+ error: ex
389
+ });
390
+ throw ex;
391
+ }
388
392
  },
389
393
 
390
394
  /**
@@ -401,44 +405,59 @@ const createModelsCrud = params => {
401
405
  locale: initialModel.locale || getLocale().code,
402
406
  webinyVersion: context.WEBINY_VERSION
403
407
  });
404
- await onModelBeforeUpdate.publish({
405
- input: {},
406
- original,
407
- model
408
- });
409
- const resultModel = await storageOperations.models.update({
410
- model
411
- });
412
- await updateManager(context, resultModel);
413
- loaders.listModels.clearAll();
414
- await onModelAfterUpdate.publish({
415
- input: {},
416
- original,
417
- model: resultModel
418
- });
419
- return resultModel;
408
+
409
+ try {
410
+ await onModelBeforeUpdate.publish({
411
+ input: {},
412
+ original,
413
+ model
414
+ });
415
+ const resultModel = await storageOperations.models.update({
416
+ model
417
+ });
418
+ await updateManager(context, resultModel);
419
+ loaders.listModels.clearAll();
420
+ await onModelAfterUpdate.publish({
421
+ input: {},
422
+ original,
423
+ model: resultModel
424
+ });
425
+ return resultModel;
426
+ } catch (ex) {
427
+ await onModelUpdateError.publish({
428
+ input: {},
429
+ original,
430
+ model,
431
+ error: ex
432
+ });
433
+ throw ex;
434
+ }
420
435
  },
421
436
 
422
- async createModelFrom(modelId, data) {
437
+ async createModelFrom(modelId, userInput) {
423
438
  await checkModelPermissions("w");
424
439
  /**
425
440
  * Get a model record; this will also perform ownership validation.
426
441
  */
427
442
 
428
443
  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
444
+ const result = await (0, _validation.createModelCreateFromValidation)().safeParseAsync({
445
+ name: userInput.name,
446
+ modelId: userInput.modelId,
447
+ description: userInput.description || original.description,
448
+ group: userInput.group,
449
+ locale: userInput.locale
435
450
  });
436
- await createdData.validate();
437
- const input = await createdData.toJSON();
438
- const locale = await context.i18n.getLocale(input.locale || original.locale);
451
+
452
+ if (!result.success) {
453
+ throw (0, _utils.createZodError)(result.error);
454
+ }
455
+
456
+ const data = result.data;
457
+ const locale = await context.i18n.getLocale(data.locale || original.locale);
439
458
 
440
459
  if (!locale) {
441
- throw new _handlerGraphql.NotFoundError(`There is no locale "${input.locale}".`);
460
+ throw new _handlerGraphql.NotFoundError(`There is no locale "${data.locale}".`);
442
461
  }
443
462
  /**
444
463
  * Use storage operations directly because we cannot get group from different locale via context methods.
@@ -446,13 +465,13 @@ const createModelsCrud = params => {
446
465
 
447
466
 
448
467
  const group = await context.cms.storageOperations.groups.get({
449
- id: input.group,
468
+ id: data.group,
450
469
  tenant: original.tenant,
451
470
  locale: locale.code
452
471
  });
453
472
 
454
473
  if (!group) {
455
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
474
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
456
475
  }
457
476
 
458
477
  const identity = getIdentity();
@@ -462,9 +481,9 @@ const createModelsCrud = params => {
462
481
  id: group.id,
463
482
  name: group.name
464
483
  },
465
- name: input.name,
466
- modelId: input.modelId || "",
467
- description: input.description || "",
484
+ name: data.name,
485
+ modelId: data.modelId || "",
486
+ description: data.description || "",
468
487
  createdBy: {
469
488
  id: identity.id,
470
489
  displayName: identity.displayName,
@@ -475,35 +494,48 @@ const createModelsCrud = params => {
475
494
  lockedFields: [],
476
495
  webinyVersion: context.WEBINY_VERSION
477
496
  });
478
- await onModelBeforeCreateFrom.publish({
479
- input,
480
- model,
481
- original
482
- });
483
- const createdModel = await storageOperations.models.create({
484
- model
485
- });
486
- loaders.listModels.clearAll();
487
- await updateManager(context, model);
488
- await onModelAfterCreateFrom.publish({
489
- input,
490
- original,
491
- model: createdModel
492
- });
493
- return createdModel;
497
+
498
+ try {
499
+ await onModelBeforeCreateFrom.publish({
500
+ input: data,
501
+ model,
502
+ original
503
+ });
504
+ const createdModel = await storageOperations.models.create({
505
+ model
506
+ });
507
+ loaders.listModels.clearAll();
508
+ await updateManager(context, model);
509
+ await onModelAfterCreateFrom.publish({
510
+ input: data,
511
+ original,
512
+ model: createdModel
513
+ });
514
+ return createdModel;
515
+ } catch (ex) {
516
+ await onModelCreateFromError.publish({
517
+ input: data,
518
+ original,
519
+ model,
520
+ error: ex
521
+ });
522
+ throw ex;
523
+ }
494
524
  },
495
525
 
496
- async updateModel(modelId, inputData) {
526
+ async updateModel(modelId, input) {
497
527
  await checkModelPermissions("w"); // Get a model record; this will also perform ownership validation.
498
528
 
499
529
  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
- });
530
+ const result = await (0, _validation.createModelUpdateValidation)().safeParseAsync(input);
505
531
 
506
- if (Object.keys(input).length === 0) {
532
+ if (!result.success) {
533
+ throw (0, _utils.createZodError)(result.error);
534
+ }
535
+
536
+ const data = result.data;
537
+
538
+ if (Object.keys(data).length === 0) {
507
539
  /**
508
540
  * We need to return the original if nothing is to be updated.
509
541
  */
@@ -515,13 +547,13 @@ const createModelsCrud = params => {
515
547
  name: original.group.name
516
548
  };
517
549
 
518
- if (input.group) {
550
+ if (data.group) {
519
551
  context.security.disableAuthorization();
520
- const groupData = await context.cms.getGroup(input.group);
552
+ const groupData = await context.cms.getGroup(data.group);
521
553
  context.security.enableAuthorization();
522
554
 
523
555
  if (!groupData) {
524
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
556
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
525
557
  }
526
558
 
527
559
  group = {
@@ -530,57 +562,76 @@ const createModelsCrud = params => {
530
562
  };
531
563
  }
532
564
 
533
- const fields = await (0, _createFieldModels.createFieldModels)(inputData.fields);
534
- const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), input), {}, {
565
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), data), {}, {
535
566
  group,
536
567
  tenant: original.tenant || getTenant().id,
537
568
  locale: original.locale || getLocale().code,
538
569
  webinyVersion: context.WEBINY_VERSION,
539
- fields,
540
570
  savedOn: new Date().toISOString()
541
571
  });
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,
553
- original,
554
- model: resultModel
555
- });
556
- return resultModel;
572
+ model.tags = ensureTypeTag(model);
573
+
574
+ try {
575
+ await onModelBeforeUpdate.publish({
576
+ input: data,
577
+ original,
578
+ model
579
+ });
580
+ const resultModel = await storageOperations.models.update({
581
+ model
582
+ });
583
+ await updateManager(context, resultModel);
584
+ await onModelAfterUpdate.publish({
585
+ input: data,
586
+ original,
587
+ model: resultModel
588
+ });
589
+ return resultModel;
590
+ } catch (ex) {
591
+ await onModelUpdateError.publish({
592
+ input: data,
593
+ model,
594
+ original,
595
+ error: ex
596
+ });
597
+ throw ex;
598
+ }
557
599
  },
558
600
 
559
601
  async deleteModel(modelId) {
560
602
  await checkModelPermissions("d");
561
603
  const model = await getModel(modelId);
562
- await onModelBeforeDelete.publish({
563
- model
564
- });
565
604
 
566
605
  try {
567
- await storageOperations.models.delete({
606
+ await onModelBeforeDelete.publish({
607
+ model
608
+ });
609
+
610
+ try {
611
+ await storageOperations.models.delete({
612
+ model
613
+ });
614
+ } catch (ex) {
615
+ throw new _error.default(ex.message || "Could not delete the content model", ex.code || "CONTENT_MODEL_DELETE_ERROR", {
616
+ error: ex,
617
+ modelId: model.modelId
618
+ });
619
+ }
620
+
621
+ await onModelAfterDelete.publish({
568
622
  model
569
623
  });
624
+ managers.delete(model.modelId);
570
625
  } catch (ex) {
571
- throw new _error.default(ex.message || "Could not delete the content model", ex.code || "CONTENT_MODEL_DELETE_ERROR", {
572
- error: ex,
573
- modelId: model.modelId
626
+ await onModelDeleteError.publish({
627
+ model,
628
+ error: ex
574
629
  });
630
+ throw ex;
575
631
  }
576
-
577
- await onModelAfterDelete.publish({
578
- model
579
- });
580
- managers.delete(model.modelId);
581
632
  },
582
633
 
583
- async initializeModel(modelId) {
634
+ async initializeModel(modelId, data) {
584
635
  /**
585
636
  * We require that users have write permissions to initialize models.
586
637
  * Maybe introduce another permission for it?
@@ -588,7 +639,8 @@ const createModelsCrud = params => {
588
639
  await checkModelPermissions("w");
589
640
  const model = await getModel(modelId);
590
641
  await onModelInitialize.publish({
591
- model
642
+ model,
643
+ data
592
644
  });
593
645
  return true;
594
646
  },