@webiny/api-headless-cms 0.0.0-unstable.8c4d9f045a → 0.0.0-unstable.97a151f74d

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.js +3 -7
  2. package/context.js.map +1 -1
  3. package/crud/contentEntry/afterDelete.d.ts +2 -2
  4. package/crud/contentEntry/afterDelete.js +2 -2
  5. package/crud/contentEntry/afterDelete.js.map +1 -1
  6. package/crud/contentEntry/beforeCreate.d.ts +2 -2
  7. package/crud/contentEntry/beforeCreate.js +2 -2
  8. package/crud/contentEntry/beforeCreate.js.map +1 -1
  9. package/crud/contentEntry/beforeUpdate.d.ts +2 -2
  10. package/crud/contentEntry/beforeUpdate.js +2 -2
  11. package/crud/contentEntry/beforeUpdate.js.map +1 -1
  12. package/crud/contentEntry/entryDataValidation.js +3 -7
  13. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  14. package/crud/contentEntry/markLockedFields.js +10 -11
  15. package/crud/contentEntry/markLockedFields.js.map +1 -1
  16. package/crud/contentEntry/referenceFieldsMapping.js +11 -13
  17. package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  18. package/crud/contentEntry/searchableFields.d.ts +9 -0
  19. package/crud/contentEntry/searchableFields.js +83 -0
  20. package/crud/contentEntry/searchableFields.js.map +1 -0
  21. package/crud/contentEntry.crud.d.ts +0 -2
  22. package/crud/contentEntry.crud.js +200 -269
  23. package/crud/contentEntry.crud.js.map +1 -1
  24. package/crud/contentModel/afterCreate.d.ts +3 -3
  25. package/crud/contentModel/afterCreate.js +5 -5
  26. package/crud/contentModel/afterCreate.js.map +1 -1
  27. package/crud/contentModel/afterCreateFrom.d.ts +3 -3
  28. package/crud/contentModel/afterCreateFrom.js +5 -5
  29. package/crud/contentModel/afterCreateFrom.js.map +1 -1
  30. package/crud/contentModel/afterDelete.d.ts +3 -3
  31. package/crud/contentModel/afterDelete.js +5 -5
  32. package/crud/contentModel/afterDelete.js.map +1 -1
  33. package/crud/contentModel/afterUpdate.d.ts +3 -3
  34. package/crud/contentModel/afterUpdate.js +5 -5
  35. package/crud/contentModel/afterUpdate.js.map +1 -1
  36. package/crud/contentModel/beforeCreate.d.ts +4 -4
  37. package/crud/contentModel/beforeCreate.js +10 -10
  38. package/crud/contentModel/beforeCreate.js.map +1 -1
  39. package/crud/contentModel/beforeDelete.d.ts +3 -3
  40. package/crud/contentModel/beforeDelete.js +6 -6
  41. package/crud/contentModel/beforeDelete.js.map +1 -1
  42. package/crud/contentModel/beforeUpdate.d.ts +3 -3
  43. package/crud/contentModel/beforeUpdate.js +5 -5
  44. package/crud/contentModel/beforeUpdate.js.map +1 -1
  45. package/crud/contentModel/createFieldStorageId.js +5 -1
  46. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  47. package/crud/contentModel/models.js +12 -0
  48. package/crud/contentModel/models.js.map +1 -1
  49. package/crud/contentModel/validateModel.js +1 -1
  50. package/crud/contentModel/validateModelFields.js +16 -12
  51. package/crud/contentModel/validateModelFields.js.map +1 -1
  52. package/crud/contentModel.crud.js +106 -60
  53. package/crud/contentModel.crud.js.map +1 -1
  54. package/crud/contentModelGroup/beforeCreate.d.ts +2 -2
  55. package/crud/contentModelGroup/beforeCreate.js +3 -3
  56. package/crud/contentModelGroup/beforeCreate.js.map +1 -1
  57. package/crud/contentModelGroup/beforeDelete.d.ts +2 -2
  58. package/crud/contentModelGroup/beforeDelete.js +3 -3
  59. package/crud/contentModelGroup/beforeDelete.js.map +1 -1
  60. package/crud/contentModelGroup/beforeUpdate.d.ts +2 -2
  61. package/crud/contentModelGroup/beforeUpdate.js +2 -2
  62. package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
  63. package/crud/contentModelGroup.crud.js +58 -38
  64. package/crud/contentModelGroup.crud.js.map +1 -1
  65. package/crud/index.js +3 -7
  66. package/crud/index.js.map +1 -1
  67. package/crud/settings.crud.js +3 -8
  68. package/crud/settings.crud.js.map +1 -1
  69. package/crud/system.crud.js +63 -51
  70. package/crud/system.crud.js.map +1 -1
  71. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js +1 -1
  72. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +17 -19
  73. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  74. package/graphql/graphQLHandlerFactory.js +53 -15
  75. package/graphql/graphQLHandlerFactory.js.map +1 -1
  76. package/graphql/index.d.ts +1 -1
  77. package/graphql/schema/baseContentSchema.js +5 -9
  78. package/graphql/schema/baseContentSchema.js.map +1 -1
  79. package/graphql/schema/contentEntries.js +1 -1
  80. package/graphql/schema/contentModels.js +37 -1
  81. package/graphql/schema/contentModels.js.map +1 -1
  82. package/graphql/schema/createFieldResolvers.d.ts +1 -1
  83. package/graphql/schema/createFieldResolvers.js +12 -14
  84. package/graphql/schema/createFieldResolvers.js.map +1 -1
  85. package/graphql/schema/createManageResolvers.js +4 -18
  86. package/graphql/schema/createManageResolvers.js.map +1 -1
  87. package/graphql/schema/createManageSDL.js +7 -10
  88. package/graphql/schema/createManageSDL.js.map +1 -1
  89. package/graphql/schema/createPreviewResolvers.js +3 -7
  90. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  91. package/graphql/schema/createReadResolvers.js +3 -7
  92. package/graphql/schema/createReadResolvers.js.map +1 -1
  93. package/graphql/schema/createReadSDL.js +5 -3
  94. package/graphql/schema/createReadSDL.js.map +1 -1
  95. package/graphql/schema/resolvers/manage/resolveGet.js +5 -9
  96. package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
  97. package/graphql/schema/resolvers/preview/resolveGet.js +3 -7
  98. package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
  99. package/graphql/schema/resolvers/read/resolveGet.js +3 -7
  100. package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
  101. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +2 -0
  102. package/graphqlFields/dynamicZone/dynamicZoneField.js +209 -0
  103. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -0
  104. package/graphqlFields/dynamicZone/dynamicZoneStorage.d.ts +3 -0
  105. package/graphqlFields/dynamicZone/dynamicZoneStorage.js +79 -0
  106. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -0
  107. package/graphqlFields/dynamicZone/index.d.ts +2 -0
  108. package/graphqlFields/dynamicZone/index.js +21 -0
  109. package/graphqlFields/dynamicZone/index.js.map +1 -0
  110. package/graphqlFields/index.d.ts +1 -1
  111. package/graphqlFields/index.js +3 -1
  112. package/graphqlFields/index.js.map +1 -1
  113. package/graphqlFields/number.js +4 -0
  114. package/graphqlFields/number.js.map +1 -1
  115. package/graphqlFields/object.js +110 -73
  116. package/graphqlFields/object.js.map +1 -1
  117. package/graphqlFields/ref.js +33 -55
  118. package/graphqlFields/ref.js.map +1 -1
  119. package/index.d.ts +2 -2
  120. package/index.js +3 -1
  121. package/index.js.map +1 -1
  122. package/modelManager/DefaultCmsModelManager.d.ts +7 -7
  123. package/modelManager/DefaultCmsModelManager.js +1 -1
  124. package/package.json +28 -28
  125. package/parameters/header.js +1 -1
  126. package/parameters/manual.js +7 -8
  127. package/parameters/manual.js.map +1 -1
  128. package/parameters/path.js +1 -1
  129. package/plugins/CmsGroupPlugin.js +1 -1
  130. package/plugins/CmsModelFieldConverterPlugin.js +1 -1
  131. package/plugins/CmsModelPlugin.d.ts +6 -2
  132. package/plugins/CmsModelPlugin.js +18 -13
  133. package/plugins/CmsModelPlugin.js.map +1 -1
  134. package/plugins/CmsParametersPlugin.js +1 -1
  135. package/plugins/StorageTransformPlugin.d.ts +11 -11
  136. package/plugins/StorageTransformPlugin.js +1 -1
  137. package/plugins/StorageTransformPlugin.js.map +1 -1
  138. package/storage/object.js +7 -8
  139. package/storage/object.js.map +1 -1
  140. package/types.d.ts +352 -166
  141. package/types.js +11 -9
  142. package/types.js.map +1 -1
  143. package/upgrades/5.33.0/index.js +5 -9
  144. package/upgrades/5.33.0/index.js.map +1 -1
  145. package/utils/converters/Converter.js +1 -1
  146. package/utils/converters/ConverterCollection.d.ts +7 -0
  147. package/utils/converters/ConverterCollection.js +36 -8
  148. package/utils/converters/ConverterCollection.js.map +1 -1
  149. package/utils/converters/valueKeyStorageConverter.js +3 -7
  150. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  151. package/utils/createTypeFromFields.d.ts +15 -0
  152. package/utils/createTypeFromFields.js +75 -0
  153. package/utils/createTypeFromFields.js.map +1 -0
  154. package/utils/createTypeName.js +4 -2
  155. package/utils/createTypeName.js.map +1 -1
  156. package/utils/entryStorage.js +10 -10
  157. package/utils/entryStorage.js.map +1 -1
  158. package/utils/filterModelFields.js +5 -9
  159. package/utils/filterModelFields.js.map +1 -1
  160. package/utils/getBaseFieldType.d.ts +4 -0
  161. package/utils/getBaseFieldType.js +12 -0
  162. package/utils/getBaseFieldType.js.map +1 -0
  163. package/utils/permissions.js +1 -5
  164. package/utils/permissions.js.map +1 -1
  165. package/utils/pluralizedTypeName.js +1 -1
  166. package/utils/renderFields.js +3 -1
  167. package/utils/renderFields.js.map +1 -1
  168. package/utils/renderGetFilterFields.js +8 -3
  169. package/utils/renderGetFilterFields.js.map +1 -1
  170. package/utils/renderInputFields.js +3 -1
  171. package/utils/renderInputFields.js.map +1 -1
  172. package/utils/renderListFilterFields.js +12 -2
  173. package/utils/renderListFilterFields.js.map +1 -1
  174. package/utils/renderSortEnum.js +3 -1
  175. package/utils/renderSortEnum.js.map +1 -1
  176. package/utils/toSlug.js +1 -1
  177. package/validators/dynamicZone.d.ts +2 -0
  178. package/validators/dynamicZone.js +24 -0
  179. package/validators/dynamicZone.js.map +1 -0
  180. package/validators/index.js +3 -1
  181. package/validators/index.js.map +1 -1
  182. package/validators/unique.js +1 -1
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.createModelsCrud = void 0;
9
9
 
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
11
 
12
12
  var _dataloader = _interopRequireDefault(require("dataloader"));
13
13
 
@@ -51,10 +51,6 @@ var _validateModelFields = require("./contentModel/validateModelFields");
51
51
 
52
52
  var _semver = _interopRequireDefault(require("semver"));
53
53
 
54
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
55
-
56
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
57
-
58
54
  /**
59
55
  * TODO: remove for 5.34.0
60
56
  * Required because of the 5.33.0 upgrade.
@@ -104,6 +100,22 @@ const attachStorageIdToModelFields = model => {
104
100
 
105
101
  return attachStorageIdToFields(model.fields);
106
102
  };
103
+ /**
104
+ * Given a model, return an array of tags ensuring the `type` tag is set.
105
+ */
106
+
107
+
108
+ const ensureTypeTag = model => {
109
+ // Let's make sure we have a `type` tag assigned.
110
+ // If `type` tag is not set, set it to a default one (`contentModel`).
111
+ const tags = model.tags || [];
112
+
113
+ if (!tags.find(tag => tag.startsWith("type:"))) {
114
+ tags.push("type:model");
115
+ }
116
+
117
+ return tags;
118
+ };
107
119
 
108
120
  const createModelsCrud = params => {
109
121
  const {
@@ -122,7 +134,8 @@ const createModelsCrud = params => {
122
134
  }
123
135
  });
124
136
  return [models.map(model => {
125
- return _objectSpread(_objectSpread({}, model), {}, {
137
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
138
+ tags: ensureTypeTag(model),
126
139
  fields: attachStorageIdToModelFields(model),
127
140
  tenant: model.tenant || getTenant().id,
128
141
  locale: model.locale || getLocale().code
@@ -173,7 +186,8 @@ const createModelsCrud = params => {
173
186
 
174
187
  return true;
175
188
  }).map(plugin => {
176
- return _objectSpread(_objectSpread({}, plugin.contentModel), {}, {
189
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, plugin.contentModel), {}, {
190
+ tags: ensureTypeTag(plugin.contentModel),
177
191
  tenant,
178
192
  locale,
179
193
  webinyVersion: context.WEBINY_VERSION
@@ -210,7 +224,8 @@ const createModelsCrud = params => {
210
224
  throw new _handlerGraphql.NotFoundError(`Content model "${modelId}" was not found!`);
211
225
  }
212
226
 
213
- return _objectSpread(_objectSpread({}, model), {}, {
227
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
228
+ tags: ensureTypeTag(model),
214
229
  tenant: model.tenant || getTenant().id,
215
230
  locale: model.locale || getLocale().code
216
231
  });
@@ -257,61 +272,82 @@ const createModelsCrud = params => {
257
272
  }
258
273
 
259
274
  return await updateManager(context, model);
260
- };
275
+ }; // create
276
+
277
+
278
+ const onModelBeforeCreate = (0, _pubsub.createTopic)("cms.onModelBeforeCreate");
279
+ const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate"); // create from
280
+
281
+ const onModelBeforeCreateFrom = (0, _pubsub.createTopic)("cms.onModelBeforeCreateFrom");
282
+ const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom"); // update
261
283
 
262
- const onBeforeModelCreate = (0, _pubsub.createTopic)();
263
- const onAfterModelCreate = (0, _pubsub.createTopic)();
264
- const onBeforeModelCreateFrom = (0, _pubsub.createTopic)();
265
- const onAfterModelCreateFrom = (0, _pubsub.createTopic)();
266
- const onBeforeModelUpdate = (0, _pubsub.createTopic)();
267
- const onAfterModelUpdate = (0, _pubsub.createTopic)();
268
- const onBeforeModelDelete = (0, _pubsub.createTopic)();
269
- const onAfterModelDelete = (0, _pubsub.createTopic)();
284
+ const onModelBeforeUpdate = (0, _pubsub.createTopic)("cms.onModelBeforeUpdate");
285
+ const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate"); // delete
286
+
287
+ const onModelBeforeDelete = (0, _pubsub.createTopic)("cms.onModelBeforeDelete");
288
+ const onModelAfterDelete = (0, _pubsub.createTopic)("cms.onModelAfterDelete");
289
+ const onModelInitialize = (0, _pubsub.createTopic)("cms.onModelInitialize");
270
290
  /**
271
291
  * We need to assign some default behaviors.
272
292
  */
273
293
 
274
- (0, _beforeCreate.assignBeforeModelCreate)({
275
- onBeforeModelCreate,
276
- onBeforeModelCreateFrom,
294
+ (0, _beforeCreate.assignModelBeforeCreate)({
295
+ onModelBeforeCreate,
296
+ onModelBeforeCreateFrom,
277
297
  plugins: context.plugins,
278
298
  storageOperations
279
299
  });
280
- (0, _afterCreate.assignAfterModelCreate)({
300
+ (0, _afterCreate.assignModelAfterCreate)({
281
301
  context,
282
- onAfterModelCreate
302
+ onModelAfterCreate
283
303
  });
284
- (0, _beforeUpdate.assignBeforeModelUpdate)({
285
- onBeforeModelUpdate,
304
+ (0, _beforeUpdate.assignModelBeforeUpdate)({
305
+ onModelBeforeUpdate,
286
306
  plugins: context.plugins,
287
307
  storageOperations
288
308
  });
289
- (0, _afterUpdate.assignAfterModelUpdate)({
309
+ (0, _afterUpdate.assignModelAfterUpdate)({
290
310
  context,
291
- onAfterModelUpdate
311
+ onModelAfterUpdate
292
312
  });
293
- (0, _afterCreateFrom.assignAfterModelCreateFrom)({
313
+ (0, _afterCreateFrom.assignModelAfterCreateFrom)({
294
314
  context,
295
- onAfterModelCreateFrom
315
+ onModelAfterCreateFrom
296
316
  });
297
- (0, _beforeDelete.assignBeforeModelDelete)({
298
- onBeforeModelDelete,
317
+ (0, _beforeDelete.assignModelBeforeDelete)({
318
+ onModelBeforeDelete,
299
319
  plugins: context.plugins,
300
320
  storageOperations
301
321
  });
302
- (0, _afterDelete.assignAfterModelDelete)({
322
+ (0, _afterDelete.assignModelAfterDelete)({
303
323
  context,
304
- onAfterModelDelete
324
+ onModelAfterDelete
305
325
  });
306
326
  return {
307
- onBeforeModelCreate,
308
- onAfterModelCreate,
309
- onBeforeModelCreateFrom,
310
- onAfterModelCreateFrom,
311
- onBeforeModelUpdate,
312
- onAfterModelUpdate,
313
- onBeforeModelDelete,
314
- onAfterModelDelete,
327
+ /**
328
+ * Deprecated - will be removed in 5.36.0
329
+ */
330
+ onBeforeModelCreate: onModelBeforeCreate,
331
+ onAfterModelCreate: onModelAfterCreate,
332
+ onBeforeModelCreateFrom: onModelBeforeCreateFrom,
333
+ onAfterModelCreateFrom: onModelAfterCreateFrom,
334
+ onBeforeModelUpdate: onModelBeforeUpdate,
335
+ onAfterModelUpdate: onModelAfterUpdate,
336
+ onBeforeModelDelete: onModelBeforeDelete,
337
+ onAfterModelDelete: onModelAfterDelete,
338
+
339
+ /**
340
+ * Released in 5.34.0
341
+ */
342
+ onModelBeforeCreate,
343
+ onModelAfterCreate,
344
+ onModelBeforeCreateFrom,
345
+ onModelAfterCreateFrom,
346
+ onModelBeforeUpdate,
347
+ onModelAfterUpdate,
348
+ onModelBeforeDelete,
349
+ onModelAfterDelete,
350
+ onModelInitialize,
315
351
  clearModelsCache,
316
352
  getModel,
317
353
  listModels,
@@ -352,9 +388,11 @@ const createModelsCrud = params => {
352
388
  fields,
353
389
  lockedFields: [],
354
390
  layout: input.layout || [],
391
+ tags: [...(input.tags || [])],
355
392
  webinyVersion: context.WEBINY_VERSION
356
393
  };
357
- await onBeforeModelCreate.publish({
394
+ model.tags = ensureTypeTag(model);
395
+ await onModelBeforeCreate.publish({
358
396
  input,
359
397
  model
360
398
  });
@@ -363,7 +401,7 @@ const createModelsCrud = params => {
363
401
  });
364
402
  loaders.listModels.clearAll();
365
403
  await updateManager(context, model);
366
- await onAfterModelCreate.publish({
404
+ await onModelAfterCreate.publish({
367
405
  input,
368
406
  model: createdModel
369
407
  });
@@ -379,14 +417,12 @@ const createModelsCrud = params => {
379
417
  model: initialModel,
380
418
  original
381
419
  } = params;
382
-
383
- const model = _objectSpread(_objectSpread({}, initialModel), {}, {
420
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, initialModel), {}, {
384
421
  tenant: initialModel.tenant || getTenant().id,
385
422
  locale: initialModel.locale || getLocale().code,
386
423
  webinyVersion: context.WEBINY_VERSION
387
424
  });
388
-
389
- await onBeforeModelUpdate.publish({
425
+ await onModelBeforeUpdate.publish({
390
426
  input: {},
391
427
  original,
392
428
  model
@@ -396,7 +432,7 @@ const createModelsCrud = params => {
396
432
  });
397
433
  await updateManager(context, resultModel);
398
434
  loaders.listModels.clearAll();
399
- await onAfterModelUpdate.publish({
435
+ await onModelAfterUpdate.publish({
400
436
  input: {},
401
437
  original,
402
438
  model: resultModel
@@ -441,8 +477,7 @@ const createModelsCrud = params => {
441
477
  }
442
478
 
443
479
  const identity = getIdentity();
444
-
445
- const model = _objectSpread(_objectSpread({}, original), {}, {
480
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), {}, {
446
481
  locale: locale.code,
447
482
  group: {
448
483
  id: group.id,
@@ -461,8 +496,7 @@ const createModelsCrud = params => {
461
496
  lockedFields: [],
462
497
  webinyVersion: context.WEBINY_VERSION
463
498
  });
464
-
465
- await onBeforeModelCreateFrom.publish({
499
+ await onModelBeforeCreateFrom.publish({
466
500
  input,
467
501
  model,
468
502
  original
@@ -472,7 +506,7 @@ const createModelsCrud = params => {
472
506
  });
473
507
  loaders.listModels.clearAll();
474
508
  await updateManager(context, model);
475
- await onAfterModelCreateFrom.publish({
509
+ await onModelAfterCreateFrom.publish({
476
510
  input,
477
511
  original,
478
512
  model: createdModel
@@ -518,8 +552,7 @@ const createModelsCrud = params => {
518
552
  }
519
553
 
520
554
  const fields = await (0, _createFieldModels.createFieldModels)(inputData.fields);
521
-
522
- const model = _objectSpread(_objectSpread(_objectSpread({}, original), input), {}, {
555
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), input), {}, {
523
556
  group,
524
557
  tenant: original.tenant || getTenant().id,
525
558
  locale: original.locale || getLocale().code,
@@ -527,8 +560,8 @@ const createModelsCrud = params => {
527
560
  fields,
528
561
  savedOn: new Date().toISOString()
529
562
  });
530
-
531
- await onBeforeModelUpdate.publish({
563
+ model.tags = ensureTypeTag(model);
564
+ await onModelBeforeUpdate.publish({
532
565
  input,
533
566
  original,
534
567
  model
@@ -537,7 +570,7 @@ const createModelsCrud = params => {
537
570
  model
538
571
  });
539
572
  await updateManager(context, resultModel);
540
- await onAfterModelUpdate.publish({
573
+ await onModelAfterUpdate.publish({
541
574
  input,
542
575
  original,
543
576
  model: resultModel
@@ -548,7 +581,7 @@ const createModelsCrud = params => {
548
581
  async deleteModel(modelId) {
549
582
  await checkModelPermissions("d");
550
583
  const model = await getModel(modelId);
551
- await onBeforeModelDelete.publish({
584
+ await onModelBeforeDelete.publish({
552
585
  model
553
586
  });
554
587
 
@@ -563,12 +596,25 @@ const createModelsCrud = params => {
563
596
  });
564
597
  }
565
598
 
566
- await onAfterModelDelete.publish({
599
+ await onModelAfterDelete.publish({
567
600
  model
568
601
  });
569
602
  managers.delete(model.modelId);
570
603
  },
571
604
 
605
+ async initializeModel(modelId) {
606
+ /**
607
+ * We require that users have write permissions to initialize models.
608
+ * Maybe introduce another permission for it?
609
+ */
610
+ await checkModelPermissions("w");
611
+ const model = await getModel(modelId);
612
+ await onModelInitialize.publish({
613
+ model
614
+ });
615
+ return true;
616
+ },
617
+
572
618
  getModelManager,
573
619
  getEntryManager: async model => {
574
620
  return getModelManager(model);
@@ -1 +1 @@
1
- {"version":3,"names":["featureVersion","semver","coerce","attachStorageIdToFields","fields","map","field","settings","storageId","fieldId","attachStorageIdToModelFields","model","webinyVersion","version","match","compare","createModelsCrud","params","getTenant","getIdentity","getLocale","storageOperations","context","loaders","listModels","DataLoader","models","list","where","tenant","id","locale","code","clearModelsCache","loader","Object","values","clearAll","managers","Map","updateManager","manager","contentModelManagerFactory","set","modelId","checkModelPermissions","check","checkPermissions","rwd","getModelsAsPlugins","plugins","byType","CmsModelPlugin","type","filter","plugin","t","l","contentModel","WEBINY_VERSION","validateModelFields","modelsGet","pluginModel","find","get","NotFoundError","modelsList","databaseModels","load","pluginsModels","concat","permission","filterAsync","validateOwnership","validateModelAccess","getModel","checkOwnership","checkModelAccess","getModelManager","target","has","m","onBeforeModelCreate","createTopic","onAfterModelCreate","onBeforeModelCreateFrom","onAfterModelCreateFrom","onBeforeModelUpdate","onAfterModelUpdate","onBeforeModelDelete","onAfterModelDelete","assignBeforeModelCreate","assignAfterModelCreate","assignBeforeModelUpdate","assignAfterModelUpdate","assignAfterModelCreateFrom","assignBeforeModelDelete","assignAfterModelDelete","createModel","inputData","createdData","CreateContentModelModel","populate","validate","input","toJSON","security","disableAuthorization","group","cms","getGroup","enableAuthorization","createFieldModels","identity","name","description","titleFieldId","createdBy","displayName","createdOn","Date","toISOString","savedOn","lockedFields","layout","publish","createdModel","create","updateModelDirect","initialModel","original","resultModel","update","createModelFrom","data","CreateContentModelModelFrom","i18n","groups","updateModel","updatedData","UpdateContentModelModel","onlyDirty","keys","length","groupData","deleteModel","delete","ex","WebinyError","message","error","getEntryManager","getManagers","getEntryManagers"],"sources":["contentModel.crud.ts"],"sourcesContent":["import {\n CmsContext,\n CmsModel,\n CmsModelContext,\n CmsModelManager,\n CmsModelPermission,\n HeadlessCmsStorageOperations,\n BeforeModelCreateTopicParams,\n AfterModelCreateTopicParams,\n BeforeModelUpdateTopicParams,\n AfterModelUpdateTopicParams,\n BeforeModelDeleteTopicParams,\n AfterModelDeleteTopicParams,\n BeforeModelCreateFromTopicParams,\n AfterModelCreateFromTopicParams,\n CmsModelCreateInput,\n CmsModelUpdateInput,\n CmsModelCreateFromInput,\n CmsModelField\n} from \"~/types\";\nimport DataLoader from \"dataloader\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { contentModelManagerFactory } from \"./contentModel/contentModelManagerFactory\";\nimport {\n CreateContentModelModel,\n CreateContentModelModelFrom,\n UpdateContentModelModel\n} from \"./contentModel/models\";\nimport { createFieldModels } from \"./contentModel/createFieldModels\";\nimport WebinyError from \"@webiny/error\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignBeforeModelCreate } from \"./contentModel/beforeCreate\";\nimport { assignBeforeModelUpdate } from \"./contentModel/beforeUpdate\";\nimport { assignBeforeModelDelete } from \"./contentModel/beforeDelete\";\nimport { assignAfterModelCreate } from \"./contentModel/afterCreate\";\nimport { assignAfterModelUpdate } from \"./contentModel/afterUpdate\";\nimport { assignAfterModelDelete } from \"./contentModel/afterDelete\";\nimport { assignAfterModelCreateFrom } from \"./contentModel/afterCreateFrom\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\nimport { checkPermissions } from \"~/utils/permissions\";\nimport { filterAsync } from \"~/utils/filterAsync\";\nimport { checkOwnership, validateOwnership } from \"~/utils/ownership\";\nimport { checkModelAccess, validateModelAccess } from \"~/utils/access\";\nimport { validateModelFields } from \"~/crud/contentModel/validateModelFields\";\nimport semver, { SemVer } from \"semver\";\n\n/**\n * TODO: remove for 5.34.0\n * Required because of the 5.33.0 upgrade.\n * Until the upgrade is done, API will break because there is no storageId assigned.\n */\nconst featureVersion = semver.coerce(\"5.33.0\") as SemVer;\n\nconst attachStorageIdToFields = (fields: CmsModelField[]): CmsModelField[] => {\n return fields.map(field => {\n if (field.settings?.fields) {\n field.settings.fields = attachStorageIdToFields(field.settings.fields);\n }\n if (!field.storageId) {\n field.storageId = field.fieldId;\n }\n return field;\n });\n};\n\nconst attachStorageIdToModelFields = (model: CmsModel): CmsModelField[] => {\n if (!model.webinyVersion) {\n return model.fields;\n }\n\n const version = semver.coerce(model.webinyVersion);\n if (!version) {\n return model.fields;\n }\n /**\n * Unfortunately we need to check for beta and next.\n * TODO remove after 5.33.0\n */\n if (model.webinyVersion.match(/beta|next/)) {\n return attachStorageIdToFields(model.fields);\n }\n if (semver.compare(version, featureVersion) >= 0) {\n return model.fields;\n }\n return attachStorageIdToFields(model.fields);\n};\n\nexport interface CreateModelsCrudParams {\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n}\nexport const createModelsCrud = (params: CreateModelsCrudParams): CmsModelContext => {\n const { getTenant, getIdentity, getLocale, storageOperations, context } = params;\n\n const loaders = {\n listModels: new DataLoader(async () => {\n const models = await storageOperations.models.list({\n where: {\n tenant: getTenant().id,\n locale: getLocale().code\n }\n });\n return [\n models.map(model => {\n return {\n ...model,\n fields: attachStorageIdToModelFields(model),\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n })\n ];\n })\n };\n\n const clearModelsCache = (): void => {\n for (const loader of Object.values(loaders)) {\n loader.clearAll();\n }\n };\n\n const managers = new Map<string, CmsModelManager>();\n const updateManager = async (\n context: CmsContext,\n model: CmsModel\n ): Promise<CmsModelManager> => {\n const manager = await contentModelManagerFactory(context, model);\n managers.set(model.modelId, manager);\n return manager;\n };\n\n const checkModelPermissions = (check: string): Promise<CmsModelPermission> => {\n return checkPermissions(context, \"cms.contentModel\", { rwd: check });\n };\n\n const getModelsAsPlugins = (): CmsModel[] => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n const models = context.plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n /**\n * We need to filter out models that are not for this tenant or locale.\n * If it does not have tenant or locale define, it is for every locale and tenant\n */\n .filter(plugin => {\n const { tenant: t, locale: l } = plugin.contentModel;\n if (t && t !== tenant) {\n return false;\n } else if (l && l !== locale) {\n return false;\n }\n return true;\n })\n .map<CmsModel>(plugin => {\n return {\n ...plugin.contentModel,\n tenant,\n locale,\n webinyVersion: context.WEBINY_VERSION\n };\n });\n /**\n * Only point where we can truly validate the user model is in the runtime.\n */\n for (const model of models) {\n validateModelFields({\n model,\n plugins: context.plugins\n });\n }\n return models;\n };\n\n const modelsGet = async (modelId: string): Promise<CmsModel> => {\n const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);\n\n if (pluginModel) {\n return pluginModel;\n }\n\n const model = await storageOperations.models.get({\n tenant: getTenant().id,\n locale: getLocale().code,\n modelId\n });\n\n if (!model) {\n throw new NotFoundError(`Content model \"${modelId}\" was not found!`);\n }\n\n return {\n ...model,\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n };\n\n const modelsList = async (): Promise<CmsModel[]> => {\n const databaseModels = await loaders.listModels.load(\"listModels\");\n\n const pluginsModels = getModelsAsPlugins();\n\n return databaseModels.concat(pluginsModels);\n };\n\n const listModels = async () => {\n const permission = await checkModelPermissions(\"r\");\n const models = await modelsList();\n return filterAsync(models, async model => {\n if (!validateOwnership(context, permission, model)) {\n return false;\n }\n return validateModelAccess(context, model);\n });\n };\n\n const getModel = async (modelId: string): Promise<CmsModel> => {\n const permission = await checkModelPermissions(\"r\");\n\n const model = await modelsGet(modelId);\n\n checkOwnership(context, permission, model);\n await checkModelAccess(context, model);\n\n return model;\n };\n\n const getModelManager: CmsModelContext[\"getModelManager\"] = async (\n target\n ): Promise<CmsModelManager> => {\n const modelId = typeof target === \"string\" ? target : target.modelId;\n if (managers.has(modelId)) {\n return managers.get(modelId) as CmsModelManager;\n }\n const models = await modelsList();\n const model = models.find(m => m.modelId === modelId);\n if (!model) {\n throw new NotFoundError(`There is no content model \"${modelId}\".`);\n }\n return await updateManager(context, model);\n };\n\n const onBeforeModelCreate = createTopic<BeforeModelCreateTopicParams>();\n const onAfterModelCreate = createTopic<AfterModelCreateTopicParams>();\n const onBeforeModelCreateFrom = createTopic<BeforeModelCreateFromTopicParams>();\n const onAfterModelCreateFrom = createTopic<AfterModelCreateFromTopicParams>();\n const onBeforeModelUpdate = createTopic<BeforeModelUpdateTopicParams>();\n const onAfterModelUpdate = createTopic<AfterModelUpdateTopicParams>();\n const onBeforeModelDelete = createTopic<BeforeModelDeleteTopicParams>();\n const onAfterModelDelete = createTopic<AfterModelDeleteTopicParams>();\n /**\n * We need to assign some default behaviors.\n */\n assignBeforeModelCreate({\n onBeforeModelCreate,\n onBeforeModelCreateFrom,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelCreate({\n context,\n onAfterModelCreate\n });\n assignBeforeModelUpdate({\n onBeforeModelUpdate,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelUpdate({\n context,\n onAfterModelUpdate\n });\n assignAfterModelCreateFrom({\n context,\n onAfterModelCreateFrom\n });\n assignBeforeModelDelete({\n onBeforeModelDelete,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelDelete({\n context,\n onAfterModelDelete\n });\n\n return {\n onBeforeModelCreate,\n onAfterModelCreate,\n onBeforeModelCreateFrom,\n onAfterModelCreateFrom,\n onBeforeModelUpdate,\n onAfterModelUpdate,\n onBeforeModelDelete,\n onAfterModelDelete,\n clearModelsCache,\n getModel,\n listModels,\n async createModel(inputData) {\n await checkModelPermissions(\"w\");\n\n const createdData = new CreateContentModelModel().populate(inputData);\n await createdData.validate();\n const input: CmsModelCreateInput = await createdData.toJSON();\n\n context.security.disableAuthorization();\n const group = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const fields = await createFieldModels(input.fields);\n\n const identity = getIdentity();\n const model: CmsModel = {\n name: input.name,\n description: input.description || \"\",\n modelId: input.modelId || \"\",\n titleFieldId: \"id\",\n locale: getLocale().code,\n tenant: getTenant().id,\n group: {\n id: group.id,\n name: group.name\n },\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n fields,\n lockedFields: [],\n layout: input.layout || [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onBeforeModelCreate.publish({\n input,\n model\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onAfterModelCreate.publish({\n input,\n model: createdModel\n });\n\n return createdModel;\n },\n /**\n * Method does not check for permissions or ownership.\n * @internal\n */\n async updateModelDirect(params) {\n const { model: initialModel, original } = params;\n\n const model: CmsModel = {\n ...initialModel,\n tenant: initialModel.tenant || getTenant().id,\n locale: initialModel.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onBeforeModelUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n loaders.listModels.clearAll();\n\n await onAfterModelUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model: resultModel\n });\n\n return resultModel;\n },\n async createModelFrom(modelId, data) {\n await checkModelPermissions(\"w\");\n /**\n * Get a model record; this will also perform ownership validation.\n */\n const original = await getModel(modelId);\n\n const createdData = new CreateContentModelModelFrom().populate({\n name: data.name,\n modelId: data.modelId,\n description: data.description || original.description,\n group: data.group,\n locale: data.locale\n });\n\n await createdData.validate();\n const input: CmsModelCreateFromInput = await createdData.toJSON();\n\n const locale = await context.i18n.getLocale(input.locale || original.locale);\n if (!locale) {\n throw new NotFoundError(`There is no locale \"${input.locale}\".`);\n }\n /**\n * Use storage operations directly because we cannot get group from different locale via context methods.\n */\n const group = await context.cms.storageOperations.groups.get({\n id: input.group,\n tenant: original.tenant,\n locale: locale.code\n });\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const identity = getIdentity();\n const model: CmsModel = {\n ...original,\n locale: locale.code,\n group: {\n id: group.id,\n name: group.name\n },\n name: input.name,\n modelId: input.modelId || \"\",\n description: input.description || \"\",\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n lockedFields: [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onBeforeModelCreateFrom.publish({\n input,\n model,\n original\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onAfterModelCreateFrom.publish({\n input,\n original,\n model: createdModel\n });\n\n return createdModel;\n },\n async updateModel(modelId, inputData) {\n await checkModelPermissions(\"w\");\n\n // Get a model record; this will also perform ownership validation.\n const original = await getModel(modelId);\n\n const updatedData = new UpdateContentModelModel().populate(inputData);\n await updatedData.validate();\n\n const input: CmsModelUpdateInput = await updatedData.toJSON({ onlyDirty: true });\n if (Object.keys(input).length === 0) {\n /**\n * We need to return the original if nothing is to be updated.\n */\n return original;\n }\n let group: CmsModel[\"group\"] = {\n id: original.group.id,\n name: original.group.name\n };\n if (input.group) {\n context.security.disableAuthorization();\n const groupData = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!groupData) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n group = {\n id: groupData.id,\n name: groupData.name\n };\n }\n const fields = await createFieldModels(inputData.fields);\n const model: CmsModel = {\n ...original,\n ...input,\n group,\n tenant: original.tenant || getTenant().id,\n locale: original.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION,\n fields,\n savedOn: new Date().toISOString()\n };\n\n await onBeforeModelUpdate.publish({\n input,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n await onAfterModelUpdate.publish({\n input,\n original,\n model: resultModel\n });\n\n return resultModel;\n },\n async deleteModel(modelId) {\n await checkModelPermissions(\"d\");\n\n const model = await getModel(modelId);\n\n await onBeforeModelDelete.publish({\n model\n });\n\n try {\n await storageOperations.models.delete({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete the content model\",\n ex.code || \"CONTENT_MODEL_DELETE_ERROR\",\n {\n error: ex,\n modelId: model.modelId\n }\n );\n }\n\n await onAfterModelDelete.publish({\n model\n });\n\n managers.delete(model.modelId);\n },\n getModelManager,\n getEntryManager: async model => {\n return getModelManager(model);\n },\n getManagers: () => managers,\n getEntryManagers: () => managers\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["featureVersion","semver","coerce","attachStorageIdToFields","fields","map","field","settings","storageId","fieldId","attachStorageIdToModelFields","model","webinyVersion","version","match","compare","ensureTypeTag","tags","find","tag","startsWith","push","createModelsCrud","params","getTenant","getIdentity","getLocale","storageOperations","context","loaders","listModels","DataLoader","models","list","where","tenant","id","locale","code","clearModelsCache","loader","Object","values","clearAll","managers","Map","updateManager","manager","contentModelManagerFactory","set","modelId","checkModelPermissions","check","checkPermissions","rwd","getModelsAsPlugins","plugins","byType","CmsModelPlugin","type","filter","plugin","t","l","contentModel","WEBINY_VERSION","validateModelFields","modelsGet","pluginModel","get","NotFoundError","modelsList","databaseModels","load","pluginsModels","concat","permission","filterAsync","validateOwnership","validateModelAccess","getModel","checkOwnership","checkModelAccess","getModelManager","target","has","m","onModelBeforeCreate","createTopic","onModelAfterCreate","onModelBeforeCreateFrom","onModelAfterCreateFrom","onModelBeforeUpdate","onModelAfterUpdate","onModelBeforeDelete","onModelAfterDelete","onModelInitialize","assignModelBeforeCreate","assignModelAfterCreate","assignModelBeforeUpdate","assignModelAfterUpdate","assignModelAfterCreateFrom","assignModelBeforeDelete","assignModelAfterDelete","onBeforeModelCreate","onAfterModelCreate","onBeforeModelCreateFrom","onAfterModelCreateFrom","onBeforeModelUpdate","onAfterModelUpdate","onBeforeModelDelete","onAfterModelDelete","createModel","inputData","createdData","CreateContentModelModel","populate","validate","input","toJSON","security","disableAuthorization","group","cms","getGroup","enableAuthorization","createFieldModels","identity","name","description","titleFieldId","createdBy","displayName","createdOn","Date","toISOString","savedOn","lockedFields","layout","publish","createdModel","create","updateModelDirect","initialModel","original","resultModel","update","createModelFrom","data","CreateContentModelModelFrom","i18n","groups","updateModel","updatedData","UpdateContentModelModel","onlyDirty","keys","length","groupData","deleteModel","delete","ex","WebinyError","message","error","initializeModel","getEntryManager","getManagers","getEntryManagers"],"sources":["contentModel.crud.ts"],"sourcesContent":["import {\n CmsContext,\n CmsModel,\n CmsModelContext,\n CmsModelManager,\n CmsModelPermission,\n HeadlessCmsStorageOperations,\n OnModelBeforeCreateTopicParams,\n OnModelAfterCreateTopicParams,\n OnModelBeforeUpdateTopicParams,\n OnModelAfterUpdateTopicParams,\n OnModelBeforeDeleteTopicParams,\n OnModelAfterDeleteTopicParams,\n OnModelInitializeParams,\n OnModelBeforeCreateFromTopicParams,\n OnModelAfterCreateFromTopicParams,\n CmsModelCreateInput,\n CmsModelUpdateInput,\n CmsModelCreateFromInput,\n CmsModelField\n} from \"~/types\";\nimport DataLoader from \"dataloader\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { contentModelManagerFactory } from \"./contentModel/contentModelManagerFactory\";\nimport {\n CreateContentModelModel,\n CreateContentModelModelFrom,\n UpdateContentModelModel\n} from \"./contentModel/models\";\nimport { createFieldModels } from \"./contentModel/createFieldModels\";\nimport WebinyError from \"@webiny/error\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignModelBeforeCreate } from \"./contentModel/beforeCreate\";\nimport { assignModelBeforeUpdate } from \"./contentModel/beforeUpdate\";\nimport { assignModelBeforeDelete } from \"./contentModel/beforeDelete\";\nimport { assignModelAfterCreate } from \"./contentModel/afterCreate\";\nimport { assignModelAfterUpdate } from \"./contentModel/afterUpdate\";\nimport { assignModelAfterDelete } from \"./contentModel/afterDelete\";\nimport { assignModelAfterCreateFrom } from \"./contentModel/afterCreateFrom\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\nimport { checkPermissions } from \"~/utils/permissions\";\nimport { filterAsync } from \"~/utils/filterAsync\";\nimport { checkOwnership, validateOwnership } from \"~/utils/ownership\";\nimport { checkModelAccess, validateModelAccess } from \"~/utils/access\";\nimport { validateModelFields } from \"~/crud/contentModel/validateModelFields\";\nimport semver, { SemVer } from \"semver\";\n\n/**\n * TODO: remove for 5.34.0\n * Required because of the 5.33.0 upgrade.\n * Until the upgrade is done, API will break because there is no storageId assigned.\n */\nconst featureVersion = semver.coerce(\"5.33.0\") as SemVer;\n\nconst attachStorageIdToFields = (fields: CmsModelField[]): CmsModelField[] => {\n return fields.map(field => {\n if (field.settings?.fields) {\n field.settings.fields = attachStorageIdToFields(field.settings.fields);\n }\n if (!field.storageId) {\n field.storageId = field.fieldId;\n }\n return field;\n });\n};\n\nconst attachStorageIdToModelFields = (model: CmsModel): CmsModelField[] => {\n if (!model.webinyVersion) {\n return model.fields;\n }\n\n const version = semver.coerce(model.webinyVersion);\n if (!version) {\n return model.fields;\n }\n /**\n * Unfortunately we need to check for beta and next.\n * TODO remove after 5.33.0\n */\n if (model.webinyVersion.match(/beta|next/)) {\n return attachStorageIdToFields(model.fields);\n }\n if (semver.compare(version, featureVersion) >= 0) {\n return model.fields;\n }\n return attachStorageIdToFields(model.fields);\n};\n\n/**\n * Given a model, return an array of tags ensuring the `type` tag is set.\n */\nconst ensureTypeTag = (model: Pick<CmsModel, \"tags\">) => {\n // Let's make sure we have a `type` tag assigned.\n // If `type` tag is not set, set it to a default one (`contentModel`).\n const tags = model.tags || [];\n if (!tags.find(tag => tag.startsWith(\"type:\"))) {\n tags.push(\"type:model\");\n }\n\n return tags;\n};\n\nexport interface CreateModelsCrudParams {\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n}\n\nexport const createModelsCrud = (params: CreateModelsCrudParams): CmsModelContext => {\n const { getTenant, getIdentity, getLocale, storageOperations, context } = params;\n\n const loaders = {\n listModels: new DataLoader(async () => {\n const models = await storageOperations.models.list({\n where: {\n tenant: getTenant().id,\n locale: getLocale().code\n }\n });\n return [\n models.map(model => {\n return {\n ...model,\n tags: ensureTypeTag(model),\n fields: attachStorageIdToModelFields(model),\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n })\n ];\n })\n };\n\n const clearModelsCache = (): void => {\n for (const loader of Object.values(loaders)) {\n loader.clearAll();\n }\n };\n\n const managers = new Map<string, CmsModelManager>();\n const updateManager = async (\n context: CmsContext,\n model: CmsModel\n ): Promise<CmsModelManager> => {\n const manager = await contentModelManagerFactory(context, model);\n managers.set(model.modelId, manager);\n return manager;\n };\n\n const checkModelPermissions = (check: string): Promise<CmsModelPermission> => {\n return checkPermissions(context, \"cms.contentModel\", { rwd: check });\n };\n\n const getModelsAsPlugins = (): CmsModel[] => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n const models = context.plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n /**\n * We need to filter out models that are not for this tenant or locale.\n * If it does not have tenant or locale define, it is for every locale and tenant\n */\n .filter(plugin => {\n const { tenant: t, locale: l } = plugin.contentModel;\n if (t && t !== tenant) {\n return false;\n } else if (l && l !== locale) {\n return false;\n }\n return true;\n })\n .map<CmsModel>(plugin => {\n return {\n ...plugin.contentModel,\n tags: ensureTypeTag(plugin.contentModel),\n tenant,\n locale,\n webinyVersion: context.WEBINY_VERSION\n };\n });\n /**\n * Only point where we can truly validate the user model is in the runtime.\n */\n for (const model of models) {\n validateModelFields({\n model,\n plugins: context.plugins\n });\n }\n return models;\n };\n\n const modelsGet = async (modelId: string): Promise<CmsModel> => {\n const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);\n\n if (pluginModel) {\n return pluginModel;\n }\n\n const model = await storageOperations.models.get({\n tenant: getTenant().id,\n locale: getLocale().code,\n modelId\n });\n\n if (!model) {\n throw new NotFoundError(`Content model \"${modelId}\" was not found!`);\n }\n\n return {\n ...model,\n tags: ensureTypeTag(model),\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n };\n\n const modelsList = async (): Promise<CmsModel[]> => {\n const databaseModels: CmsModel[] = await loaders.listModels.load(\"listModels\");\n\n const pluginsModels = getModelsAsPlugins();\n\n return databaseModels.concat(pluginsModels);\n };\n\n const listModels = async () => {\n const permission = await checkModelPermissions(\"r\");\n const models = await modelsList();\n return filterAsync(models, async model => {\n if (!validateOwnership(context, permission, model)) {\n return false;\n }\n return validateModelAccess(context, model);\n });\n };\n\n const getModel = async (modelId: string): Promise<CmsModel> => {\n const permission = await checkModelPermissions(\"r\");\n\n const model = await modelsGet(modelId);\n\n checkOwnership(context, permission, model);\n await checkModelAccess(context, model);\n\n return model;\n };\n\n const getModelManager: CmsModelContext[\"getModelManager\"] = async (\n target\n ): Promise<CmsModelManager> => {\n const modelId = typeof target === \"string\" ? target : target.modelId;\n if (managers.has(modelId)) {\n return managers.get(modelId) as CmsModelManager;\n }\n const models = await modelsList();\n const model = models.find(m => m.modelId === modelId);\n if (!model) {\n throw new NotFoundError(`There is no content model \"${modelId}\".`);\n }\n return await updateManager(context, model);\n };\n\n // create\n const onModelBeforeCreate =\n createTopic<OnModelBeforeCreateTopicParams>(\"cms.onModelBeforeCreate\");\n const onModelAfterCreate = createTopic<OnModelAfterCreateTopicParams>(\"cms.onModelAfterCreate\");\n // create from\n const onModelBeforeCreateFrom = createTopic<OnModelBeforeCreateFromTopicParams>(\n \"cms.onModelBeforeCreateFrom\"\n );\n const onModelAfterCreateFrom = createTopic<OnModelAfterCreateFromTopicParams>(\n \"cms.onModelAfterCreateFrom\"\n );\n // update\n const onModelBeforeUpdate =\n createTopic<OnModelBeforeUpdateTopicParams>(\"cms.onModelBeforeUpdate\");\n const onModelAfterUpdate = createTopic<OnModelAfterUpdateTopicParams>(\"cms.onModelAfterUpdate\");\n // delete\n const onModelBeforeDelete =\n createTopic<OnModelBeforeDeleteTopicParams>(\"cms.onModelBeforeDelete\");\n const onModelAfterDelete = createTopic<OnModelAfterDeleteTopicParams>(\"cms.onModelAfterDelete\");\n\n const onModelInitialize = createTopic<OnModelInitializeParams>(\"cms.onModelInitialize\");\n /**\n * We need to assign some default behaviors.\n */\n assignModelBeforeCreate({\n onModelBeforeCreate,\n onModelBeforeCreateFrom,\n plugins: context.plugins,\n storageOperations\n });\n assignModelAfterCreate({\n context,\n onModelAfterCreate\n });\n assignModelBeforeUpdate({\n onModelBeforeUpdate,\n plugins: context.plugins,\n storageOperations\n });\n assignModelAfterUpdate({\n context,\n onModelAfterUpdate\n });\n assignModelAfterCreateFrom({\n context,\n onModelAfterCreateFrom\n });\n assignModelBeforeDelete({\n onModelBeforeDelete,\n plugins: context.plugins,\n storageOperations\n });\n assignModelAfterDelete({\n context,\n onModelAfterDelete\n });\n\n return {\n /**\n * Deprecated - will be removed in 5.36.0\n */\n onBeforeModelCreate: onModelBeforeCreate,\n onAfterModelCreate: onModelAfterCreate,\n onBeforeModelCreateFrom: onModelBeforeCreateFrom,\n onAfterModelCreateFrom: onModelAfterCreateFrom,\n onBeforeModelUpdate: onModelBeforeUpdate,\n onAfterModelUpdate: onModelAfterUpdate,\n onBeforeModelDelete: onModelBeforeDelete,\n onAfterModelDelete: onModelAfterDelete,\n /**\n * Released in 5.34.0\n */\n onModelBeforeCreate,\n onModelAfterCreate,\n onModelBeforeCreateFrom,\n onModelAfterCreateFrom,\n onModelBeforeUpdate,\n onModelAfterUpdate,\n onModelBeforeDelete,\n onModelAfterDelete,\n onModelInitialize,\n clearModelsCache,\n getModel,\n listModels,\n async createModel(inputData) {\n await checkModelPermissions(\"w\");\n\n const createdData = new CreateContentModelModel().populate(inputData);\n await createdData.validate();\n const input: CmsModelCreateInput = await createdData.toJSON();\n\n context.security.disableAuthorization();\n const group = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const fields = await createFieldModels(input.fields);\n\n const identity = getIdentity();\n const model: CmsModel = {\n name: input.name,\n description: input.description || \"\",\n modelId: input.modelId || \"\",\n titleFieldId: \"id\",\n locale: getLocale().code,\n tenant: getTenant().id,\n group: {\n id: group.id,\n name: group.name\n },\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n fields,\n lockedFields: [],\n layout: input.layout || [],\n tags: [...(input.tags || [])],\n webinyVersion: context.WEBINY_VERSION\n };\n\n model.tags = ensureTypeTag(model);\n\n await onModelBeforeCreate.publish({\n input,\n model\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onModelAfterCreate.publish({\n input,\n model: createdModel\n });\n\n return createdModel;\n },\n /**\n * Method does not check for permissions or ownership.\n * @internal\n */\n async updateModelDirect(params) {\n const { model: initialModel, original } = params;\n\n const model: CmsModel = {\n ...initialModel,\n tenant: initialModel.tenant || getTenant().id,\n locale: initialModel.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onModelBeforeUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n loaders.listModels.clearAll();\n\n await onModelAfterUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model: resultModel\n });\n\n return resultModel;\n },\n async createModelFrom(modelId, data) {\n await checkModelPermissions(\"w\");\n /**\n * Get a model record; this will also perform ownership validation.\n */\n const original = await getModel(modelId);\n\n const createdData = new CreateContentModelModelFrom().populate({\n name: data.name,\n modelId: data.modelId,\n description: data.description || original.description,\n group: data.group,\n locale: data.locale\n });\n\n await createdData.validate();\n const input: CmsModelCreateFromInput = await createdData.toJSON();\n\n const locale = await context.i18n.getLocale(input.locale || original.locale);\n if (!locale) {\n throw new NotFoundError(`There is no locale \"${input.locale}\".`);\n }\n /**\n * Use storage operations directly because we cannot get group from different locale via context methods.\n */\n const group = await context.cms.storageOperations.groups.get({\n id: input.group,\n tenant: original.tenant,\n locale: locale.code\n });\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const identity = getIdentity();\n const model: CmsModel = {\n ...original,\n locale: locale.code,\n group: {\n id: group.id,\n name: group.name\n },\n name: input.name,\n modelId: input.modelId || \"\",\n description: input.description || \"\",\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n lockedFields: [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onModelBeforeCreateFrom.publish({\n input,\n model,\n original\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onModelAfterCreateFrom.publish({\n input,\n original,\n model: createdModel\n });\n\n return createdModel;\n },\n async updateModel(modelId, inputData) {\n await checkModelPermissions(\"w\");\n\n // Get a model record; this will also perform ownership validation.\n const original = await getModel(modelId);\n\n const updatedData = new UpdateContentModelModel().populate(inputData);\n await updatedData.validate();\n\n const input: CmsModelUpdateInput = await updatedData.toJSON({ onlyDirty: true });\n if (Object.keys(input).length === 0) {\n /**\n * We need to return the original if nothing is to be updated.\n */\n return original;\n }\n let group: CmsModel[\"group\"] = {\n id: original.group.id,\n name: original.group.name\n };\n if (input.group) {\n context.security.disableAuthorization();\n const groupData = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!groupData) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n group = {\n id: groupData.id,\n name: groupData.name\n };\n }\n const fields = await createFieldModels(inputData.fields);\n const model: CmsModel = {\n ...original,\n ...input,\n group,\n tenant: original.tenant || getTenant().id,\n locale: original.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION,\n fields,\n savedOn: new Date().toISOString()\n };\n\n model.tags = ensureTypeTag(model);\n\n await onModelBeforeUpdate.publish({\n input,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n await onModelAfterUpdate.publish({\n input,\n original,\n model: resultModel\n });\n\n return resultModel;\n },\n async deleteModel(modelId) {\n await checkModelPermissions(\"d\");\n\n const model = await getModel(modelId);\n\n await onModelBeforeDelete.publish({\n model\n });\n\n try {\n await storageOperations.models.delete({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete the content model\",\n ex.code || \"CONTENT_MODEL_DELETE_ERROR\",\n {\n error: ex,\n modelId: model.modelId\n }\n );\n }\n\n await onModelAfterDelete.publish({\n model\n });\n\n managers.delete(model.modelId);\n },\n async initializeModel(modelId) {\n /**\n * We require that users have write permissions to initialize models.\n * Maybe introduce another permission for it?\n */\n await checkModelPermissions(\"w\");\n\n const model = await getModel(modelId);\n\n await onModelInitialize.publish({ model });\n\n return true;\n },\n getModelManager,\n getEntryManager: async model => {\n return getModelManager(model);\n },\n getManagers: () => managers,\n getEntryManagers: () => managers\n };\n};\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { BeforeGroupCreateTopicParams, HeadlessCmsStorageOperations } from "../../types";
1
+ import { OnGroupBeforeCreateTopicParams, HeadlessCmsStorageOperations } from "../../types";
2
2
  import { Topic } from "@webiny/pubsub/types";
3
3
  import { PluginsContainer } from "@webiny/plugins";
4
4
  interface AssignBeforeGroupCreateParams {
5
- onBeforeCreate: Topic<BeforeGroupCreateTopicParams>;
5
+ onGroupBeforeCreate: Topic<OnGroupBeforeCreateTopicParams>;
6
6
  plugins: PluginsContainer;
7
7
  storageOperations: HeadlessCmsStorageOperations;
8
8
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
@@ -17,11 +17,11 @@ var _utils = require("@webiny/utils");
17
17
 
18
18
  const assignBeforeGroupCreate = params => {
19
19
  const {
20
- onBeforeCreate,
20
+ onGroupBeforeCreate,
21
21
  plugins,
22
22
  storageOperations
23
23
  } = params;
24
- onBeforeCreate.subscribe(async params => {
24
+ onGroupBeforeCreate.subscribe(async params => {
25
25
  const {
26
26
  group
27
27
  } = params;
@@ -1 +1 @@
1
- {"version":3,"names":["assignBeforeGroupCreate","params","onBeforeCreate","plugins","storageOperations","subscribe","group","slug","trim","groups","list","where","tenant","locale","length","WebinyError","toSlug","name","generateAlphaNumericId","groupPlugin","byType","CmsGroupPlugin","type","find","item","contentModelGroup","Error"],"sources":["beforeCreate.ts"],"sourcesContent":["import { BeforeGroupCreateTopicParams, HeadlessCmsStorageOperations } from \"~/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport WebinyError from \"@webiny/error\";\nimport { toSlug } from \"~/utils/toSlug\";\nimport { CmsGroupPlugin } from \"~/plugins/CmsGroupPlugin\";\nimport { generateAlphaNumericId } from \"@webiny/utils\";\n\ninterface AssignBeforeGroupCreateParams {\n onBeforeCreate: Topic<BeforeGroupCreateTopicParams>;\n plugins: PluginsContainer;\n storageOperations: HeadlessCmsStorageOperations;\n}\nexport const assignBeforeGroupCreate = (params: AssignBeforeGroupCreateParams) => {\n const { onBeforeCreate, plugins, storageOperations } = params;\n\n onBeforeCreate.subscribe(async params => {\n const { group } = params;\n\n if (group.slug && group.slug.trim()) {\n const groups = await storageOperations.groups.list({\n where: {\n tenant: group.tenant,\n locale: group.locale,\n slug: group.slug\n }\n });\n if (groups.length > 0) {\n throw new WebinyError(\n `Cms Group with the slug \"${group.slug}\" already exists.`,\n \"SLUG_ALREADY_EXISTS\"\n );\n }\n } else {\n const slug = toSlug(group.name);\n const groups = await storageOperations.groups.list({\n where: {\n tenant: group.tenant,\n locale: group.locale,\n slug\n }\n });\n\n if (groups.length === 0) {\n group.slug = slug;\n } else {\n group.slug = `${slug}-${generateAlphaNumericId(8)}`;\n }\n }\n\n const groupPlugin = plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n .find(item => item.contentModelGroup.slug === group.slug);\n\n if (groupPlugin) {\n throw new Error(\n `Cannot create \"${group.slug}\" content model group because one is already registered via a plugin.`\n );\n }\n });\n};\n"],"mappings":";;;;;;;;;AAGA;;AACA;;AACA;;AACA;;AAOO,MAAMA,uBAAuB,GAAIC,MAAD,IAA2C;EAC9E,MAAM;IAAEC,cAAF;IAAkBC,OAAlB;IAA2BC;EAA3B,IAAiDH,MAAvD;EAEAC,cAAc,CAACG,SAAf,CAAyB,MAAMJ,MAAN,IAAgB;IACrC,MAAM;MAAEK;IAAF,IAAYL,MAAlB;;IAEA,IAAIK,KAAK,CAACC,IAAN,IAAcD,KAAK,CAACC,IAAN,CAAWC,IAAX,EAAlB,EAAqC;MACjC,MAAMC,MAAM,GAAG,MAAML,iBAAiB,CAACK,MAAlB,CAAyBC,IAAzB,CAA8B;QAC/CC,KAAK,EAAE;UACHC,MAAM,EAAEN,KAAK,CAACM,MADX;UAEHC,MAAM,EAAEP,KAAK,CAACO,MAFX;UAGHN,IAAI,EAAED,KAAK,CAACC;QAHT;MADwC,CAA9B,CAArB;;MAOA,IAAIE,MAAM,CAACK,MAAP,GAAgB,CAApB,EAAuB;QACnB,MAAM,IAAIC,cAAJ,CACD,4BAA2BT,KAAK,CAACC,IAAK,mBADrC,EAEF,qBAFE,CAAN;MAIH;IACJ,CAdD,MAcO;MACH,MAAMA,IAAI,GAAG,IAAAS,cAAA,EAAOV,KAAK,CAACW,IAAb,CAAb;MACA,MAAMR,MAAM,GAAG,MAAML,iBAAiB,CAACK,MAAlB,CAAyBC,IAAzB,CAA8B;QAC/CC,KAAK,EAAE;UACHC,MAAM,EAAEN,KAAK,CAACM,MADX;UAEHC,MAAM,EAAEP,KAAK,CAACO,MAFX;UAGHN;QAHG;MADwC,CAA9B,CAArB;;MAQA,IAAIE,MAAM,CAACK,MAAP,KAAkB,CAAtB,EAAyB;QACrBR,KAAK,CAACC,IAAN,GAAaA,IAAb;MACH,CAFD,MAEO;QACHD,KAAK,CAACC,IAAN,GAAc,GAAEA,IAAK,IAAG,IAAAW,6BAAA,EAAuB,CAAvB,CAA0B,EAAlD;MACH;IACJ;;IAED,MAAMC,WAAW,GAAGhB,OAAO,CACtBiB,MADe,CACQC,8BAAA,CAAeC,IADvB,EAEfC,IAFe,CAEVC,IAAI,IAAIA,IAAI,CAACC,iBAAL,CAAuBlB,IAAvB,KAAgCD,KAAK,CAACC,IAFpC,CAApB;;IAIA,IAAIY,WAAJ,EAAiB;MACb,MAAM,IAAIO,KAAJ,CACD,kBAAiBpB,KAAK,CAACC,IAAK,uEAD3B,CAAN;IAGH;EACJ,CA3CD;AA4CH,CA/CM"}
1
+ {"version":3,"names":["assignBeforeGroupCreate","params","onGroupBeforeCreate","plugins","storageOperations","subscribe","group","slug","trim","groups","list","where","tenant","locale","length","WebinyError","toSlug","name","generateAlphaNumericId","groupPlugin","byType","CmsGroupPlugin","type","find","item","contentModelGroup","Error"],"sources":["beforeCreate.ts"],"sourcesContent":["import { OnGroupBeforeCreateTopicParams, HeadlessCmsStorageOperations } from \"~/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport WebinyError from \"@webiny/error\";\nimport { toSlug } from \"~/utils/toSlug\";\nimport { CmsGroupPlugin } from \"~/plugins/CmsGroupPlugin\";\nimport { generateAlphaNumericId } from \"@webiny/utils\";\n\ninterface AssignBeforeGroupCreateParams {\n onGroupBeforeCreate: Topic<OnGroupBeforeCreateTopicParams>;\n plugins: PluginsContainer;\n storageOperations: HeadlessCmsStorageOperations;\n}\nexport const assignBeforeGroupCreate = (params: AssignBeforeGroupCreateParams) => {\n const { onGroupBeforeCreate, plugins, storageOperations } = params;\n\n onGroupBeforeCreate.subscribe(async params => {\n const { group } = params;\n\n if (group.slug && group.slug.trim()) {\n const groups = await storageOperations.groups.list({\n where: {\n tenant: group.tenant,\n locale: group.locale,\n slug: group.slug\n }\n });\n if (groups.length > 0) {\n throw new WebinyError(\n `Cms Group with the slug \"${group.slug}\" already exists.`,\n \"SLUG_ALREADY_EXISTS\"\n );\n }\n } else {\n const slug = toSlug(group.name);\n const groups = await storageOperations.groups.list({\n where: {\n tenant: group.tenant,\n locale: group.locale,\n slug\n }\n });\n\n if (groups.length === 0) {\n group.slug = slug;\n } else {\n group.slug = `${slug}-${generateAlphaNumericId(8)}`;\n }\n }\n\n const groupPlugin = plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n .find(item => item.contentModelGroup.slug === group.slug);\n\n if (groupPlugin) {\n throw new Error(\n `Cannot create \"${group.slug}\" content model group because one is already registered via a plugin.`\n );\n }\n });\n};\n"],"mappings":";;;;;;;;;AAGA;;AACA;;AACA;;AACA;;AAOO,MAAMA,uBAAuB,GAAIC,MAAD,IAA2C;EAC9E,MAAM;IAAEC,mBAAF;IAAuBC,OAAvB;IAAgCC;EAAhC,IAAsDH,MAA5D;EAEAC,mBAAmB,CAACG,SAApB,CAA8B,MAAMJ,MAAN,IAAgB;IAC1C,MAAM;MAAEK;IAAF,IAAYL,MAAlB;;IAEA,IAAIK,KAAK,CAACC,IAAN,IAAcD,KAAK,CAACC,IAAN,CAAWC,IAAX,EAAlB,EAAqC;MACjC,MAAMC,MAAM,GAAG,MAAML,iBAAiB,CAACK,MAAlB,CAAyBC,IAAzB,CAA8B;QAC/CC,KAAK,EAAE;UACHC,MAAM,EAAEN,KAAK,CAACM,MADX;UAEHC,MAAM,EAAEP,KAAK,CAACO,MAFX;UAGHN,IAAI,EAAED,KAAK,CAACC;QAHT;MADwC,CAA9B,CAArB;;MAOA,IAAIE,MAAM,CAACK,MAAP,GAAgB,CAApB,EAAuB;QACnB,MAAM,IAAIC,cAAJ,CACD,4BAA2BT,KAAK,CAACC,IAAK,mBADrC,EAEF,qBAFE,CAAN;MAIH;IACJ,CAdD,MAcO;MACH,MAAMA,IAAI,GAAG,IAAAS,cAAA,EAAOV,KAAK,CAACW,IAAb,CAAb;MACA,MAAMR,MAAM,GAAG,MAAML,iBAAiB,CAACK,MAAlB,CAAyBC,IAAzB,CAA8B;QAC/CC,KAAK,EAAE;UACHC,MAAM,EAAEN,KAAK,CAACM,MADX;UAEHC,MAAM,EAAEP,KAAK,CAACO,MAFX;UAGHN;QAHG;MADwC,CAA9B,CAArB;;MAQA,IAAIE,MAAM,CAACK,MAAP,KAAkB,CAAtB,EAAyB;QACrBR,KAAK,CAACC,IAAN,GAAaA,IAAb;MACH,CAFD,MAEO;QACHD,KAAK,CAACC,IAAN,GAAc,GAAEA,IAAK,IAAG,IAAAW,6BAAA,EAAuB,CAAvB,CAA0B,EAAlD;MACH;IACJ;;IAED,MAAMC,WAAW,GAAGhB,OAAO,CACtBiB,MADe,CACQC,8BAAA,CAAeC,IADvB,EAEfC,IAFe,CAEVC,IAAI,IAAIA,IAAI,CAACC,iBAAL,CAAuBlB,IAAvB,KAAgCD,KAAK,CAACC,IAFpC,CAApB;;IAIA,IAAIY,WAAJ,EAAiB;MACb,MAAM,IAAIO,KAAJ,CACD,kBAAiBpB,KAAK,CAACC,IAAK,uEAD3B,CAAN;IAGH;EACJ,CA3CD;AA4CH,CA/CM"}
@@ -1,8 +1,8 @@
1
1
  import { Topic } from "@webiny/pubsub/types";
2
- import { BeforeGroupDeleteTopicParams, HeadlessCmsStorageOperations } from "../../types";
2
+ import { OnGroupBeforeDeleteTopicParams, HeadlessCmsStorageOperations } from "../../types";
3
3
  import { PluginsContainer } from "@webiny/plugins";
4
4
  interface AssignBeforeGroupDeleteParams {
5
- onBeforeDelete: Topic<BeforeGroupDeleteTopicParams>;
5
+ onGroupBeforeDelete: Topic<OnGroupBeforeDeleteTopicParams>;
6
6
  plugins: PluginsContainer;
7
7
  storageOperations: HeadlessCmsStorageOperations;
8
8
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
@@ -13,11 +13,11 @@ var _error = _interopRequireDefault(require("@webiny/error"));
13
13
 
14
14
  const assignBeforeGroupDelete = params => {
15
15
  const {
16
- onBeforeDelete,
16
+ onGroupBeforeDelete,
17
17
  plugins,
18
18
  storageOperations
19
19
  } = params;
20
- onBeforeDelete.subscribe(async params => {
20
+ onGroupBeforeDelete.subscribe(async params => {
21
21
  const {
22
22
  group
23
23
  } = params;
@@ -1 +1 @@
1
- {"version":3,"names":["assignBeforeGroupDelete","params","onBeforeDelete","plugins","storageOperations","subscribe","group","groupPlugin","byType","CmsGroupPlugin","type","find","item","contentModelGroup","slug","Error","models","list","where","tenant","locale","items","filter","model","id","length","WebinyError"],"sources":["beforeDelete.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { BeforeGroupDeleteTopicParams, HeadlessCmsStorageOperations } from \"~/types\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { CmsGroupPlugin } from \"~/plugins/CmsGroupPlugin\";\nimport WebinyError from \"@webiny/error\";\n\ninterface AssignBeforeGroupDeleteParams {\n onBeforeDelete: Topic<BeforeGroupDeleteTopicParams>;\n plugins: PluginsContainer;\n storageOperations: HeadlessCmsStorageOperations;\n}\nexport const assignBeforeGroupDelete = (params: AssignBeforeGroupDeleteParams) => {\n const { onBeforeDelete, plugins, storageOperations } = params;\n\n onBeforeDelete.subscribe(async params => {\n const { group } = params;\n\n const groupPlugin = plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n .find(item => item.contentModelGroup.slug === group.slug);\n\n if (groupPlugin) {\n throw new Error(`Cms Groups defined via plugins cannot be deleted.`);\n }\n\n const models = await storageOperations.models.list({\n where: {\n tenant: group.tenant,\n locale: group.locale\n }\n });\n const items = models.filter(model => {\n return model.group.id === group.id;\n });\n if (items.length > 0) {\n throw new WebinyError(\n \"Cannot delete this group because there are models that belong to it.\",\n \"BEFORE_DELETE_ERROR\",\n {\n group\n }\n );\n }\n });\n};\n"],"mappings":";;;;;;;;;AAGA;;AACA;;AAOO,MAAMA,uBAAuB,GAAIC,MAAD,IAA2C;EAC9E,MAAM;IAAEC,cAAF;IAAkBC,OAAlB;IAA2BC;EAA3B,IAAiDH,MAAvD;EAEAC,cAAc,CAACG,SAAf,CAAyB,MAAMJ,MAAN,IAAgB;IACrC,MAAM;MAAEK;IAAF,IAAYL,MAAlB;IAEA,MAAMM,WAAW,GAAGJ,OAAO,CACtBK,MADe,CACQC,8BAAA,CAAeC,IADvB,EAEfC,IAFe,CAEVC,IAAI,IAAIA,IAAI,CAACC,iBAAL,CAAuBC,IAAvB,KAAgCR,KAAK,CAACQ,IAFpC,CAApB;;IAIA,IAAIP,WAAJ,EAAiB;MACb,MAAM,IAAIQ,KAAJ,CAAW,mDAAX,CAAN;IACH;;IAED,MAAMC,MAAM,GAAG,MAAMZ,iBAAiB,CAACY,MAAlB,CAAyBC,IAAzB,CAA8B;MAC/CC,KAAK,EAAE;QACHC,MAAM,EAAEb,KAAK,CAACa,MADX;QAEHC,MAAM,EAAEd,KAAK,CAACc;MAFX;IADwC,CAA9B,CAArB;IAMA,MAAMC,KAAK,GAAGL,MAAM,CAACM,MAAP,CAAcC,KAAK,IAAI;MACjC,OAAOA,KAAK,CAACjB,KAAN,CAAYkB,EAAZ,KAAmBlB,KAAK,CAACkB,EAAhC;IACH,CAFa,CAAd;;IAGA,IAAIH,KAAK,CAACI,MAAN,GAAe,CAAnB,EAAsB;MAClB,MAAM,IAAIC,cAAJ,CACF,sEADE,EAEF,qBAFE,EAGF;QACIpB;MADJ,CAHE,CAAN;IAOH;EACJ,CA7BD;AA8BH,CAjCM"}
1
+ {"version":3,"names":["assignBeforeGroupDelete","params","onGroupBeforeDelete","plugins","storageOperations","subscribe","group","groupPlugin","byType","CmsGroupPlugin","type","find","item","contentModelGroup","slug","Error","models","list","where","tenant","locale","items","filter","model","id","length","WebinyError"],"sources":["beforeDelete.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { OnGroupBeforeDeleteTopicParams, HeadlessCmsStorageOperations } from \"~/types\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { CmsGroupPlugin } from \"~/plugins/CmsGroupPlugin\";\nimport WebinyError from \"@webiny/error\";\n\ninterface AssignBeforeGroupDeleteParams {\n onGroupBeforeDelete: Topic<OnGroupBeforeDeleteTopicParams>;\n plugins: PluginsContainer;\n storageOperations: HeadlessCmsStorageOperations;\n}\nexport const assignBeforeGroupDelete = (params: AssignBeforeGroupDeleteParams) => {\n const { onGroupBeforeDelete, plugins, storageOperations } = params;\n\n onGroupBeforeDelete.subscribe(async params => {\n const { group } = params;\n\n const groupPlugin = plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n .find(item => item.contentModelGroup.slug === group.slug);\n\n if (groupPlugin) {\n throw new Error(`Cms Groups defined via plugins cannot be deleted.`);\n }\n\n const models = await storageOperations.models.list({\n where: {\n tenant: group.tenant,\n locale: group.locale\n }\n });\n const items = models.filter(model => {\n return model.group.id === group.id;\n });\n if (items.length > 0) {\n throw new WebinyError(\n \"Cannot delete this group because there are models that belong to it.\",\n \"BEFORE_DELETE_ERROR\",\n {\n group\n }\n );\n }\n });\n};\n"],"mappings":";;;;;;;;;AAGA;;AACA;;AAOO,MAAMA,uBAAuB,GAAIC,MAAD,IAA2C;EAC9E,MAAM;IAAEC,mBAAF;IAAuBC,OAAvB;IAAgCC;EAAhC,IAAsDH,MAA5D;EAEAC,mBAAmB,CAACG,SAApB,CAA8B,MAAMJ,MAAN,IAAgB;IAC1C,MAAM;MAAEK;IAAF,IAAYL,MAAlB;IAEA,MAAMM,WAAW,GAAGJ,OAAO,CACtBK,MADe,CACQC,8BAAA,CAAeC,IADvB,EAEfC,IAFe,CAEVC,IAAI,IAAIA,IAAI,CAACC,iBAAL,CAAuBC,IAAvB,KAAgCR,KAAK,CAACQ,IAFpC,CAApB;;IAIA,IAAIP,WAAJ,EAAiB;MACb,MAAM,IAAIQ,KAAJ,CAAW,mDAAX,CAAN;IACH;;IAED,MAAMC,MAAM,GAAG,MAAMZ,iBAAiB,CAACY,MAAlB,CAAyBC,IAAzB,CAA8B;MAC/CC,KAAK,EAAE;QACHC,MAAM,EAAEb,KAAK,CAACa,MADX;QAEHC,MAAM,EAAEd,KAAK,CAACc;MAFX;IADwC,CAA9B,CAArB;IAMA,MAAMC,KAAK,GAAGL,MAAM,CAACM,MAAP,CAAcC,KAAK,IAAI;MACjC,OAAOA,KAAK,CAACjB,KAAN,CAAYkB,EAAZ,KAAmBlB,KAAK,CAACkB,EAAhC;IACH,CAFa,CAAd;;IAGA,IAAIH,KAAK,CAACI,MAAN,GAAe,CAAnB,EAAsB;MAClB,MAAM,IAAIC,cAAJ,CACF,sEADE,EAEF,qBAFE,EAGF;QACIpB;MADJ,CAHE,CAAN;IAOH;EACJ,CA7BD;AA8BH,CAjCM"}
@@ -1,8 +1,8 @@
1
1
  import { Topic } from "@webiny/pubsub/types";
2
- import { BeforeGroupUpdateTopicParams } from "../../types";
2
+ import { OnGroupBeforeUpdateTopicParams } from "../../types";
3
3
  import { PluginsContainer } from "@webiny/plugins";
4
4
  interface AssignBeforeGroupUpdateParams {
5
- onBeforeUpdate: Topic<BeforeGroupUpdateTopicParams>;
5
+ onGroupBeforeUpdate: Topic<OnGroupBeforeUpdateTopicParams>;
6
6
  plugins: PluginsContainer;
7
7
  }
8
8
  export declare const assignBeforeGroupUpdate: (params: AssignBeforeGroupUpdateParams) => void;