@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.
- package/constants.d.ts +1 -0
- package/constants.js +8 -0
- package/constants.js.map +1 -0
- package/context.js +37 -5
- package/context.js.map +1 -1
- package/crud/contentEntry/afterDelete.js.map +1 -1
- package/crud/contentEntry/beforeCreate.js.map +1 -1
- package/crud/contentEntry/beforeUpdate.js.map +1 -1
- package/crud/contentEntry/entryDataValidation.js.map +1 -1
- package/crud/contentEntry/markLockedFields.js.map +1 -1
- package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
- package/crud/contentEntry/searchableFields.js.map +1 -1
- package/crud/contentEntry.crud.d.ts +4 -0
- package/crud/contentEntry.crud.js +206 -53
- package/crud/contentEntry.crud.js.map +1 -1
- package/crud/contentModel/afterCreate.js.map +1 -1
- package/crud/contentModel/afterCreateFrom.js.map +1 -1
- package/crud/contentModel/afterDelete.js.map +1 -1
- package/crud/contentModel/afterUpdate.js.map +1 -1
- package/crud/contentModel/beforeCreate.js.map +1 -1
- package/crud/contentModel/beforeDelete.js.map +1 -1
- package/crud/contentModel/beforeUpdate.js.map +1 -1
- package/crud/contentModel/compatibility/modelApiName.js.map +1 -1
- package/crud/contentModel/contentModelManagerFactory.js.map +1 -1
- package/crud/contentModel/createFieldStorageId.js.map +1 -1
- package/crud/contentModel/defaultFields.js.map +1 -1
- package/crud/contentModel/fields/descriptionField.js.map +1 -1
- package/crud/contentModel/fields/imageField.js.map +1 -1
- package/crud/contentModel/fields/titleField.js.map +1 -1
- package/crud/contentModel/validate/endingAllowed.js.map +1 -1
- package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -1
- package/crud/contentModel/validate/modelId.js.map +1 -1
- package/crud/contentModel/validate/pluralApiName.js.map +1 -1
- package/crud/contentModel/validate/singularApiName.js.map +1 -1
- package/crud/contentModel/validateLayout.js.map +1 -1
- package/crud/contentModel/validateModel.js.map +1 -1
- package/crud/contentModel/validateModelFields.js +1 -1
- package/crud/contentModel/validateModelFields.js.map +1 -1
- package/crud/contentModel/validation.d.ts +246 -206
- package/crud/contentModel/validation.js.map +1 -1
- package/crud/contentModel.crud.d.ts +2 -0
- package/crud/contentModel.crud.js +22 -12
- package/crud/contentModel.crud.js.map +1 -1
- package/crud/contentModelGroup/beforeCreate.js.map +1 -1
- package/crud/contentModelGroup/beforeDelete.js.map +1 -1
- package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
- package/crud/contentModelGroup/validation.d.ts +4 -4
- package/crud/contentModelGroup/validation.js.map +1 -1
- package/crud/contentModelGroup.crud.d.ts +2 -0
- package/crud/contentModelGroup.crud.js +41 -20
- package/crud/contentModelGroup.crud.js.map +1 -1
- package/crud/settings.crud.d.ts +2 -0
- package/crud/settings.crud.js +2 -6
- package/crud/settings.crud.js.map +1 -1
- package/crud/system.crud.js.map +1 -1
- package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +1 -1
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/index.js.map +1 -1
- package/graphql/buildSchemaPlugins.js +4 -0
- package/graphql/buildSchemaPlugins.js.map +1 -1
- package/graphql/checkEndpointAccess.js.map +1 -1
- package/graphql/createExecutableSchema.js.map +1 -1
- package/graphql/createRequestBody.js.map +1 -1
- package/graphql/formatErrorPayload.js.map +1 -1
- package/graphql/generateSchema.js.map +1 -1
- package/graphql/getSchema.js +1 -1
- package/graphql/getSchema.js.map +1 -1
- package/graphql/graphQLHandlerFactory.js.map +1 -1
- package/graphql/handleRequest.js.map +1 -1
- package/graphql/index.d.ts +1 -1
- package/graphql/index.js.map +1 -1
- package/graphql/schema/baseContentSchema.js.map +1 -1
- package/graphql/schema/baseSchema.js +16 -0
- package/graphql/schema/baseSchema.js.map +1 -1
- package/graphql/schema/contentEntries.js +9 -4
- package/graphql/schema/contentEntries.js.map +1 -1
- package/graphql/schema/contentModelGroups.js.map +1 -1
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/createFieldResolvers.js +1 -1
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/graphql/schema/createFieldTypePluginRecords.js.map +1 -1
- package/graphql/schema/createManageResolvers.d.ts +1 -1
- package/graphql/schema/createManageResolvers.js +10 -0
- package/graphql/schema/createManageResolvers.js.map +1 -1
- package/graphql/schema/createManageSDL.js +18 -3
- package/graphql/schema/createManageSDL.js.map +1 -1
- package/graphql/schema/createPreviewResolvers.js.map +1 -1
- package/graphql/schema/createReadResolvers.js.map +1 -1
- package/graphql/schema/createReadSDL.js +1 -0
- package/graphql/schema/createReadSDL.js.map +1 -1
- package/graphql/schema/resolvers/commonFieldResolvers.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveCreate.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveList.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveMove.d.ts +8 -0
- package/graphql/schema/resolvers/manage/resolveMove.js +25 -0
- package/graphql/schema/resolvers/manage/resolveMove.js.map +1 -0
- package/graphql/schema/resolvers/manage/resolvePublish.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveRepublish.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveUpdate.js.map +1 -1
- package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
- package/graphql/schema/resolvers/preview/resolveList.js.map +1 -1
- package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
- package/graphql/schema/resolvers/read/resolveList.js.map +1 -1
- package/graphql/schema/schemaPlugins.js.map +1 -1
- package/graphql/system.d.ts +2 -5
- package/graphql/system.js +1 -11
- package/graphql/system.js.map +1 -1
- package/graphqlFields/boolean.js.map +1 -1
- package/graphqlFields/datetime.js.map +1 -1
- package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -1
- package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -1
- package/graphqlFields/dynamicZone/index.js.map +1 -1
- package/graphqlFields/file.js.map +1 -1
- package/graphqlFields/helpers.js.map +1 -1
- package/graphqlFields/index.js.map +1 -1
- package/graphqlFields/longText.js.map +1 -1
- package/graphqlFields/number.js +1 -0
- package/graphqlFields/number.js.map +1 -1
- package/graphqlFields/object.js +3 -3
- package/graphqlFields/object.js.map +1 -1
- package/graphqlFields/ref.js.map +1 -1
- package/graphqlFields/richText.js.map +1 -1
- package/graphqlFields/text.js +2 -0
- package/graphqlFields/text.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.js.map +1 -1
- package/modelManager/DefaultCmsModelManager.js.map +1 -1
- package/modelManager/index.js.map +1 -1
- package/package.json +25 -29
- package/parameters/context.js.map +1 -1
- package/parameters/header.js +3 -3
- package/parameters/header.js.map +1 -1
- package/parameters/index.js.map +1 -1
- package/parameters/manual.js.map +1 -1
- package/parameters/path.js.map +1 -1
- package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -1
- package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -1
- package/plugins/CmsGroupPlugin.js.map +1 -1
- package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/plugins/CmsParametersPlugin.js +4 -0
- package/plugins/CmsParametersPlugin.js.map +1 -1
- package/plugins/StorageOperationsCmsModelPlugin.js.map +1 -1
- package/plugins/StorageTransformPlugin.js.map +1 -1
- package/plugins/index.js.map +1 -1
- package/storage/default.js.map +1 -1
- package/storage/object.js.map +1 -1
- package/types.d.ts +68 -5
- package/types.js +7 -4
- package/types.js.map +1 -1
- package/utils/converters/Converter.js.map +1 -1
- package/utils/converters/ConverterCollection.js.map +1 -1
- package/utils/converters/valueKeyStorageConverter.js +5 -0
- package/utils/converters/valueKeyStorageConverter.js.map +1 -1
- package/utils/createTypeFromFields.js +1 -1
- package/utils/createTypeFromFields.js.map +1 -1
- package/utils/createTypeName.js.map +1 -1
- package/utils/entryStorage.js.map +1 -1
- package/utils/filterAsync.js.map +1 -1
- package/utils/getBaseFieldType.js.map +1 -1
- package/utils/getEntryDescription.js.map +1 -1
- package/utils/getEntryImage.js.map +1 -1
- package/utils/getEntryTitle.js.map +1 -1
- package/utils/getSchemaFromFieldPlugins.js.map +1 -1
- package/utils/incrementEntryIdVersion.js.map +1 -1
- package/utils/permissions/EntriesPermissions.d.ts +4 -0
- package/utils/permissions/EntriesPermissions.js +9 -0
- package/utils/permissions/EntriesPermissions.js.map +1 -0
- package/utils/permissions/ModelGroupsPermissions.d.ts +11 -0
- package/utils/permissions/ModelGroupsPermissions.js +48 -0
- package/utils/permissions/ModelGroupsPermissions.js.map +1 -0
- package/utils/permissions/ModelsPermissions.d.ts +20 -0
- package/utils/permissions/ModelsPermissions.js +91 -0
- package/utils/permissions/ModelsPermissions.js.map +1 -0
- package/utils/permissions/SettingsPermissions.d.ts +4 -0
- package/utils/permissions/SettingsPermissions.js +9 -0
- package/utils/permissions/SettingsPermissions.js.map +1 -0
- package/utils/renderFields.js.map +1 -1
- package/utils/renderGetFilterFields.js.map +1 -1
- package/utils/renderInputFields.js.map +1 -1
- package/utils/renderListFilterFields.d.ts +1 -0
- package/utils/renderListFilterFields.js +12 -6
- package/utils/renderListFilterFields.js.map +1 -1
- package/utils/renderSortEnum.d.ts +1 -1
- package/utils/renderSortEnum.js +3 -0
- package/utils/renderSortEnum.js.map +1 -1
- package/utils/toSlug.js.map +1 -1
- package/validators/dateGte.js.map +1 -1
- package/validators/dateLte.js.map +1 -1
- package/validators/dynamicZone.js.map +1 -1
- package/validators/gte.js.map +1 -1
- package/validators/in.js.map +1 -1
- package/validators/index.js.map +1 -1
- package/validators/lte.js.map +1 -1
- package/validators/maxLength.js.map +1 -1
- package/validators/minLength.js.map +1 -1
- package/validators/pattern.js.map +1 -1
- package/validators/patternPlugins/email.js.map +1 -1
- package/validators/patternPlugins/index.js.map +1 -1
- package/validators/patternPlugins/lowerCase.js.map +1 -1
- package/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
- package/validators/patternPlugins/upperCase.js.map +1 -1
- package/validators/patternPlugins/upperCaseSpace.js.map +1 -1
- package/validators/patternPlugins/url.js.map +1 -1
- package/validators/required.js.map +1 -1
- package/validators/timeGte.js.map +1 -1
- package/validators/timeLte.js.map +1 -1
- package/validators/unique.js.map +1 -1
- package/utils/access.d.ts +0 -8
- package/utils/access.js +0 -76
- package/utils/access.js.map +0 -1
- package/utils/ownership.d.ts +0 -8
- package/utils/ownership.js +0 -33
- package/utils/ownership.js.map +0 -1
- package/utils/permissions.d.ts +0 -7
- package/utils/permissions.js +0 -91
- 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
|
-
|
|
333
|
+
await entriesPermissions.ensure({
|
|
329
334
|
rwd: "r"
|
|
330
335
|
});
|
|
331
|
-
await
|
|
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
|
|
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
|
-
|
|
367
|
+
await entriesPermissions.ensure({
|
|
354
368
|
rwd: "r"
|
|
355
369
|
});
|
|
356
|
-
await
|
|
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
|
|
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
|
-
|
|
386
|
+
await entriesPermissions.ensure({
|
|
364
387
|
rwd: "r"
|
|
365
388
|
});
|
|
366
|
-
await
|
|
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
|
|
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
|
|
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
|
-
|
|
402
|
-
|
|
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
|
-
|
|
416
|
-
|
|
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
|
-
|
|
520
|
+
var _inputData$wbyAco_loc;
|
|
521
|
+
await entriesPermissions.ensure({
|
|
478
522
|
rwd: "w"
|
|
479
523
|
});
|
|
480
|
-
await
|
|
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
|
-
|
|
610
|
+
await entriesPermissions.ensure({
|
|
561
611
|
rwd: "w"
|
|
562
612
|
});
|
|
563
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
720
|
+
var _inputData$wbyAco_loc2;
|
|
721
|
+
await entriesPermissions.ensure({
|
|
666
722
|
rwd: "w"
|
|
667
723
|
});
|
|
668
|
-
await
|
|
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
|
-
|
|
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
|
|
865
|
+
await entriesPermissions.ensure({
|
|
755
866
|
rwd: "w"
|
|
756
867
|
});
|
|
757
|
-
await
|
|
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
|
-
|
|
947
|
+
await entriesPermissions.ensure({
|
|
833
948
|
rwd: "d"
|
|
834
949
|
});
|
|
835
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
1043
|
+
await entriesPermissions.ensure({
|
|
924
1044
|
rwd: "d"
|
|
925
1045
|
});
|
|
926
|
-
await
|
|
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
|
|
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
|
-
|
|
1102
|
+
await entriesPermissions.ensure({
|
|
976
1103
|
rwd: "d"
|
|
977
1104
|
});
|
|
978
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
1150
|
+
await entriesPermissions.ensure({
|
|
1019
1151
|
pw: "p"
|
|
1020
1152
|
});
|
|
1021
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1263
|
+
await entriesPermissions.ensure({
|
|
1125
1264
|
rwd: "r"
|
|
1126
1265
|
});
|
|
1127
|
-
await
|
|
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
|
-
|
|
1138
|
-
|
|
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)
|
|
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
|