@webiny/api-headless-cms 0.0.0-unstable.990c3ab1b6 → 0.0.0-unstable.99666aeb00
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.d.ts +5 -2
- package/context.js +94 -9
- package/context.js.map +1 -1
- package/crud/contentEntry/markLockedFields.d.ts +1 -1
- package/crud/contentEntry/markLockedFields.js +17 -4
- package/crud/contentEntry/markLockedFields.js.map +1 -1
- package/crud/contentEntry/referenceFieldsMapping.js +40 -9
- package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
- package/crud/contentEntry/searchableFields.d.ts +9 -0
- package/crud/contentEntry/searchableFields.js +72 -0
- package/crud/contentEntry/searchableFields.js.map +1 -0
- package/crud/contentEntry.crud.d.ts +12 -5
- package/crud/contentEntry.crud.js +1195 -855
- package/crud/contentEntry.crud.js.map +1 -1
- package/crud/contentModel/beforeCreate.d.ts +2 -3
- package/crud/contentModel/beforeCreate.js +43 -81
- package/crud/contentModel/beforeCreate.js.map +1 -1
- package/crud/contentModel/beforeDelete.d.ts +1 -1
- package/crud/contentModel/beforeDelete.js +1 -5
- package/crud/contentModel/beforeDelete.js.map +1 -1
- package/crud/contentModel/beforeUpdate.d.ts +2 -4
- package/crud/contentModel/beforeUpdate.js +33 -5
- package/crud/contentModel/beforeUpdate.js.map +1 -1
- package/crud/contentModel/compatibility/modelApiName.d.ts +3 -0
- package/crud/contentModel/compatibility/modelApiName.js +24 -0
- package/crud/contentModel/compatibility/modelApiName.js.map +1 -0
- package/crud/contentModel/createFieldStorageId.js +4 -1
- package/crud/contentModel/createFieldStorageId.js.map +1 -1
- package/crud/contentModel/defaultFields.d.ts +5 -0
- package/crud/contentModel/defaultFields.js +58 -0
- package/crud/contentModel/defaultFields.js.map +1 -0
- package/crud/contentModel/fields/descriptionField.d.ts +2 -0
- package/crud/contentModel/fields/descriptionField.js +42 -0
- package/crud/contentModel/fields/descriptionField.js.map +1 -0
- package/crud/contentModel/fields/imageField.d.ts +2 -0
- package/crud/contentModel/fields/imageField.js +46 -0
- package/crud/contentModel/fields/imageField.js.map +1 -0
- package/crud/contentModel/fields/titleField.d.ts +2 -0
- package/crud/contentModel/fields/titleField.js +58 -0
- package/crud/contentModel/fields/titleField.js.map +1 -0
- package/crud/contentModel/validate/endingAllowed.d.ts +6 -0
- package/crud/contentModel/validate/endingAllowed.js +26 -0
- package/crud/contentModel/validate/endingAllowed.js.map +1 -0
- package/crud/contentModel/validate/isModelEndingAllowed.d.ts +6 -0
- package/crud/contentModel/validate/isModelEndingAllowed.js +24 -0
- package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -0
- package/crud/contentModel/validate/modelId.d.ts +11 -0
- package/crud/contentModel/validate/modelId.js +36 -0
- package/crud/contentModel/validate/modelId.js.map +1 -0
- package/crud/contentModel/validate/pluralApiName.d.ts +7 -0
- package/crud/contentModel/validate/pluralApiName.js +24 -0
- package/crud/contentModel/validate/pluralApiName.js.map +1 -0
- package/crud/contentModel/validate/singularApiName.d.ts +7 -0
- package/crud/contentModel/validate/singularApiName.js +24 -0
- package/crud/contentModel/validate/singularApiName.js.map +1 -0
- package/crud/contentModel/validateModel.d.ts +4 -4
- package/crud/contentModel/validateModel.js +6 -3
- package/crud/contentModel/validateModel.js.map +1 -1
- package/crud/contentModel/validateModelFields.d.ts +4 -4
- package/crud/contentModel/validateModelFields.js +124 -89
- package/crud/contentModel/validateModelFields.js.map +1 -1
- package/crud/contentModel/validation.d.ts +551 -0
- package/crud/contentModel/validation.js +145 -0
- package/crud/contentModel/validation.js.map +1 -0
- package/crud/contentModel.crud.d.ts +2 -0
- package/crud/contentModel.crud.js +385 -279
- package/crud/contentModel.crud.js.map +1 -1
- package/crud/contentModelGroup/validation.d.ts +30 -0
- package/crud/contentModelGroup/validation.js +34 -0
- package/crud/contentModelGroup/validation.js.map +1 -0
- package/crud/contentModelGroup.crud.d.ts +2 -0
- package/crud/contentModelGroup.crud.js +218 -180
- package/crud/contentModelGroup.crud.js.map +1 -1
- package/crud/settings.crud.d.ts +3 -1
- package/crud/settings.crud.js +7 -16
- package/crud/settings.crud.js.map +1 -1
- package/crud/system.crud.js +0 -60
- package/crud/system.crud.js.map +1 -1
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.d.ts +11 -0
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +203 -0
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -0
- package/fieldConverters/index.d.ts +2 -1
- package/fieldConverters/index.js +2 -1
- package/fieldConverters/index.js.map +1 -1
- package/graphql/buildSchemaPlugins.d.ts +8 -3
- package/graphql/buildSchemaPlugins.js +3 -7
- package/graphql/buildSchemaPlugins.js.map +1 -1
- package/graphql/checkEndpointAccess.d.ts +2 -0
- package/graphql/checkEndpointAccess.js +18 -0
- package/graphql/checkEndpointAccess.js.map +1 -0
- package/graphql/createExecutableSchema.d.ts +6 -0
- package/graphql/createExecutableSchema.js +29 -0
- package/graphql/createExecutableSchema.js.map +1 -0
- package/graphql/createRequestBody.d.ts +2 -0
- package/graphql/createRequestBody.js +14 -0
- package/graphql/createRequestBody.js.map +1 -0
- package/graphql/formatErrorPayload.d.ts +1 -0
- package/graphql/formatErrorPayload.js +25 -0
- package/graphql/formatErrorPayload.js.map +1 -0
- package/graphql/generateSchema.d.ts +8 -0
- package/graphql/generateSchema.js +31 -0
- package/graphql/generateSchema.js.map +1 -0
- package/graphql/getSchema.d.ts +17 -0
- package/graphql/getSchema.js +102 -0
- package/graphql/getSchema.js.map +1 -0
- package/graphql/graphQLHandlerFactory.js +6 -104
- package/graphql/graphQLHandlerFactory.js.map +1 -1
- package/graphql/handleRequest.d.ts +11 -0
- package/graphql/handleRequest.js +81 -0
- package/graphql/handleRequest.js.map +1 -0
- package/graphql/index.d.ts +1 -3
- package/graphql/index.js +2 -39
- package/graphql/index.js.map +1 -1
- package/graphql/schema/baseContentSchema.d.ts +6 -2
- package/graphql/schema/baseContentSchema.js +9 -11
- package/graphql/schema/baseContentSchema.js.map +1 -1
- package/graphql/schema/baseSchema.d.ts +3 -0
- package/graphql/schema/baseSchema.js +84 -0
- package/graphql/schema/baseSchema.js.map +1 -0
- package/graphql/schema/contentEntries.d.ts +6 -2
- package/graphql/schema/contentEntries.js +121 -65
- package/graphql/schema/contentEntries.js.map +1 -1
- package/graphql/schema/contentModelGroups.d.ts +6 -2
- package/graphql/schema/contentModelGroups.js +14 -10
- package/graphql/schema/contentModelGroups.js.map +1 -1
- package/graphql/schema/contentModels.d.ts +6 -2
- package/graphql/schema/contentModels.js +60 -8
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/createFieldResolvers.d.ts +2 -2
- package/graphql/schema/createFieldResolvers.js +18 -13
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/graphql/schema/createFieldTypePluginRecords.d.ts +3 -0
- package/graphql/schema/createFieldTypePluginRecords.js +13 -0
- package/graphql/schema/createFieldTypePluginRecords.js.map +1 -0
- package/graphql/schema/createManageResolvers.d.ts +1 -1
- package/graphql/schema/createManageResolvers.js +47 -17
- package/graphql/schema/createManageResolvers.js.map +1 -1
- package/graphql/schema/createManageSDL.d.ts +3 -0
- package/graphql/schema/createManageSDL.js +96 -63
- package/graphql/schema/createManageSDL.js.map +1 -1
- package/graphql/schema/createPreviewResolvers.js +3 -7
- package/graphql/schema/createPreviewResolvers.js.map +1 -1
- package/graphql/schema/createReadResolvers.js +8 -7
- package/graphql/schema/createReadResolvers.js.map +1 -1
- package/graphql/schema/createReadSDL.d.ts +3 -0
- package/graphql/schema/createReadSDL.js +48 -36
- package/graphql/schema/createReadSDL.js.map +1 -1
- package/graphql/schema/resolvers/commonFieldResolvers.d.ts +3 -2
- package/graphql/schema/resolvers/commonFieldResolvers.js +2 -1
- package/graphql/schema/resolvers/commonFieldResolvers.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveDelete.d.ts +2 -1
- package/graphql/schema/resolvers/manage/resolveDelete.js +13 -3
- package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveDeleteMultiple.d.ts +7 -0
- package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js +20 -0
- package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js.map +1 -0
- package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.d.ts +4 -0
- package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js +18 -0
- package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js.map +1 -0
- package/graphql/schema/resolvers/manage/resolveMove.d.ts +8 -0
- package/graphql/schema/resolvers/manage/resolveMove.js +30 -0
- package/graphql/schema/resolvers/manage/resolveMove.js.map +1 -0
- package/graphql/schema/schemaPlugins.d.ts +8 -3
- package/graphql/schema/schemaPlugins.js +55 -52
- package/graphql/schema/schemaPlugins.js.map +1 -1
- package/graphql/system.d.ts +2 -5
- package/graphql/system.js +56 -85
- package/graphql/system.js.map +1 -1
- package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +2 -0
- package/graphqlFields/dynamicZone/dynamicZoneField.js +243 -0
- package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.d.ts +3 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.js +63 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -0
- package/graphqlFields/dynamicZone/index.d.ts +2 -0
- package/graphqlFields/dynamicZone/index.js +19 -0
- package/graphqlFields/dynamicZone/index.js.map +1 -0
- package/graphqlFields/index.d.ts +1 -1
- package/graphqlFields/index.js +2 -1
- package/graphqlFields/index.js.map +1 -1
- package/graphqlFields/number.js +5 -0
- package/graphqlFields/number.js.map +1 -1
- package/graphqlFields/object.js +131 -68
- package/graphqlFields/object.js.map +1 -1
- package/graphqlFields/ref.js +70 -56
- package/graphqlFields/ref.js.map +1 -1
- package/graphqlFields/text.js +2 -0
- package/graphqlFields/text.js.map +1 -1
- package/index.d.ts +5 -3
- package/index.js +27 -8
- package/index.js.map +1 -1
- package/package.json +36 -41
- package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
- package/plugins/CmsGraphQLSchemaPlugin.js +12 -0
- package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +20 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.js +28 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -0
- package/plugins/CmsModelFieldConverterPlugin.d.ts +2 -2
- package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
- package/plugins/CmsModelPlugin.d.ts +21 -3
- package/plugins/CmsModelPlugin.js +28 -2
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/plugins/StorageOperationsCmsModelPlugin.d.ts +23 -0
- package/plugins/StorageOperationsCmsModelPlugin.js +42 -0
- package/plugins/StorageOperationsCmsModelPlugin.js.map +1 -0
- package/plugins/StorageTransformPlugin.d.ts +11 -11
- package/plugins/StorageTransformPlugin.js.map +1 -1
- package/plugins/index.d.ts +3 -0
- package/plugins/index.js +33 -0
- package/plugins/index.js.map +1 -1
- package/storage/object.js +4 -2
- package/storage/object.js.map +1 -1
- package/types.d.ts +455 -135
- package/types.js +74 -8
- package/types.js.map +1 -1
- package/utils/converters/ConverterCollection.js +5 -2
- package/utils/converters/ConverterCollection.js.map +1 -1
- package/utils/converters/valueKeyStorageConverter.d.ts +1 -5
- package/utils/converters/valueKeyStorageConverter.js +26 -20
- package/utils/converters/valueKeyStorageConverter.js.map +1 -1
- package/utils/createTypeFromFields.d.ts +16 -0
- package/utils/createTypeFromFields.js +66 -0
- package/utils/createTypeFromFields.js.map +1 -0
- package/utils/createTypeName.d.ts +0 -2
- package/utils/createTypeName.js +4 -11
- package/utils/createTypeName.js.map +1 -1
- package/utils/entryStorage.js +14 -11
- package/utils/entryStorage.js.map +1 -1
- package/utils/getBaseFieldType.d.ts +2 -0
- package/utils/getBaseFieldType.js +10 -0
- package/utils/getBaseFieldType.js.map +1 -0
- package/utils/getEntryDescription.d.ts +2 -0
- package/utils/getEntryDescription.js +17 -0
- package/utils/getEntryDescription.js.map +1 -0
- package/utils/getEntryImage.d.ts +2 -0
- package/utils/getEntryImage.js +17 -0
- package/utils/getEntryImage.js.map +1 -0
- package/utils/getEntryTitle.d.ts +1 -1
- package/utils/getEntryTitle.js.map +1 -1
- package/utils/getSchemaFromFieldPlugins.d.ts +4 -7
- package/utils/getSchemaFromFieldPlugins.js +22 -14
- package/utils/getSchemaFromFieldPlugins.js.map +1 -1
- package/utils/incrementEntryIdVersion.d.ts +5 -0
- package/utils/incrementEntryIdVersion.js +29 -0
- package/utils/incrementEntryIdVersion.js.map +1 -0
- 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.d.ts +4 -2
- package/utils/renderFields.js +12 -3
- package/utils/renderFields.js.map +1 -1
- package/utils/renderGetFilterFields.d.ts +2 -2
- package/utils/renderGetFilterFields.js +9 -19
- package/utils/renderGetFilterFields.js.map +1 -1
- package/utils/renderInputFields.d.ts +4 -2
- package/utils/renderInputFields.js +19 -6
- package/utils/renderInputFields.js.map +1 -1
- package/utils/renderListFilterFields.d.ts +3 -1
- package/utils/renderListFilterFields.js +19 -22
- package/utils/renderListFilterFields.js.map +1 -1
- package/utils/renderSortEnum.d.ts +9 -5
- package/utils/renderSortEnum.js +26 -5
- package/utils/renderSortEnum.js.map +1 -1
- package/validators/dynamicZone.d.ts +2 -0
- package/validators/dynamicZone.js +20 -0
- package/validators/dynamicZone.js.map +1 -0
- package/validators/index.js +2 -1
- package/validators/index.js.map +1 -1
- package/crud/contentModel/createFieldModels.d.ts +0 -2
- package/crud/contentModel/createFieldModels.js +0 -20
- package/crud/contentModel/createFieldModels.js.map +0 -1
- package/crud/contentModel/fieldIdValidation.d.ts +0 -1
- package/crud/contentModel/fieldIdValidation.js +0 -20
- package/crud/contentModel/fieldIdValidation.js.map +0 -1
- package/crud/contentModel/idValidation.d.ts +0 -1
- package/crud/contentModel/idValidation.js +0 -17
- package/crud/contentModel/idValidation.js.map +0 -1
- package/crud/contentModel/models.d.ts +0 -4
- package/crud/contentModel/models.js +0 -173
- package/crud/contentModel/models.js.map +0 -1
- package/crud/contentModel/systemFields.d.ts +0 -1
- package/crud/contentModel/systemFields.js +0 -8
- package/crud/contentModel/systemFields.js.map +0 -1
- package/crud/index.d.ts +0 -6
- package/crud/index.js +0 -69
- package/crud/index.js.map +0 -1
- package/graphql/schema/resolvers/manage/resolveRequestChanges.d.ts +0 -7
- package/graphql/schema/resolvers/manage/resolveRequestChanges.js +0 -21
- package/graphql/schema/resolvers/manage/resolveRequestChanges.js.map +0 -1
- package/graphql/schema/resolvers/manage/resolveRequestReview.d.ts +0 -7
- package/graphql/schema/resolvers/manage/resolveRequestReview.js +0 -21
- package/graphql/schema/resolvers/manage/resolveRequestReview.js.map +0 -1
- package/upgrades/5.33.0/index.d.ts +0 -3
- package/upgrades/5.33.0/index.js +0 -159
- package/upgrades/5.33.0/index.js.map +0 -1
- package/upgrades/index.d.ts +0 -1
- package/upgrades/index.js +0 -9
- package/upgrades/index.js.map +0 -1
- package/utils/access.d.ts +0 -8
- package/utils/access.js +0 -76
- package/utils/access.js.map +0 -1
- package/utils/filterModelFields.d.ts +0 -16
- package/utils/filterModelFields.js +0 -71
- package/utils/filterModelFields.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
- package/utils/pluralizedTypeName.d.ts +0 -1
- package/utils/pluralizedTypeName.js +0 -20
- package/utils/pluralizedTypeName.js.map +0 -1
|
@@ -5,13 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.createModelsCrud = void 0;
|
|
8
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
8
9
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
10
|
var _dataloader = _interopRequireDefault(require("dataloader"));
|
|
11
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
10
12
|
var _handlerGraphql = require("@webiny/handler-graphql");
|
|
11
13
|
var _contentModelManagerFactory = require("./contentModel/contentModelManagerFactory");
|
|
12
|
-
var _models = require("./contentModel/models");
|
|
13
|
-
var _createFieldModels = require("./contentModel/createFieldModels");
|
|
14
|
-
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
15
14
|
var _pubsub = require("@webiny/pubsub");
|
|
16
15
|
var _beforeCreate = require("./contentModel/beforeCreate");
|
|
17
16
|
var _beforeUpdate = require("./contentModel/beforeUpdate");
|
|
@@ -21,49 +20,23 @@ var _afterUpdate = require("./contentModel/afterUpdate");
|
|
|
21
20
|
var _afterDelete = require("./contentModel/afterDelete");
|
|
22
21
|
var _afterCreateFrom = require("./contentModel/afterCreateFrom");
|
|
23
22
|
var _CmsModelPlugin = require("../plugins/CmsModelPlugin");
|
|
24
|
-
var _permissions = require("../utils/permissions");
|
|
25
23
|
var _filterAsync = require("../utils/filterAsync");
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
var
|
|
29
|
-
var
|
|
24
|
+
var _validation = require("./contentModel/validation");
|
|
25
|
+
var _utils = require("@webiny/utils");
|
|
26
|
+
var _defaultFields = require("./contentModel/defaultFields");
|
|
27
|
+
var _modelApiName = require("./contentModel/compatibility/modelApiName");
|
|
28
|
+
const _excluded = ["defaultFields"];
|
|
30
29
|
/**
|
|
31
|
-
*
|
|
32
|
-
* Required because of the 5.33.0 upgrade.
|
|
33
|
-
* Until the upgrade is done, API will break because there is no storageId assigned.
|
|
30
|
+
* Given a model, return an array of tags ensuring the `type` tag is set.
|
|
34
31
|
*/
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
if (!field.storageId) {
|
|
43
|
-
field.storageId = field.fieldId;
|
|
44
|
-
}
|
|
45
|
-
return field;
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
const attachStorageIdToModelFields = model => {
|
|
49
|
-
if (!model.webinyVersion) {
|
|
50
|
-
return model.fields;
|
|
51
|
-
}
|
|
52
|
-
const version = _semver.default.coerce(model.webinyVersion);
|
|
53
|
-
if (!version) {
|
|
54
|
-
return model.fields;
|
|
32
|
+
const ensureTypeTag = model => {
|
|
33
|
+
// Let's make sure we have a `type` tag assigned.
|
|
34
|
+
// If `type` tag is not set, set it to a default one (`model`).
|
|
35
|
+
const tags = model.tags || [];
|
|
36
|
+
if (!tags.some(tag => tag.startsWith("type:"))) {
|
|
37
|
+
tags.push("type:model");
|
|
55
38
|
}
|
|
56
|
-
|
|
57
|
-
* Unfortunately we need to check for beta and next.
|
|
58
|
-
* TODO remove after 5.33.0
|
|
59
|
-
*/
|
|
60
|
-
if (model.webinyVersion.match(/beta|next/)) {
|
|
61
|
-
return attachStorageIdToFields(model.fields);
|
|
62
|
-
}
|
|
63
|
-
if (_semver.default.compare(version, featureVersion) >= 0) {
|
|
64
|
-
return model.fields;
|
|
65
|
-
}
|
|
66
|
-
return attachStorageIdToFields(model.fields);
|
|
39
|
+
return tags;
|
|
67
40
|
};
|
|
68
41
|
const createModelsCrud = params => {
|
|
69
42
|
const {
|
|
@@ -71,6 +44,7 @@ const createModelsCrud = params => {
|
|
|
71
44
|
getIdentity,
|
|
72
45
|
getLocale,
|
|
73
46
|
storageOperations,
|
|
47
|
+
modelsPermissions,
|
|
74
48
|
context
|
|
75
49
|
} = params;
|
|
76
50
|
const loaders = {
|
|
@@ -83,9 +57,15 @@ const createModelsCrud = params => {
|
|
|
83
57
|
});
|
|
84
58
|
return [models.map(model => {
|
|
85
59
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
|
|
86
|
-
|
|
60
|
+
tags: ensureTypeTag(model),
|
|
87
61
|
tenant: model.tenant || getTenant().id,
|
|
88
|
-
locale: model.locale || getLocale().code
|
|
62
|
+
locale: model.locale || getLocale().code,
|
|
63
|
+
/**
|
|
64
|
+
* TODO: remove in v5.36.0
|
|
65
|
+
* This is for backward compatibility while migrations are not yet executed.
|
|
66
|
+
*/
|
|
67
|
+
singularApiName: (0, _modelApiName.ensureSingularApiName)(model),
|
|
68
|
+
pluralApiName: (0, _modelApiName.ensurePluralApiName)(model)
|
|
89
69
|
});
|
|
90
70
|
})];
|
|
91
71
|
})
|
|
@@ -101,46 +81,37 @@ const createModelsCrud = params => {
|
|
|
101
81
|
managers.set(model.modelId, manager);
|
|
102
82
|
return manager;
|
|
103
83
|
};
|
|
104
|
-
const checkModelPermissions =
|
|
105
|
-
return
|
|
106
|
-
rwd
|
|
84
|
+
const checkModelPermissions = rwd => {
|
|
85
|
+
return modelsPermissions.ensure({
|
|
86
|
+
rwd
|
|
107
87
|
});
|
|
108
88
|
};
|
|
109
89
|
const getModelsAsPlugins = () => {
|
|
110
90
|
const tenant = getTenant().id;
|
|
111
91
|
const locale = getLocale().code;
|
|
112
|
-
|
|
92
|
+
return context.plugins.byType(_CmsModelPlugin.CmsModelPlugin.type)
|
|
113
93
|
/**
|
|
114
94
|
* We need to filter out models that are not for this tenant or locale.
|
|
115
95
|
* If it does not have tenant or locale define, it is for every locale and tenant
|
|
116
96
|
*/.filter(plugin => {
|
|
117
97
|
const {
|
|
118
|
-
tenant:
|
|
119
|
-
locale:
|
|
98
|
+
tenant: modelTenant,
|
|
99
|
+
locale: modelLocale
|
|
120
100
|
} = plugin.contentModel;
|
|
121
|
-
if (
|
|
101
|
+
if (modelTenant && modelTenant !== tenant) {
|
|
122
102
|
return false;
|
|
123
|
-
} else if (
|
|
103
|
+
} else if (modelLocale && modelLocale !== locale) {
|
|
124
104
|
return false;
|
|
125
105
|
}
|
|
126
106
|
return true;
|
|
127
107
|
}).map(plugin => {
|
|
128
108
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, plugin.contentModel), {}, {
|
|
109
|
+
tags: ensureTypeTag(plugin.contentModel),
|
|
129
110
|
tenant,
|
|
130
111
|
locale,
|
|
131
112
|
webinyVersion: context.WEBINY_VERSION
|
|
132
113
|
});
|
|
133
114
|
});
|
|
134
|
-
/**
|
|
135
|
-
* Only point where we can truly validate the user model is in the runtime.
|
|
136
|
-
*/
|
|
137
|
-
for (const model of models) {
|
|
138
|
-
(0, _validateModelFields.validateModelFields)({
|
|
139
|
-
model,
|
|
140
|
-
plugins: context.plugins
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
return models;
|
|
144
115
|
};
|
|
145
116
|
const modelsGet = async modelId => {
|
|
146
117
|
const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);
|
|
@@ -156,6 +127,7 @@ const createModelsCrud = params => {
|
|
|
156
127
|
throw new _handlerGraphql.NotFoundError(`Content model "${modelId}" was not found!`);
|
|
157
128
|
}
|
|
158
129
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
|
|
130
|
+
tags: ensureTypeTag(model),
|
|
159
131
|
tenant: model.tenant || getTenant().id,
|
|
160
132
|
locale: model.locale || getLocale().code
|
|
161
133
|
});
|
|
@@ -166,21 +138,37 @@ const createModelsCrud = params => {
|
|
|
166
138
|
return databaseModels.concat(pluginsModels);
|
|
167
139
|
};
|
|
168
140
|
const listModels = async () => {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
141
|
+
return context.benchmark.measure("headlessCms.crud.models.listModels", async () => {
|
|
142
|
+
const models = await modelsList();
|
|
143
|
+
return (0, _filterAsync.filterAsync)(models, async model => {
|
|
144
|
+
const ownsModel = await modelsPermissions.ensure({
|
|
145
|
+
owns: model.createdBy
|
|
146
|
+
}, {
|
|
147
|
+
throw: false
|
|
148
|
+
});
|
|
149
|
+
if (!ownsModel) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
return modelsPermissions.canAccessModel({
|
|
153
|
+
model,
|
|
154
|
+
locale: getLocale().code
|
|
155
|
+
});
|
|
156
|
+
});
|
|
176
157
|
});
|
|
177
158
|
};
|
|
178
159
|
const getModel = async modelId => {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
160
|
+
return context.benchmark.measure("headlessCms.crud.models.getModel", async () => {
|
|
161
|
+
await checkModelPermissions("r");
|
|
162
|
+
const model = await modelsGet(modelId);
|
|
163
|
+
await modelsPermissions.ensure({
|
|
164
|
+
owns: model.createdBy
|
|
165
|
+
});
|
|
166
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
167
|
+
model,
|
|
168
|
+
locale: getLocale().code
|
|
169
|
+
});
|
|
170
|
+
return model;
|
|
171
|
+
});
|
|
184
172
|
};
|
|
185
173
|
const getModelManager = async target => {
|
|
186
174
|
const modelId = typeof target === "string" ? target : target.modelId;
|
|
@@ -195,18 +183,33 @@ const createModelsCrud = params => {
|
|
|
195
183
|
return await updateManager(context, model);
|
|
196
184
|
};
|
|
197
185
|
|
|
198
|
-
|
|
186
|
+
/**
|
|
187
|
+
* Create
|
|
188
|
+
*/
|
|
199
189
|
const onModelBeforeCreate = (0, _pubsub.createTopic)("cms.onModelBeforeCreate");
|
|
200
190
|
const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate");
|
|
201
|
-
|
|
191
|
+
const onModelCreateError = (0, _pubsub.createTopic)("cms.onModelCreateError");
|
|
192
|
+
/**
|
|
193
|
+
* Create from / clone
|
|
194
|
+
*/
|
|
202
195
|
const onModelBeforeCreateFrom = (0, _pubsub.createTopic)("cms.onModelBeforeCreateFrom");
|
|
203
196
|
const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom");
|
|
204
|
-
|
|
197
|
+
const onModelCreateFromError = (0, _pubsub.createTopic)("cms.onModelCreateFromError");
|
|
198
|
+
/**
|
|
199
|
+
* Update
|
|
200
|
+
*/
|
|
205
201
|
const onModelBeforeUpdate = (0, _pubsub.createTopic)("cms.onModelBeforeUpdate");
|
|
206
202
|
const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate");
|
|
207
|
-
|
|
203
|
+
const onModelUpdateError = (0, _pubsub.createTopic)("cms.onModelUpdateError");
|
|
204
|
+
/**
|
|
205
|
+
* Delete
|
|
206
|
+
*/
|
|
208
207
|
const onModelBeforeDelete = (0, _pubsub.createTopic)("cms.onModelBeforeDelete");
|
|
209
208
|
const onModelAfterDelete = (0, _pubsub.createTopic)("cms.onModelAfterDelete");
|
|
209
|
+
const onModelDeleteError = (0, _pubsub.createTopic)("cms.onModelDeleteError");
|
|
210
|
+
/**
|
|
211
|
+
* Initialize
|
|
212
|
+
*/
|
|
210
213
|
const onModelInitialize = (0, _pubsub.createTopic)("cms.onModelInitialize");
|
|
211
214
|
/**
|
|
212
215
|
* We need to assign some default behaviors.
|
|
@@ -214,7 +217,7 @@ const createModelsCrud = params => {
|
|
|
214
217
|
(0, _beforeCreate.assignModelBeforeCreate)({
|
|
215
218
|
onModelBeforeCreate,
|
|
216
219
|
onModelBeforeCreateFrom,
|
|
217
|
-
|
|
220
|
+
context,
|
|
218
221
|
storageOperations
|
|
219
222
|
});
|
|
220
223
|
(0, _afterCreate.assignModelAfterCreate)({
|
|
@@ -223,8 +226,7 @@ const createModelsCrud = params => {
|
|
|
223
226
|
});
|
|
224
227
|
(0, _beforeUpdate.assignModelBeforeUpdate)({
|
|
225
228
|
onModelBeforeUpdate,
|
|
226
|
-
|
|
227
|
-
storageOperations
|
|
229
|
+
context
|
|
228
230
|
});
|
|
229
231
|
(0, _afterUpdate.assignModelAfterUpdate)({
|
|
230
232
|
context,
|
|
@@ -243,71 +245,62 @@ const createModelsCrud = params => {
|
|
|
243
245
|
context,
|
|
244
246
|
onModelAfterDelete
|
|
245
247
|
});
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
onBeforeModelDelete: onModelBeforeDelete,
|
|
257
|
-
onAfterModelDelete: onModelAfterDelete,
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* CRUD methods
|
|
251
|
+
*/
|
|
252
|
+
const createModel = async input => {
|
|
253
|
+
await checkModelPermissions("w");
|
|
254
|
+
const result = await (0, _validation.createModelCreateValidation)().safeParseAsync(input);
|
|
255
|
+
if (!result.success) {
|
|
256
|
+
throw (0, _utils.createZodError)(result.error);
|
|
257
|
+
}
|
|
258
258
|
/**
|
|
259
|
-
*
|
|
259
|
+
* We need to extract the defaultFields because it is not for the CmsModel object.
|
|
260
260
|
*/
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
createdOn: new Date().toISOString(),
|
|
303
|
-
savedOn: new Date().toISOString(),
|
|
304
|
-
fields,
|
|
305
|
-
lockedFields: [],
|
|
306
|
-
layout: input.layout || [],
|
|
307
|
-
webinyVersion: context.WEBINY_VERSION
|
|
308
|
-
};
|
|
261
|
+
const _removeUndefinedValue = (0, _utils.removeUndefinedValues)(result.data),
|
|
262
|
+
{
|
|
263
|
+
defaultFields
|
|
264
|
+
} = _removeUndefinedValue,
|
|
265
|
+
data = (0, _objectWithoutProperties2.default)(_removeUndefinedValue, _excluded);
|
|
266
|
+
if (defaultFields) {
|
|
267
|
+
(0, _defaultFields.assignModelDefaultFields)(data);
|
|
268
|
+
}
|
|
269
|
+
const group = await context.security.withoutAuthorization(async () => {
|
|
270
|
+
return context.cms.getGroup(data.group);
|
|
271
|
+
});
|
|
272
|
+
if (!group) {
|
|
273
|
+
throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
|
|
274
|
+
}
|
|
275
|
+
const identity = getIdentity();
|
|
276
|
+
const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, data), {}, {
|
|
277
|
+
modelId: data.modelId || "",
|
|
278
|
+
singularApiName: data.singularApiName,
|
|
279
|
+
pluralApiName: data.pluralApiName,
|
|
280
|
+
titleFieldId: "id",
|
|
281
|
+
descriptionFieldId: null,
|
|
282
|
+
imageFieldId: null,
|
|
283
|
+
description: data.description || "",
|
|
284
|
+
locale: getLocale().code,
|
|
285
|
+
tenant: getTenant().id,
|
|
286
|
+
group: {
|
|
287
|
+
id: group.id,
|
|
288
|
+
name: group.name
|
|
289
|
+
},
|
|
290
|
+
createdBy: {
|
|
291
|
+
id: identity.id,
|
|
292
|
+
displayName: identity.displayName,
|
|
293
|
+
type: identity.type
|
|
294
|
+
},
|
|
295
|
+
createdOn: new Date().toISOString(),
|
|
296
|
+
savedOn: new Date().toISOString(),
|
|
297
|
+
lockedFields: [],
|
|
298
|
+
webinyVersion: context.WEBINY_VERSION
|
|
299
|
+
});
|
|
300
|
+
model.tags = ensureTypeTag(model);
|
|
301
|
+
try {
|
|
309
302
|
await onModelBeforeCreate.publish({
|
|
310
|
-
input,
|
|
303
|
+
input: data,
|
|
311
304
|
model
|
|
312
305
|
});
|
|
313
306
|
const createdModel = await storageOperations.models.create({
|
|
@@ -316,25 +309,101 @@ const createModelsCrud = params => {
|
|
|
316
309
|
loaders.listModels.clearAll();
|
|
317
310
|
await updateManager(context, model);
|
|
318
311
|
await onModelAfterCreate.publish({
|
|
319
|
-
input,
|
|
312
|
+
input: data,
|
|
320
313
|
model: createdModel
|
|
321
314
|
});
|
|
322
315
|
return createdModel;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
316
|
+
} catch (ex) {
|
|
317
|
+
await onModelCreateError.publish({
|
|
318
|
+
input: data,
|
|
319
|
+
model,
|
|
320
|
+
error: ex
|
|
321
|
+
});
|
|
322
|
+
throw ex;
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
const updateModel = async (modelId, input) => {
|
|
326
|
+
await checkModelPermissions("w");
|
|
327
|
+
|
|
328
|
+
// Get a model record; this will also perform ownership validation.
|
|
329
|
+
const original = await getModel(modelId);
|
|
330
|
+
const result = await (0, _validation.createModelUpdateValidation)().safeParseAsync(input);
|
|
331
|
+
if (!result.success) {
|
|
332
|
+
throw (0, _utils.createZodError)(result.error);
|
|
333
|
+
}
|
|
334
|
+
const data = (0, _utils.removeUndefinedValues)(result.data);
|
|
335
|
+
if (Object.keys(data).length === 0) {
|
|
336
|
+
/**
|
|
337
|
+
* We need to return the original if nothing is to be updated.
|
|
338
|
+
*/
|
|
339
|
+
return original;
|
|
340
|
+
}
|
|
341
|
+
let group = {
|
|
342
|
+
id: original.group.id,
|
|
343
|
+
name: original.group.name
|
|
344
|
+
};
|
|
345
|
+
const groupId = data.group;
|
|
346
|
+
if (groupId) {
|
|
347
|
+
const groupData = await context.security.withoutAuthorization(async () => {
|
|
348
|
+
return context.cms.getGroup(groupId);
|
|
349
|
+
});
|
|
350
|
+
if (!groupData) {
|
|
351
|
+
throw new _handlerGraphql.NotFoundError(`There is no group "${groupId}".`);
|
|
352
|
+
}
|
|
353
|
+
group = {
|
|
354
|
+
id: groupData.id,
|
|
355
|
+
name: groupData.name
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), data), {}, {
|
|
359
|
+
titleFieldId: data.titleFieldId === undefined ? original.titleFieldId : data.titleFieldId,
|
|
360
|
+
descriptionFieldId: data.descriptionFieldId === undefined ? original.descriptionFieldId : data.descriptionFieldId,
|
|
361
|
+
imageFieldId: data.imageFieldId === undefined ? original.imageFieldId : data.imageFieldId,
|
|
362
|
+
group,
|
|
363
|
+
description: data.description || original.description,
|
|
364
|
+
tenant: original.tenant || getTenant().id,
|
|
365
|
+
locale: original.locale || getLocale().code,
|
|
366
|
+
webinyVersion: context.WEBINY_VERSION,
|
|
367
|
+
savedOn: new Date().toISOString()
|
|
368
|
+
});
|
|
369
|
+
model.tags = ensureTypeTag(model);
|
|
370
|
+
try {
|
|
371
|
+
await onModelBeforeUpdate.publish({
|
|
372
|
+
input: data,
|
|
373
|
+
original,
|
|
374
|
+
model
|
|
375
|
+
});
|
|
376
|
+
const resultModel = await storageOperations.models.update({
|
|
377
|
+
model
|
|
378
|
+
});
|
|
379
|
+
await updateManager(context, resultModel);
|
|
380
|
+
await onModelAfterUpdate.publish({
|
|
381
|
+
input: data,
|
|
382
|
+
original,
|
|
383
|
+
model: resultModel
|
|
384
|
+
});
|
|
385
|
+
return resultModel;
|
|
386
|
+
} catch (ex) {
|
|
387
|
+
await onModelUpdateError.publish({
|
|
388
|
+
input: data,
|
|
389
|
+
model,
|
|
390
|
+
original,
|
|
391
|
+
error: ex
|
|
337
392
|
});
|
|
393
|
+
throw ex;
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
const updateModelDirect = async params => {
|
|
397
|
+
const {
|
|
398
|
+
model: initialModel,
|
|
399
|
+
original
|
|
400
|
+
} = params;
|
|
401
|
+
const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, initialModel), {}, {
|
|
402
|
+
tenant: initialModel.tenant || getTenant().id,
|
|
403
|
+
locale: initialModel.locale || getLocale().code,
|
|
404
|
+
webinyVersion: context.WEBINY_VERSION
|
|
405
|
+
});
|
|
406
|
+
try {
|
|
338
407
|
await onModelBeforeUpdate.publish({
|
|
339
408
|
input: {},
|
|
340
409
|
original,
|
|
@@ -351,59 +420,70 @@ const createModelsCrud = params => {
|
|
|
351
420
|
model: resultModel
|
|
352
421
|
});
|
|
353
422
|
return resultModel;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
const original = await getModel(modelId);
|
|
361
|
-
const createdData = new _models.CreateContentModelModelFrom().populate({
|
|
362
|
-
name: data.name,
|
|
363
|
-
modelId: data.modelId,
|
|
364
|
-
description: data.description || original.description,
|
|
365
|
-
group: data.group,
|
|
366
|
-
locale: data.locale
|
|
367
|
-
});
|
|
368
|
-
await createdData.validate();
|
|
369
|
-
const input = await createdData.toJSON();
|
|
370
|
-
const locale = await context.i18n.getLocale(input.locale || original.locale);
|
|
371
|
-
if (!locale) {
|
|
372
|
-
throw new _handlerGraphql.NotFoundError(`There is no locale "${input.locale}".`);
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Use storage operations directly because we cannot get group from different locale via context methods.
|
|
376
|
-
*/
|
|
377
|
-
const group = await context.cms.storageOperations.groups.get({
|
|
378
|
-
id: input.group,
|
|
379
|
-
tenant: original.tenant,
|
|
380
|
-
locale: locale.code
|
|
381
|
-
});
|
|
382
|
-
if (!group) {
|
|
383
|
-
throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
|
|
384
|
-
}
|
|
385
|
-
const identity = getIdentity();
|
|
386
|
-
const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), {}, {
|
|
387
|
-
locale: locale.code,
|
|
388
|
-
group: {
|
|
389
|
-
id: group.id,
|
|
390
|
-
name: group.name
|
|
391
|
-
},
|
|
392
|
-
name: input.name,
|
|
393
|
-
modelId: input.modelId || "",
|
|
394
|
-
description: input.description || "",
|
|
395
|
-
createdBy: {
|
|
396
|
-
id: identity.id,
|
|
397
|
-
displayName: identity.displayName,
|
|
398
|
-
type: identity.type
|
|
399
|
-
},
|
|
400
|
-
createdOn: new Date().toISOString(),
|
|
401
|
-
savedOn: new Date().toISOString(),
|
|
402
|
-
lockedFields: [],
|
|
403
|
-
webinyVersion: context.WEBINY_VERSION
|
|
423
|
+
} catch (ex) {
|
|
424
|
+
await onModelUpdateError.publish({
|
|
425
|
+
input: {},
|
|
426
|
+
original,
|
|
427
|
+
model,
|
|
428
|
+
error: ex
|
|
404
429
|
});
|
|
430
|
+
throw ex;
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
const createModelFrom = async (modelId, input) => {
|
|
434
|
+
await checkModelPermissions("w");
|
|
435
|
+
/**
|
|
436
|
+
* Get a model record; this will also perform ownership validation.
|
|
437
|
+
*/
|
|
438
|
+
const original = await getModel(modelId);
|
|
439
|
+
const result = await (0, _validation.createModelCreateFromValidation)().safeParseAsync((0, _objectSpread2.default)((0, _objectSpread2.default)({}, input), {}, {
|
|
440
|
+
description: input.description || original.description
|
|
441
|
+
}));
|
|
442
|
+
if (!result.success) {
|
|
443
|
+
throw (0, _utils.createZodError)(result.error);
|
|
444
|
+
}
|
|
445
|
+
const data = (0, _utils.removeUndefinedValues)(result.data);
|
|
446
|
+
const locale = await context.i18n.getLocale(data.locale || original.locale);
|
|
447
|
+
if (!locale) {
|
|
448
|
+
throw new _handlerGraphql.NotFoundError(`There is no locale "${data.locale}".`);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Use storage operations directly because we cannot get group from different locale via context methods.
|
|
452
|
+
*/
|
|
453
|
+
const group = await context.cms.storageOperations.groups.get({
|
|
454
|
+
id: data.group,
|
|
455
|
+
tenant: original.tenant,
|
|
456
|
+
locale: locale.code
|
|
457
|
+
});
|
|
458
|
+
if (!group) {
|
|
459
|
+
throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
|
|
460
|
+
}
|
|
461
|
+
const identity = getIdentity();
|
|
462
|
+
const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), {}, {
|
|
463
|
+
singularApiName: data.singularApiName,
|
|
464
|
+
pluralApiName: data.pluralApiName,
|
|
465
|
+
locale: locale.code,
|
|
466
|
+
group: {
|
|
467
|
+
id: group.id,
|
|
468
|
+
name: group.name
|
|
469
|
+
},
|
|
470
|
+
icon: data.icon,
|
|
471
|
+
name: data.name,
|
|
472
|
+
modelId: data.modelId || "",
|
|
473
|
+
description: data.description || "",
|
|
474
|
+
createdBy: {
|
|
475
|
+
id: identity.id,
|
|
476
|
+
displayName: identity.displayName,
|
|
477
|
+
type: identity.type
|
|
478
|
+
},
|
|
479
|
+
createdOn: new Date().toISOString(),
|
|
480
|
+
savedOn: new Date().toISOString(),
|
|
481
|
+
lockedFields: [],
|
|
482
|
+
webinyVersion: context.WEBINY_VERSION
|
|
483
|
+
});
|
|
484
|
+
try {
|
|
405
485
|
await onModelBeforeCreateFrom.publish({
|
|
406
|
-
input,
|
|
486
|
+
input: data,
|
|
407
487
|
model,
|
|
408
488
|
original
|
|
409
489
|
});
|
|
@@ -413,72 +493,25 @@ const createModelsCrud = params => {
|
|
|
413
493
|
loaders.listModels.clearAll();
|
|
414
494
|
await updateManager(context, model);
|
|
415
495
|
await onModelAfterCreateFrom.publish({
|
|
416
|
-
input,
|
|
496
|
+
input: data,
|
|
417
497
|
original,
|
|
418
498
|
model: createdModel
|
|
419
499
|
});
|
|
420
500
|
return createdModel;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
// Get a model record; this will also perform ownership validation.
|
|
426
|
-
const original = await getModel(modelId);
|
|
427
|
-
const updatedData = new _models.UpdateContentModelModel().populate(inputData);
|
|
428
|
-
await updatedData.validate();
|
|
429
|
-
const input = await updatedData.toJSON({
|
|
430
|
-
onlyDirty: true
|
|
431
|
-
});
|
|
432
|
-
if (Object.keys(input).length === 0) {
|
|
433
|
-
/**
|
|
434
|
-
* We need to return the original if nothing is to be updated.
|
|
435
|
-
*/
|
|
436
|
-
return original;
|
|
437
|
-
}
|
|
438
|
-
let group = {
|
|
439
|
-
id: original.group.id,
|
|
440
|
-
name: original.group.name
|
|
441
|
-
};
|
|
442
|
-
if (input.group) {
|
|
443
|
-
context.security.disableAuthorization();
|
|
444
|
-
const groupData = await context.cms.getGroup(input.group);
|
|
445
|
-
context.security.enableAuthorization();
|
|
446
|
-
if (!groupData) {
|
|
447
|
-
throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
|
|
448
|
-
}
|
|
449
|
-
group = {
|
|
450
|
-
id: groupData.id,
|
|
451
|
-
name: groupData.name
|
|
452
|
-
};
|
|
453
|
-
}
|
|
454
|
-
const fields = await (0, _createFieldModels.createFieldModels)(inputData.fields);
|
|
455
|
-
const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), input), {}, {
|
|
456
|
-
group,
|
|
457
|
-
tenant: original.tenant || getTenant().id,
|
|
458
|
-
locale: original.locale || getLocale().code,
|
|
459
|
-
webinyVersion: context.WEBINY_VERSION,
|
|
460
|
-
fields,
|
|
461
|
-
savedOn: new Date().toISOString()
|
|
462
|
-
});
|
|
463
|
-
await onModelBeforeUpdate.publish({
|
|
464
|
-
input,
|
|
465
|
-
original,
|
|
466
|
-
model
|
|
467
|
-
});
|
|
468
|
-
const resultModel = await storageOperations.models.update({
|
|
469
|
-
model
|
|
470
|
-
});
|
|
471
|
-
await updateManager(context, resultModel);
|
|
472
|
-
await onModelAfterUpdate.publish({
|
|
473
|
-
input,
|
|
501
|
+
} catch (ex) {
|
|
502
|
+
await onModelCreateFromError.publish({
|
|
503
|
+
input: data,
|
|
474
504
|
original,
|
|
475
|
-
model
|
|
505
|
+
model,
|
|
506
|
+
error: ex
|
|
476
507
|
});
|
|
477
|
-
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
508
|
+
throw ex;
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
const deleteModel = async modelId => {
|
|
512
|
+
await checkModelPermissions("d");
|
|
513
|
+
const model = await getModel(modelId);
|
|
514
|
+
try {
|
|
482
515
|
await onModelBeforeDelete.publish({
|
|
483
516
|
model
|
|
484
517
|
});
|
|
@@ -496,18 +529,91 @@ const createModelsCrud = params => {
|
|
|
496
529
|
model
|
|
497
530
|
});
|
|
498
531
|
managers.delete(model.modelId);
|
|
532
|
+
} catch (ex) {
|
|
533
|
+
await onModelDeleteError.publish({
|
|
534
|
+
model,
|
|
535
|
+
error: ex
|
|
536
|
+
});
|
|
537
|
+
throw ex;
|
|
538
|
+
}
|
|
539
|
+
};
|
|
540
|
+
const initializeModel = async (modelId, data) => {
|
|
541
|
+
/**
|
|
542
|
+
* We require that users have write permissions to initialize models.
|
|
543
|
+
* Maybe introduce another permission for it?
|
|
544
|
+
*/
|
|
545
|
+
await checkModelPermissions("w");
|
|
546
|
+
const model = await getModel(modelId);
|
|
547
|
+
await onModelInitialize.publish({
|
|
548
|
+
model,
|
|
549
|
+
data
|
|
550
|
+
});
|
|
551
|
+
return true;
|
|
552
|
+
};
|
|
553
|
+
return {
|
|
554
|
+
/**
|
|
555
|
+
* Deprecated - will be removed in 5.36.0
|
|
556
|
+
*/
|
|
557
|
+
onBeforeModelCreate: onModelBeforeCreate,
|
|
558
|
+
onAfterModelCreate: onModelAfterCreate,
|
|
559
|
+
onBeforeModelCreateFrom: onModelBeforeCreateFrom,
|
|
560
|
+
onAfterModelCreateFrom: onModelAfterCreateFrom,
|
|
561
|
+
onBeforeModelUpdate: onModelBeforeUpdate,
|
|
562
|
+
onAfterModelUpdate: onModelAfterUpdate,
|
|
563
|
+
onBeforeModelDelete: onModelBeforeDelete,
|
|
564
|
+
onAfterModelDelete: onModelAfterDelete,
|
|
565
|
+
/**
|
|
566
|
+
* Released in 5.34.0
|
|
567
|
+
*/
|
|
568
|
+
onModelBeforeCreate,
|
|
569
|
+
onModelAfterCreate,
|
|
570
|
+
onModelCreateError,
|
|
571
|
+
onModelBeforeCreateFrom,
|
|
572
|
+
onModelAfterCreateFrom,
|
|
573
|
+
onModelCreateFromError,
|
|
574
|
+
onModelBeforeUpdate,
|
|
575
|
+
onModelAfterUpdate,
|
|
576
|
+
onModelUpdateError,
|
|
577
|
+
onModelBeforeDelete,
|
|
578
|
+
onModelAfterDelete,
|
|
579
|
+
onModelDeleteError,
|
|
580
|
+
onModelInitialize,
|
|
581
|
+
clearModelsCache,
|
|
582
|
+
getModel,
|
|
583
|
+
listModels,
|
|
584
|
+
async createModel(input) {
|
|
585
|
+
return context.benchmark.measure("headlessCms.crud.models.createModel", async () => {
|
|
586
|
+
return createModel(input);
|
|
587
|
+
});
|
|
499
588
|
},
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
589
|
+
/**
|
|
590
|
+
* Method does not check for permissions or ownership.
|
|
591
|
+
* @internal
|
|
592
|
+
*/
|
|
593
|
+
async updateModelDirect(params) {
|
|
594
|
+
return context.benchmark.measure("headlessCms.crud.models.updateModelDirect", async () => {
|
|
595
|
+
return updateModelDirect(params);
|
|
596
|
+
});
|
|
597
|
+
},
|
|
598
|
+
async createModelFrom(modelId, userInput) {
|
|
599
|
+
return context.benchmark.measure("headlessCms.crud.models.createModelFrom", async () => {
|
|
600
|
+
return createModelFrom(modelId, userInput);
|
|
601
|
+
});
|
|
602
|
+
},
|
|
603
|
+
async updateModel(modelId, input) {
|
|
604
|
+
return context.benchmark.measure("headlessCms.crud.models.updateModel", async () => {
|
|
605
|
+
return updateModel(modelId, input);
|
|
606
|
+
});
|
|
607
|
+
},
|
|
608
|
+
async deleteModel(modelId) {
|
|
609
|
+
return context.benchmark.measure("headlessCms.crud.models.deleteModel", async () => {
|
|
610
|
+
return deleteModel(modelId);
|
|
611
|
+
});
|
|
612
|
+
},
|
|
613
|
+
async initializeModel(modelId, data) {
|
|
614
|
+
return context.benchmark.measure("headlessCms.crud.models.initializeModel", async () => {
|
|
615
|
+
return initializeModel(modelId, data);
|
|
509
616
|
});
|
|
510
|
-
return true;
|
|
511
617
|
},
|
|
512
618
|
getModelManager,
|
|
513
619
|
getEntryManager: async model => {
|