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