@webiny/api-headless-cms 5.36.2 → 5.37.0-beta.1

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 (227) hide show
  1. package/constants.d.ts +1 -0
  2. package/constants.js +8 -0
  3. package/constants.js.map +1 -0
  4. package/context.js +37 -5
  5. package/context.js.map +1 -1
  6. package/crud/contentEntry/afterDelete.js.map +1 -1
  7. package/crud/contentEntry/beforeCreate.js.map +1 -1
  8. package/crud/contentEntry/beforeUpdate.js.map +1 -1
  9. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  10. package/crud/contentEntry/markLockedFields.js.map +1 -1
  11. package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  12. package/crud/contentEntry/searchableFields.js.map +1 -1
  13. package/crud/contentEntry.crud.d.ts +4 -0
  14. package/crud/contentEntry.crud.js +206 -53
  15. package/crud/contentEntry.crud.js.map +1 -1
  16. package/crud/contentModel/afterCreate.js.map +1 -1
  17. package/crud/contentModel/afterCreateFrom.js.map +1 -1
  18. package/crud/contentModel/afterDelete.js.map +1 -1
  19. package/crud/contentModel/afterUpdate.js.map +1 -1
  20. package/crud/contentModel/beforeCreate.js.map +1 -1
  21. package/crud/contentModel/beforeDelete.js.map +1 -1
  22. package/crud/contentModel/beforeUpdate.js.map +1 -1
  23. package/crud/contentModel/compatibility/modelApiName.js.map +1 -1
  24. package/crud/contentModel/contentModelManagerFactory.js.map +1 -1
  25. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  26. package/crud/contentModel/defaultFields.js.map +1 -1
  27. package/crud/contentModel/fields/descriptionField.js.map +1 -1
  28. package/crud/contentModel/fields/imageField.js.map +1 -1
  29. package/crud/contentModel/fields/titleField.js.map +1 -1
  30. package/crud/contentModel/validate/endingAllowed.js.map +1 -1
  31. package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -1
  32. package/crud/contentModel/validate/modelId.js.map +1 -1
  33. package/crud/contentModel/validate/pluralApiName.js.map +1 -1
  34. package/crud/contentModel/validate/singularApiName.js.map +1 -1
  35. package/crud/contentModel/validateLayout.js.map +1 -1
  36. package/crud/contentModel/validateModel.js.map +1 -1
  37. package/crud/contentModel/validateModelFields.js +1 -1
  38. package/crud/contentModel/validateModelFields.js.map +1 -1
  39. package/crud/contentModel/validation.d.ts +246 -206
  40. package/crud/contentModel/validation.js.map +1 -1
  41. package/crud/contentModel.crud.d.ts +2 -0
  42. package/crud/contentModel.crud.js +22 -12
  43. package/crud/contentModel.crud.js.map +1 -1
  44. package/crud/contentModelGroup/beforeCreate.js.map +1 -1
  45. package/crud/contentModelGroup/beforeDelete.js.map +1 -1
  46. package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
  47. package/crud/contentModelGroup/validation.d.ts +4 -4
  48. package/crud/contentModelGroup/validation.js.map +1 -1
  49. package/crud/contentModelGroup.crud.d.ts +2 -0
  50. package/crud/contentModelGroup.crud.js +41 -20
  51. package/crud/contentModelGroup.crud.js.map +1 -1
  52. package/crud/settings.crud.d.ts +2 -0
  53. package/crud/settings.crud.js +2 -6
  54. package/crud/settings.crud.js.map +1 -1
  55. package/crud/system.crud.js.map +1 -1
  56. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -1
  57. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
  58. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +1 -1
  59. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  60. package/fieldConverters/index.js.map +1 -1
  61. package/graphql/buildSchemaPlugins.js +4 -0
  62. package/graphql/buildSchemaPlugins.js.map +1 -1
  63. package/graphql/checkEndpointAccess.js.map +1 -1
  64. package/graphql/createExecutableSchema.js.map +1 -1
  65. package/graphql/createRequestBody.js.map +1 -1
  66. package/graphql/formatErrorPayload.js.map +1 -1
  67. package/graphql/generateSchema.js.map +1 -1
  68. package/graphql/getSchema.js +1 -1
  69. package/graphql/getSchema.js.map +1 -1
  70. package/graphql/graphQLHandlerFactory.js.map +1 -1
  71. package/graphql/handleRequest.js.map +1 -1
  72. package/graphql/index.d.ts +1 -1
  73. package/graphql/index.js.map +1 -1
  74. package/graphql/schema/baseContentSchema.js.map +1 -1
  75. package/graphql/schema/baseSchema.js +16 -0
  76. package/graphql/schema/baseSchema.js.map +1 -1
  77. package/graphql/schema/contentEntries.js +9 -4
  78. package/graphql/schema/contentEntries.js.map +1 -1
  79. package/graphql/schema/contentModelGroups.js.map +1 -1
  80. package/graphql/schema/contentModels.js.map +1 -1
  81. package/graphql/schema/createFieldResolvers.js +1 -1
  82. package/graphql/schema/createFieldResolvers.js.map +1 -1
  83. package/graphql/schema/createFieldTypePluginRecords.js.map +1 -1
  84. package/graphql/schema/createManageResolvers.d.ts +1 -1
  85. package/graphql/schema/createManageResolvers.js +10 -0
  86. package/graphql/schema/createManageResolvers.js.map +1 -1
  87. package/graphql/schema/createManageSDL.js +18 -3
  88. package/graphql/schema/createManageSDL.js.map +1 -1
  89. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  90. package/graphql/schema/createReadResolvers.js.map +1 -1
  91. package/graphql/schema/createReadSDL.js +1 -0
  92. package/graphql/schema/createReadSDL.js.map +1 -1
  93. package/graphql/schema/resolvers/commonFieldResolvers.js.map +1 -1
  94. package/graphql/schema/resolvers/manage/resolveCreate.js.map +1 -1
  95. package/graphql/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
  96. package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
  97. package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js.map +1 -1
  98. package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
  99. package/graphql/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
  100. package/graphql/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
  101. package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js.map +1 -1
  102. package/graphql/schema/resolvers/manage/resolveList.js.map +1 -1
  103. package/graphql/schema/resolvers/manage/resolveMove.d.ts +8 -0
  104. package/graphql/schema/resolvers/manage/resolveMove.js +25 -0
  105. package/graphql/schema/resolvers/manage/resolveMove.js.map +1 -0
  106. package/graphql/schema/resolvers/manage/resolvePublish.js.map +1 -1
  107. package/graphql/schema/resolvers/manage/resolveRepublish.js.map +1 -1
  108. package/graphql/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
  109. package/graphql/schema/resolvers/manage/resolveUpdate.js.map +1 -1
  110. package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
  111. package/graphql/schema/resolvers/preview/resolveList.js.map +1 -1
  112. package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
  113. package/graphql/schema/resolvers/read/resolveList.js.map +1 -1
  114. package/graphql/schema/schemaPlugins.js.map +1 -1
  115. package/graphql/system.d.ts +2 -5
  116. package/graphql/system.js +1 -11
  117. package/graphql/system.js.map +1 -1
  118. package/graphqlFields/boolean.js.map +1 -1
  119. package/graphqlFields/datetime.js.map +1 -1
  120. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -1
  121. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -1
  122. package/graphqlFields/dynamicZone/index.js.map +1 -1
  123. package/graphqlFields/file.js.map +1 -1
  124. package/graphqlFields/helpers.js.map +1 -1
  125. package/graphqlFields/index.js.map +1 -1
  126. package/graphqlFields/longText.js.map +1 -1
  127. package/graphqlFields/number.js +1 -0
  128. package/graphqlFields/number.js.map +1 -1
  129. package/graphqlFields/object.js +3 -3
  130. package/graphqlFields/object.js.map +1 -1
  131. package/graphqlFields/ref.js.map +1 -1
  132. package/graphqlFields/richText.js.map +1 -1
  133. package/graphqlFields/text.js +2 -0
  134. package/graphqlFields/text.js.map +1 -1
  135. package/index.d.ts +1 -1
  136. package/index.js.map +1 -1
  137. package/modelManager/DefaultCmsModelManager.js.map +1 -1
  138. package/modelManager/index.js.map +1 -1
  139. package/package.json +25 -29
  140. package/parameters/context.js.map +1 -1
  141. package/parameters/header.js +3 -3
  142. package/parameters/header.js.map +1 -1
  143. package/parameters/index.js.map +1 -1
  144. package/parameters/manual.js.map +1 -1
  145. package/parameters/path.js.map +1 -1
  146. package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -1
  147. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -1
  148. package/plugins/CmsGroupPlugin.js.map +1 -1
  149. package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
  150. package/plugins/CmsModelPlugin.js.map +1 -1
  151. package/plugins/CmsParametersPlugin.js +4 -0
  152. package/plugins/CmsParametersPlugin.js.map +1 -1
  153. package/plugins/StorageOperationsCmsModelPlugin.js.map +1 -1
  154. package/plugins/StorageTransformPlugin.js.map +1 -1
  155. package/plugins/index.js.map +1 -1
  156. package/storage/default.js.map +1 -1
  157. package/storage/object.js.map +1 -1
  158. package/types.d.ts +68 -5
  159. package/types.js +7 -4
  160. package/types.js.map +1 -1
  161. package/utils/converters/Converter.js.map +1 -1
  162. package/utils/converters/ConverterCollection.js.map +1 -1
  163. package/utils/converters/valueKeyStorageConverter.js +5 -0
  164. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  165. package/utils/createTypeFromFields.js +1 -1
  166. package/utils/createTypeFromFields.js.map +1 -1
  167. package/utils/createTypeName.js.map +1 -1
  168. package/utils/entryStorage.js.map +1 -1
  169. package/utils/filterAsync.js.map +1 -1
  170. package/utils/getBaseFieldType.js.map +1 -1
  171. package/utils/getEntryDescription.js.map +1 -1
  172. package/utils/getEntryImage.js.map +1 -1
  173. package/utils/getEntryTitle.js.map +1 -1
  174. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  175. package/utils/incrementEntryIdVersion.js.map +1 -1
  176. package/utils/permissions/EntriesPermissions.d.ts +4 -0
  177. package/utils/permissions/EntriesPermissions.js +9 -0
  178. package/utils/permissions/EntriesPermissions.js.map +1 -0
  179. package/utils/permissions/ModelGroupsPermissions.d.ts +11 -0
  180. package/utils/permissions/ModelGroupsPermissions.js +48 -0
  181. package/utils/permissions/ModelGroupsPermissions.js.map +1 -0
  182. package/utils/permissions/ModelsPermissions.d.ts +20 -0
  183. package/utils/permissions/ModelsPermissions.js +91 -0
  184. package/utils/permissions/ModelsPermissions.js.map +1 -0
  185. package/utils/permissions/SettingsPermissions.d.ts +4 -0
  186. package/utils/permissions/SettingsPermissions.js +9 -0
  187. package/utils/permissions/SettingsPermissions.js.map +1 -0
  188. package/utils/renderFields.js.map +1 -1
  189. package/utils/renderGetFilterFields.js.map +1 -1
  190. package/utils/renderInputFields.js.map +1 -1
  191. package/utils/renderListFilterFields.d.ts +1 -0
  192. package/utils/renderListFilterFields.js +12 -6
  193. package/utils/renderListFilterFields.js.map +1 -1
  194. package/utils/renderSortEnum.d.ts +1 -1
  195. package/utils/renderSortEnum.js +3 -0
  196. package/utils/renderSortEnum.js.map +1 -1
  197. package/utils/toSlug.js.map +1 -1
  198. package/validators/dateGte.js.map +1 -1
  199. package/validators/dateLte.js.map +1 -1
  200. package/validators/dynamicZone.js.map +1 -1
  201. package/validators/gte.js.map +1 -1
  202. package/validators/in.js.map +1 -1
  203. package/validators/index.js.map +1 -1
  204. package/validators/lte.js.map +1 -1
  205. package/validators/maxLength.js.map +1 -1
  206. package/validators/minLength.js.map +1 -1
  207. package/validators/pattern.js.map +1 -1
  208. package/validators/patternPlugins/email.js.map +1 -1
  209. package/validators/patternPlugins/index.js.map +1 -1
  210. package/validators/patternPlugins/lowerCase.js.map +1 -1
  211. package/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
  212. package/validators/patternPlugins/upperCase.js.map +1 -1
  213. package/validators/patternPlugins/upperCaseSpace.js.map +1 -1
  214. package/validators/patternPlugins/url.js.map +1 -1
  215. package/validators/required.js.map +1 -1
  216. package/validators/timeGte.js.map +1 -1
  217. package/validators/timeLte.js.map +1 -1
  218. package/validators/unique.js.map +1 -1
  219. package/utils/access.d.ts +0 -8
  220. package/utils/access.js +0 -76
  221. package/utils/access.js.map +0 -1
  222. package/utils/ownership.d.ts +0 -8
  223. package/utils/ownership.js +0 -33
  224. package/utils/ownership.js.map +0 -1
  225. package/utils/permissions.d.ts +0 -7
  226. package/utils/permissions.js +0 -91
  227. package/utils/permissions.js.map +0 -1
@@ -17,12 +17,11 @@ var _beforeCreate = require("./contentEntry/beforeCreate");
17
17
  var _beforeUpdate = require("./contentEntry/beforeUpdate");
18
18
  var _afterDelete = require("./contentEntry/afterDelete");
19
19
  var _referenceFieldsMapping = require("./contentEntry/referenceFieldsMapping");
20
- var _permissions = require("../utils/permissions");
21
- var _access = require("../utils/access");
22
- var _ownership = require("../utils/ownership");
23
20
  var _entryStorage = require("../utils/entryStorage");
24
21
  var _searchableFields = require("./contentEntry/searchableFields");
25
22
  var _filterAsync = require("../utils/filterAsync");
23
+ var _apiSecurity = require("@webiny/api-security/");
24
+ var _constants = require("../constants");
26
25
  const STATUS_DRAFT = _types.CONTENT_ENTRY_STATUS.DRAFT;
27
26
  exports.STATUS_DRAFT = STATUS_DRAFT;
28
27
  const STATUS_PUBLISHED = _types.CONTENT_ENTRY_STATUS.PUBLISHED;
@@ -182,6 +181,8 @@ const createSort = sort => {
182
181
  const createContentEntryCrud = params => {
183
182
  const {
184
183
  storageOperations,
184
+ entriesPermissions,
185
+ modelsPermissions,
185
186
  context,
186
187
  getIdentity,
187
188
  getTenant,
@@ -217,6 +218,13 @@ const createContentEntryCrud = params => {
217
218
  const onEntryAfterUpdate = (0, _pubsub.createTopic)("cms.onEntryAfterUpdate");
218
219
  const onEntryUpdateError = (0, _pubsub.createTopic)("cms.onEntryUpdateError");
219
220
 
221
+ /**
222
+ * Move
223
+ */
224
+ const onEntryBeforeMove = (0, _pubsub.createTopic)("cms.onEntryBeforeMove");
225
+ const onEntryAfterMove = (0, _pubsub.createTopic)("cms.onEntryAfterMove");
226
+ const onEntryMoveError = (0, _pubsub.createTopic)("cms.onEntryMoveError");
227
+
220
228
  /**
221
229
  * Publish
222
230
  */
@@ -283,9 +291,6 @@ const createContentEntryCrud = params => {
283
291
  context,
284
292
  onEntryAfterDelete
285
293
  });
286
- const checkEntryPermissions = check => {
287
- return (0, _permissions.checkPermissions)(context, "cms.contentEntry", check);
288
- };
289
294
 
290
295
  /**
291
296
  * A helper to delete the entire entry.
@@ -325,14 +330,23 @@ const createContentEntryCrud = params => {
325
330
  */
326
331
  const getEntriesByIds = async (model, ids) => {
327
332
  return context.benchmark.measure("headlessCms.crud.entries.getEntriesByIds", async () => {
328
- const permission = await checkEntryPermissions({
333
+ await entriesPermissions.ensure({
329
334
  rwd: "r"
330
335
  });
331
- await (0, _access.checkModelAccess)(context, model);
336
+ await modelsPermissions.ensureCanAccessModel({
337
+ model,
338
+ locale: getLocale().code
339
+ });
332
340
  const entries = await storageOperations.entries.getByIds(model, {
333
341
  ids
334
342
  });
335
- return entries.filter(entry => (0, _ownership.validateOwnership)(context, permission, entry));
343
+ return (0, _filterAsync.filterAsync)(entries, async entry => {
344
+ return entriesPermissions.ensure({
345
+ owns: entry.createdBy
346
+ }, {
347
+ throw: false
348
+ });
349
+ });
336
350
  });
337
351
  };
338
352
  const getEntryById = async (model, id) => {
@@ -350,27 +364,45 @@ const createContentEntryCrud = params => {
350
364
  return entry;
351
365
  };
352
366
  const getPublishedEntriesByIds = async (model, ids) => {
353
- const permission = await checkEntryPermissions({
367
+ await entriesPermissions.ensure({
354
368
  rwd: "r"
355
369
  });
356
- await (0, _access.checkModelAccess)(context, model);
370
+ await modelsPermissions.ensureCanAccessModel({
371
+ model,
372
+ locale: getLocale().code
373
+ });
357
374
  const entries = await storageOperations.entries.getPublishedByIds(model, {
358
375
  ids
359
376
  });
360
- return entries.filter(entry => (0, _ownership.validateOwnership)(context, permission, entry));
377
+ return (0, _filterAsync.filterAsync)(entries, async entry => {
378
+ return entriesPermissions.ensure({
379
+ owns: entry.createdBy
380
+ }, {
381
+ throw: false
382
+ });
383
+ });
361
384
  };
362
385
  const getLatestEntriesByIds = async (model, ids) => {
363
- const permission = await checkEntryPermissions({
386
+ await entriesPermissions.ensure({
364
387
  rwd: "r"
365
388
  });
366
- await (0, _access.checkModelAccess)(context, model);
389
+ await modelsPermissions.ensureCanAccessModel({
390
+ model,
391
+ locale: getLocale().code
392
+ });
367
393
  const entries = await storageOperations.entries.getLatestByIds(model, {
368
394
  ids
369
395
  });
370
- return entries.filter(entry => (0, _ownership.validateOwnership)(context, permission, entry));
396
+ return (0, _filterAsync.filterAsync)(entries, async entry => {
397
+ return entriesPermissions.ensure({
398
+ owns: entry.createdBy
399
+ }, {
400
+ throw: false
401
+ });
402
+ });
371
403
  };
372
404
  const getEntry = async (model, params) => {
373
- await checkEntryPermissions({
405
+ await entriesPermissions.ensure({
374
406
  rwd: "r"
375
407
  });
376
408
  const {
@@ -398,10 +430,21 @@ const createContentEntryCrud = params => {
398
430
  });
399
431
  };
400
432
  const listEntries = async (model, params) => {
401
- const permission = await checkEntryPermissions({
402
- rwd: "r"
433
+ try {
434
+ await entriesPermissions.ensure({
435
+ rwd: "r"
436
+ });
437
+ } catch {
438
+ throw new _apiSecurity.NotAuthorizedError({
439
+ data: {
440
+ reason: 'Not allowed to perform "read" on "cms.contentEntry".'
441
+ }
442
+ });
443
+ }
444
+ await modelsPermissions.ensureCanAccessModel({
445
+ model,
446
+ locale: getLocale().code
403
447
  });
404
- await (0, _access.checkModelAccess)(context, model);
405
448
  const {
406
449
  where: initialWhere,
407
450
  limit: initialLimit
@@ -412,10 +455,10 @@ const createContentEntryCrud = params => {
412
455
  * Possibly only get records which are owned by current user.
413
456
  * Or if searching for the owner set that value - in the case that user can see other entries than their own.
414
457
  */
415
- const ownedBy = permission.own ? getIdentity().id : where.ownedBy;
416
- if (ownedBy !== undefined) {
417
- where.ownedBy = ownedBy;
458
+ if (await entriesPermissions.canAccessOnlyOwnRecords()) {
459
+ where.ownedBy = getIdentity().id;
418
460
  }
461
+
419
462
  /**
420
463
  * Where must contain either latest or published keys.
421
464
  * We cannot list entries without one of those
@@ -474,10 +517,14 @@ const createContentEntryCrud = params => {
474
517
  }
475
518
  };
476
519
  const createEntry = async (model, inputData) => {
477
- await checkEntryPermissions({
520
+ var _inputData$wbyAco_loc;
521
+ await entriesPermissions.ensure({
478
522
  rwd: "w"
479
523
  });
480
- await (0, _access.checkModelAccess)(context, model);
524
+ await modelsPermissions.ensureCanAccessModel({
525
+ model,
526
+ locale: getLocale().code
527
+ });
481
528
 
482
529
  /**
483
530
  * Make sure we only work with fields that are defined in the model.
@@ -520,7 +567,10 @@ const createContentEntryCrud = params => {
520
567
  version,
521
568
  locked: false,
522
569
  status: STATUS_DRAFT,
523
- values: input
570
+ values: input,
571
+ location: {
572
+ folderId: ((_inputData$wbyAco_loc = inputData.wbyAco_location) === null || _inputData$wbyAco_loc === void 0 ? void 0 : _inputData$wbyAco_loc.folderId) || _constants.ROOT_FOLDER
573
+ }
524
574
  };
525
575
  let storageEntry = null;
526
576
  try {
@@ -557,10 +607,13 @@ const createContentEntryCrud = params => {
557
607
  }
558
608
  };
559
609
  const createEntryRevisionFrom = async (model, sourceId, inputData) => {
560
- const permission = await checkEntryPermissions({
610
+ await entriesPermissions.ensure({
561
611
  rwd: "w"
562
612
  });
563
- await (0, _access.checkModelAccess)(context, model);
613
+ await modelsPermissions.ensureCanAccessModel({
614
+ model,
615
+ locale: getLocale().code
616
+ });
564
617
 
565
618
  /**
566
619
  * Make sure we only work with fields that are defined in the model.
@@ -600,7 +653,9 @@ const createContentEntryCrud = params => {
600
653
  input: initialValues,
601
654
  validateEntries: false
602
655
  });
603
- (0, _ownership.checkOwnership)(context, permission, originalEntry);
656
+ await entriesPermissions.ensure({
657
+ owns: originalEntry.createdBy
658
+ });
604
659
  const identity = getIdentity();
605
660
  const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;
606
661
  const {
@@ -662,10 +717,14 @@ const createContentEntryCrud = params => {
662
717
  }
663
718
  };
664
719
  const updateEntry = async (model, id, inputData, metaInput) => {
665
- const permission = await checkEntryPermissions({
720
+ var _inputData$wbyAco_loc2;
721
+ await entriesPermissions.ensure({
666
722
  rwd: "w"
667
723
  });
668
- await (0, _access.checkModelAccess)(context, model);
724
+ await modelsPermissions.ensureCanAccessModel({
725
+ model,
726
+ locale: getLocale().code
727
+ });
669
728
 
670
729
  /**
671
730
  * Make sure we only work with fields that are defined in the model.
@@ -691,7 +750,9 @@ const createContentEntryCrud = params => {
691
750
  data: input,
692
751
  entry: originalEntry
693
752
  });
694
- (0, _ownership.checkOwnership)(context, permission, originalEntry);
753
+ await entriesPermissions.ensure({
754
+ owns: originalEntry.createdBy
755
+ });
695
756
  const initialValues = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry.values), input);
696
757
  const values = await (0, _referenceFieldsMapping.referenceFieldsMapping)({
697
758
  context,
@@ -713,6 +774,12 @@ const createContentEntryCrud = params => {
713
774
  meta,
714
775
  status: transformEntryStatus(originalEntry.status)
715
776
  });
777
+ const folderId = (_inputData$wbyAco_loc2 = inputData.wbyAco_location) === null || _inputData$wbyAco_loc2 === void 0 ? void 0 : _inputData$wbyAco_loc2.folderId;
778
+ if (folderId) {
779
+ entry.location = {
780
+ folderId
781
+ };
782
+ }
716
783
  let storageEntry = null;
717
784
  try {
718
785
  await onEntryBeforeUpdate.publish({
@@ -750,11 +817,59 @@ const createContentEntryCrud = params => {
750
817
  });
751
818
  }
752
819
  };
820
+ const moveEntry = async (model, id, folderId) => {
821
+ await entriesPermissions.ensure({
822
+ rwd: "w"
823
+ });
824
+ await modelsPermissions.ensureCanAccessModel({
825
+ model,
826
+ locale: getLocale().code
827
+ });
828
+ /**
829
+ * The entry we are going to move to another folder.
830
+ */
831
+ const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
832
+ id
833
+ });
834
+ if (!originalStorageEntry) {
835
+ throw new _handlerGraphql.NotFoundError(`Entry "${id}" of model "${model.modelId}" was not found.`);
836
+ }
837
+ const entry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
838
+ try {
839
+ await onEntryBeforeMove.publish({
840
+ entry,
841
+ model,
842
+ folderId
843
+ });
844
+ await storageOperations.entries.move(model, id, folderId);
845
+ await onEntryAfterMove.publish({
846
+ entry,
847
+ model,
848
+ folderId
849
+ });
850
+ return entry;
851
+ } catch (ex) {
852
+ await onEntryMoveError.publish({
853
+ entry,
854
+ model,
855
+ folderId,
856
+ error: ex
857
+ });
858
+ throw _error.default.from(ex, {
859
+ message: `Could not move entry "${id}" of model "${model.modelId}".`,
860
+ code: "MOVE_ENTRY_ERROR"
861
+ });
862
+ }
863
+ };
753
864
  const republishEntry = async (model, id) => {
754
- await checkEntryPermissions({
865
+ await entriesPermissions.ensure({
755
866
  rwd: "w"
756
867
  });
757
- await (0, _access.checkModelAccess)(context, model);
868
+ await modelsPermissions.ensureCanAccessModel({
869
+ model,
870
+ locale: getLocale().code
871
+ });
872
+
758
873
  /**
759
874
  * Fetch the entry from the storage.
760
875
  */
@@ -829,10 +944,13 @@ const createContentEntryCrud = params => {
829
944
  }
830
945
  };
831
946
  const deleteEntryRevision = async (model, revisionId) => {
832
- const permission = await checkEntryPermissions({
947
+ await entriesPermissions.ensure({
833
948
  rwd: "d"
834
949
  });
835
- await (0, _access.checkModelAccess)(context, model);
950
+ await modelsPermissions.ensureCanAccessModel({
951
+ model,
952
+ locale: getLocale().code
953
+ });
836
954
  const {
837
955
  id: entryId,
838
956
  version
@@ -850,7 +968,9 @@ const createContentEntryCrud = params => {
850
968
  if (!storageEntryToDelete) {
851
969
  throw new _handlerGraphql.NotFoundError(`Entry "${revisionId}" was not found!`);
852
970
  }
853
- (0, _ownership.checkOwnership)(context, permission, storageEntryToDelete);
971
+ await entriesPermissions.ensure({
972
+ owns: storageEntryToDelete.createdBy
973
+ });
854
974
  const latestEntryRevisionId = latestStorageEntry ? latestStorageEntry.id : null;
855
975
  const entryToDelete = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntryToDelete);
856
976
  /**
@@ -920,10 +1040,13 @@ const createContentEntryCrud = params => {
920
1040
  entries: ids
921
1041
  });
922
1042
  }
923
- const permission = await checkEntryPermissions({
1043
+ await entriesPermissions.ensure({
924
1044
  rwd: "d"
925
1045
  });
926
- await (0, _access.checkModelAccess)(context, model);
1046
+ await modelsPermissions.ensureCanAccessModel({
1047
+ model,
1048
+ locale: getLocale().code
1049
+ });
927
1050
  const {
928
1051
  items: entries
929
1052
  } = await storageOperations.entries.list(model, {
@@ -937,7 +1060,11 @@ const createContentEntryCrud = params => {
937
1060
  * We do not want to allow deleting entries that user does not own or cannot access.
938
1061
  */
939
1062
  const items = (await (0, _filterAsync.filterAsync)(entries, async entry => {
940
- return (0, _ownership.validateOwnership)(context, permission, entry);
1063
+ return entriesPermissions.ensure({
1064
+ owns: entry.createdBy
1065
+ }, {
1066
+ throw: false
1067
+ });
941
1068
  })).map(entry => entry.id);
942
1069
  try {
943
1070
  await onEntryBeforeDeleteMultiple.publish({
@@ -972,10 +1099,13 @@ const createContentEntryCrud = params => {
972
1099
  }
973
1100
  };
974
1101
  const deleteEntry = async (model, id, options) => {
975
- const permission = await checkEntryPermissions({
1102
+ await entriesPermissions.ensure({
976
1103
  rwd: "d"
977
1104
  });
978
- await (0, _access.checkModelAccess)(context, model);
1105
+ await modelsPermissions.ensureCanAccessModel({
1106
+ model,
1107
+ locale: getLocale().code
1108
+ });
979
1109
  const {
980
1110
  force
981
1111
  } = options || {};
@@ -1007,7 +1137,9 @@ const createContentEntryCrud = params => {
1007
1137
  }
1008
1138
  });
1009
1139
  }
1010
- (0, _ownership.checkOwnership)(context, permission, storageEntry);
1140
+ await entriesPermissions.ensure({
1141
+ owns: storageEntry.createdBy
1142
+ });
1011
1143
  const entry = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntry);
1012
1144
  return await deleteEntryHelper({
1013
1145
  model,
@@ -1015,17 +1147,22 @@ const createContentEntryCrud = params => {
1015
1147
  });
1016
1148
  };
1017
1149
  const publishEntry = async (model, id) => {
1018
- const permission = await checkEntryPermissions({
1150
+ await entriesPermissions.ensure({
1019
1151
  pw: "p"
1020
1152
  });
1021
- await (0, _access.checkModelAccess)(context, model);
1153
+ await modelsPermissions.ensureCanAccessModel({
1154
+ model,
1155
+ locale: getLocale().code
1156
+ });
1022
1157
  const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
1023
1158
  id
1024
1159
  });
1025
1160
  if (!originalStorageEntry) {
1026
1161
  throw new _handlerGraphql.NotFoundError(`Entry "${id}" in the model "${model.modelId}" was not found.`);
1027
1162
  }
1028
- (0, _ownership.checkOwnership)(context, permission, originalStorageEntry);
1163
+ await entriesPermissions.ensure({
1164
+ owns: originalStorageEntry.createdBy
1165
+ });
1029
1166
  const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
1030
1167
  const currentDate = new Date().toISOString();
1031
1168
  const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
@@ -1067,7 +1204,7 @@ const createContentEntryCrud = params => {
1067
1204
  }
1068
1205
  };
1069
1206
  const unpublishEntry = async (model, id) => {
1070
- const permission = await checkEntryPermissions({
1207
+ await entriesPermissions.ensure({
1071
1208
  pw: "u"
1072
1209
  });
1073
1210
  const {
@@ -1084,7 +1221,9 @@ const createContentEntryCrud = params => {
1084
1221
  entry: originalStorageEntry
1085
1222
  });
1086
1223
  }
1087
- (0, _ownership.checkOwnership)(context, permission, originalStorageEntry);
1224
+ await entriesPermissions.ensure({
1225
+ owns: originalStorageEntry.createdBy
1226
+ });
1088
1227
  const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
1089
1228
  const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
1090
1229
  status: STATUS_UNPUBLISHED
@@ -1121,10 +1260,13 @@ const createContentEntryCrud = params => {
1121
1260
  }
1122
1261
  };
1123
1262
  const getUniqueFieldValues = async (model, params) => {
1124
- const permission = await checkEntryPermissions({
1263
+ await entriesPermissions.ensure({
1125
1264
  rwd: "r"
1126
1265
  });
1127
- await (0, _access.checkModelAccess)(context, model);
1266
+ await modelsPermissions.ensureCanAccessModel({
1267
+ model,
1268
+ locale: getLocale().code
1269
+ });
1128
1270
  const {
1129
1271
  where: initialWhere,
1130
1272
  fieldId
@@ -1134,10 +1276,10 @@ const createContentEntryCrud = params => {
1134
1276
  * Possibly only get records which are owned by current user.
1135
1277
  * Or if searching for the owner set that value - in the case that user can see other entries than their own.
1136
1278
  */
1137
- const ownedBy = permission.own ? getIdentity().id : where.ownedBy;
1138
- if (ownedBy !== undefined) {
1139
- where.ownedBy = ownedBy;
1279
+ if (await entriesPermissions.canAccessOnlyOwnRecords()) {
1280
+ where.ownedBy = getIdentity().id;
1140
1281
  }
1282
+
1141
1283
  /**
1142
1284
  * Where must contain either latest or published keys.
1143
1285
  * We cannot list entries without one of those
@@ -1159,7 +1301,7 @@ const createContentEntryCrud = params => {
1159
1301
  plugins: context.plugins,
1160
1302
  input: []
1161
1303
  });
1162
- if (fields.includes(fieldId) === false) {
1304
+ if (!fields.includes(fieldId)) {
1163
1305
  throw new _error.default("Cannot list unique entry field values if the field is not searchable.", "LIST_UNIQUE_ENTRY_VALUES_ERROR", {
1164
1306
  fieldId
1165
1307
  });
@@ -1222,6 +1364,12 @@ const createContentEntryCrud = params => {
1222
1364
  onEntryBeforeUpdate,
1223
1365
  onEntryAfterUpdate,
1224
1366
  onEntryUpdateError,
1367
+ /**
1368
+ * Move
1369
+ */
1370
+ onEntryBeforeMove,
1371
+ onEntryAfterMove,
1372
+ onEntryMoveError,
1225
1373
  /**
1226
1374
  * Delete whole entry
1227
1375
  */
@@ -1342,6 +1490,11 @@ const createContentEntryCrud = params => {
1342
1490
  return updateEntry(model, id, input, meta);
1343
1491
  });
1344
1492
  },
1493
+ async moveEntry(model, id, folderId) {
1494
+ return context.benchmark.measure("headlessCms.crud.entries.moveEntry", async () => {
1495
+ return moveEntry(model, id, folderId);
1496
+ });
1497
+ },
1345
1498
  /**
1346
1499
  * Method used internally. Not documented and should not be used in users systems.
1347
1500
  * @internal