@webiny/api-headless-cms 0.0.0-unstable.6e5425ee89 → 0.0.0-unstable.7f63ea0744

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 (182) hide show
  1. package/context.d.ts +5 -2
  2. package/context.js +53 -4
  3. package/context.js.map +1 -1
  4. package/crud/contentEntry/markLockedFields.js +4 -2
  5. package/crud/contentEntry/markLockedFields.js.map +1 -1
  6. package/crud/contentEntry/referenceFieldsMapping.js +7 -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 +72 -0
  10. package/crud/contentEntry/searchableFields.js.map +1 -0
  11. package/crud/contentEntry.crud.js +99 -42
  12. package/crud/contentEntry.crud.js.map +1 -1
  13. package/crud/contentModel/beforeCreate.d.ts +2 -3
  14. package/crud/contentModel/beforeCreate.js +4 -5
  15. package/crud/contentModel/beforeCreate.js.map +1 -1
  16. package/crud/contentModel/beforeUpdate.d.ts +2 -4
  17. package/crud/contentModel/beforeUpdate.js +2 -2
  18. package/crud/contentModel/beforeUpdate.js.map +1 -1
  19. package/crud/contentModel/createFieldStorageId.js +4 -1
  20. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  21. package/crud/contentModel/validateModel.d.ts +3 -4
  22. package/crud/contentModel/validateModel.js +6 -3
  23. package/crud/contentModel/validateModel.js.map +1 -1
  24. package/crud/contentModel/validateModelFields.d.ts +3 -4
  25. package/crud/contentModel/validateModelFields.js +100 -38
  26. package/crud/contentModel/validateModelFields.js.map +1 -1
  27. package/crud/contentModel/validation.d.ts +477 -0
  28. package/crud/contentModel/validation.js +97 -0
  29. package/crud/contentModel/validation.js.map +1 -0
  30. package/crud/contentModel.crud.js +212 -177
  31. package/crud/contentModel.crud.js.map +1 -1
  32. package/crud/contentModelGroup/validation.d.ts +30 -0
  33. package/crud/contentModelGroup/validation.js +34 -0
  34. package/crud/contentModelGroup/validation.js.map +1 -0
  35. package/crud/contentModelGroup.crud.js +47 -52
  36. package/crud/contentModelGroup.crud.js.map +1 -1
  37. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.d.ts +11 -0
  38. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +203 -0
  39. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -0
  40. package/fieldConverters/index.d.ts +2 -1
  41. package/fieldConverters/index.js +2 -1
  42. package/fieldConverters/index.js.map +1 -1
  43. package/graphql/buildSchemaPlugins.d.ts +8 -3
  44. package/graphql/buildSchemaPlugins.js +3 -7
  45. package/graphql/buildSchemaPlugins.js.map +1 -1
  46. package/graphql/createExecutableSchema.d.ts +7 -0
  47. package/graphql/createExecutableSchema.js +29 -0
  48. package/graphql/createExecutableSchema.js.map +1 -0
  49. package/graphql/generateSchema.d.ts +8 -0
  50. package/graphql/generateSchema.js +31 -0
  51. package/graphql/generateSchema.js.map +1 -0
  52. package/graphql/graphQLHandlerFactory.js +91 -50
  53. package/graphql/graphQLHandlerFactory.js.map +1 -1
  54. package/graphql/index.d.ts +1 -3
  55. package/graphql/index.js +2 -39
  56. package/graphql/index.js.map +1 -1
  57. package/graphql/schema/baseContentSchema.d.ts +6 -2
  58. package/graphql/schema/baseContentSchema.js +6 -4
  59. package/graphql/schema/baseContentSchema.js.map +1 -1
  60. package/graphql/schema/baseSchema.d.ts +3 -0
  61. package/graphql/schema/baseSchema.js +53 -0
  62. package/graphql/schema/baseSchema.js.map +1 -0
  63. package/graphql/schema/contentEntries.d.ts +6 -2
  64. package/graphql/schema/contentEntries.js +37 -23
  65. package/graphql/schema/contentEntries.js.map +1 -1
  66. package/graphql/schema/contentModelGroups.d.ts +6 -2
  67. package/graphql/schema/contentModelGroups.js +7 -3
  68. package/graphql/schema/contentModelGroups.js.map +1 -1
  69. package/graphql/schema/contentModels.d.ts +6 -2
  70. package/graphql/schema/contentModels.js +40 -7
  71. package/graphql/schema/contentModels.js.map +1 -1
  72. package/graphql/schema/createFieldResolvers.d.ts +1 -1
  73. package/graphql/schema/createFieldResolvers.js +17 -6
  74. package/graphql/schema/createFieldResolvers.js.map +1 -1
  75. package/graphql/schema/createManageSDL.d.ts +2 -0
  76. package/graphql/schema/createManageSDL.js +10 -6
  77. package/graphql/schema/createManageSDL.js.map +1 -1
  78. package/graphql/schema/createReadResolvers.js +5 -0
  79. package/graphql/schema/createReadResolvers.js.map +1 -1
  80. package/graphql/schema/createReadSDL.d.ts +2 -0
  81. package/graphql/schema/createReadSDL.js +11 -5
  82. package/graphql/schema/createReadSDL.js.map +1 -1
  83. package/graphql/schema/schemaPlugins.d.ts +8 -3
  84. package/graphql/schema/schemaPlugins.js +58 -46
  85. package/graphql/schema/schemaPlugins.js.map +1 -1
  86. package/graphql/system.js +69 -72
  87. package/graphql/system.js.map +1 -1
  88. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +2 -0
  89. package/graphqlFields/dynamicZone/dynamicZoneField.js +208 -0
  90. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -0
  91. package/graphqlFields/dynamicZone/dynamicZoneStorage.d.ts +3 -0
  92. package/graphqlFields/dynamicZone/dynamicZoneStorage.js +63 -0
  93. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -0
  94. package/graphqlFields/dynamicZone/index.d.ts +2 -0
  95. package/graphqlFields/dynamicZone/index.js +19 -0
  96. package/graphqlFields/dynamicZone/index.js.map +1 -0
  97. package/graphqlFields/index.d.ts +1 -1
  98. package/graphqlFields/index.js +2 -1
  99. package/graphqlFields/index.js.map +1 -1
  100. package/graphqlFields/number.js +4 -0
  101. package/graphqlFields/number.js.map +1 -1
  102. package/graphqlFields/object.js +112 -68
  103. package/graphqlFields/object.js.map +1 -1
  104. package/graphqlFields/ref.js +31 -45
  105. package/graphqlFields/ref.js.map +1 -1
  106. package/index.d.ts +3 -3
  107. package/index.js +3 -7
  108. package/index.js.map +1 -1
  109. package/package.json +28 -28
  110. package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
  111. package/plugins/CmsGraphQLSchemaPlugin.js +12 -0
  112. package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
  113. package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +20 -0
  114. package/plugins/CmsGraphQLSchemaSorterPlugin.js +28 -0
  115. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -0
  116. package/plugins/CmsModelFieldConverterPlugin.d.ts +2 -2
  117. package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
  118. package/plugins/StorageTransformPlugin.d.ts +11 -11
  119. package/plugins/StorageTransformPlugin.js.map +1 -1
  120. package/plugins/index.d.ts +2 -0
  121. package/plugins/index.js +22 -0
  122. package/plugins/index.js.map +1 -1
  123. package/storage/object.js +4 -2
  124. package/storage/object.js.map +1 -1
  125. package/types.d.ts +241 -57
  126. package/types.js +62 -7
  127. package/types.js.map +1 -1
  128. package/utils/converters/ConverterCollection.js +5 -2
  129. package/utils/converters/ConverterCollection.js.map +1 -1
  130. package/utils/createTypeFromFields.d.ts +15 -0
  131. package/utils/createTypeFromFields.js +64 -0
  132. package/utils/createTypeFromFields.js.map +1 -0
  133. package/utils/createTypeName.js +2 -1
  134. package/utils/createTypeName.js.map +1 -1
  135. package/utils/entryStorage.js +14 -11
  136. package/utils/entryStorage.js.map +1 -1
  137. package/utils/getBaseFieldType.d.ts +4 -0
  138. package/utils/getBaseFieldType.js +10 -0
  139. package/utils/getBaseFieldType.js.map +1 -0
  140. package/utils/getSchemaFromFieldPlugins.d.ts +4 -7
  141. package/utils/getSchemaFromFieldPlugins.js +22 -14
  142. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  143. package/utils/renderFields.js +2 -1
  144. package/utils/renderFields.js.map +1 -1
  145. package/utils/renderGetFilterFields.js +6 -3
  146. package/utils/renderGetFilterFields.js.map +1 -1
  147. package/utils/renderInputFields.js +2 -1
  148. package/utils/renderInputFields.js.map +1 -1
  149. package/utils/renderListFilterFields.js +4 -2
  150. package/utils/renderListFilterFields.js.map +1 -1
  151. package/utils/renderSortEnum.d.ts +7 -4
  152. package/utils/renderSortEnum.js +21 -4
  153. package/utils/renderSortEnum.js.map +1 -1
  154. package/validators/dynamicZone.d.ts +2 -0
  155. package/validators/dynamicZone.js +20 -0
  156. package/validators/dynamicZone.js.map +1 -0
  157. package/validators/index.js +2 -1
  158. package/validators/index.js.map +1 -1
  159. package/crud/contentModel/createFieldModels.d.ts +0 -2
  160. package/crud/contentModel/createFieldModels.js +0 -20
  161. package/crud/contentModel/createFieldModels.js.map +0 -1
  162. package/crud/contentModel/fieldIdValidation.d.ts +0 -1
  163. package/crud/contentModel/fieldIdValidation.js +0 -20
  164. package/crud/contentModel/fieldIdValidation.js.map +0 -1
  165. package/crud/contentModel/idValidation.d.ts +0 -1
  166. package/crud/contentModel/idValidation.js +0 -17
  167. package/crud/contentModel/idValidation.js.map +0 -1
  168. package/crud/contentModel/models.d.ts +0 -4
  169. package/crud/contentModel/models.js +0 -173
  170. package/crud/contentModel/models.js.map +0 -1
  171. package/crud/index.d.ts +0 -6
  172. package/crud/index.js +0 -69
  173. package/crud/index.js.map +0 -1
  174. package/graphql/schema/resolvers/manage/resolveRequestChanges.d.ts +0 -7
  175. package/graphql/schema/resolvers/manage/resolveRequestChanges.js +0 -21
  176. package/graphql/schema/resolvers/manage/resolveRequestChanges.js.map +0 -1
  177. package/graphql/schema/resolvers/manage/resolveRequestReview.d.ts +0 -7
  178. package/graphql/schema/resolvers/manage/resolveRequestReview.js +0 -21
  179. package/graphql/schema/resolvers/manage/resolveRequestReview.js.map +0 -1
  180. package/utils/filterModelFields.d.ts +0 -16
  181. package/utils/filterModelFields.js +0 -71
  182. package/utils/filterModelFields.js.map +0 -1
@@ -7,11 +7,9 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.createModelsCrud = void 0;
8
8
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
9
  var _dataloader = _interopRequireDefault(require("dataloader"));
10
+ var _error = _interopRequireDefault(require("@webiny/error"));
10
11
  var _handlerGraphql = require("@webiny/handler-graphql");
11
12
  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
13
  var _pubsub = require("@webiny/pubsub");
16
14
  var _beforeCreate = require("./contentModel/beforeCreate");
17
15
  var _beforeUpdate = require("./contentModel/beforeUpdate");
@@ -25,45 +23,19 @@ var _permissions = require("../utils/permissions");
25
23
  var _filterAsync = require("../utils/filterAsync");
26
24
  var _ownership = require("../utils/ownership");
27
25
  var _access = require("../utils/access");
28
- var _validateModelFields = require("./contentModel/validateModelFields");
29
- var _semver = _interopRequireDefault(require("semver"));
26
+ var _validation = require("./contentModel/validation");
27
+ var _utils = require("@webiny/utils");
30
28
  /**
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.
29
+ * Given a model, return an array of tags ensuring the `type` tag is set.
34
30
  */
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;
31
+ const ensureTypeTag = model => {
32
+ // Let's make sure we have a `type` tag assigned.
33
+ // If `type` tag is not set, set it to a default one (`model`).
34
+ const tags = model.tags || [];
35
+ if (!tags.some(tag => tag.startsWith("type:"))) {
36
+ tags.push("type:model");
51
37
  }
52
- const version = _semver.default.coerce(model.webinyVersion);
53
- if (!version) {
54
- return model.fields;
55
- }
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);
38
+ return tags;
67
39
  };
68
40
  const createModelsCrud = params => {
69
41
  const {
@@ -83,7 +55,7 @@ const createModelsCrud = params => {
83
55
  });
84
56
  return [models.map(model => {
85
57
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
86
- fields: attachStorageIdToModelFields(model),
58
+ tags: ensureTypeTag(model),
87
59
  tenant: model.tenant || getTenant().id,
88
60
  locale: model.locale || getLocale().code
89
61
  });
@@ -109,38 +81,29 @@ const createModelsCrud = params => {
109
81
  const getModelsAsPlugins = () => {
110
82
  const tenant = getTenant().id;
111
83
  const locale = getLocale().code;
112
- const models = context.plugins.byType(_CmsModelPlugin.CmsModelPlugin.type)
84
+ return context.plugins.byType(_CmsModelPlugin.CmsModelPlugin.type)
113
85
  /**
114
86
  * We need to filter out models that are not for this tenant or locale.
115
87
  * If it does not have tenant or locale define, it is for every locale and tenant
116
88
  */.filter(plugin => {
117
89
  const {
118
- tenant: t,
119
- locale: l
90
+ tenant: modelTenant,
91
+ locale: modelLocale
120
92
  } = plugin.contentModel;
121
- if (t && t !== tenant) {
93
+ if (modelTenant && modelTenant !== tenant) {
122
94
  return false;
123
- } else if (l && l !== locale) {
95
+ } else if (modelLocale && modelLocale !== locale) {
124
96
  return false;
125
97
  }
126
98
  return true;
127
99
  }).map(plugin => {
128
100
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, plugin.contentModel), {}, {
101
+ tags: ensureTypeTag(plugin.contentModel),
129
102
  tenant,
130
103
  locale,
131
104
  webinyVersion: context.WEBINY_VERSION
132
105
  });
133
106
  });
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
107
  };
145
108
  const modelsGet = async modelId => {
146
109
  const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);
@@ -156,6 +119,7 @@ const createModelsCrud = params => {
156
119
  throw new _handlerGraphql.NotFoundError(`Content model "${modelId}" was not found!`);
157
120
  }
158
121
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
122
+ tags: ensureTypeTag(model),
159
123
  tenant: model.tenant || getTenant().id,
160
124
  locale: model.locale || getLocale().code
161
125
  });
@@ -195,18 +159,33 @@ const createModelsCrud = params => {
195
159
  return await updateManager(context, model);
196
160
  };
197
161
 
198
- // create
162
+ /**
163
+ * Create
164
+ */
199
165
  const onModelBeforeCreate = (0, _pubsub.createTopic)("cms.onModelBeforeCreate");
200
166
  const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate");
201
- // create from
167
+ const onModelCreateError = (0, _pubsub.createTopic)("cms.onModelCreateError");
168
+ /**
169
+ * Create from / clone
170
+ */
202
171
  const onModelBeforeCreateFrom = (0, _pubsub.createTopic)("cms.onModelBeforeCreateFrom");
203
172
  const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom");
204
- // update
173
+ const onModelCreateFromError = (0, _pubsub.createTopic)("cms.onModelCreateFromError");
174
+ /**
175
+ * Update
176
+ */
205
177
  const onModelBeforeUpdate = (0, _pubsub.createTopic)("cms.onModelBeforeUpdate");
206
178
  const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate");
207
- // delete
179
+ const onModelUpdateError = (0, _pubsub.createTopic)("cms.onModelUpdateError");
180
+ /**
181
+ * Delete
182
+ */
208
183
  const onModelBeforeDelete = (0, _pubsub.createTopic)("cms.onModelBeforeDelete");
209
184
  const onModelAfterDelete = (0, _pubsub.createTopic)("cms.onModelAfterDelete");
185
+ const onModelDeleteError = (0, _pubsub.createTopic)("cms.onModelDeleteError");
186
+ /**
187
+ * Initialize
188
+ */
210
189
  const onModelInitialize = (0, _pubsub.createTopic)("cms.onModelInitialize");
211
190
  /**
212
191
  * We need to assign some default behaviors.
@@ -214,7 +193,7 @@ const createModelsCrud = params => {
214
193
  (0, _beforeCreate.assignModelBeforeCreate)({
215
194
  onModelBeforeCreate,
216
195
  onModelBeforeCreateFrom,
217
- plugins: context.plugins,
196
+ context,
218
197
  storageOperations
219
198
  });
220
199
  (0, _afterCreate.assignModelAfterCreate)({
@@ -223,8 +202,7 @@ const createModelsCrud = params => {
223
202
  });
224
203
  (0, _beforeUpdate.assignModelBeforeUpdate)({
225
204
  onModelBeforeUpdate,
226
- plugins: context.plugins,
227
- storageOperations
205
+ context
228
206
  });
229
207
  (0, _afterUpdate.assignModelAfterUpdate)({
230
208
  context,
@@ -260,33 +238,38 @@ const createModelsCrud = params => {
260
238
  */
261
239
  onModelBeforeCreate,
262
240
  onModelAfterCreate,
241
+ onModelCreateError,
263
242
  onModelBeforeCreateFrom,
264
243
  onModelAfterCreateFrom,
244
+ onModelCreateFromError,
265
245
  onModelBeforeUpdate,
266
246
  onModelAfterUpdate,
247
+ onModelUpdateError,
267
248
  onModelBeforeDelete,
268
249
  onModelAfterDelete,
250
+ onModelDeleteError,
269
251
  onModelInitialize,
270
252
  clearModelsCache,
271
253
  getModel,
272
254
  listModels,
273
- async createModel(inputData) {
255
+ async createModel(input) {
274
256
  await checkModelPermissions("w");
275
- const createdData = new _models.CreateContentModelModel().populate(inputData);
276
- await createdData.validate();
277
- const input = await createdData.toJSON();
257
+ const result = await (0, _validation.createModelCreateValidation)().safeParseAsync(input);
258
+ if (!result.success) {
259
+ throw (0, _utils.createZodError)(result.error);
260
+ }
261
+ const data = result.data;
278
262
  context.security.disableAuthorization();
279
- const group = await context.cms.getGroup(input.group);
263
+ const group = await context.cms.getGroup(data.group);
280
264
  context.security.enableAuthorization();
281
265
  if (!group) {
282
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
266
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
283
267
  }
284
- const fields = await (0, _createFieldModels.createFieldModels)(input.fields);
285
268
  const identity = getIdentity();
286
269
  const model = {
287
- name: input.name,
288
- description: input.description || "",
289
- modelId: input.modelId || "",
270
+ name: data.name,
271
+ description: data.description || "",
272
+ modelId: data.modelId || "",
290
273
  titleFieldId: "id",
291
274
  locale: getLocale().code,
292
275
  tenant: getTenant().id,
@@ -301,25 +284,36 @@ const createModelsCrud = params => {
301
284
  },
302
285
  createdOn: new Date().toISOString(),
303
286
  savedOn: new Date().toISOString(),
304
- fields,
287
+ fields: data.fields,
305
288
  lockedFields: [],
306
- layout: input.layout || [],
289
+ layout: data.layout || [],
290
+ tags: [...(data.tags || [])],
307
291
  webinyVersion: context.WEBINY_VERSION
308
292
  };
309
- await onModelBeforeCreate.publish({
310
- input,
311
- model
312
- });
313
- const createdModel = await storageOperations.models.create({
314
- model
315
- });
316
- loaders.listModels.clearAll();
317
- await updateManager(context, model);
318
- await onModelAfterCreate.publish({
319
- input,
320
- model: createdModel
321
- });
322
- return createdModel;
293
+ model.tags = ensureTypeTag(model);
294
+ try {
295
+ await onModelBeforeCreate.publish({
296
+ input: data,
297
+ model
298
+ });
299
+ const createdModel = await storageOperations.models.create({
300
+ model
301
+ });
302
+ loaders.listModels.clearAll();
303
+ await updateManager(context, model);
304
+ await onModelAfterCreate.publish({
305
+ input: data,
306
+ model: createdModel
307
+ });
308
+ return createdModel;
309
+ } catch (ex) {
310
+ await onModelCreateError.publish({
311
+ input: data,
312
+ model,
313
+ error: ex
314
+ });
315
+ throw ex;
316
+ }
323
317
  },
324
318
  /**
325
319
  * Method does not check for permissions or ownership.
@@ -335,52 +329,64 @@ const createModelsCrud = params => {
335
329
  locale: initialModel.locale || getLocale().code,
336
330
  webinyVersion: context.WEBINY_VERSION
337
331
  });
338
- await onModelBeforeUpdate.publish({
339
- input: {},
340
- original,
341
- model
342
- });
343
- const resultModel = await storageOperations.models.update({
344
- model
345
- });
346
- await updateManager(context, resultModel);
347
- loaders.listModels.clearAll();
348
- await onModelAfterUpdate.publish({
349
- input: {},
350
- original,
351
- model: resultModel
352
- });
353
- return resultModel;
332
+ try {
333
+ await onModelBeforeUpdate.publish({
334
+ input: {},
335
+ original,
336
+ model
337
+ });
338
+ const resultModel = await storageOperations.models.update({
339
+ model
340
+ });
341
+ await updateManager(context, resultModel);
342
+ loaders.listModels.clearAll();
343
+ await onModelAfterUpdate.publish({
344
+ input: {},
345
+ original,
346
+ model: resultModel
347
+ });
348
+ return resultModel;
349
+ } catch (ex) {
350
+ await onModelUpdateError.publish({
351
+ input: {},
352
+ original,
353
+ model,
354
+ error: ex
355
+ });
356
+ throw ex;
357
+ }
354
358
  },
355
- async createModelFrom(modelId, data) {
359
+ async createModelFrom(modelId, userInput) {
356
360
  await checkModelPermissions("w");
357
361
  /**
358
362
  * Get a model record; this will also perform ownership validation.
359
363
  */
360
364
  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
365
+ const result = await (0, _validation.createModelCreateFromValidation)().safeParseAsync({
366
+ name: userInput.name,
367
+ modelId: userInput.modelId,
368
+ description: userInput.description || original.description,
369
+ group: userInput.group,
370
+ locale: userInput.locale
367
371
  });
368
- await createdData.validate();
369
- const input = await createdData.toJSON();
370
- const locale = await context.i18n.getLocale(input.locale || original.locale);
372
+ if (!result.success) {
373
+ throw (0, _utils.createZodError)(result.error);
374
+ }
375
+ const data = result.data;
376
+ const locale = await context.i18n.getLocale(data.locale || original.locale);
371
377
  if (!locale) {
372
- throw new _handlerGraphql.NotFoundError(`There is no locale "${input.locale}".`);
378
+ throw new _handlerGraphql.NotFoundError(`There is no locale "${data.locale}".`);
373
379
  }
374
380
  /**
375
381
  * Use storage operations directly because we cannot get group from different locale via context methods.
376
382
  */
377
383
  const group = await context.cms.storageOperations.groups.get({
378
- id: input.group,
384
+ id: data.group,
379
385
  tenant: original.tenant,
380
386
  locale: locale.code
381
387
  });
382
388
  if (!group) {
383
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
389
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
384
390
  }
385
391
  const identity = getIdentity();
386
392
  const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), {}, {
@@ -389,9 +395,9 @@ const createModelsCrud = params => {
389
395
  id: group.id,
390
396
  name: group.name
391
397
  },
392
- name: input.name,
393
- modelId: input.modelId || "",
394
- description: input.description || "",
398
+ name: data.name,
399
+ modelId: data.modelId || "",
400
+ description: data.description || "",
395
401
  createdBy: {
396
402
  id: identity.id,
397
403
  displayName: identity.displayName,
@@ -402,34 +408,44 @@ const createModelsCrud = params => {
402
408
  lockedFields: [],
403
409
  webinyVersion: context.WEBINY_VERSION
404
410
  });
405
- await onModelBeforeCreateFrom.publish({
406
- input,
407
- model,
408
- original
409
- });
410
- const createdModel = await storageOperations.models.create({
411
- model
412
- });
413
- loaders.listModels.clearAll();
414
- await updateManager(context, model);
415
- await onModelAfterCreateFrom.publish({
416
- input,
417
- original,
418
- model: createdModel
419
- });
420
- return createdModel;
411
+ try {
412
+ await onModelBeforeCreateFrom.publish({
413
+ input: data,
414
+ model,
415
+ original
416
+ });
417
+ const createdModel = await storageOperations.models.create({
418
+ model
419
+ });
420
+ loaders.listModels.clearAll();
421
+ await updateManager(context, model);
422
+ await onModelAfterCreateFrom.publish({
423
+ input: data,
424
+ original,
425
+ model: createdModel
426
+ });
427
+ return createdModel;
428
+ } catch (ex) {
429
+ await onModelCreateFromError.publish({
430
+ input: data,
431
+ original,
432
+ model,
433
+ error: ex
434
+ });
435
+ throw ex;
436
+ }
421
437
  },
422
- async updateModel(modelId, inputData) {
438
+ async updateModel(modelId, input) {
423
439
  await checkModelPermissions("w");
424
440
 
425
441
  // Get a model record; this will also perform ownership validation.
426
442
  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) {
443
+ const result = await (0, _validation.createModelUpdateValidation)().safeParseAsync(input);
444
+ if (!result.success) {
445
+ throw (0, _utils.createZodError)(result.error);
446
+ }
447
+ const data = result.data;
448
+ if (Object.keys(data).length === 0) {
433
449
  /**
434
450
  * We need to return the original if nothing is to be updated.
435
451
  */
@@ -439,65 +455,83 @@ const createModelsCrud = params => {
439
455
  id: original.group.id,
440
456
  name: original.group.name
441
457
  };
442
- if (input.group) {
458
+ if (data.group) {
443
459
  context.security.disableAuthorization();
444
- const groupData = await context.cms.getGroup(input.group);
460
+ const groupData = await context.cms.getGroup(data.group);
445
461
  context.security.enableAuthorization();
446
462
  if (!groupData) {
447
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
463
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
448
464
  }
449
465
  group = {
450
466
  id: groupData.id,
451
467
  name: groupData.name
452
468
  };
453
469
  }
454
- const fields = await (0, _createFieldModels.createFieldModels)(inputData.fields);
455
- const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), input), {}, {
470
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), data), {}, {
456
471
  group,
472
+ description: data.description || original.description,
457
473
  tenant: original.tenant || getTenant().id,
458
474
  locale: original.locale || getLocale().code,
459
475
  webinyVersion: context.WEBINY_VERSION,
460
- fields,
461
476
  savedOn: new Date().toISOString()
462
477
  });
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,
474
- original,
475
- model: resultModel
476
- });
477
- return resultModel;
478
+ model.tags = ensureTypeTag(model);
479
+ try {
480
+ await onModelBeforeUpdate.publish({
481
+ input: data,
482
+ original,
483
+ model
484
+ });
485
+ const resultModel = await storageOperations.models.update({
486
+ model
487
+ });
488
+ await updateManager(context, resultModel);
489
+ await onModelAfterUpdate.publish({
490
+ input: data,
491
+ original,
492
+ model: resultModel
493
+ });
494
+ return resultModel;
495
+ } catch (ex) {
496
+ await onModelUpdateError.publish({
497
+ input: data,
498
+ model,
499
+ original,
500
+ error: ex
501
+ });
502
+ throw ex;
503
+ }
478
504
  },
479
505
  async deleteModel(modelId) {
480
506
  await checkModelPermissions("d");
481
507
  const model = await getModel(modelId);
482
- await onModelBeforeDelete.publish({
483
- model
484
- });
485
508
  try {
486
- await storageOperations.models.delete({
509
+ await onModelBeforeDelete.publish({
487
510
  model
488
511
  });
512
+ try {
513
+ await storageOperations.models.delete({
514
+ model
515
+ });
516
+ } catch (ex) {
517
+ throw new _error.default(ex.message || "Could not delete the content model", ex.code || "CONTENT_MODEL_DELETE_ERROR", {
518
+ error: ex,
519
+ modelId: model.modelId
520
+ });
521
+ }
522
+ await onModelAfterDelete.publish({
523
+ model
524
+ });
525
+ managers.delete(model.modelId);
489
526
  } catch (ex) {
490
- throw new _error.default(ex.message || "Could not delete the content model", ex.code || "CONTENT_MODEL_DELETE_ERROR", {
491
- error: ex,
492
- modelId: model.modelId
527
+ await onModelDeleteError.publish({
528
+ model,
529
+ error: ex
493
530
  });
531
+ throw ex;
494
532
  }
495
- await onModelAfterDelete.publish({
496
- model
497
- });
498
- managers.delete(model.modelId);
499
533
  },
500
- async initializeModel(modelId) {
534
+ async initializeModel(modelId, data) {
501
535
  /**
502
536
  * We require that users have write permissions to initialize models.
503
537
  * Maybe introduce another permission for it?
@@ -505,7 +539,8 @@ const createModelsCrud = params => {
505
539
  await checkModelPermissions("w");
506
540
  const model = await getModel(modelId);
507
541
  await onModelInitialize.publish({
508
- model
542
+ model,
543
+ data
509
544
  });
510
545
  return true;
511
546
  },