@webiny/api-headless-cms 0.0.0-unstable.990c3ab1b6 → 0.0.0-unstable.aa00eecd97
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 +61 -8
- 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 +8 -5
- package/crud/contentEntry.crud.js +1081 -841
- 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 +123 -88
- 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.js +369 -273
- 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.js +189 -172
- package/crud/contentModelGroup.crud.js.map +1 -1
- package/crud/settings.crud.d.ts +1 -1
- package/crud/settings.crud.js +5 -10
- 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 +68 -0
- package/graphql/schema/baseSchema.js.map +1 -0
- package/graphql/schema/contentEntries.d.ts +6 -2
- package/graphql/schema/contentEntries.js +116 -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 +37 -17
- package/graphql/schema/createManageResolvers.js.map +1 -1
- package/graphql/schema/createManageSDL.d.ts +3 -0
- package/graphql/schema/createManageSDL.js +81 -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 +47 -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/schemaPlugins.d.ts +8 -3
- package/graphql/schema/schemaPlugins.js +55 -52
- package/graphql/schema/schemaPlugins.js.map +1 -1
- package/graphql/system.js +55 -74
- 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 +4 -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/index.d.ts +5 -3
- package/index.js +27 -8
- package/index.js.map +1 -1
- package/package.json +40 -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 +436 -149
- 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/ownership.d.ts +3 -3
- package/utils/ownership.js.map +1 -1
- 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 +2 -1
- package/utils/renderListFilterFields.js +12 -21
- package/utils/renderListFilterFields.js.map +1 -1
- package/utils/renderSortEnum.d.ts +9 -5
- package/utils/renderSortEnum.js +23 -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/filterModelFields.d.ts +0 -16
- package/utils/filterModelFields.js +0 -71
- package/utils/filterModelFields.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");
|
|
@@ -25,45 +24,22 @@ var _permissions = require("../utils/permissions");
|
|
|
25
24
|
var _filterAsync = require("../utils/filterAsync");
|
|
26
25
|
var _ownership = require("../utils/ownership");
|
|
27
26
|
var _access = require("../utils/access");
|
|
28
|
-
var
|
|
29
|
-
var
|
|
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"];
|
|
30
32
|
/**
|
|
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.
|
|
33
|
+
* Given a model, return an array of tags ensuring the `type` tag is set.
|
|
34
34
|
*/
|
|
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;
|
|
35
|
+
const ensureTypeTag = model => {
|
|
36
|
+
// Let's make sure we have a `type` tag assigned.
|
|
37
|
+
// If `type` tag is not set, set it to a default one (`model`).
|
|
38
|
+
const tags = model.tags || [];
|
|
39
|
+
if (!tags.some(tag => tag.startsWith("type:"))) {
|
|
40
|
+
tags.push("type:model");
|
|
55
41
|
}
|
|
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);
|
|
42
|
+
return tags;
|
|
67
43
|
};
|
|
68
44
|
const createModelsCrud = params => {
|
|
69
45
|
const {
|
|
@@ -83,9 +59,15 @@ const createModelsCrud = params => {
|
|
|
83
59
|
});
|
|
84
60
|
return [models.map(model => {
|
|
85
61
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
|
|
86
|
-
|
|
62
|
+
tags: ensureTypeTag(model),
|
|
87
63
|
tenant: model.tenant || getTenant().id,
|
|
88
|
-
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)
|
|
89
71
|
});
|
|
90
72
|
})];
|
|
91
73
|
})
|
|
@@ -109,38 +91,29 @@ const createModelsCrud = params => {
|
|
|
109
91
|
const getModelsAsPlugins = () => {
|
|
110
92
|
const tenant = getTenant().id;
|
|
111
93
|
const locale = getLocale().code;
|
|
112
|
-
|
|
94
|
+
return context.plugins.byType(_CmsModelPlugin.CmsModelPlugin.type)
|
|
113
95
|
/**
|
|
114
96
|
* We need to filter out models that are not for this tenant or locale.
|
|
115
97
|
* If it does not have tenant or locale define, it is for every locale and tenant
|
|
116
98
|
*/.filter(plugin => {
|
|
117
99
|
const {
|
|
118
|
-
tenant:
|
|
119
|
-
locale:
|
|
100
|
+
tenant: modelTenant,
|
|
101
|
+
locale: modelLocale
|
|
120
102
|
} = plugin.contentModel;
|
|
121
|
-
if (
|
|
103
|
+
if (modelTenant && modelTenant !== tenant) {
|
|
122
104
|
return false;
|
|
123
|
-
} else if (
|
|
105
|
+
} else if (modelLocale && modelLocale !== locale) {
|
|
124
106
|
return false;
|
|
125
107
|
}
|
|
126
108
|
return true;
|
|
127
109
|
}).map(plugin => {
|
|
128
110
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, plugin.contentModel), {}, {
|
|
111
|
+
tags: ensureTypeTag(plugin.contentModel),
|
|
129
112
|
tenant,
|
|
130
113
|
locale,
|
|
131
114
|
webinyVersion: context.WEBINY_VERSION
|
|
132
115
|
});
|
|
133
116
|
});
|
|
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
117
|
};
|
|
145
118
|
const modelsGet = async modelId => {
|
|
146
119
|
const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);
|
|
@@ -156,6 +129,7 @@ const createModelsCrud = params => {
|
|
|
156
129
|
throw new _handlerGraphql.NotFoundError(`Content model "${modelId}" was not found!`);
|
|
157
130
|
}
|
|
158
131
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
|
|
132
|
+
tags: ensureTypeTag(model),
|
|
159
133
|
tenant: model.tenant || getTenant().id,
|
|
160
134
|
locale: model.locale || getLocale().code
|
|
161
135
|
});
|
|
@@ -166,21 +140,25 @@ const createModelsCrud = params => {
|
|
|
166
140
|
return databaseModels.concat(pluginsModels);
|
|
167
141
|
};
|
|
168
142
|
const listModels = async () => {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
+
});
|
|
176
152
|
});
|
|
177
153
|
};
|
|
178
154
|
const getModel = async modelId => {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
+
});
|
|
184
162
|
};
|
|
185
163
|
const getModelManager = async target => {
|
|
186
164
|
const modelId = typeof target === "string" ? target : target.modelId;
|
|
@@ -195,18 +173,33 @@ const createModelsCrud = params => {
|
|
|
195
173
|
return await updateManager(context, model);
|
|
196
174
|
};
|
|
197
175
|
|
|
198
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Create
|
|
178
|
+
*/
|
|
199
179
|
const onModelBeforeCreate = (0, _pubsub.createTopic)("cms.onModelBeforeCreate");
|
|
200
180
|
const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate");
|
|
201
|
-
|
|
181
|
+
const onModelCreateError = (0, _pubsub.createTopic)("cms.onModelCreateError");
|
|
182
|
+
/**
|
|
183
|
+
* Create from / clone
|
|
184
|
+
*/
|
|
202
185
|
const onModelBeforeCreateFrom = (0, _pubsub.createTopic)("cms.onModelBeforeCreateFrom");
|
|
203
186
|
const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom");
|
|
204
|
-
|
|
187
|
+
const onModelCreateFromError = (0, _pubsub.createTopic)("cms.onModelCreateFromError");
|
|
188
|
+
/**
|
|
189
|
+
* Update
|
|
190
|
+
*/
|
|
205
191
|
const onModelBeforeUpdate = (0, _pubsub.createTopic)("cms.onModelBeforeUpdate");
|
|
206
192
|
const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate");
|
|
207
|
-
|
|
193
|
+
const onModelUpdateError = (0, _pubsub.createTopic)("cms.onModelUpdateError");
|
|
194
|
+
/**
|
|
195
|
+
* Delete
|
|
196
|
+
*/
|
|
208
197
|
const onModelBeforeDelete = (0, _pubsub.createTopic)("cms.onModelBeforeDelete");
|
|
209
198
|
const onModelAfterDelete = (0, _pubsub.createTopic)("cms.onModelAfterDelete");
|
|
199
|
+
const onModelDeleteError = (0, _pubsub.createTopic)("cms.onModelDeleteError");
|
|
200
|
+
/**
|
|
201
|
+
* Initialize
|
|
202
|
+
*/
|
|
210
203
|
const onModelInitialize = (0, _pubsub.createTopic)("cms.onModelInitialize");
|
|
211
204
|
/**
|
|
212
205
|
* We need to assign some default behaviors.
|
|
@@ -214,7 +207,7 @@ const createModelsCrud = params => {
|
|
|
214
207
|
(0, _beforeCreate.assignModelBeforeCreate)({
|
|
215
208
|
onModelBeforeCreate,
|
|
216
209
|
onModelBeforeCreateFrom,
|
|
217
|
-
|
|
210
|
+
context,
|
|
218
211
|
storageOperations
|
|
219
212
|
});
|
|
220
213
|
(0, _afterCreate.assignModelAfterCreate)({
|
|
@@ -223,8 +216,7 @@ const createModelsCrud = params => {
|
|
|
223
216
|
});
|
|
224
217
|
(0, _beforeUpdate.assignModelBeforeUpdate)({
|
|
225
218
|
onModelBeforeUpdate,
|
|
226
|
-
|
|
227
|
-
storageOperations
|
|
219
|
+
context
|
|
228
220
|
});
|
|
229
221
|
(0, _afterUpdate.assignModelAfterUpdate)({
|
|
230
222
|
context,
|
|
@@ -243,71 +235,62 @@ const createModelsCrud = params => {
|
|
|
243
235
|
context,
|
|
244
236
|
onModelAfterDelete
|
|
245
237
|
});
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
onBeforeModelDelete: onModelBeforeDelete,
|
|
257
|
-
onAfterModelDelete: onModelAfterDelete,
|
|
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
|
+
}
|
|
258
248
|
/**
|
|
259
|
-
*
|
|
249
|
+
* We need to extract the defaultFields because it is not for the CmsModel object.
|
|
260
250
|
*/
|
|
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
|
-
};
|
|
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 {
|
|
309
292
|
await onModelBeforeCreate.publish({
|
|
310
|
-
input,
|
|
293
|
+
input: data,
|
|
311
294
|
model
|
|
312
295
|
});
|
|
313
296
|
const createdModel = await storageOperations.models.create({
|
|
@@ -316,25 +299,101 @@ const createModelsCrud = params => {
|
|
|
316
299
|
loaders.listModels.clearAll();
|
|
317
300
|
await updateManager(context, model);
|
|
318
301
|
await onModelAfterCreate.publish({
|
|
319
|
-
input,
|
|
302
|
+
input: data,
|
|
320
303
|
model: createdModel
|
|
321
304
|
});
|
|
322
305
|
return createdModel;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
|
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
|
|
337
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 {
|
|
338
397
|
await onModelBeforeUpdate.publish({
|
|
339
398
|
input: {},
|
|
340
399
|
original,
|
|
@@ -351,59 +410,70 @@ const createModelsCrud = params => {
|
|
|
351
410
|
model: resultModel
|
|
352
411
|
});
|
|
353
412
|
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
|
|
413
|
+
} catch (ex) {
|
|
414
|
+
await onModelUpdateError.publish({
|
|
415
|
+
input: {},
|
|
416
|
+
original,
|
|
417
|
+
model,
|
|
418
|
+
error: ex
|
|
404
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 {
|
|
405
475
|
await onModelBeforeCreateFrom.publish({
|
|
406
|
-
input,
|
|
476
|
+
input: data,
|
|
407
477
|
model,
|
|
408
478
|
original
|
|
409
479
|
});
|
|
@@ -413,72 +483,25 @@ const createModelsCrud = params => {
|
|
|
413
483
|
loaders.listModels.clearAll();
|
|
414
484
|
await updateManager(context, model);
|
|
415
485
|
await onModelAfterCreateFrom.publish({
|
|
416
|
-
input,
|
|
486
|
+
input: data,
|
|
417
487
|
original,
|
|
418
488
|
model: createdModel
|
|
419
489
|
});
|
|
420
490
|
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,
|
|
491
|
+
} catch (ex) {
|
|
492
|
+
await onModelCreateFromError.publish({
|
|
493
|
+
input: data,
|
|
465
494
|
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,
|
|
474
|
-
original,
|
|
475
|
-
model: resultModel
|
|
495
|
+
model,
|
|
496
|
+
error: ex
|
|
476
497
|
});
|
|
477
|
-
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
498
|
+
throw ex;
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
const deleteModel = async modelId => {
|
|
502
|
+
await checkModelPermissions("d");
|
|
503
|
+
const model = await getModel(modelId);
|
|
504
|
+
try {
|
|
482
505
|
await onModelBeforeDelete.publish({
|
|
483
506
|
model
|
|
484
507
|
});
|
|
@@ -496,18 +519,91 @@ const createModelsCrud = params => {
|
|
|
496
519
|
model
|
|
497
520
|
});
|
|
498
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
|
+
});
|
|
499
578
|
},
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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);
|
|
509
606
|
});
|
|
510
|
-
return true;
|
|
511
607
|
},
|
|
512
608
|
getModelManager,
|
|
513
609
|
getEntryManager: async model => {
|