@webiny/api-headless-cms 0.0.0-unstable.aa00eecd97 → 0.0.0-unstable.acacc54f0e

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 +217 -55
  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 +259 -219
  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 +3 -3
  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 +19 -4
  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;
@@ -171,9 +170,19 @@ const allowedEntryStatus = ["draft", "published", "unpublished"];
171
170
  const transformEntryStatus = status => {
172
171
  return allowedEntryStatus.includes(status) ? status : "draft";
173
172
  };
173
+ const createSort = sort => {
174
+ if (!Array.isArray(sort)) {
175
+ return ["createdOn_DESC"];
176
+ } else if (sort.filter(s => !!s).length === 0) {
177
+ return ["createdOn_DESC"];
178
+ }
179
+ return sort;
180
+ };
174
181
  const createContentEntryCrud = params => {
175
182
  const {
176
183
  storageOperations,
184
+ entriesPermissions,
185
+ modelsPermissions,
177
186
  context,
178
187
  getIdentity,
179
188
  getTenant,
@@ -209,6 +218,13 @@ const createContentEntryCrud = params => {
209
218
  const onEntryAfterUpdate = (0, _pubsub.createTopic)("cms.onEntryAfterUpdate");
210
219
  const onEntryUpdateError = (0, _pubsub.createTopic)("cms.onEntryUpdateError");
211
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
+
212
228
  /**
213
229
  * Publish
214
230
  */
@@ -275,9 +291,6 @@ const createContentEntryCrud = params => {
275
291
  context,
276
292
  onEntryAfterDelete
277
293
  });
278
- const checkEntryPermissions = check => {
279
- return (0, _permissions.checkPermissions)(context, "cms.contentEntry", check);
280
- };
281
294
 
282
295
  /**
283
296
  * A helper to delete the entire entry.
@@ -317,14 +330,23 @@ const createContentEntryCrud = params => {
317
330
  */
318
331
  const getEntriesByIds = async (model, ids) => {
319
332
  return context.benchmark.measure("headlessCms.crud.entries.getEntriesByIds", async () => {
320
- const permission = await checkEntryPermissions({
333
+ await entriesPermissions.ensure({
321
334
  rwd: "r"
322
335
  });
323
- await (0, _access.checkModelAccess)(context, model);
336
+ await modelsPermissions.ensureCanAccessModel({
337
+ model,
338
+ locale: getLocale().code
339
+ });
324
340
  const entries = await storageOperations.entries.getByIds(model, {
325
341
  ids
326
342
  });
327
- 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
+ });
328
350
  });
329
351
  };
330
352
  const getEntryById = async (model, id) => {
@@ -342,27 +364,45 @@ const createContentEntryCrud = params => {
342
364
  return entry;
343
365
  };
344
366
  const getPublishedEntriesByIds = async (model, ids) => {
345
- const permission = await checkEntryPermissions({
367
+ await entriesPermissions.ensure({
346
368
  rwd: "r"
347
369
  });
348
- await (0, _access.checkModelAccess)(context, model);
370
+ await modelsPermissions.ensureCanAccessModel({
371
+ model,
372
+ locale: getLocale().code
373
+ });
349
374
  const entries = await storageOperations.entries.getPublishedByIds(model, {
350
375
  ids
351
376
  });
352
- 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
+ });
353
384
  };
354
385
  const getLatestEntriesByIds = async (model, ids) => {
355
- const permission = await checkEntryPermissions({
386
+ await entriesPermissions.ensure({
356
387
  rwd: "r"
357
388
  });
358
- await (0, _access.checkModelAccess)(context, model);
389
+ await modelsPermissions.ensureCanAccessModel({
390
+ model,
391
+ locale: getLocale().code
392
+ });
359
393
  const entries = await storageOperations.entries.getLatestByIds(model, {
360
394
  ids
361
395
  });
362
- 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
+ });
363
403
  };
364
404
  const getEntry = async (model, params) => {
365
- await checkEntryPermissions({
405
+ await entriesPermissions.ensure({
366
406
  rwd: "r"
367
407
  });
368
408
  const {
@@ -390,10 +430,21 @@ const createContentEntryCrud = params => {
390
430
  });
391
431
  };
392
432
  const listEntries = async (model, params) => {
393
- const permission = await checkEntryPermissions({
394
- 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
395
447
  });
396
- await (0, _access.checkModelAccess)(context, model);
397
448
  const {
398
449
  where: initialWhere,
399
450
  limit: initialLimit
@@ -404,10 +455,10 @@ const createContentEntryCrud = params => {
404
455
  * Possibly only get records which are owned by current user.
405
456
  * Or if searching for the owner set that value - in the case that user can see other entries than their own.
406
457
  */
407
- const ownedBy = permission.own ? getIdentity().id : where.ownedBy;
408
- if (ownedBy !== undefined) {
409
- where.ownedBy = ownedBy;
458
+ if (await entriesPermissions.canAccessOnlyOwnRecords()) {
459
+ where.ownedBy = getIdentity().id;
410
460
  }
461
+
411
462
  /**
412
463
  * Where must contain either latest or published keys.
413
464
  * We cannot list entries without one of those
@@ -437,6 +488,7 @@ const createContentEntryCrud = params => {
437
488
  cursor,
438
489
  items
439
490
  } = await storageOperations.entries.list(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
491
+ sort: createSort(params.sort),
440
492
  limit,
441
493
  where,
442
494
  fields
@@ -465,10 +517,14 @@ const createContentEntryCrud = params => {
465
517
  }
466
518
  };
467
519
  const createEntry = async (model, inputData) => {
468
- await checkEntryPermissions({
520
+ var _inputData$wbyAco_loc;
521
+ await entriesPermissions.ensure({
469
522
  rwd: "w"
470
523
  });
471
- await (0, _access.checkModelAccess)(context, model);
524
+ await modelsPermissions.ensureCanAccessModel({
525
+ model,
526
+ locale: getLocale().code
527
+ });
472
528
 
473
529
  /**
474
530
  * Make sure we only work with fields that are defined in the model.
@@ -511,7 +567,10 @@ const createContentEntryCrud = params => {
511
567
  version,
512
568
  locked: false,
513
569
  status: STATUS_DRAFT,
514
- 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
+ }
515
574
  };
516
575
  let storageEntry = null;
517
576
  try {
@@ -548,10 +607,13 @@ const createContentEntryCrud = params => {
548
607
  }
549
608
  };
550
609
  const createEntryRevisionFrom = async (model, sourceId, inputData) => {
551
- const permission = await checkEntryPermissions({
610
+ await entriesPermissions.ensure({
552
611
  rwd: "w"
553
612
  });
554
- await (0, _access.checkModelAccess)(context, model);
613
+ await modelsPermissions.ensureCanAccessModel({
614
+ model,
615
+ locale: getLocale().code
616
+ });
555
617
 
556
618
  /**
557
619
  * Make sure we only work with fields that are defined in the model.
@@ -591,7 +653,9 @@ const createContentEntryCrud = params => {
591
653
  input: initialValues,
592
654
  validateEntries: false
593
655
  });
594
- (0, _ownership.checkOwnership)(context, permission, originalEntry);
656
+ await entriesPermissions.ensure({
657
+ owns: originalEntry.createdBy
658
+ });
595
659
  const identity = getIdentity();
596
660
  const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;
597
661
  const {
@@ -653,10 +717,14 @@ const createContentEntryCrud = params => {
653
717
  }
654
718
  };
655
719
  const updateEntry = async (model, id, inputData, metaInput) => {
656
- const permission = await checkEntryPermissions({
720
+ var _inputData$wbyAco_loc2;
721
+ await entriesPermissions.ensure({
657
722
  rwd: "w"
658
723
  });
659
- await (0, _access.checkModelAccess)(context, model);
724
+ await modelsPermissions.ensureCanAccessModel({
725
+ model,
726
+ locale: getLocale().code
727
+ });
660
728
 
661
729
  /**
662
730
  * Make sure we only work with fields that are defined in the model.
@@ -682,7 +750,9 @@ const createContentEntryCrud = params => {
682
750
  data: input,
683
751
  entry: originalEntry
684
752
  });
685
- (0, _ownership.checkOwnership)(context, permission, originalEntry);
753
+ await entriesPermissions.ensure({
754
+ owns: originalEntry.createdBy
755
+ });
686
756
  const initialValues = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry.values), input);
687
757
  const values = await (0, _referenceFieldsMapping.referenceFieldsMapping)({
688
758
  context,
@@ -704,6 +774,12 @@ const createContentEntryCrud = params => {
704
774
  meta,
705
775
  status: transformEntryStatus(originalEntry.status)
706
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
+ }
707
783
  let storageEntry = null;
708
784
  try {
709
785
  await onEntryBeforeUpdate.publish({
@@ -741,11 +817,59 @@ const createContentEntryCrud = params => {
741
817
  });
742
818
  }
743
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
+ };
744
864
  const republishEntry = async (model, id) => {
745
- await checkEntryPermissions({
865
+ await entriesPermissions.ensure({
746
866
  rwd: "w"
747
867
  });
748
- await (0, _access.checkModelAccess)(context, model);
868
+ await modelsPermissions.ensureCanAccessModel({
869
+ model,
870
+ locale: getLocale().code
871
+ });
872
+
749
873
  /**
750
874
  * Fetch the entry from the storage.
751
875
  */
@@ -820,10 +944,13 @@ const createContentEntryCrud = params => {
820
944
  }
821
945
  };
822
946
  const deleteEntryRevision = async (model, revisionId) => {
823
- const permission = await checkEntryPermissions({
947
+ await entriesPermissions.ensure({
824
948
  rwd: "d"
825
949
  });
826
- await (0, _access.checkModelAccess)(context, model);
950
+ await modelsPermissions.ensureCanAccessModel({
951
+ model,
952
+ locale: getLocale().code
953
+ });
827
954
  const {
828
955
  id: entryId,
829
956
  version
@@ -841,7 +968,9 @@ const createContentEntryCrud = params => {
841
968
  if (!storageEntryToDelete) {
842
969
  throw new _handlerGraphql.NotFoundError(`Entry "${revisionId}" was not found!`);
843
970
  }
844
- (0, _ownership.checkOwnership)(context, permission, storageEntryToDelete);
971
+ await entriesPermissions.ensure({
972
+ owns: storageEntryToDelete.createdBy
973
+ });
845
974
  const latestEntryRevisionId = latestStorageEntry ? latestStorageEntry.id : null;
846
975
  const entryToDelete = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntryToDelete);
847
976
  /**
@@ -911,10 +1040,13 @@ const createContentEntryCrud = params => {
911
1040
  entries: ids
912
1041
  });
913
1042
  }
914
- const permission = await checkEntryPermissions({
1043
+ await entriesPermissions.ensure({
915
1044
  rwd: "d"
916
1045
  });
917
- await (0, _access.checkModelAccess)(context, model);
1046
+ await modelsPermissions.ensureCanAccessModel({
1047
+ model,
1048
+ locale: getLocale().code
1049
+ });
918
1050
  const {
919
1051
  items: entries
920
1052
  } = await storageOperations.entries.list(model, {
@@ -928,7 +1060,11 @@ const createContentEntryCrud = params => {
928
1060
  * We do not want to allow deleting entries that user does not own or cannot access.
929
1061
  */
930
1062
  const items = (await (0, _filterAsync.filterAsync)(entries, async entry => {
931
- return (0, _ownership.validateOwnership)(context, permission, entry);
1063
+ return entriesPermissions.ensure({
1064
+ owns: entry.createdBy
1065
+ }, {
1066
+ throw: false
1067
+ });
932
1068
  })).map(entry => entry.id);
933
1069
  try {
934
1070
  await onEntryBeforeDeleteMultiple.publish({
@@ -963,10 +1099,13 @@ const createContentEntryCrud = params => {
963
1099
  }
964
1100
  };
965
1101
  const deleteEntry = async (model, id, options) => {
966
- const permission = await checkEntryPermissions({
1102
+ await entriesPermissions.ensure({
967
1103
  rwd: "d"
968
1104
  });
969
- await (0, _access.checkModelAccess)(context, model);
1105
+ await modelsPermissions.ensureCanAccessModel({
1106
+ model,
1107
+ locale: getLocale().code
1108
+ });
970
1109
  const {
971
1110
  force
972
1111
  } = options || {};
@@ -998,7 +1137,9 @@ const createContentEntryCrud = params => {
998
1137
  }
999
1138
  });
1000
1139
  }
1001
- (0, _ownership.checkOwnership)(context, permission, storageEntry);
1140
+ await entriesPermissions.ensure({
1141
+ owns: storageEntry.createdBy
1142
+ });
1002
1143
  const entry = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntry);
1003
1144
  return await deleteEntryHelper({
1004
1145
  model,
@@ -1006,17 +1147,22 @@ const createContentEntryCrud = params => {
1006
1147
  });
1007
1148
  };
1008
1149
  const publishEntry = async (model, id) => {
1009
- const permission = await checkEntryPermissions({
1150
+ await entriesPermissions.ensure({
1010
1151
  pw: "p"
1011
1152
  });
1012
- await (0, _access.checkModelAccess)(context, model);
1153
+ await modelsPermissions.ensureCanAccessModel({
1154
+ model,
1155
+ locale: getLocale().code
1156
+ });
1013
1157
  const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
1014
1158
  id
1015
1159
  });
1016
1160
  if (!originalStorageEntry) {
1017
1161
  throw new _handlerGraphql.NotFoundError(`Entry "${id}" in the model "${model.modelId}" was not found.`);
1018
1162
  }
1019
- (0, _ownership.checkOwnership)(context, permission, originalStorageEntry);
1163
+ await entriesPermissions.ensure({
1164
+ owns: originalStorageEntry.createdBy
1165
+ });
1020
1166
  const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
1021
1167
  const currentDate = new Date().toISOString();
1022
1168
  const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
@@ -1058,7 +1204,7 @@ const createContentEntryCrud = params => {
1058
1204
  }
1059
1205
  };
1060
1206
  const unpublishEntry = async (model, id) => {
1061
- const permission = await checkEntryPermissions({
1207
+ await entriesPermissions.ensure({
1062
1208
  pw: "u"
1063
1209
  });
1064
1210
  const {
@@ -1075,7 +1221,9 @@ const createContentEntryCrud = params => {
1075
1221
  entry: originalStorageEntry
1076
1222
  });
1077
1223
  }
1078
- (0, _ownership.checkOwnership)(context, permission, originalStorageEntry);
1224
+ await entriesPermissions.ensure({
1225
+ owns: originalStorageEntry.createdBy
1226
+ });
1079
1227
  const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
1080
1228
  const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
1081
1229
  status: STATUS_UNPUBLISHED
@@ -1112,10 +1260,13 @@ const createContentEntryCrud = params => {
1112
1260
  }
1113
1261
  };
1114
1262
  const getUniqueFieldValues = async (model, params) => {
1115
- const permission = await checkEntryPermissions({
1263
+ await entriesPermissions.ensure({
1116
1264
  rwd: "r"
1117
1265
  });
1118
- await (0, _access.checkModelAccess)(context, model);
1266
+ await modelsPermissions.ensureCanAccessModel({
1267
+ model,
1268
+ locale: getLocale().code
1269
+ });
1119
1270
  const {
1120
1271
  where: initialWhere,
1121
1272
  fieldId
@@ -1125,10 +1276,10 @@ const createContentEntryCrud = params => {
1125
1276
  * Possibly only get records which are owned by current user.
1126
1277
  * Or if searching for the owner set that value - in the case that user can see other entries than their own.
1127
1278
  */
1128
- const ownedBy = permission.own ? getIdentity().id : where.ownedBy;
1129
- if (ownedBy !== undefined) {
1130
- where.ownedBy = ownedBy;
1279
+ if (await entriesPermissions.canAccessOnlyOwnRecords()) {
1280
+ where.ownedBy = getIdentity().id;
1131
1281
  }
1282
+
1132
1283
  /**
1133
1284
  * Where must contain either latest or published keys.
1134
1285
  * We cannot list entries without one of those
@@ -1150,7 +1301,7 @@ const createContentEntryCrud = params => {
1150
1301
  plugins: context.plugins,
1151
1302
  input: []
1152
1303
  });
1153
- if (fields.includes(fieldId) === false) {
1304
+ if (!fields.includes(fieldId)) {
1154
1305
  throw new _error.default("Cannot list unique entry field values if the field is not searchable.", "LIST_UNIQUE_ENTRY_VALUES_ERROR", {
1155
1306
  fieldId
1156
1307
  });
@@ -1213,6 +1364,12 @@ const createContentEntryCrud = params => {
1213
1364
  onEntryBeforeUpdate,
1214
1365
  onEntryAfterUpdate,
1215
1366
  onEntryUpdateError,
1367
+ /**
1368
+ * Move
1369
+ */
1370
+ onEntryBeforeMove,
1371
+ onEntryAfterMove,
1372
+ onEntryMoveError,
1216
1373
  /**
1217
1374
  * Delete whole entry
1218
1375
  */
@@ -1333,6 +1490,11 @@ const createContentEntryCrud = params => {
1333
1490
  return updateEntry(model, id, input, meta);
1334
1491
  });
1335
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
+ },
1336
1498
  /**
1337
1499
  * Method used internally. Not documented and should not be used in users systems.
1338
1500
  * @internal
@@ -1347,9 +1509,9 @@ const createContentEntryCrud = params => {
1347
1509
  return deleteEntryRevision(model, id);
1348
1510
  });
1349
1511
  },
1350
- async deleteEntry(model, entryId) {
1512
+ async deleteEntry(model, entryId, options) {
1351
1513
  return context.benchmark.measure("headlessCms.crud.entries.deleteEntry", async () => {
1352
- return deleteEntry(model, entryId);
1514
+ return deleteEntry(model, entryId, options);
1353
1515
  });
1354
1516
  },
1355
1517
  async deleteMultipleEntries(model, ids) {