@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.
- 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 +217 -55
- 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 +259 -219
- 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 +3 -3
- 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 +19 -4
- 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;
|
|
@@ -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
|
-
|
|
333
|
+
await entriesPermissions.ensure({
|
|
321
334
|
rwd: "r"
|
|
322
335
|
});
|
|
323
|
-
await
|
|
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
|
|
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
|
-
|
|
367
|
+
await entriesPermissions.ensure({
|
|
346
368
|
rwd: "r"
|
|
347
369
|
});
|
|
348
|
-
await
|
|
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
|
|
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
|
-
|
|
386
|
+
await entriesPermissions.ensure({
|
|
356
387
|
rwd: "r"
|
|
357
388
|
});
|
|
358
|
-
await
|
|
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
|
|
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
|
|
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
|
-
|
|
394
|
-
|
|
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
|
-
|
|
408
|
-
|
|
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
|
-
|
|
520
|
+
var _inputData$wbyAco_loc;
|
|
521
|
+
await entriesPermissions.ensure({
|
|
469
522
|
rwd: "w"
|
|
470
523
|
});
|
|
471
|
-
await
|
|
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
|
-
|
|
610
|
+
await entriesPermissions.ensure({
|
|
552
611
|
rwd: "w"
|
|
553
612
|
});
|
|
554
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
720
|
+
var _inputData$wbyAco_loc2;
|
|
721
|
+
await entriesPermissions.ensure({
|
|
657
722
|
rwd: "w"
|
|
658
723
|
});
|
|
659
|
-
await
|
|
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
|
-
|
|
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
|
|
865
|
+
await entriesPermissions.ensure({
|
|
746
866
|
rwd: "w"
|
|
747
867
|
});
|
|
748
|
-
await
|
|
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
|
-
|
|
947
|
+
await entriesPermissions.ensure({
|
|
824
948
|
rwd: "d"
|
|
825
949
|
});
|
|
826
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
1043
|
+
await entriesPermissions.ensure({
|
|
915
1044
|
rwd: "d"
|
|
916
1045
|
});
|
|
917
|
-
await
|
|
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
|
|
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
|
-
|
|
1102
|
+
await entriesPermissions.ensure({
|
|
967
1103
|
rwd: "d"
|
|
968
1104
|
});
|
|
969
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
1150
|
+
await entriesPermissions.ensure({
|
|
1010
1151
|
pw: "p"
|
|
1011
1152
|
});
|
|
1012
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1263
|
+
await entriesPermissions.ensure({
|
|
1116
1264
|
rwd: "r"
|
|
1117
1265
|
});
|
|
1118
|
-
await
|
|
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
|
-
|
|
1129
|
-
|
|
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)
|
|
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) {
|