@webiny/api-headless-cms 5.27.0 → 5.28.0-beta.0
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/content/contextSetup.js.map +1 -1
- package/content/graphQLHandlerFactory.js.map +1 -1
- package/content/parameterPlugins.js.map +1 -1
- package/content/plugins/CmsGroupPlugin.js.map +1 -1
- package/content/plugins/CmsModelPlugin.js.map +1 -1
- package/content/plugins/CmsParametersPlugin.js.map +1 -1
- package/content/plugins/buildSchemaPlugins.js.map +1 -1
- package/content/plugins/crud/contentEntry/afterDelete.js.map +1 -1
- package/content/plugins/crud/contentEntry/beforeCreate.js.map +1 -1
- package/content/plugins/crud/contentEntry/beforeUpdate.js.map +1 -1
- package/content/plugins/crud/contentEntry/entryDataValidation.js.map +1 -1
- package/content/plugins/crud/contentEntry/markLockedFields.js.map +1 -1
- package/content/plugins/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
- package/content/plugins/crud/contentEntry.crud.js.map +1 -1
- package/content/plugins/crud/contentModel/afterCreate.js.map +1 -1
- package/content/plugins/crud/contentModel/afterCreateFrom.js.map +1 -1
- package/content/plugins/crud/contentModel/afterDelete.js.map +1 -1
- package/content/plugins/crud/contentModel/afterUpdate.js.map +1 -1
- package/content/plugins/crud/contentModel/beforeCreate.js +26 -4
- package/content/plugins/crud/contentModel/beforeCreate.js.map +1 -1
- package/content/plugins/crud/contentModel/beforeDelete.js.map +1 -1
- package/content/plugins/crud/contentModel/beforeUpdate.js +5 -188
- package/content/plugins/crud/contentModel/beforeUpdate.js.map +1 -1
- package/content/plugins/crud/contentModel/contentModelManagerFactory.js.map +1 -1
- package/content/plugins/crud/contentModel/createFieldModels.d.ts +2 -2
- package/content/plugins/crud/contentModel/createFieldModels.js +6 -2
- package/content/plugins/crud/contentModel/createFieldModels.js.map +1 -1
- package/content/plugins/crud/contentModel/idValidation.js.map +1 -1
- package/content/plugins/crud/contentModel/models.d.ts +1 -1
- package/content/plugins/crud/contentModel/models.js +43 -33
- package/content/plugins/crud/contentModel/models.js.map +1 -1
- package/content/plugins/crud/contentModel/validateLayout.d.ts +1 -1
- package/content/plugins/crud/contentModel/validateLayout.js +2 -3
- package/content/plugins/crud/contentModel/validateLayout.js.map +1 -1
- package/content/plugins/crud/contentModel/validateModelFields.d.ts +8 -0
- package/content/plugins/crud/contentModel/validateModelFields.js +201 -0
- package/content/plugins/crud/contentModel/validateModelFields.js.map +1 -0
- package/content/plugins/crud/contentModel.crud.js +7 -5
- package/content/plugins/crud/contentModel.crud.js.map +1 -1
- package/content/plugins/crud/contentModelGroup/beforeCreate.js.map +1 -1
- package/content/plugins/crud/contentModelGroup/beforeDelete.js.map +1 -1
- package/content/plugins/crud/contentModelGroup/beforeUpdate.js.map +1 -1
- package/content/plugins/crud/contentModelGroup.crud.js.map +1 -1
- package/content/plugins/crud/index.js.map +1 -1
- package/content/plugins/graphqlFields/boolean.js.map +1 -1
- package/content/plugins/graphqlFields/datetime.js.map +1 -1
- package/content/plugins/graphqlFields/file.js.map +1 -1
- package/content/plugins/graphqlFields/helpers.js.map +1 -1
- package/content/plugins/graphqlFields/index.js.map +1 -1
- package/content/plugins/graphqlFields/longText.js.map +1 -1
- package/content/plugins/graphqlFields/number.js.map +1 -1
- package/content/plugins/graphqlFields/object.js.map +1 -1
- package/content/plugins/graphqlFields/ref.js.map +1 -1
- package/content/plugins/graphqlFields/richText.js.map +1 -1
- package/content/plugins/graphqlFields/text.js.map +1 -1
- package/content/plugins/internalSecurity/InternalAuthenticationPlugin.js.map +1 -1
- package/content/plugins/internalSecurity/InternalAuthorizationPlugin.js.map +1 -1
- package/content/plugins/modelManager/DefaultCmsModelManager.js.map +1 -1
- package/content/plugins/modelManager/index.js.map +1 -1
- package/content/plugins/schema/baseSchema.js.map +1 -1
- package/content/plugins/schema/contentEntries.js.map +1 -1
- package/content/plugins/schema/contentModelGroups.js.map +1 -1
- package/content/plugins/schema/contentModels.js +3 -0
- package/content/plugins/schema/contentModels.js.map +1 -1
- package/content/plugins/schema/createFieldResolvers.js.map +1 -1
- package/content/plugins/schema/createManageResolvers.js.map +1 -1
- package/content/plugins/schema/createManageSDL.js.map +1 -1
- package/content/plugins/schema/createPreviewResolvers.js.map +1 -1
- package/content/plugins/schema/createReadResolvers.js.map +1 -1
- package/content/plugins/schema/createReadSDL.js.map +1 -1
- package/content/plugins/schema/resolvers/commonFieldResolvers.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveCreate.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveDelete.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveGet.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveList.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolvePublish.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveRepublish.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveRequestChanges.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveRequestReview.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
- package/content/plugins/schema/resolvers/manage/resolveUpdate.js.map +1 -1
- package/content/plugins/schema/resolvers/preview/resolveGet.js.map +1 -1
- package/content/plugins/schema/resolvers/preview/resolveList.js.map +1 -1
- package/content/plugins/schema/resolvers/read/resolveGet.js.map +1 -1
- package/content/plugins/schema/resolvers/read/resolveList.js.map +1 -1
- package/content/plugins/schema/schemaPlugins.js.map +1 -1
- package/content/plugins/storage/StorageTransformPlugin.js.map +1 -1
- package/content/plugins/storage/default.js.map +1 -1
- package/content/plugins/storage/object.js.map +1 -1
- package/content/plugins/utils/createTypeName.js.map +1 -1
- package/content/plugins/utils/entryStorage.js.map +1 -1
- package/content/plugins/utils/getEntryTitle.js.map +1 -1
- package/content/plugins/utils/getSchemaFromFieldPlugins.js.map +1 -1
- package/content/plugins/utils/pluralizedTypeName.js.map +1 -1
- package/content/plugins/utils/renderFields.js.map +1 -1
- package/content/plugins/utils/renderGetFilterFields.js.map +1 -1
- package/content/plugins/utils/renderInputFields.js.map +1 -1
- package/content/plugins/utils/renderListFilterFields.js.map +1 -1
- package/content/plugins/utils/renderSortEnum.js.map +1 -1
- package/content/plugins/validators/dateGte.js.map +1 -1
- package/content/plugins/validators/dateLte.js.map +1 -1
- package/content/plugins/validators/gte.js.map +1 -1
- package/content/plugins/validators/in.js.map +1 -1
- package/content/plugins/validators/index.js.map +1 -1
- package/content/plugins/validators/lte.js.map +1 -1
- package/content/plugins/validators/maxLength.js.map +1 -1
- package/content/plugins/validators/minLength.js.map +1 -1
- package/content/plugins/validators/pattern.js.map +1 -1
- package/content/plugins/validators/patternPlugins/email.js.map +1 -1
- package/content/plugins/validators/patternPlugins/index.js.map +1 -1
- package/content/plugins/validators/patternPlugins/lowerCase.js.map +1 -1
- package/content/plugins/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
- package/content/plugins/validators/patternPlugins/upperCase.js.map +1 -1
- package/content/plugins/validators/patternPlugins/upperCaseSpace.js.map +1 -1
- package/content/plugins/validators/patternPlugins/url.js.map +1 -1
- package/content/plugins/validators/required.js.map +1 -1
- package/content/plugins/validators/timeGte.js.map +1 -1
- package/content/plugins/validators/timeLte.js.map +1 -1
- package/content/plugins/validators/unique.js.map +1 -1
- package/index.js.map +1 -1
- package/migrateCMSPermissions.js.map +1 -1
- package/package.json +25 -25
- package/plugins/context.js.map +1 -1
- package/plugins/crud/index.js.map +1 -1
- package/plugins/crud/settings.crud.js.map +1 -1
- package/plugins/crud/system.crud.js.map +1 -1
- package/plugins/graphql/system.js.map +1 -1
- package/plugins/graphql.js.map +1 -1
- package/plugins/upgrades/index.js.map +1 -1
- package/plugins/upgrades/v5.5.0/helpers.js.map +1 -1
- package/plugins/upgrades/v5.5.0/index.js.map +1 -1
- package/transformers.js.map +1 -1
- package/types.d.ts +20 -0
- package/types.js.map +1 -1
- package/utils.js.map +1 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.validateModelFields = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
|
|
13
|
+
|
|
14
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
15
|
+
|
|
16
|
+
var _CmsModelPlugin = require("../../CmsModelPlugin");
|
|
17
|
+
|
|
18
|
+
var _createManageSDL = require("../../schema/createManageSDL");
|
|
19
|
+
|
|
20
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
21
|
+
|
|
22
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
23
|
+
|
|
24
|
+
const defaultTitleFieldId = "id";
|
|
25
|
+
const allowedTitleFieldTypes = ["text", "number"];
|
|
26
|
+
|
|
27
|
+
const getContentModelTitleFieldId = (fields, titleFieldId) => {
|
|
28
|
+
// if there is no title field defined either in input data or existing content model data
|
|
29
|
+
// we will take first text field that has no multiple values enabled
|
|
30
|
+
// or if initial titleFieldId is the default one also try to find first available text field
|
|
31
|
+
if (!titleFieldId || titleFieldId === defaultTitleFieldId) {
|
|
32
|
+
const titleField = fields.find(field => {
|
|
33
|
+
return field.type === "text" && !field.multipleValues;
|
|
34
|
+
});
|
|
35
|
+
return titleField ? titleField.fieldId : defaultTitleFieldId;
|
|
36
|
+
} // check existing titleFieldId for existence in the model
|
|
37
|
+
// for correct type
|
|
38
|
+
// and that it is not multiple values field
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
const target = fields.find(f => f.fieldId === titleFieldId);
|
|
42
|
+
|
|
43
|
+
if (!target) {
|
|
44
|
+
throw new _error.default(`Field does not exist in the model.`, "VALIDATION_ERROR", {
|
|
45
|
+
fieldId: titleFieldId,
|
|
46
|
+
fields
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (allowedTitleFieldTypes.includes(target.type) === false) {
|
|
51
|
+
throw new _error.default(`Only ${allowedTitleFieldTypes.join(", ")} and id fields can be used as an entry title.`, "ENTRY_TITLE_FIELD_TYPE", {
|
|
52
|
+
fieldId: target.fieldId,
|
|
53
|
+
type: target.type
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (target.multipleValues) {
|
|
58
|
+
throw new _error.default(`Fields that accept multiple values cannot be used as the entry title.`, "ENTRY_TITLE_FIELD_TYPE", {
|
|
59
|
+
fieldId: target.fieldId,
|
|
60
|
+
type: target.type
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return target.fieldId;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const extractInvalidField = (model, err) => {
|
|
68
|
+
var _err$source;
|
|
69
|
+
|
|
70
|
+
const sdl = ((_err$source = err.source) === null || _err$source === void 0 ? void 0 : _err$source.body) || ""; // Find the invalid type
|
|
71
|
+
|
|
72
|
+
const {
|
|
73
|
+
line: lineNumber
|
|
74
|
+
} = err.locations ? err.locations[0] : {
|
|
75
|
+
line: 0
|
|
76
|
+
};
|
|
77
|
+
const sdlLines = sdl.split("\n");
|
|
78
|
+
let sdlLine;
|
|
79
|
+
let gqlType;
|
|
80
|
+
|
|
81
|
+
for (let i = lineNumber; i > 0; i--) {
|
|
82
|
+
if (sdlLine && sdlLine.includes("type ")) {
|
|
83
|
+
gqlType = sdlLine.match(/type\s+(.*?)\s+{/);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
sdlLine = sdlLines[i];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let invalidField = undefined;
|
|
91
|
+
|
|
92
|
+
if (Array.isArray(gqlType)) {
|
|
93
|
+
const fieldRegex = new RegExp(`([^\\s+].*?):\\s+\\[?${gqlType[1]}!?\\]?`);
|
|
94
|
+
const matched = sdl.match(fieldRegex);
|
|
95
|
+
|
|
96
|
+
if (matched) {
|
|
97
|
+
invalidField = matched[1];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
let message = `See more details in the browser console.`;
|
|
102
|
+
|
|
103
|
+
if (invalidField) {
|
|
104
|
+
message = `Please review the definition of "${invalidField}" field.`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
data: {
|
|
109
|
+
modelId: model.modelId,
|
|
110
|
+
sdl,
|
|
111
|
+
invalidField
|
|
112
|
+
},
|
|
113
|
+
code: "INVALID_MODEL_DEFINITION",
|
|
114
|
+
message: [`Model "${model.modelId}" was not saved!`, message].join("\n")
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const validateModelFields = async params => {
|
|
119
|
+
const {
|
|
120
|
+
model,
|
|
121
|
+
plugins
|
|
122
|
+
} = params;
|
|
123
|
+
const modelPlugin = plugins.byType(_CmsModelPlugin.CmsModelPlugin.type).find(item => item.contentModel.modelId === model.modelId);
|
|
124
|
+
|
|
125
|
+
if (modelPlugin) {
|
|
126
|
+
throw new _error.default("Content models defined via plugins cannot be updated.", "CONTENT_MODEL_UPDATE_ERROR", {
|
|
127
|
+
modelId: model.modelId
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const {
|
|
132
|
+
titleFieldId
|
|
133
|
+
} = model; // There should be fields/locked fields in either model or data to be updated.
|
|
134
|
+
|
|
135
|
+
const {
|
|
136
|
+
fields = [],
|
|
137
|
+
lockedFields = []
|
|
138
|
+
} = model; // Let's inspect the fields of the received content model. We prevent saving of a content model if it
|
|
139
|
+
// contains a field for which a "cms-model-field-to-graphql" plugin does not exist on the backend.
|
|
140
|
+
|
|
141
|
+
const fieldTypePlugins = plugins.byType("cms-model-field-to-graphql");
|
|
142
|
+
|
|
143
|
+
for (let i = 0; i < fields.length; i++) {
|
|
144
|
+
const field = fields[i];
|
|
145
|
+
|
|
146
|
+
if (!fieldTypePlugins.find(item => item.fieldType === field.type)) {
|
|
147
|
+
throw new Error(`Cannot update content model because of the unknown "${field.type}" field.`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (fields.length) {
|
|
152
|
+
// Make sure that this model can be safely converted to a GraphQL SDL
|
|
153
|
+
const schema = (0, _createManageSDL.createManageSDL)({
|
|
154
|
+
model,
|
|
155
|
+
fieldTypePlugins: fieldTypePlugins.reduce((acc, pl) => _objectSpread(_objectSpread({}, acc), {}, {
|
|
156
|
+
[pl.fieldType]: pl
|
|
157
|
+
}), {})
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
(0, _graphqlTag.default)(schema);
|
|
162
|
+
} catch (err) {
|
|
163
|
+
throw new _error.default(extractInvalidField(model, err));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
model.titleFieldId = getContentModelTitleFieldId(fields, titleFieldId);
|
|
168
|
+
const cmsLockedFieldPlugins = plugins.byType("cms-model-locked-field"); // We must not allow removal or changes in fields that are already in use in content entries.
|
|
169
|
+
|
|
170
|
+
for (const lockedField of lockedFields) {
|
|
171
|
+
const existingField = fields.find(item => item.fieldId === lockedField.fieldId);
|
|
172
|
+
|
|
173
|
+
if (!existingField) {
|
|
174
|
+
throw new _error.default(`Cannot remove the field "${lockedField.fieldId}" because it's already in use in created content.`, "ENTRY_FIELD_USED");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (lockedField.multipleValues !== existingField.multipleValues) {
|
|
178
|
+
throw new _error.default(`Cannot change "multipleValues" for the "${lockedField.fieldId}" field because it's already in use in created content.`, "ENTRY_FIELD_USED");
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (lockedField.type !== existingField.type) {
|
|
182
|
+
throw new _error.default(`Cannot change field type for the "${lockedField.fieldId}" field because it's already in use in created content.`, "ENTRY_FIELD_USED");
|
|
183
|
+
} // Check `lockedField` invariant for specific field
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
const lockedFieldsByType = cmsLockedFieldPlugins.filter(pl => pl.fieldType === lockedField.type);
|
|
187
|
+
|
|
188
|
+
for (const plugin of lockedFieldsByType) {
|
|
189
|
+
if (typeof plugin.checkLockedField !== "function") {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
plugin.checkLockedField({
|
|
194
|
+
lockedField,
|
|
195
|
+
field: existingField
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
exports.validateModelFields = validateModelFields;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["defaultTitleFieldId","allowedTitleFieldTypes","getContentModelTitleFieldId","fields","titleFieldId","titleField","find","field","type","multipleValues","fieldId","target","f","WebinyError","includes","join","extractInvalidField","model","err","sdl","source","body","line","lineNumber","locations","sdlLines","split","sdlLine","gqlType","i","match","invalidField","undefined","Array","isArray","fieldRegex","RegExp","matched","message","data","modelId","code","validateModelFields","params","plugins","modelPlugin","byType","CmsModelPlugin","item","contentModel","lockedFields","fieldTypePlugins","length","fieldType","Error","schema","createManageSDL","reduce","acc","pl","gql","cmsLockedFieldPlugins","lockedField","existingField","lockedFieldsByType","filter","plugin","checkLockedField"],"sources":["validateModelFields.ts"],"sourcesContent":["import gql from \"graphql-tag\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/content/plugins/CmsModelPlugin\";\nimport {\n CmsModel,\n CmsModelField,\n CmsModelFieldToGraphQLPlugin,\n CmsModelLockedFieldPlugin\n} from \"~/types\";\nimport { createManageSDL } from \"~/content/plugins/schema/createManageSDL\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { GraphQLError } from \"graphql\";\n\nconst defaultTitleFieldId = \"id\";\n\nconst allowedTitleFieldTypes = [\"text\", \"number\"];\n\nconst getContentModelTitleFieldId = (fields: CmsModelField[], titleFieldId?: string): string => {\n // if there is no title field defined either in input data or existing content model data\n // we will take first text field that has no multiple values enabled\n // or if initial titleFieldId is the default one also try to find first available text field\n if (!titleFieldId || titleFieldId === defaultTitleFieldId) {\n const titleField = fields.find(field => {\n return field.type === \"text\" && !field.multipleValues;\n });\n return titleField ? titleField.fieldId : defaultTitleFieldId;\n }\n // check existing titleFieldId for existence in the model\n // for correct type\n // and that it is not multiple values field\n const target = fields.find(f => f.fieldId === titleFieldId);\n if (!target) {\n throw new WebinyError(`Field does not exist in the model.`, \"VALIDATION_ERROR\", {\n fieldId: titleFieldId,\n fields\n });\n }\n\n if (allowedTitleFieldTypes.includes(target.type) === false) {\n throw new WebinyError(\n `Only ${allowedTitleFieldTypes.join(\n \", \"\n )} and id fields can be used as an entry title.`,\n \"ENTRY_TITLE_FIELD_TYPE\",\n {\n fieldId: target.fieldId,\n type: target.type\n }\n );\n }\n\n if (target.multipleValues) {\n throw new WebinyError(\n `Fields that accept multiple values cannot be used as the entry title.`,\n \"ENTRY_TITLE_FIELD_TYPE\",\n {\n fieldId: target.fieldId,\n type: target.type\n }\n );\n }\n\n return target.fieldId;\n};\n\nconst extractInvalidField = (model: CmsModel, err: GraphQLError) => {\n const sdl = err.source?.body || \"\";\n\n // Find the invalid type\n const { line: lineNumber } = err.locations\n ? err.locations[0]\n : {\n line: 0\n };\n const sdlLines = sdl.split(\"\\n\");\n let sdlLine;\n let gqlType;\n for (let i = lineNumber; i > 0; i--) {\n if (sdlLine && sdlLine.includes(\"type \")) {\n gqlType = sdlLine.match(/type\\s+(.*?)\\s+{/);\n break;\n }\n\n sdlLine = sdlLines[i];\n }\n\n let invalidField: string | undefined = undefined;\n if (Array.isArray(gqlType)) {\n const fieldRegex = new RegExp(`([^\\\\s+].*?):\\\\s+\\\\[?${gqlType[1]}!?\\\\]?`);\n\n const matched = sdl.match(fieldRegex);\n if (matched) {\n invalidField = matched[1];\n }\n }\n\n let message = `See more details in the browser console.`;\n if (invalidField) {\n message = `Please review the definition of \"${invalidField}\" field.`;\n }\n\n return {\n data: {\n modelId: model.modelId,\n sdl,\n invalidField\n },\n code: \"INVALID_MODEL_DEFINITION\",\n message: [`Model \"${model.modelId}\" was not saved!`, message].join(\"\\n\")\n };\n};\n\ninterface ValidateModelParams {\n model: CmsModel;\n plugins: PluginsContainer;\n}\n\nexport const validateModelFields = async (params: ValidateModelParams) => {\n const { model, plugins } = params;\n\n const modelPlugin = plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n .find(item => item.contentModel.modelId === model.modelId);\n\n if (modelPlugin) {\n throw new WebinyError(\n \"Content models defined via plugins cannot be updated.\",\n \"CONTENT_MODEL_UPDATE_ERROR\",\n {\n modelId: model.modelId\n }\n );\n }\n\n const { titleFieldId } = model;\n\n // There should be fields/locked fields in either model or data to be updated.\n const { fields = [], lockedFields = [] } = model;\n\n // Let's inspect the fields of the received content model. We prevent saving of a content model if it\n // contains a field for which a \"cms-model-field-to-graphql\" plugin does not exist on the backend.\n const fieldTypePlugins = plugins.byType<CmsModelFieldToGraphQLPlugin>(\n \"cms-model-field-to-graphql\"\n );\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n if (!fieldTypePlugins.find(item => item.fieldType === field.type)) {\n throw new Error(\n `Cannot update content model because of the unknown \"${field.type}\" field.`\n );\n }\n }\n\n if (fields.length) {\n // Make sure that this model can be safely converted to a GraphQL SDL\n const schema = createManageSDL({\n model,\n fieldTypePlugins: fieldTypePlugins.reduce(\n (acc, pl) => ({ ...acc, [pl.fieldType]: pl }),\n {}\n )\n });\n\n try {\n gql(schema);\n } catch (err) {\n throw new WebinyError(extractInvalidField(model, err));\n }\n }\n\n model.titleFieldId = getContentModelTitleFieldId(fields, titleFieldId);\n\n const cmsLockedFieldPlugins =\n plugins.byType<CmsModelLockedFieldPlugin>(\"cms-model-locked-field\");\n\n // We must not allow removal or changes in fields that are already in use in content entries.\n for (const lockedField of lockedFields) {\n const existingField = fields.find(item => item.fieldId === lockedField.fieldId);\n if (!existingField) {\n throw new WebinyError(\n `Cannot remove the field \"${lockedField.fieldId}\" because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n if (lockedField.multipleValues !== existingField.multipleValues) {\n throw new WebinyError(\n `Cannot change \"multipleValues\" for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n if (lockedField.type !== existingField.type) {\n throw new WebinyError(\n `Cannot change field type for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n // Check `lockedField` invariant for specific field\n const lockedFieldsByType = cmsLockedFieldPlugins.filter(\n pl => pl.fieldType === lockedField.type\n );\n for (const plugin of lockedFieldsByType) {\n if (typeof plugin.checkLockedField !== \"function\") {\n continue;\n }\n plugin.checkLockedField({\n lockedField,\n field: existingField\n });\n }\n }\n};\n"],"mappings":"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"}
|
|
@@ -262,6 +262,7 @@ const createModelsCrud = params => {
|
|
|
262
262
|
throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
const fields = await (0, _createFieldModels.createFieldModels)(input.fields);
|
|
265
266
|
const identity = getIdentity();
|
|
266
267
|
const model = {
|
|
267
268
|
name: input.name,
|
|
@@ -281,11 +282,12 @@ const createModelsCrud = params => {
|
|
|
281
282
|
},
|
|
282
283
|
createdOn: new Date().toISOString(),
|
|
283
284
|
savedOn: new Date().toISOString(),
|
|
284
|
-
fields
|
|
285
|
+
fields,
|
|
285
286
|
lockedFields: [],
|
|
286
|
-
layout: [],
|
|
287
|
+
layout: input.layout || [],
|
|
287
288
|
webinyVersion: context.WEBINY_VERSION
|
|
288
289
|
};
|
|
290
|
+
(0, _validateLayout.validateLayout)(model, fields);
|
|
289
291
|
await onBeforeModelCreate.publish({
|
|
290
292
|
input,
|
|
291
293
|
model
|
|
@@ -449,18 +451,18 @@ const createModelsCrud = params => {
|
|
|
449
451
|
};
|
|
450
452
|
}
|
|
451
453
|
|
|
452
|
-
const
|
|
454
|
+
const fields = await (0, _createFieldModels.createFieldModels)(inputData.fields);
|
|
453
455
|
|
|
454
456
|
const model = _objectSpread(_objectSpread(_objectSpread({}, original), input), {}, {
|
|
455
457
|
group,
|
|
456
458
|
tenant: original.tenant || getTenant().id,
|
|
457
459
|
locale: original.locale || getLocale().code,
|
|
458
460
|
webinyVersion: context.WEBINY_VERSION,
|
|
459
|
-
fields
|
|
461
|
+
fields,
|
|
460
462
|
savedOn: new Date().toISOString()
|
|
461
463
|
});
|
|
462
464
|
|
|
463
|
-
(0, _validateLayout.validateLayout)(model,
|
|
465
|
+
(0, _validateLayout.validateLayout)(model, fields);
|
|
464
466
|
await onBeforeModelUpdate.publish({
|
|
465
467
|
input,
|
|
466
468
|
original,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["contentModel.crud.ts"],"names":["createModelsCrud","params","getTenant","getIdentity","getLocale","storageOperations","context","loaders","listModels","DataLoader","models","list","where","tenant","id","locale","code","map","model","clearModelsCache","loader","Object","values","clearAll","managers","Map","updateManager","manager","set","modelId","checkModelPermissions","check","utils","checkPermissions","rwd","getModelsAsPlugins","plugins","byType","CmsModelPlugin","type","filter","plugin","t","l","contentModel","webinyVersion","WEBINY_VERSION","modelsGet","pluginModel","find","get","NotFoundError","modelsList","databaseModels","load","pluginsModels","concat","permission","filterAsync","validateOwnership","validateModelAccess","getModel","checkOwnership","checkModelAccess","getModelManager","target","has","m","onBeforeModelCreate","onAfterModelCreate","onBeforeModelCreateFrom","onAfterModelCreateFrom","onBeforeModelUpdate","onAfterModelUpdate","onBeforeModelDelete","onAfterModelDelete","createModel","inputData","createdData","CreateContentModelModel","populate","validate","input","toJSON","security","disableAuthorization","group","cms","getGroup","enableAuthorization","identity","name","description","titleFieldId","createdBy","displayName","createdOn","Date","toISOString","savedOn","fields","lockedFields","layout","publish","createdModel","create","updateModelDirect","initialModel","original","resultModel","update","createModelFrom","data","CreateContentModelModelFrom","i18n","groups","updateModel","updatedData","UpdateContentModelModel","onlyDirty","keys","length","groupData","modelFields","deleteModel","delete","ex","WebinyError","message","error","getEntryManager","getManagers","getEntryManagers"],"mappings":";;;;;;;;;;;AAmBA;;AACA;;AACA;;AACA;;AACA;;AAKA;;AACA;;AACA;;AACA;;AAIA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AASO,MAAMA,gBAAgB,GAAIC,MAAD,IAAqD;AACjF,QAAM;AAAEC,IAAAA,SAAF;AAAaC,IAAAA,WAAb;AAA0BC,IAAAA,SAA1B;AAAqCC,IAAAA,iBAArC;AAAwDC,IAAAA;AAAxD,MAAoEL,MAA1E;AAEA,QAAMM,OAAO,GAAG;AACZC,IAAAA,UAAU,EAAE,IAAIC,mBAAJ,CAAe,YAAY;AACnC,YAAMC,MAAM,GAAG,MAAML,iBAAiB,CAACK,MAAlB,CAAyBC,IAAzB,CAA8B;AAC/CC,QAAAA,KAAK,EAAE;AACHC,UAAAA,MAAM,EAAEX,SAAS,GAAGY,EADjB;AAEHC,UAAAA,MAAM,EAAEX,SAAS,GAAGY;AAFjB;AADwC,OAA9B,CAArB;AAMA,aAAO,CACHN,MAAM,CAACO,GAAP,CAAWC,KAAK,IAAI;AAChB,+CACOA,KADP;AAEIL,UAAAA,MAAM,EAAEK,KAAK,CAACL,MAAN,IAAgBX,SAAS,GAAGY,EAFxC;AAGIC,UAAAA,MAAM,EAAEG,KAAK,CAACH,MAAN,IAAgBX,SAAS,GAAGY;AAHxC;AAKH,OAND,CADG,CAAP;AASH,KAhBW;AADA,GAAhB;;AAoBA,QAAMG,gBAAgB,GAAG,MAAY;AACjC,SAAK,MAAMC,MAAX,IAAqBC,MAAM,CAACC,MAAP,CAAcf,OAAd,CAArB,EAA6C;AACzCa,MAAAA,MAAM,CAACG,QAAP;AACH;AACJ,GAJD;;AAMA,QAAMC,QAAQ,GAAG,IAAIC,GAAJ,EAAjB;;AACA,QAAMC,aAAa,GAAG,OAClBpB,OADkB,EAElBY,KAFkB,KAGS;AAC3B,UAAMS,OAAO,GAAG,MAAM,4DAA2BrB,OAA3B,EAAoCY,KAApC,CAAtB;AACAM,IAAAA,QAAQ,CAACI,GAAT,CAAaV,KAAK,CAACW,OAAnB,EAA4BF,OAA5B;AACA,WAAOA,OAAP;AACH,GAPD;;AASA,QAAMG,qBAAqB,GAAIC,KAAD,IAAgD;AAC1E,WAAOC,KAAK,CAACC,gBAAN,CAAuB3B,OAAvB,EAAgC,kBAAhC,EAAoD;AAAE4B,MAAAA,GAAG,EAAEH;AAAP,KAApD,CAAP;AACH,GAFD;;AAIA,QAAMI,kBAAkB,GAAG,MAAkB;AACzC,UAAMtB,MAAM,GAAGX,SAAS,GAAGY,EAA3B;AACA,UAAMC,MAAM,GAAGX,SAAS,GAAGY,IAA3B;AAEA,WACIV,OAAO,CAAC8B,OAAR,CACKC,MADL,CAC4BC,+BAAeC,IAD3C;AAEI;AAChB;AACA;AACA;AALY,KAMKC,MANL,CAMYC,MAAM,IAAI;AACd,YAAM;AAAE5B,QAAAA,MAAM,EAAE6B,CAAV;AAAa3B,QAAAA,MAAM,EAAE4B;AAArB,UAA2BF,MAAM,CAACG,YAAxC;;AACA,UAAIF,CAAC,IAAIA,CAAC,KAAK7B,MAAf,EAAuB;AACnB,eAAO,KAAP;AACH,OAFD,MAEO,IAAI8B,CAAC,IAAIA,CAAC,KAAK5B,MAAf,EAAuB;AAC1B,eAAO,KAAP;AACH;;AACD,aAAO,IAAP;AACH,KAdL,EAeKE,GAfL,CAemBwB,MAAM,IAAI;AACrB,6CACOA,MAAM,CAACG,YADd;AAEI/B,QAAAA,MAFJ;AAGIE,QAAAA,MAHJ;AAII8B,QAAAA,aAAa,EAAEvC,OAAO,CAACwC;AAJ3B;AAMH,KAtBL,CADJ;AAyBH,GA7BD;;AA+BA,QAAMC,SAAS,GAAG,MAAOlB,OAAP,IAA8C;AAC5D,UAAMmB,WAAW,GAAGb,kBAAkB,GAAGc,IAArB,CAA0B/B,KAAK,IAAIA,KAAK,CAACW,OAAN,KAAkBA,OAArD,CAApB;;AAEA,QAAImB,WAAJ,EAAiB;AACb,aAAOA,WAAP;AACH;;AAED,UAAM9B,KAAK,GAAG,MAAMb,iBAAiB,CAACK,MAAlB,CAAyBwC,GAAzB,CAA6B;AAC7CrC,MAAAA,MAAM,EAAEX,SAAS,GAAGY,EADyB;AAE7CC,MAAAA,MAAM,EAAEX,SAAS,GAAGY,IAFyB;AAG7Ca,MAAAA;AAH6C,KAA7B,CAApB;;AAMA,QAAI,CAACX,KAAL,EAAY;AACR,YAAM,IAAIiC,6BAAJ,CAAmB,kBAAiBtB,OAAQ,kBAA5C,CAAN;AACH;;AAED,2CACOX,KADP;AAEIL,MAAAA,MAAM,EAAEK,KAAK,CAACL,MAAN,IAAgBX,SAAS,GAAGY,EAFxC;AAGIC,MAAAA,MAAM,EAAEG,KAAK,CAACH,MAAN,IAAgBX,SAAS,GAAGY;AAHxC;AAKH,GAtBD;;AAwBA,QAAMoC,UAAU,GAAG,YAAiC;AAChD,UAAMC,cAAc,GAAG,MAAM9C,OAAO,CAACC,UAAR,CAAmB8C,IAAnB,CAAwB,YAAxB,CAA7B;AAEA,UAAMC,aAAa,GAAGpB,kBAAkB,EAAxC;AAEA,WAAOkB,cAAc,CAACG,MAAf,CAAsBD,aAAtB,CAAP;AACH,GAND;;AAQA,QAAM/C,UAAU,GAAG,YAAY;AAC3B,UAAMiD,UAAU,GAAG,MAAM3B,qBAAqB,CAAC,GAAD,CAA9C;AACA,UAAMpB,MAAM,GAAG,MAAM0C,UAAU,EAA/B;AACA,WAAOpB,KAAK,CAAC0B,WAAN,CAAkBhD,MAAlB,EAA0B,MAAMQ,KAAN,IAAe;AAC5C,UAAI,CAACc,KAAK,CAAC2B,iBAAN,CAAwBrD,OAAxB,EAAiCmD,UAAjC,EAA6CvC,KAA7C,CAAL,EAA0D;AACtD,eAAO,KAAP;AACH;;AACD,aAAOc,KAAK,CAAC4B,mBAAN,CAA0BtD,OAA1B,EAAmCY,KAAnC,CAAP;AACH,KALM,CAAP;AAMH,GATD;;AAWA,QAAM2C,QAAQ,GAAG,MAAOhC,OAAP,IAA8C;AAC3D,UAAM4B,UAAU,GAAG,MAAM3B,qBAAqB,CAAC,GAAD,CAA9C;AAEA,UAAMZ,KAAK,GAAG,MAAM6B,SAAS,CAAClB,OAAD,CAA7B;AAEAG,IAAAA,KAAK,CAAC8B,cAAN,CAAqBxD,OAArB,EAA8BmD,UAA9B,EAA0CvC,KAA1C;AACA,UAAMc,KAAK,CAAC+B,gBAAN,CAAuBzD,OAAvB,EAAgCY,KAAhC,CAAN;AAEA,WAAOA,KAAP;AACH,GATD;;AAWA,QAAM8C,eAAmD,GAAG,MACxDC,MADwD,IAE7B;AAC3B,UAAMpC,OAAO,GAAG,OAAOoC,MAAP,KAAkB,QAAlB,GAA6BA,MAA7B,GAAsCA,MAAM,CAACpC,OAA7D;;AACA,QAAIL,QAAQ,CAAC0C,GAAT,CAAarC,OAAb,CAAJ,EAA2B;AACvB,aAAOL,QAAQ,CAAC0B,GAAT,CAAarB,OAAb,CAAP;AACH;;AACD,UAAMnB,MAAM,GAAG,MAAM0C,UAAU,EAA/B;AACA,UAAMlC,KAAK,GAAGR,MAAM,CAACuC,IAAP,CAAYkB,CAAC,IAAIA,CAAC,CAACtC,OAAF,KAAcA,OAA/B,CAAd;;AACA,QAAI,CAACX,KAAL,EAAY;AACR,YAAM,IAAIiC,6BAAJ,CAAmB,8BAA6BtB,OAAQ,IAAxD,CAAN;AACH;;AACD,WAAO,MAAMH,aAAa,CAACpB,OAAD,EAAUY,KAAV,CAA1B;AACH,GAbD;;AAeA,QAAMkD,mBAAmB,GAAG,0BAA5B;AACA,QAAMC,kBAAkB,GAAG,0BAA3B;AACA,QAAMC,uBAAuB,GAAG,0BAAhC;AACA,QAAMC,sBAAsB,GAAG,0BAA/B;AACA,QAAMC,mBAAmB,GAAG,0BAA5B;AACA,QAAMC,kBAAkB,GAAG,0BAA3B;AACA,QAAMC,mBAAmB,GAAG,0BAA5B;AACA,QAAMC,kBAAkB,GAAG,0BAA3B;AACA;AACJ;AACA;;AACI,6CAAwB;AACpBP,IAAAA,mBADoB;AAEpBE,IAAAA,uBAFoB;AAGpBlC,IAAAA,OAAO,EAAE9B,OAAO,CAAC8B,OAHG;AAIpB/B,IAAAA;AAJoB,GAAxB;AAMA,2CAAuB;AACnBC,IAAAA,OADmB;AAEnB+D,IAAAA;AAFmB,GAAvB;AAIA,6CAAwB;AACpBG,IAAAA,mBADoB;AAEpBpC,IAAAA,OAAO,EAAE9B,OAAO,CAAC8B,OAFG;AAGpB/B,IAAAA;AAHoB,GAAxB;AAKA,2CAAuB;AACnBC,IAAAA,OADmB;AAEnBmE,IAAAA;AAFmB,GAAvB;AAIA,mDAA2B;AACvBnE,IAAAA,OADuB;AAEvBiE,IAAAA;AAFuB,GAA3B;AAIA,6CAAwB;AACpBG,IAAAA,mBADoB;AAEpBtC,IAAAA,OAAO,EAAE9B,OAAO,CAAC8B,OAFG;AAGpB/B,IAAAA;AAHoB,GAAxB;AAKA,2CAAuB;AACnBC,IAAAA,OADmB;AAEnBqE,IAAAA;AAFmB,GAAvB;AAKA,SAAO;AACHP,IAAAA,mBADG;AAEHC,IAAAA,kBAFG;AAGHC,IAAAA,uBAHG;AAIHC,IAAAA,sBAJG;AAKHC,IAAAA,mBALG;AAMHC,IAAAA,kBANG;AAOHC,IAAAA,mBAPG;AAQHC,IAAAA,kBARG;AASHxD,IAAAA,gBATG;AAUH0C,IAAAA,QAVG;AAWHrD,IAAAA,UAXG;;AAYH,UAAMoE,WAAN,CAAkBC,SAAlB,EAA6B;AACzB,YAAM/C,qBAAqB,CAAC,GAAD,CAA3B;AAEA,YAAMgD,WAAW,GAAG,IAAIC,+BAAJ,GAA8BC,QAA9B,CAAuCH,SAAvC,CAApB;AACA,YAAMC,WAAW,CAACG,QAAZ,EAAN;AACA,YAAMC,KAA0B,GAAG,MAAMJ,WAAW,CAACK,MAAZ,EAAzC;AAEA7E,MAAAA,OAAO,CAAC8E,QAAR,CAAiBC,oBAAjB;AACA,YAAMC,KAAK,GAAG,MAAMhF,OAAO,CAACiF,GAAR,CAAYC,QAAZ,CAAqBN,KAAK,CAACI,KAA3B,CAApB;AACAhF,MAAAA,OAAO,CAAC8E,QAAR,CAAiBK,mBAAjB;;AACA,UAAI,CAACH,KAAL,EAAY;AACR,cAAM,IAAInC,6BAAJ,CAAmB,sBAAqB+B,KAAK,CAACI,KAAM,IAApD,CAAN;AACH;;AAED,YAAMI,QAAQ,GAAGvF,WAAW,EAA5B;AACA,YAAMe,KAAe,GAAG;AACpByE,QAAAA,IAAI,EAAET,KAAK,CAACS,IADQ;AAEpBC,QAAAA,WAAW,EAAEV,KAAK,CAACU,WAAN,IAAqB,EAFd;AAGpB/D,QAAAA,OAAO,EAAEqD,KAAK,CAACrD,OAAN,IAAiB,EAHN;AAIpBgE,QAAAA,YAAY,EAAE,IAJM;AAKpB9E,QAAAA,MAAM,EAAEX,SAAS,GAAGY,IALA;AAMpBH,QAAAA,MAAM,EAAEX,SAAS,GAAGY,EANA;AAOpBwE,QAAAA,KAAK,EAAE;AACHxE,UAAAA,EAAE,EAAEwE,KAAK,CAACxE,EADP;AAEH6E,UAAAA,IAAI,EAAEL,KAAK,CAACK;AAFT,SAPa;AAWpBG,QAAAA,SAAS,EAAE;AACPhF,UAAAA,EAAE,EAAE4E,QAAQ,CAAC5E,EADN;AAEPiF,UAAAA,WAAW,EAAEL,QAAQ,CAACK,WAFf;AAGPxD,UAAAA,IAAI,EAAEmD,QAAQ,CAACnD;AAHR,SAXS;AAgBpByD,QAAAA,SAAS,EAAE,IAAIC,IAAJ,GAAWC,WAAX,EAhBS;AAiBpBC,QAAAA,OAAO,EAAE,IAAIF,IAAJ,GAAWC,WAAX,EAjBW;AAkBpBE,QAAAA,MAAM,EAAE,EAlBY;AAmBpBC,QAAAA,YAAY,EAAE,EAnBM;AAoBpBC,QAAAA,MAAM,EAAE,EApBY;AAqBpBzD,QAAAA,aAAa,EAAEvC,OAAO,CAACwC;AArBH,OAAxB;AAwBA,YAAMsB,mBAAmB,CAACmC,OAApB,CAA4B;AAC9BrB,QAAAA,KAD8B;AAE9BhE,QAAAA;AAF8B,OAA5B,CAAN;AAKA,YAAMsF,YAAY,GAAG,MAAMnG,iBAAiB,CAACK,MAAlB,CAAyB+F,MAAzB,CAAgC;AACvDvF,QAAAA;AADuD,OAAhC,CAA3B;AAIAX,MAAAA,OAAO,CAACC,UAAR,CAAmBe,QAAnB;AAEA,YAAMG,aAAa,CAACpB,OAAD,EAAUY,KAAV,CAAnB;AAEA,YAAMmD,kBAAkB,CAACkC,OAAnB,CAA2B;AAC7BrB,QAAAA,KAD6B;AAE7BhE,QAAAA,KAAK,EAAEsF;AAFsB,OAA3B,CAAN;AAKA,aAAOA,YAAP;AACH,KAtEE;;AAuEH;AACR;AACA;AACA;AACQ,UAAME,iBAAN,CAAwBzG,MAAxB,EAAgC;AAC5B,YAAM;AAAEiB,QAAAA,KAAK,EAAEyF,YAAT;AAAuBC,QAAAA;AAAvB,UAAoC3G,MAA1C;;AAEA,YAAMiB,KAAe,mCACdyF,YADc;AAEjB9F,QAAAA,MAAM,EAAE8F,YAAY,CAAC9F,MAAb,IAAuBX,SAAS,GAAGY,EAF1B;AAGjBC,QAAAA,MAAM,EAAE4F,YAAY,CAAC5F,MAAb,IAAuBX,SAAS,GAAGY,IAH1B;AAIjB6B,QAAAA,aAAa,EAAEvC,OAAO,CAACwC;AAJN,QAArB;;AAOA,YAAM0B,mBAAmB,CAAC+B,OAApB,CAA4B;AAC9BrB,QAAAA,KAAK,EAAE,EADuB;AAE9B0B,QAAAA,QAF8B;AAG9B1F,QAAAA;AAH8B,OAA5B,CAAN;AAMA,YAAM2F,WAAW,GAAG,MAAMxG,iBAAiB,CAACK,MAAlB,CAAyBoG,MAAzB,CAAgC;AACtD5F,QAAAA;AADsD,OAAhC,CAA1B;AAIA,YAAMQ,aAAa,CAACpB,OAAD,EAAUuG,WAAV,CAAnB;AAEAtG,MAAAA,OAAO,CAACC,UAAR,CAAmBe,QAAnB;AAEA,YAAMkD,kBAAkB,CAAC8B,OAAnB,CAA2B;AAC7BrB,QAAAA,KAAK,EAAE,EADsB;AAE7B0B,QAAAA,QAF6B;AAG7B1F,QAAAA,KAAK,EAAE2F;AAHsB,OAA3B,CAAN;AAMA,aAAOA,WAAP;AACH,KA1GE;;AA2GH,UAAME,eAAN,CAAsBlF,OAAtB,EAA+BmF,IAA/B,EAAqC;AACjC,YAAMlF,qBAAqB,CAAC,GAAD,CAA3B;AACA;AACZ;AACA;;AACY,YAAM8E,QAAQ,GAAG,MAAM/C,QAAQ,CAAChC,OAAD,CAA/B;AAEA,YAAMiD,WAAW,GAAG,IAAImC,mCAAJ,GAAkCjC,QAAlC,CAA2C;AAC3DW,QAAAA,IAAI,EAAEqB,IAAI,CAACrB,IADgD;AAE3D9D,QAAAA,OAAO,EAAEmF,IAAI,CAACnF,OAF6C;AAG3D+D,QAAAA,WAAW,EAAEoB,IAAI,CAACpB,WAAL,IAAoBgB,QAAQ,CAAChB,WAHiB;AAI3DN,QAAAA,KAAK,EAAE0B,IAAI,CAAC1B,KAJ+C;AAK3DvE,QAAAA,MAAM,EAAEiG,IAAI,CAACjG;AAL8C,OAA3C,CAApB;AAQA,YAAM+D,WAAW,CAACG,QAAZ,EAAN;AACA,YAAMC,KAA8B,GAAG,MAAMJ,WAAW,CAACK,MAAZ,EAA7C;AAEA,YAAMpE,MAAM,GAAG,MAAMT,OAAO,CAAC4G,IAAR,CAAa9G,SAAb,CAAuB8E,KAAK,CAACnE,MAAN,IAAgB6F,QAAQ,CAAC7F,MAAhD,CAArB;;AACA,UAAI,CAACA,MAAL,EAAa;AACT,cAAM,IAAIoC,6BAAJ,CAAmB,uBAAsB+B,KAAK,CAACnE,MAAO,IAAtD,CAAN;AACH;AACD;AACZ;AACA;;;AACY,YAAMuE,KAAK,GAAG,MAAMhF,OAAO,CAACiF,GAAR,CAAYlF,iBAAZ,CAA8B8G,MAA9B,CAAqCjE,GAArC,CAAyC;AACzDpC,QAAAA,EAAE,EAAEoE,KAAK,CAACI,KAD+C;AAEzDzE,QAAAA,MAAM,EAAE+F,QAAQ,CAAC/F,MAFwC;AAGzDE,QAAAA,MAAM,EAAEA,MAAM,CAACC;AAH0C,OAAzC,CAApB;;AAKA,UAAI,CAACsE,KAAL,EAAY;AACR,cAAM,IAAInC,6BAAJ,CAAmB,sBAAqB+B,KAAK,CAACI,KAAM,IAApD,CAAN;AACH;;AAED,YAAMI,QAAQ,GAAGvF,WAAW,EAA5B;;AACA,YAAMe,KAAe,mCACd0F,QADc;AAEjB7F,QAAAA,MAAM,EAAEA,MAAM,CAACC,IAFE;AAGjBsE,QAAAA,KAAK,EAAE;AACHxE,UAAAA,EAAE,EAAEwE,KAAK,CAACxE,EADP;AAEH6E,UAAAA,IAAI,EAAEL,KAAK,CAACK;AAFT,SAHU;AAOjBA,QAAAA,IAAI,EAAET,KAAK,CAACS,IAPK;AAQjB9D,QAAAA,OAAO,EAAEqD,KAAK,CAACrD,OAAN,IAAiB,EART;AASjB+D,QAAAA,WAAW,EAAEV,KAAK,CAACU,WAAN,IAAqB,EATjB;AAUjBE,QAAAA,SAAS,EAAE;AACPhF,UAAAA,EAAE,EAAE4E,QAAQ,CAAC5E,EADN;AAEPiF,UAAAA,WAAW,EAAEL,QAAQ,CAACK,WAFf;AAGPxD,UAAAA,IAAI,EAAEmD,QAAQ,CAACnD;AAHR,SAVM;AAejByD,QAAAA,SAAS,EAAE,IAAIC,IAAJ,GAAWC,WAAX,EAfM;AAgBjBC,QAAAA,OAAO,EAAE,IAAIF,IAAJ,GAAWC,WAAX,EAhBQ;AAiBjBG,QAAAA,YAAY,EAAE,EAjBG;AAkBjBxD,QAAAA,aAAa,EAAEvC,OAAO,CAACwC;AAlBN,QAArB;;AAqBA,YAAMwB,uBAAuB,CAACiC,OAAxB,CAAgC;AAClCrB,QAAAA,KADkC;AAElChE,QAAAA,KAFkC;AAGlC0F,QAAAA;AAHkC,OAAhC,CAAN;AAMA,YAAMJ,YAAY,GAAG,MAAMnG,iBAAiB,CAACK,MAAlB,CAAyB+F,MAAzB,CAAgC;AACvDvF,QAAAA;AADuD,OAAhC,CAA3B;AAIAX,MAAAA,OAAO,CAACC,UAAR,CAAmBe,QAAnB;AAEA,YAAMG,aAAa,CAACpB,OAAD,EAAUY,KAAV,CAAnB;AAEA,YAAMqD,sBAAsB,CAACgC,OAAvB,CAA+B;AACjCrB,QAAAA,KADiC;AAEjC0B,QAAAA,QAFiC;AAGjC1F,QAAAA,KAAK,EAAEsF;AAH0B,OAA/B,CAAN;AAMA,aAAOA,YAAP;AACH,KAxLE;;AAyLH,UAAMY,WAAN,CAAkBvF,OAAlB,EAA2BgD,SAA3B,EAAsC;AAClC,YAAM/C,qBAAqB,CAAC,GAAD,CAA3B,CADkC,CAGlC;;AACA,YAAM8E,QAAQ,GAAG,MAAM/C,QAAQ,CAAChC,OAAD,CAA/B;AAEA,YAAMwF,WAAW,GAAG,IAAIC,+BAAJ,GAA8BtC,QAA9B,CAAuCH,SAAvC,CAApB;AACA,YAAMwC,WAAW,CAACpC,QAAZ,EAAN;AAEA,YAAMC,KAA0B,GAAG,MAAMmC,WAAW,CAAClC,MAAZ,CAAmB;AAAEoC,QAAAA,SAAS,EAAE;AAAb,OAAnB,CAAzC;;AACA,UAAIlG,MAAM,CAACmG,IAAP,CAAYtC,KAAZ,EAAmBuC,MAAnB,KAA8B,CAAlC,EAAqC;AACjC;AAChB;AACA;AACgB,eAAOb,QAAP;AACH;;AACD,UAAItB,KAAwB,GAAG;AAC3BxE,QAAAA,EAAE,EAAE8F,QAAQ,CAACtB,KAAT,CAAexE,EADQ;AAE3B6E,QAAAA,IAAI,EAAEiB,QAAQ,CAACtB,KAAT,CAAeK;AAFM,OAA/B;;AAIA,UAAIT,KAAK,CAACI,KAAV,EAAiB;AACbhF,QAAAA,OAAO,CAAC8E,QAAR,CAAiBC,oBAAjB;AACA,cAAMqC,SAAS,GAAG,MAAMpH,OAAO,CAACiF,GAAR,CAAYC,QAAZ,CAAqBN,KAAK,CAACI,KAA3B,CAAxB;AACAhF,QAAAA,OAAO,CAAC8E,QAAR,CAAiBK,mBAAjB;;AACA,YAAI,CAACiC,SAAL,EAAgB;AACZ,gBAAM,IAAIvE,6BAAJ,CAAmB,sBAAqB+B,KAAK,CAACI,KAAM,IAApD,CAAN;AACH;;AACDA,QAAAA,KAAK,GAAG;AACJxE,UAAAA,EAAE,EAAE4G,SAAS,CAAC5G,EADV;AAEJ6E,UAAAA,IAAI,EAAE+B,SAAS,CAAC/B;AAFZ,SAAR;AAIH;;AACD,YAAMgC,WAAW,GAAG,MAAM,0CAAkBf,QAAlB,EAA4B/B,SAA5B,CAA1B;;AACA,YAAM3D,KAAe,iDACd0F,QADc,GAEd1B,KAFc;AAGjBI,QAAAA,KAHiB;AAIjBzE,QAAAA,MAAM,EAAE+F,QAAQ,CAAC/F,MAAT,IAAmBX,SAAS,GAAGY,EAJtB;AAKjBC,QAAAA,MAAM,EAAE6F,QAAQ,CAAC7F,MAAT,IAAmBX,SAAS,GAAGY,IALtB;AAMjB6B,QAAAA,aAAa,EAAEvC,OAAO,CAACwC,cANN;AAOjBsD,QAAAA,MAAM,EAAEuB,WAPS;AAQjBxB,QAAAA,OAAO,EAAE,IAAIF,IAAJ,GAAWC,WAAX;AARQ,QAArB;;AAUA,0CAAehF,KAAf,EAAsByG,WAAtB;AAEA,YAAMnD,mBAAmB,CAAC+B,OAApB,CAA4B;AAC9BrB,QAAAA,KAD8B;AAE9B0B,QAAAA,QAF8B;AAG9B1F,QAAAA;AAH8B,OAA5B,CAAN;AAMA,YAAM2F,WAAW,GAAG,MAAMxG,iBAAiB,CAACK,MAAlB,CAAyBoG,MAAzB,CAAgC;AACtD5F,QAAAA;AADsD,OAAhC,CAA1B;AAIA,YAAMQ,aAAa,CAACpB,OAAD,EAAUuG,WAAV,CAAnB;AAEA,YAAMpC,kBAAkB,CAAC8B,OAAnB,CAA2B;AAC7BrB,QAAAA,KAD6B;AAE7B0B,QAAAA,QAF6B;AAG7B1F,QAAAA,KAAK,EAAE2F;AAHsB,OAA3B,CAAN;AAMA,aAAOA,WAAP;AACH,KAzPE;;AA0PH,UAAMe,WAAN,CAAkB/F,OAAlB,EAA2B;AACvB,YAAMC,qBAAqB,CAAC,GAAD,CAA3B;AAEA,YAAMZ,KAAK,GAAG,MAAM2C,QAAQ,CAAChC,OAAD,CAA5B;AAEA,YAAM6C,mBAAmB,CAAC6B,OAApB,CAA4B;AAC9BrF,QAAAA;AAD8B,OAA5B,CAAN;;AAIA,UAAI;AACA,cAAMb,iBAAiB,CAACK,MAAlB,CAAyBmH,MAAzB,CAAgC;AAClC3G,UAAAA;AADkC,SAAhC,CAAN;AAGH,OAJD,CAIE,OAAO4G,EAAP,EAAW;AACT,cAAM,IAAIC,cAAJ,CACFD,EAAE,CAACE,OAAH,IAAc,oCADZ,EAEFF,EAAE,CAAC9G,IAAH,IAAW,4BAFT,EAGF;AACIiH,UAAAA,KAAK,EAAEH,EADX;AAEIjG,UAAAA,OAAO,EAAEX,KAAK,CAACW;AAFnB,SAHE,CAAN;AAQH;;AAED,YAAM8C,kBAAkB,CAAC4B,OAAnB,CAA2B;AAC7BrF,QAAAA;AAD6B,OAA3B,CAAN;AAIAM,MAAAA,QAAQ,CAACqG,MAAT,CAAgB3G,KAAK,CAACW,OAAtB;AACH,KAvRE;;AAwRHmC,IAAAA,eAxRG;AAyRHkE,IAAAA,eAAe,EAAE,MAAMhH,KAAN,IAAe;AAC5B,aAAO8C,eAAe,CAAC9C,KAAD,CAAtB;AACH,KA3RE;AA4RHiH,IAAAA,WAAW,EAAE,MAAM3G,QA5RhB;AA6RH4G,IAAAA,gBAAgB,EAAE,MAAM5G;AA7RrB,GAAP;AA+RH,CA1dM","sourcesContent":["import {\n CmsContext,\n CmsModel,\n CmsModelContext,\n CmsModelManager,\n CmsModelPermission,\n HeadlessCmsStorageOperations,\n BeforeModelCreateTopicParams,\n AfterModelCreateTopicParams,\n BeforeModelUpdateTopicParams,\n AfterModelUpdateTopicParams,\n BeforeModelDeleteTopicParams,\n AfterModelDeleteTopicParams,\n BeforeModelCreateFromTopicParams,\n AfterModelCreateFromTopicParams,\n CmsModelCreateInput,\n CmsModelUpdateInput,\n CmsModelCreateFromInput\n} from \"~/types\";\nimport * as utils from \"~/utils\";\nimport DataLoader from \"dataloader\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { contentModelManagerFactory } from \"./contentModel/contentModelManagerFactory\";\nimport {\n CreateContentModelModel,\n CreateContentModelModelFrom,\n UpdateContentModelModel\n} from \"./contentModel/models\";\nimport { createFieldModels } from \"./contentModel/createFieldModels\";\nimport { validateLayout } from \"./contentModel/validateLayout\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/content/plugins/CmsModelPlugin\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignBeforeModelCreate } from \"./contentModel/beforeCreate\";\nimport { assignBeforeModelUpdate } from \"./contentModel/beforeUpdate\";\nimport { assignBeforeModelDelete } from \"./contentModel/beforeDelete\";\nimport { assignAfterModelCreate } from \"./contentModel/afterCreate\";\nimport { assignAfterModelUpdate } from \"./contentModel/afterUpdate\";\nimport { assignAfterModelDelete } from \"./contentModel/afterDelete\";\nimport { assignAfterModelCreateFrom } from \"~/content/plugins/crud/contentModel/afterCreateFrom\";\n\nexport interface CreateModelsCrudParams {\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n}\nexport const createModelsCrud = (params: CreateModelsCrudParams): CmsModelContext => {\n const { getTenant, getIdentity, getLocale, storageOperations, context } = params;\n\n const loaders = {\n listModels: new DataLoader(async () => {\n const models = await storageOperations.models.list({\n where: {\n tenant: getTenant().id,\n locale: getLocale().code\n }\n });\n return [\n models.map(model => {\n return {\n ...model,\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n })\n ];\n })\n };\n\n const clearModelsCache = (): void => {\n for (const loader of Object.values(loaders)) {\n loader.clearAll();\n }\n };\n\n const managers = new Map<string, CmsModelManager>();\n const updateManager = async (\n context: CmsContext,\n model: CmsModel\n ): Promise<CmsModelManager> => {\n const manager = await contentModelManagerFactory(context, model);\n managers.set(model.modelId, manager);\n return manager;\n };\n\n const checkModelPermissions = (check: string): Promise<CmsModelPermission> => {\n return utils.checkPermissions(context, \"cms.contentModel\", { rwd: check });\n };\n\n const getModelsAsPlugins = (): CmsModel[] => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n return (\n context.plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n /**\n * We need to filter out models that are not for this tenant or locale.\n * If it does not have tenant or locale define, it is for every locale and tenant\n */\n .filter(plugin => {\n const { tenant: t, locale: l } = plugin.contentModel;\n if (t && t !== tenant) {\n return false;\n } else if (l && l !== locale) {\n return false;\n }\n return true;\n })\n .map<CmsModel>(plugin => {\n return {\n ...plugin.contentModel,\n tenant,\n locale,\n webinyVersion: context.WEBINY_VERSION\n };\n })\n );\n };\n\n const modelsGet = async (modelId: string): Promise<CmsModel> => {\n const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);\n\n if (pluginModel) {\n return pluginModel;\n }\n\n const model = await storageOperations.models.get({\n tenant: getTenant().id,\n locale: getLocale().code,\n modelId\n });\n\n if (!model) {\n throw new NotFoundError(`Content model \"${modelId}\" was not found!`);\n }\n\n return {\n ...model,\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n };\n\n const modelsList = async (): Promise<CmsModel[]> => {\n const databaseModels = await loaders.listModels.load(\"listModels\");\n\n const pluginsModels = getModelsAsPlugins();\n\n return databaseModels.concat(pluginsModels);\n };\n\n const listModels = async () => {\n const permission = await checkModelPermissions(\"r\");\n const models = await modelsList();\n return utils.filterAsync(models, async model => {\n if (!utils.validateOwnership(context, permission, model)) {\n return false;\n }\n return utils.validateModelAccess(context, model);\n });\n };\n\n const getModel = async (modelId: string): Promise<CmsModel> => {\n const permission = await checkModelPermissions(\"r\");\n\n const model = await modelsGet(modelId);\n\n utils.checkOwnership(context, permission, model);\n await utils.checkModelAccess(context, model);\n\n return model;\n };\n\n const getModelManager: CmsModelContext[\"getModelManager\"] = async (\n target\n ): Promise<CmsModelManager> => {\n const modelId = typeof target === \"string\" ? target : target.modelId;\n if (managers.has(modelId)) {\n return managers.get(modelId) as CmsModelManager;\n }\n const models = await modelsList();\n const model = models.find(m => m.modelId === modelId);\n if (!model) {\n throw new NotFoundError(`There is no content model \"${modelId}\".`);\n }\n return await updateManager(context, model);\n };\n\n const onBeforeModelCreate = createTopic<BeforeModelCreateTopicParams>();\n const onAfterModelCreate = createTopic<AfterModelCreateTopicParams>();\n const onBeforeModelCreateFrom = createTopic<BeforeModelCreateFromTopicParams>();\n const onAfterModelCreateFrom = createTopic<AfterModelCreateFromTopicParams>();\n const onBeforeModelUpdate = createTopic<BeforeModelUpdateTopicParams>();\n const onAfterModelUpdate = createTopic<AfterModelUpdateTopicParams>();\n const onBeforeModelDelete = createTopic<BeforeModelDeleteTopicParams>();\n const onAfterModelDelete = createTopic<AfterModelDeleteTopicParams>();\n /**\n * We need to assign some default behaviors.\n */\n assignBeforeModelCreate({\n onBeforeModelCreate,\n onBeforeModelCreateFrom,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelCreate({\n context,\n onAfterModelCreate\n });\n assignBeforeModelUpdate({\n onBeforeModelUpdate,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelUpdate({\n context,\n onAfterModelUpdate\n });\n assignAfterModelCreateFrom({\n context,\n onAfterModelCreateFrom\n });\n assignBeforeModelDelete({\n onBeforeModelDelete,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelDelete({\n context,\n onAfterModelDelete\n });\n\n return {\n onBeforeModelCreate,\n onAfterModelCreate,\n onBeforeModelCreateFrom,\n onAfterModelCreateFrom,\n onBeforeModelUpdate,\n onAfterModelUpdate,\n onBeforeModelDelete,\n onAfterModelDelete,\n clearModelsCache,\n getModel,\n listModels,\n async createModel(inputData) {\n await checkModelPermissions(\"w\");\n\n const createdData = new CreateContentModelModel().populate(inputData);\n await createdData.validate();\n const input: CmsModelCreateInput = await createdData.toJSON();\n\n context.security.disableAuthorization();\n const group = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const identity = getIdentity();\n const model: CmsModel = {\n name: input.name,\n description: input.description || \"\",\n modelId: input.modelId || \"\",\n titleFieldId: \"id\",\n locale: getLocale().code,\n tenant: getTenant().id,\n group: {\n id: group.id,\n name: group.name\n },\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n fields: [],\n lockedFields: [],\n layout: [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onBeforeModelCreate.publish({\n input,\n model\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onAfterModelCreate.publish({\n input,\n model: createdModel\n });\n\n return createdModel;\n },\n /**\n * Method does not check for permissions or ownership.\n * @internal\n */\n async updateModelDirect(params) {\n const { model: initialModel, original } = params;\n\n const model: CmsModel = {\n ...initialModel,\n tenant: initialModel.tenant || getTenant().id,\n locale: initialModel.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onBeforeModelUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n loaders.listModels.clearAll();\n\n await onAfterModelUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model: resultModel\n });\n\n return resultModel;\n },\n async createModelFrom(modelId, data) {\n await checkModelPermissions(\"w\");\n /**\n * Get a model record; this will also perform ownership validation.\n */\n const original = await getModel(modelId);\n\n const createdData = new CreateContentModelModelFrom().populate({\n name: data.name,\n modelId: data.modelId,\n description: data.description || original.description,\n group: data.group,\n locale: data.locale\n });\n\n await createdData.validate();\n const input: CmsModelCreateFromInput = await createdData.toJSON();\n\n const locale = await context.i18n.getLocale(input.locale || original.locale);\n if (!locale) {\n throw new NotFoundError(`There is no locale \"${input.locale}\".`);\n }\n /**\n * Use storage operations directly because we cannot get group from different locale via context methods.\n */\n const group = await context.cms.storageOperations.groups.get({\n id: input.group,\n tenant: original.tenant,\n locale: locale.code\n });\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const identity = getIdentity();\n const model: CmsModel = {\n ...original,\n locale: locale.code,\n group: {\n id: group.id,\n name: group.name\n },\n name: input.name,\n modelId: input.modelId || \"\",\n description: input.description || \"\",\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n lockedFields: [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onBeforeModelCreateFrom.publish({\n input,\n model,\n original\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onAfterModelCreateFrom.publish({\n input,\n original,\n model: createdModel\n });\n\n return createdModel;\n },\n async updateModel(modelId, inputData) {\n await checkModelPermissions(\"w\");\n\n // Get a model record; this will also perform ownership validation.\n const original = await getModel(modelId);\n\n const updatedData = new UpdateContentModelModel().populate(inputData);\n await updatedData.validate();\n\n const input: CmsModelUpdateInput = await updatedData.toJSON({ onlyDirty: true });\n if (Object.keys(input).length === 0) {\n /**\n * We need to return the original if nothing is to be updated.\n */\n return original;\n }\n let group: CmsModel[\"group\"] = {\n id: original.group.id,\n name: original.group.name\n };\n if (input.group) {\n context.security.disableAuthorization();\n const groupData = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!groupData) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n group = {\n id: groupData.id,\n name: groupData.name\n };\n }\n const modelFields = await createFieldModels(original, inputData);\n const model: CmsModel = {\n ...original,\n ...input,\n group,\n tenant: original.tenant || getTenant().id,\n locale: original.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION,\n fields: modelFields,\n savedOn: new Date().toISOString() as any\n };\n validateLayout(model, modelFields);\n\n await onBeforeModelUpdate.publish({\n input,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n await onAfterModelUpdate.publish({\n input,\n original,\n model: resultModel\n });\n\n return resultModel;\n },\n async deleteModel(modelId) {\n await checkModelPermissions(\"d\");\n\n const model = await getModel(modelId);\n\n await onBeforeModelDelete.publish({\n model\n });\n\n try {\n await storageOperations.models.delete({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete the content model\",\n ex.code || \"CONTENT_MODEL_DELETE_ERROR\",\n {\n error: ex,\n modelId: model.modelId\n }\n );\n }\n\n await onAfterModelDelete.publish({\n model\n });\n\n managers.delete(model.modelId);\n },\n getModelManager,\n getEntryManager: async model => {\n return getModelManager(model);\n },\n getManagers: () => managers,\n getEntryManagers: () => managers\n };\n};\n"]}
|
|
1
|
+
{"version":3,"names":["createModelsCrud","params","getTenant","getIdentity","getLocale","storageOperations","context","loaders","listModels","DataLoader","models","list","where","tenant","id","locale","code","map","model","clearModelsCache","loader","Object","values","clearAll","managers","Map","updateManager","manager","contentModelManagerFactory","set","modelId","checkModelPermissions","check","utils","checkPermissions","rwd","getModelsAsPlugins","plugins","byType","CmsModelPlugin","type","filter","plugin","t","l","contentModel","webinyVersion","WEBINY_VERSION","modelsGet","pluginModel","find","get","NotFoundError","modelsList","databaseModels","load","pluginsModels","concat","permission","filterAsync","validateOwnership","validateModelAccess","getModel","checkOwnership","checkModelAccess","getModelManager","target","has","m","onBeforeModelCreate","createTopic","onAfterModelCreate","onBeforeModelCreateFrom","onAfterModelCreateFrom","onBeforeModelUpdate","onAfterModelUpdate","onBeforeModelDelete","onAfterModelDelete","assignBeforeModelCreate","assignAfterModelCreate","assignBeforeModelUpdate","assignAfterModelUpdate","assignAfterModelCreateFrom","assignBeforeModelDelete","assignAfterModelDelete","createModel","inputData","createdData","CreateContentModelModel","populate","validate","input","toJSON","security","disableAuthorization","group","cms","getGroup","enableAuthorization","fields","createFieldModels","identity","name","description","titleFieldId","createdBy","displayName","createdOn","Date","toISOString","savedOn","lockedFields","layout","validateLayout","publish","createdModel","create","updateModelDirect","initialModel","original","resultModel","update","createModelFrom","data","CreateContentModelModelFrom","i18n","groups","updateModel","updatedData","UpdateContentModelModel","onlyDirty","keys","length","groupData","deleteModel","delete","ex","WebinyError","message","error","getEntryManager","getManagers","getEntryManagers"],"sources":["contentModel.crud.ts"],"sourcesContent":["import {\n CmsContext,\n CmsModel,\n CmsModelContext,\n CmsModelManager,\n CmsModelPermission,\n HeadlessCmsStorageOperations,\n BeforeModelCreateTopicParams,\n AfterModelCreateTopicParams,\n BeforeModelUpdateTopicParams,\n AfterModelUpdateTopicParams,\n BeforeModelDeleteTopicParams,\n AfterModelDeleteTopicParams,\n BeforeModelCreateFromTopicParams,\n AfterModelCreateFromTopicParams,\n CmsModelCreateInput,\n CmsModelUpdateInput,\n CmsModelCreateFromInput\n} from \"~/types\";\nimport * as utils from \"~/utils\";\nimport DataLoader from \"dataloader\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { contentModelManagerFactory } from \"./contentModel/contentModelManagerFactory\";\nimport {\n CreateContentModelModel,\n CreateContentModelModelFrom,\n UpdateContentModelModel\n} from \"./contentModel/models\";\nimport { createFieldModels } from \"./contentModel/createFieldModels\";\nimport { validateLayout } from \"./contentModel/validateLayout\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/content/plugins/CmsModelPlugin\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignBeforeModelCreate } from \"./contentModel/beforeCreate\";\nimport { assignBeforeModelUpdate } from \"./contentModel/beforeUpdate\";\nimport { assignBeforeModelDelete } from \"./contentModel/beforeDelete\";\nimport { assignAfterModelCreate } from \"./contentModel/afterCreate\";\nimport { assignAfterModelUpdate } from \"./contentModel/afterUpdate\";\nimport { assignAfterModelDelete } from \"./contentModel/afterDelete\";\nimport { assignAfterModelCreateFrom } from \"~/content/plugins/crud/contentModel/afterCreateFrom\";\n\nexport interface CreateModelsCrudParams {\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n}\nexport const createModelsCrud = (params: CreateModelsCrudParams): CmsModelContext => {\n const { getTenant, getIdentity, getLocale, storageOperations, context } = params;\n\n const loaders = {\n listModels: new DataLoader(async () => {\n const models = await storageOperations.models.list({\n where: {\n tenant: getTenant().id,\n locale: getLocale().code\n }\n });\n return [\n models.map(model => {\n return {\n ...model,\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n })\n ];\n })\n };\n\n const clearModelsCache = (): void => {\n for (const loader of Object.values(loaders)) {\n loader.clearAll();\n }\n };\n\n const managers = new Map<string, CmsModelManager>();\n const updateManager = async (\n context: CmsContext,\n model: CmsModel\n ): Promise<CmsModelManager> => {\n const manager = await contentModelManagerFactory(context, model);\n managers.set(model.modelId, manager);\n return manager;\n };\n\n const checkModelPermissions = (check: string): Promise<CmsModelPermission> => {\n return utils.checkPermissions(context, \"cms.contentModel\", { rwd: check });\n };\n\n const getModelsAsPlugins = (): CmsModel[] => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n return (\n context.plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n /**\n * We need to filter out models that are not for this tenant or locale.\n * If it does not have tenant or locale define, it is for every locale and tenant\n */\n .filter(plugin => {\n const { tenant: t, locale: l } = plugin.contentModel;\n if (t && t !== tenant) {\n return false;\n } else if (l && l !== locale) {\n return false;\n }\n return true;\n })\n .map<CmsModel>(plugin => {\n return {\n ...plugin.contentModel,\n tenant,\n locale,\n webinyVersion: context.WEBINY_VERSION\n };\n })\n );\n };\n\n const modelsGet = async (modelId: string): Promise<CmsModel> => {\n const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);\n\n if (pluginModel) {\n return pluginModel;\n }\n\n const model = await storageOperations.models.get({\n tenant: getTenant().id,\n locale: getLocale().code,\n modelId\n });\n\n if (!model) {\n throw new NotFoundError(`Content model \"${modelId}\" was not found!`);\n }\n\n return {\n ...model,\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n };\n\n const modelsList = async (): Promise<CmsModel[]> => {\n const databaseModels = await loaders.listModels.load(\"listModels\");\n\n const pluginsModels = getModelsAsPlugins();\n\n return databaseModels.concat(pluginsModels);\n };\n\n const listModels = async () => {\n const permission = await checkModelPermissions(\"r\");\n const models = await modelsList();\n return utils.filterAsync(models, async model => {\n if (!utils.validateOwnership(context, permission, model)) {\n return false;\n }\n return utils.validateModelAccess(context, model);\n });\n };\n\n const getModel = async (modelId: string): Promise<CmsModel> => {\n const permission = await checkModelPermissions(\"r\");\n\n const model = await modelsGet(modelId);\n\n utils.checkOwnership(context, permission, model);\n await utils.checkModelAccess(context, model);\n\n return model;\n };\n\n const getModelManager: CmsModelContext[\"getModelManager\"] = async (\n target\n ): Promise<CmsModelManager> => {\n const modelId = typeof target === \"string\" ? target : target.modelId;\n if (managers.has(modelId)) {\n return managers.get(modelId) as CmsModelManager;\n }\n const models = await modelsList();\n const model = models.find(m => m.modelId === modelId);\n if (!model) {\n throw new NotFoundError(`There is no content model \"${modelId}\".`);\n }\n return await updateManager(context, model);\n };\n\n const onBeforeModelCreate = createTopic<BeforeModelCreateTopicParams>();\n const onAfterModelCreate = createTopic<AfterModelCreateTopicParams>();\n const onBeforeModelCreateFrom = createTopic<BeforeModelCreateFromTopicParams>();\n const onAfterModelCreateFrom = createTopic<AfterModelCreateFromTopicParams>();\n const onBeforeModelUpdate = createTopic<BeforeModelUpdateTopicParams>();\n const onAfterModelUpdate = createTopic<AfterModelUpdateTopicParams>();\n const onBeforeModelDelete = createTopic<BeforeModelDeleteTopicParams>();\n const onAfterModelDelete = createTopic<AfterModelDeleteTopicParams>();\n /**\n * We need to assign some default behaviors.\n */\n assignBeforeModelCreate({\n onBeforeModelCreate,\n onBeforeModelCreateFrom,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelCreate({\n context,\n onAfterModelCreate\n });\n assignBeforeModelUpdate({\n onBeforeModelUpdate,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelUpdate({\n context,\n onAfterModelUpdate\n });\n assignAfterModelCreateFrom({\n context,\n onAfterModelCreateFrom\n });\n assignBeforeModelDelete({\n onBeforeModelDelete,\n plugins: context.plugins,\n storageOperations\n });\n assignAfterModelDelete({\n context,\n onAfterModelDelete\n });\n\n return {\n onBeforeModelCreate,\n onAfterModelCreate,\n onBeforeModelCreateFrom,\n onAfterModelCreateFrom,\n onBeforeModelUpdate,\n onAfterModelUpdate,\n onBeforeModelDelete,\n onAfterModelDelete,\n clearModelsCache,\n getModel,\n listModels,\n async createModel(inputData) {\n await checkModelPermissions(\"w\");\n\n const createdData = new CreateContentModelModel().populate(inputData);\n await createdData.validate();\n const input: CmsModelCreateInput = await createdData.toJSON();\n\n context.security.disableAuthorization();\n const group = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const fields = await createFieldModels(input.fields);\n\n const identity = getIdentity();\n const model: CmsModel = {\n name: input.name,\n description: input.description || \"\",\n modelId: input.modelId || \"\",\n titleFieldId: \"id\",\n locale: getLocale().code,\n tenant: getTenant().id,\n group: {\n id: group.id,\n name: group.name\n },\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n fields,\n lockedFields: [],\n layout: input.layout || [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n validateLayout(model, fields);\n\n await onBeforeModelCreate.publish({\n input,\n model\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onAfterModelCreate.publish({\n input,\n model: createdModel\n });\n\n return createdModel;\n },\n /**\n * Method does not check for permissions or ownership.\n * @internal\n */\n async updateModelDirect(params) {\n const { model: initialModel, original } = params;\n\n const model: CmsModel = {\n ...initialModel,\n tenant: initialModel.tenant || getTenant().id,\n locale: initialModel.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onBeforeModelUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n loaders.listModels.clearAll();\n\n await onAfterModelUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model: resultModel\n });\n\n return resultModel;\n },\n async createModelFrom(modelId, data) {\n await checkModelPermissions(\"w\");\n /**\n * Get a model record; this will also perform ownership validation.\n */\n const original = await getModel(modelId);\n\n const createdData = new CreateContentModelModelFrom().populate({\n name: data.name,\n modelId: data.modelId,\n description: data.description || original.description,\n group: data.group,\n locale: data.locale\n });\n\n await createdData.validate();\n const input: CmsModelCreateFromInput = await createdData.toJSON();\n\n const locale = await context.i18n.getLocale(input.locale || original.locale);\n if (!locale) {\n throw new NotFoundError(`There is no locale \"${input.locale}\".`);\n }\n /**\n * Use storage operations directly because we cannot get group from different locale via context methods.\n */\n const group = await context.cms.storageOperations.groups.get({\n id: input.group,\n tenant: original.tenant,\n locale: locale.code\n });\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const identity = getIdentity();\n const model: CmsModel = {\n ...original,\n locale: locale.code,\n group: {\n id: group.id,\n name: group.name\n },\n name: input.name,\n modelId: input.modelId || \"\",\n description: input.description || \"\",\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n lockedFields: [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n await onBeforeModelCreateFrom.publish({\n input,\n model,\n original\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onAfterModelCreateFrom.publish({\n input,\n original,\n model: createdModel\n });\n\n return createdModel;\n },\n async updateModel(modelId, inputData) {\n await checkModelPermissions(\"w\");\n\n // Get a model record; this will also perform ownership validation.\n const original = await getModel(modelId);\n\n const updatedData = new UpdateContentModelModel().populate(inputData);\n await updatedData.validate();\n\n const input: CmsModelUpdateInput = await updatedData.toJSON({ onlyDirty: true });\n if (Object.keys(input).length === 0) {\n /**\n * We need to return the original if nothing is to be updated.\n */\n return original;\n }\n let group: CmsModel[\"group\"] = {\n id: original.group.id,\n name: original.group.name\n };\n if (input.group) {\n context.security.disableAuthorization();\n const groupData = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!groupData) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n group = {\n id: groupData.id,\n name: groupData.name\n };\n }\n const fields = await createFieldModels(inputData.fields);\n const model: CmsModel = {\n ...original,\n ...input,\n group,\n tenant: original.tenant || getTenant().id,\n locale: original.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION,\n fields,\n savedOn: new Date().toISOString()\n };\n validateLayout(model, fields);\n\n await onBeforeModelUpdate.publish({\n input,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n await onAfterModelUpdate.publish({\n input,\n original,\n model: resultModel\n });\n\n return resultModel;\n },\n async deleteModel(modelId) {\n await checkModelPermissions(\"d\");\n\n const model = await getModel(modelId);\n\n await onBeforeModelDelete.publish({\n model\n });\n\n try {\n await storageOperations.models.delete({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete the content model\",\n ex.code || \"CONTENT_MODEL_DELETE_ERROR\",\n {\n error: ex,\n modelId: model.modelId\n }\n );\n }\n\n await onAfterModelDelete.publish({\n model\n });\n\n managers.delete(model.modelId);\n },\n getModelManager,\n getEntryManager: async model => {\n return getModelManager(model);\n },\n getManagers: () => managers,\n getEntryManagers: () => managers\n };\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"names":["assignBeforeGroupCreate","params","onBeforeCreate","plugins","storageOperations","subscribe","group","slug","trim","groups","list","where","tenant","locale","length","WebinyError","toSlug","name","shortid","generate","groupPlugin","byType","CmsGroupPlugin","type","find","item","contentModelGroup","Error"],"sources":["beforeCreate.ts"],"sourcesContent":["import { BeforeGroupCreateTopicParams, HeadlessCmsStorageOperations } from \"~/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport { CmsGroupPlugin } from \"~/content/plugins/CmsGroupPlugin\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { toSlug } from \"~/utils\";\nimport WebinyError from \"@webiny/error\";\nimport shortid from \"shortid\";\n\ninterface AssignBeforeGroupCreateParams {\n onBeforeCreate: Topic<BeforeGroupCreateTopicParams>;\n plugins: PluginsContainer;\n storageOperations: HeadlessCmsStorageOperations;\n}\nexport const assignBeforeGroupCreate = (params: AssignBeforeGroupCreateParams) => {\n const { onBeforeCreate, plugins, storageOperations } = params;\n\n onBeforeCreate.subscribe(async params => {\n const { group } = params;\n\n if (group.slug && group.slug.trim()) {\n const groups = await storageOperations.groups.list({\n where: {\n tenant: group.tenant,\n locale: group.locale,\n slug: group.slug\n }\n });\n if (groups.length > 0) {\n throw new WebinyError(\n `Cms Group with the slug \"${group.slug}\" already exists.`,\n \"SLUG_ALREADY_EXISTS\"\n );\n }\n } else {\n const slug = toSlug(group.name);\n const groups = await storageOperations.groups.list({\n where: {\n tenant: group.tenant,\n locale: group.locale,\n slug\n }\n });\n\n if (groups.length === 0) {\n group.slug = slug;\n } else {\n group.slug = `${slug}-${shortid.generate()}`;\n }\n }\n\n const groupPlugin = plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n .find(item => item.contentModelGroup.slug === group.slug);\n\n if (groupPlugin) {\n throw new Error(\n `Cannot create \"${group.slug}\" content model group because one is already registered via a plugin.`\n );\n }\n });\n};\n"],"mappings":";;;;;;;;;AAEA;;AAEA;;AACA;;AACA;;AAOO,MAAMA,uBAAuB,GAAIC,MAAD,IAA2C;EAC9E,MAAM;IAAEC,cAAF;IAAkBC,OAAlB;IAA2BC;EAA3B,IAAiDH,MAAvD;EAEAC,cAAc,CAACG,SAAf,CAAyB,MAAMJ,MAAN,IAAgB;IACrC,MAAM;MAAEK;IAAF,IAAYL,MAAlB;;IAEA,IAAIK,KAAK,CAACC,IAAN,IAAcD,KAAK,CAACC,IAAN,CAAWC,IAAX,EAAlB,EAAqC;MACjC,MAAMC,MAAM,GAAG,MAAML,iBAAiB,CAACK,MAAlB,CAAyBC,IAAzB,CAA8B;QAC/CC,KAAK,EAAE;UACHC,MAAM,EAAEN,KAAK,CAACM,MADX;UAEHC,MAAM,EAAEP,KAAK,CAACO,MAFX;UAGHN,IAAI,EAAED,KAAK,CAACC;QAHT;MADwC,CAA9B,CAArB;;MAOA,IAAIE,MAAM,CAACK,MAAP,GAAgB,CAApB,EAAuB;QACnB,MAAM,IAAIC,cAAJ,CACD,4BAA2BT,KAAK,CAACC,IAAK,mBADrC,EAEF,qBAFE,CAAN;MAIH;IACJ,CAdD,MAcO;MACH,MAAMA,IAAI,GAAG,IAAAS,aAAA,EAAOV,KAAK,CAACW,IAAb,CAAb;MACA,MAAMR,MAAM,GAAG,MAAML,iBAAiB,CAACK,MAAlB,CAAyBC,IAAzB,CAA8B;QAC/CC,KAAK,EAAE;UACHC,MAAM,EAAEN,KAAK,CAACM,MADX;UAEHC,MAAM,EAAEP,KAAK,CAACO,MAFX;UAGHN;QAHG;MADwC,CAA9B,CAArB;;MAQA,IAAIE,MAAM,CAACK,MAAP,KAAkB,CAAtB,EAAyB;QACrBR,KAAK,CAACC,IAAN,GAAaA,IAAb;MACH,CAFD,MAEO;QACHD,KAAK,CAACC,IAAN,GAAc,GAAEA,IAAK,IAAGW,gBAAA,CAAQC,QAAR,EAAmB,EAA3C;MACH;IACJ;;IAED,MAAMC,WAAW,GAAGjB,OAAO,CACtBkB,MADe,CACQC,8BAAA,CAAeC,IADvB,EAEfC,IAFe,CAEVC,IAAI,IAAIA,IAAI,CAACC,iBAAL,CAAuBnB,IAAvB,KAAgCD,KAAK,CAACC,IAFpC,CAApB;;IAIA,IAAIa,WAAJ,EAAiB;MACb,MAAM,IAAIO,KAAJ,CACD,kBAAiBrB,KAAK,CAACC,IAAK,uEAD3B,CAAN;IAGH;EACJ,CA3CD;AA4CH,CA/CM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"names":["assignBeforeGroupDelete","params","onBeforeDelete","plugins","storageOperations","subscribe","group","groupPlugin","byType","CmsGroupPlugin","type","find","item","contentModelGroup","slug","Error","models","list","where","tenant","locale","items","filter","model","id","length","WebinyError"],"sources":["beforeDelete.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { BeforeGroupDeleteTopicParams, HeadlessCmsStorageOperations } from \"~/types\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { CmsGroupPlugin } from \"~/content/plugins/CmsGroupPlugin\";\nimport WebinyError from \"@webiny/error\";\n\ninterface AssignBeforeGroupDeleteParams {\n onBeforeDelete: Topic<BeforeGroupDeleteTopicParams>;\n plugins: PluginsContainer;\n storageOperations: HeadlessCmsStorageOperations;\n}\nexport const assignBeforeGroupDelete = (params: AssignBeforeGroupDeleteParams) => {\n const { onBeforeDelete, plugins, storageOperations } = params;\n\n onBeforeDelete.subscribe(async params => {\n const { group } = params;\n\n const groupPlugin = plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n .find(item => item.contentModelGroup.slug === group.slug);\n\n if (groupPlugin) {\n throw new Error(`Cms Groups defined via plugins cannot be deleted.`);\n }\n\n const models = await storageOperations.models.list({\n where: {\n tenant: group.tenant,\n locale: group.locale\n }\n });\n const items = models.filter(model => {\n return model.group.id === group.id;\n });\n if (items.length > 0) {\n throw new WebinyError(\n \"Cannot delete this group because there are models that belong to it.\",\n \"BEFORE_DELETE_ERROR\",\n {\n group\n }\n );\n }\n });\n};\n"],"mappings":";;;;;;;;;AAGA;;AACA;;AAOO,MAAMA,uBAAuB,GAAIC,MAAD,IAA2C;EAC9E,MAAM;IAAEC,cAAF;IAAkBC,OAAlB;IAA2BC;EAA3B,IAAiDH,MAAvD;EAEAC,cAAc,CAACG,SAAf,CAAyB,MAAMJ,MAAN,IAAgB;IACrC,MAAM;MAAEK;IAAF,IAAYL,MAAlB;IAEA,MAAMM,WAAW,GAAGJ,OAAO,CACtBK,MADe,CACQC,8BAAA,CAAeC,IADvB,EAEfC,IAFe,CAEVC,IAAI,IAAIA,IAAI,CAACC,iBAAL,CAAuBC,IAAvB,KAAgCR,KAAK,CAACQ,IAFpC,CAApB;;IAIA,IAAIP,WAAJ,EAAiB;MACb,MAAM,IAAIQ,KAAJ,CAAW,mDAAX,CAAN;IACH;;IAED,MAAMC,MAAM,GAAG,MAAMZ,iBAAiB,CAACY,MAAlB,CAAyBC,IAAzB,CAA8B;MAC/CC,KAAK,EAAE;QACHC,MAAM,EAAEb,KAAK,CAACa,MADX;QAEHC,MAAM,EAAEd,KAAK,CAACc;MAFX;IADwC,CAA9B,CAArB;IAMA,MAAMC,KAAK,GAAGL,MAAM,CAACM,MAAP,CAAcC,KAAK,IAAI;MACjC,OAAOA,KAAK,CAACjB,KAAN,CAAYkB,EAAZ,KAAmBlB,KAAK,CAACkB,EAAhC;IACH,CAFa,CAAd;;IAGA,IAAIH,KAAK,CAACI,MAAN,GAAe,CAAnB,EAAsB;MAClB,MAAM,IAAIC,cAAJ,CACF,sEADE,EAEF,qBAFE,EAGF;QACIpB;MADJ,CAHE,CAAN;IAOH;EACJ,CA7BD;AA8BH,CAjCM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"names":["assignBeforeGroupUpdate","params","onBeforeUpdate","plugins","subscribe","group","groupPlugin","byType","CmsGroupPlugin","type","find","item","contentModelGroup","slug","Error"],"sources":["beforeUpdate.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { BeforeGroupUpdateTopicParams } from \"~/types\";\nimport { CmsGroupPlugin } from \"~/content/plugins/CmsGroupPlugin\";\nimport { PluginsContainer } from \"@webiny/plugins\";\n\ninterface AssignBeforeGroupUpdateParams {\n onBeforeUpdate: Topic<BeforeGroupUpdateTopicParams>;\n plugins: PluginsContainer;\n}\nexport const assignBeforeGroupUpdate = (params: AssignBeforeGroupUpdateParams) => {\n const { onBeforeUpdate, plugins } = params;\n\n onBeforeUpdate.subscribe(({ group }) => {\n const groupPlugin = plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n .find(item => item.contentModelGroup.slug === group.slug);\n if (!groupPlugin) {\n return;\n }\n throw new Error(`Cms Groups defined via plugins cannot be updated.`);\n });\n};\n"],"mappings":";;;;;;;AAEA;;AAOO,MAAMA,uBAAuB,GAAIC,MAAD,IAA2C;EAC9E,MAAM;IAAEC,cAAF;IAAkBC;EAAlB,IAA8BF,MAApC;EAEAC,cAAc,CAACE,SAAf,CAAyB,CAAC;IAAEC;EAAF,CAAD,KAAe;IACpC,MAAMC,WAAW,GAAGH,OAAO,CACtBI,MADe,CACQC,8BAAA,CAAeC,IADvB,EAEfC,IAFe,CAEVC,IAAI,IAAIA,IAAI,CAACC,iBAAL,CAAuBC,IAAvB,KAAgCR,KAAK,CAACQ,IAFpC,CAApB;;IAGA,IAAI,CAACP,WAAL,EAAkB;MACd;IACH;;IACD,MAAM,IAAIQ,KAAJ,CAAW,mDAAX,CAAN;EACH,CARD;AASH,CAZM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["contentModelGroup.crud.ts"],"names":["CreateContentModelGroupModel","name","validation","create","slug","description","icon","UpdateContentModelGroupModel","createModelGroupsCrud","params","getTenant","getIdentity","getLocale","storageOperations","context","dataLoaders","listGroups","DataLoader","tenant","id","locale","code","pluginsGroups","getGroupsAsPlugins","map","group","groups","list","where","concat","clearGroupsCache","loader","Object","values","clearAll","plugins","byType","CmsGroupPlugin","type","filter","plugin","t","l","contentModelGroup","webinyVersion","WEBINY_VERSION","checkPermissions","check","utils","rwd","groupsGet","load","find","g","NotFoundError","groupsList","ex","WebinyError","message","data","onBeforeCreate","onAfterCreate","onBeforeUpdate","onAfterUpdate","onBeforeDelete","onAfterDelete","onBeforeGroupCreate","onAfterGroupCreate","onBeforeGroupUpdate","onAfterGroupUpdate","onBeforeGroupDelete","onAfterGroupDelete","getGroup","permission","checkOwnership","validateGroupAccess","response","validateOwnership","createGroup","inputData","createdData","populate","toSlug","validate","input","toJSON","identity","createdOn","Date","toISOString","savedOn","createdBy","displayName","publish","result","updateGroup","original","updatedDataJson","onlyDirty","keys","length","updatedGroup","update","error","deleteGroup","delete"],"mappings":"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","sourcesContent":["/**\n * Package @commodo/fields does not have types.\n */\n// @ts-ignore\nimport { withFields, string } from \"@commodo/fields\";\nimport { validation } from \"@webiny/validation\";\n/**\n * Package mdbid does not have types.\n */\n// @ts-ignore\nimport mdbid from \"mdbid\";\nimport {\n CmsGroupContext,\n CmsGroupListParams,\n CmsGroupPermission,\n CmsGroup,\n CmsContext,\n HeadlessCmsStorageOperations,\n CmsGroupCreateInput,\n BeforeGroupCreateTopicParams,\n AfterGroupCreateTopicParams,\n BeforeGroupUpdateTopicParams,\n AfterGroupUpdateTopicParams,\n BeforeGroupDeleteTopicParams,\n AfterGroupDeleteTopicParams\n} from \"~/types\";\nimport * as utils from \"~/utils\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsGroupPlugin } from \"~/content/plugins/CmsGroupPlugin\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignBeforeGroupUpdate } from \"~/content/plugins/crud/contentModelGroup/beforeUpdate\";\nimport { assignBeforeGroupCreate } from \"~/content/plugins/crud/contentModelGroup/beforeCreate\";\nimport { assignBeforeGroupDelete } from \"~/content/plugins/crud/contentModelGroup/beforeDelete\";\nimport DataLoader from \"dataloader\";\n\nconst CreateContentModelGroupModel = withFields({\n name: string({ validation: validation.create(\"required,maxLength:100\") }),\n slug: string({ validation: validation.create(\"maxLength:100\") }),\n description: string({ validation: validation.create(\"maxLength:255\") }),\n icon: string({ validation: validation.create(\"required,maxLength:255\") })\n})();\n\nconst UpdateContentModelGroupModel = withFields({\n name: string({ validation: validation.create(\"maxLength:100\") }),\n description: string({ validation: validation.create(\"maxLength:255\") }),\n icon: string({ validation: validation.create(\"maxLength:255\") })\n})();\n\nexport interface CreateModelGroupsCrudParams {\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n}\nexport const createModelGroupsCrud = (params: CreateModelGroupsCrudParams): CmsGroupContext => {\n const { getTenant, getIdentity, getLocale, storageOperations, context } = params;\n\n const dataLoaders = {\n listGroups: new DataLoader(async () => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n const pluginsGroups = getGroupsAsPlugins().map(group => {\n return {\n ...group,\n tenant: group.tenant || tenant,\n locale: group.locale || locale\n };\n });\n\n const groups = await storageOperations.groups.list({\n where: {\n tenant: getTenant().id,\n locale: getLocale().code\n }\n });\n\n return [groups.concat(pluginsGroups)];\n })\n };\n\n const clearGroupsCache = (): void => {\n for (const loader of Object.values(dataLoaders)) {\n loader.clearAll();\n }\n };\n\n const getGroupsAsPlugins = (): CmsGroup[] => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n return (\n context.plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n /**\n * We need to filter out groups that are not for this tenant or locale.\n * If it does not have tenant or locale define, it is for every locale and tenant\n */\n .filter(plugin => {\n const { tenant: t, locale: l } = plugin.contentModelGroup;\n if (t && t !== tenant) {\n return false;\n } else if (l && l !== locale) {\n return false;\n }\n return true;\n })\n .map(plugin => {\n return {\n ...plugin.contentModelGroup,\n tenant,\n locale,\n webinyVersion: context.WEBINY_VERSION\n };\n })\n );\n };\n\n const checkPermissions = (check: string): Promise<CmsGroupPermission> => {\n return utils.checkPermissions(context, \"cms.contentModelGroup\", { rwd: check });\n };\n\n const groupsGet = async (id: string) => {\n const groups = await dataLoaders.listGroups.load(\"listGroups\");\n\n const group = groups.find(g => g.id === id);\n\n if (!group) {\n throw new NotFoundError(`Cms Group \"${id}\" was not found!`);\n }\n return group;\n };\n\n const groupsList = async (params: CmsGroupListParams) => {\n const { where } = params || {};\n\n try {\n return await dataLoaders.listGroups.load(\"listGroups\");\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"LIST_ERROR\", {\n ...(ex.data || {}),\n where\n });\n }\n };\n\n const onBeforeCreate = createTopic<BeforeGroupCreateTopicParams>();\n const onAfterCreate = createTopic<AfterGroupCreateTopicParams>();\n const onBeforeUpdate = createTopic<BeforeGroupUpdateTopicParams>();\n const onAfterUpdate = createTopic<AfterGroupUpdateTopicParams>();\n const onBeforeDelete = createTopic<BeforeGroupDeleteTopicParams>();\n const onAfterDelete = createTopic<AfterGroupDeleteTopicParams>();\n\n /**\n * We need to assign some default behaviors.\n */\n assignBeforeGroupCreate({\n onBeforeCreate,\n plugins: context.plugins,\n storageOperations\n });\n assignBeforeGroupUpdate({\n onBeforeUpdate,\n plugins: context.plugins\n });\n assignBeforeGroupDelete({\n onBeforeDelete,\n plugins: context.plugins,\n storageOperations\n });\n\n return {\n onBeforeGroupCreate: onBeforeCreate,\n onAfterGroupCreate: onAfterCreate,\n onBeforeGroupUpdate: onBeforeUpdate,\n onAfterGroupUpdate: onAfterUpdate,\n onBeforeGroupDelete: onBeforeDelete,\n onAfterGroupDelete: onAfterDelete,\n clearGroupsCache,\n getGroup: async id => {\n const permission = await checkPermissions(\"r\");\n\n const group = await groupsGet(id);\n utils.checkOwnership(context, permission, group);\n utils.validateGroupAccess(context, permission, group);\n\n return group;\n },\n listGroups: async params => {\n const { where } = params || {};\n\n const { tenant, locale } = where || {};\n const permission = await checkPermissions(\"r\");\n\n const response = await groupsList({\n ...(params || {}),\n where: {\n ...(where || {}),\n tenant: tenant || getTenant().id,\n locale: locale || getLocale().code\n }\n });\n\n return response.filter(group => {\n if (!utils.validateOwnership(context, permission, group)) {\n return false;\n }\n return utils.validateGroupAccess(context, permission, group);\n });\n },\n createGroup: async inputData => {\n await checkPermissions(\"w\");\n\n const createdData = new CreateContentModelGroupModel().populate({\n ...inputData,\n slug: inputData.slug ? utils.toSlug(inputData.slug) : \"\",\n description: inputData.description || \"\"\n });\n await createdData.validate();\n const input: CmsGroupCreateInput & { slug: string; description: string } =\n await createdData.toJSON();\n\n const identity = getIdentity();\n\n const id = mdbid();\n const group: CmsGroup = {\n ...input,\n id,\n tenant: getTenant().id,\n locale: getLocale().code,\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n webinyVersion: context.WEBINY_VERSION\n };\n try {\n await onBeforeCreate.publish({\n group\n });\n\n const result = await storageOperations.groups.create({\n group\n });\n\n clearGroupsCache();\n\n await onAfterCreate.publish({\n group: result\n });\n\n return group;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not save data model group.\",\n ex.code || \"ERROR_ON_CREATE\",\n {\n ...(ex.data || {}),\n group,\n input\n }\n );\n }\n },\n updateGroup: async (id, inputData) => {\n const permission = await checkPermissions(\"w\");\n\n const original = await groupsGet(id);\n\n utils.checkOwnership(context, permission, original);\n\n const input = new UpdateContentModelGroupModel().populate(inputData);\n await input.validate();\n\n const updatedDataJson: Partial<CmsGroup> = await input.toJSON({\n onlyDirty: true\n });\n\n /**\n * No need to continue if no values were changed\n */\n if (Object.keys(updatedDataJson).length === 0) {\n return original;\n }\n\n const group: CmsGroup = {\n ...original,\n ...updatedDataJson,\n locale: getLocale().code,\n tenant: getTenant().id,\n savedOn: new Date().toISOString()\n };\n\n try {\n await onBeforeUpdate.publish({\n original,\n group\n });\n\n const updatedGroup = await storageOperations.groups.update({\n group\n });\n clearGroupsCache();\n\n await onAfterUpdate.publish({\n original,\n group: updatedGroup\n });\n\n return updatedGroup;\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"UPDATE_ERROR\", {\n error: ex,\n original,\n group,\n input\n });\n }\n },\n deleteGroup: async id => {\n const permission = await checkPermissions(\"d\");\n\n const group = await groupsGet(id);\n\n utils.checkOwnership(context, permission, group);\n\n try {\n await onBeforeDelete.publish({\n group\n });\n\n await storageOperations.groups.delete({ group });\n clearGroupsCache();\n\n await onAfterDelete.publish({\n group\n });\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"DELETE_ERROR\", {\n ...(ex.data || {}),\n id\n });\n }\n\n return true;\n }\n };\n};\n"]}
|
|
1
|
+
{"version":3,"names":["CreateContentModelGroupModel","withFields","name","string","validation","create","slug","description","icon","UpdateContentModelGroupModel","createModelGroupsCrud","params","getTenant","getIdentity","getLocale","storageOperations","context","dataLoaders","listGroups","DataLoader","tenant","id","locale","code","pluginsGroups","getGroupsAsPlugins","map","group","groups","list","where","concat","clearGroupsCache","loader","Object","values","clearAll","plugins","byType","CmsGroupPlugin","type","filter","plugin","t","l","contentModelGroup","webinyVersion","WEBINY_VERSION","checkPermissions","check","utils","rwd","groupsGet","load","find","g","NotFoundError","groupsList","ex","WebinyError","message","data","onBeforeCreate","createTopic","onAfterCreate","onBeforeUpdate","onAfterUpdate","onBeforeDelete","onAfterDelete","assignBeforeGroupCreate","assignBeforeGroupUpdate","assignBeforeGroupDelete","onBeforeGroupCreate","onAfterGroupCreate","onBeforeGroupUpdate","onAfterGroupUpdate","onBeforeGroupDelete","onAfterGroupDelete","getGroup","permission","checkOwnership","validateGroupAccess","response","validateOwnership","createGroup","inputData","createdData","populate","toSlug","validate","input","toJSON","identity","mdbid","createdOn","Date","toISOString","savedOn","createdBy","displayName","publish","result","updateGroup","original","updatedDataJson","onlyDirty","keys","length","updatedGroup","update","error","deleteGroup","delete"],"sources":["contentModelGroup.crud.ts"],"sourcesContent":["/**\n * Package @commodo/fields does not have types.\n */\n// @ts-ignore\nimport { withFields, string } from \"@commodo/fields\";\nimport { validation } from \"@webiny/validation\";\n/**\n * Package mdbid does not have types.\n */\n// @ts-ignore\nimport mdbid from \"mdbid\";\nimport {\n CmsGroupContext,\n CmsGroupListParams,\n CmsGroupPermission,\n CmsGroup,\n CmsContext,\n HeadlessCmsStorageOperations,\n CmsGroupCreateInput,\n BeforeGroupCreateTopicParams,\n AfterGroupCreateTopicParams,\n BeforeGroupUpdateTopicParams,\n AfterGroupUpdateTopicParams,\n BeforeGroupDeleteTopicParams,\n AfterGroupDeleteTopicParams\n} from \"~/types\";\nimport * as utils from \"~/utils\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsGroupPlugin } from \"~/content/plugins/CmsGroupPlugin\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignBeforeGroupUpdate } from \"~/content/plugins/crud/contentModelGroup/beforeUpdate\";\nimport { assignBeforeGroupCreate } from \"~/content/plugins/crud/contentModelGroup/beforeCreate\";\nimport { assignBeforeGroupDelete } from \"~/content/plugins/crud/contentModelGroup/beforeDelete\";\nimport DataLoader from \"dataloader\";\n\nconst CreateContentModelGroupModel = withFields({\n name: string({ validation: validation.create(\"required,maxLength:100\") }),\n slug: string({ validation: validation.create(\"maxLength:100\") }),\n description: string({ validation: validation.create(\"maxLength:255\") }),\n icon: string({ validation: validation.create(\"required,maxLength:255\") })\n})();\n\nconst UpdateContentModelGroupModel = withFields({\n name: string({ validation: validation.create(\"maxLength:100\") }),\n description: string({ validation: validation.create(\"maxLength:255\") }),\n icon: string({ validation: validation.create(\"maxLength:255\") })\n})();\n\nexport interface CreateModelGroupsCrudParams {\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n}\nexport const createModelGroupsCrud = (params: CreateModelGroupsCrudParams): CmsGroupContext => {\n const { getTenant, getIdentity, getLocale, storageOperations, context } = params;\n\n const dataLoaders = {\n listGroups: new DataLoader(async () => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n const pluginsGroups = getGroupsAsPlugins().map(group => {\n return {\n ...group,\n tenant: group.tenant || tenant,\n locale: group.locale || locale\n };\n });\n\n const groups = await storageOperations.groups.list({\n where: {\n tenant: getTenant().id,\n locale: getLocale().code\n }\n });\n\n return [groups.concat(pluginsGroups)];\n })\n };\n\n const clearGroupsCache = (): void => {\n for (const loader of Object.values(dataLoaders)) {\n loader.clearAll();\n }\n };\n\n const getGroupsAsPlugins = (): CmsGroup[] => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n return (\n context.plugins\n .byType<CmsGroupPlugin>(CmsGroupPlugin.type)\n /**\n * We need to filter out groups that are not for this tenant or locale.\n * If it does not have tenant or locale define, it is for every locale and tenant\n */\n .filter(plugin => {\n const { tenant: t, locale: l } = plugin.contentModelGroup;\n if (t && t !== tenant) {\n return false;\n } else if (l && l !== locale) {\n return false;\n }\n return true;\n })\n .map(plugin => {\n return {\n ...plugin.contentModelGroup,\n tenant,\n locale,\n webinyVersion: context.WEBINY_VERSION\n };\n })\n );\n };\n\n const checkPermissions = (check: string): Promise<CmsGroupPermission> => {\n return utils.checkPermissions(context, \"cms.contentModelGroup\", { rwd: check });\n };\n\n const groupsGet = async (id: string) => {\n const groups = await dataLoaders.listGroups.load(\"listGroups\");\n\n const group = groups.find(g => g.id === id);\n\n if (!group) {\n throw new NotFoundError(`Cms Group \"${id}\" was not found!`);\n }\n return group;\n };\n\n const groupsList = async (params: CmsGroupListParams) => {\n const { where } = params || {};\n\n try {\n return await dataLoaders.listGroups.load(\"listGroups\");\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"LIST_ERROR\", {\n ...(ex.data || {}),\n where\n });\n }\n };\n\n const onBeforeCreate = createTopic<BeforeGroupCreateTopicParams>();\n const onAfterCreate = createTopic<AfterGroupCreateTopicParams>();\n const onBeforeUpdate = createTopic<BeforeGroupUpdateTopicParams>();\n const onAfterUpdate = createTopic<AfterGroupUpdateTopicParams>();\n const onBeforeDelete = createTopic<BeforeGroupDeleteTopicParams>();\n const onAfterDelete = createTopic<AfterGroupDeleteTopicParams>();\n\n /**\n * We need to assign some default behaviors.\n */\n assignBeforeGroupCreate({\n onBeforeCreate,\n plugins: context.plugins,\n storageOperations\n });\n assignBeforeGroupUpdate({\n onBeforeUpdate,\n plugins: context.plugins\n });\n assignBeforeGroupDelete({\n onBeforeDelete,\n plugins: context.plugins,\n storageOperations\n });\n\n return {\n onBeforeGroupCreate: onBeforeCreate,\n onAfterGroupCreate: onAfterCreate,\n onBeforeGroupUpdate: onBeforeUpdate,\n onAfterGroupUpdate: onAfterUpdate,\n onBeforeGroupDelete: onBeforeDelete,\n onAfterGroupDelete: onAfterDelete,\n clearGroupsCache,\n getGroup: async id => {\n const permission = await checkPermissions(\"r\");\n\n const group = await groupsGet(id);\n utils.checkOwnership(context, permission, group);\n utils.validateGroupAccess(context, permission, group);\n\n return group;\n },\n listGroups: async params => {\n const { where } = params || {};\n\n const { tenant, locale } = where || {};\n const permission = await checkPermissions(\"r\");\n\n const response = await groupsList({\n ...(params || {}),\n where: {\n ...(where || {}),\n tenant: tenant || getTenant().id,\n locale: locale || getLocale().code\n }\n });\n\n return response.filter(group => {\n if (!utils.validateOwnership(context, permission, group)) {\n return false;\n }\n return utils.validateGroupAccess(context, permission, group);\n });\n },\n createGroup: async inputData => {\n await checkPermissions(\"w\");\n\n const createdData = new CreateContentModelGroupModel().populate({\n ...inputData,\n slug: inputData.slug ? utils.toSlug(inputData.slug) : \"\",\n description: inputData.description || \"\"\n });\n await createdData.validate();\n const input: CmsGroupCreateInput & { slug: string; description: string } =\n await createdData.toJSON();\n\n const identity = getIdentity();\n\n const id = mdbid();\n const group: CmsGroup = {\n ...input,\n id,\n tenant: getTenant().id,\n locale: getLocale().code,\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n webinyVersion: context.WEBINY_VERSION\n };\n try {\n await onBeforeCreate.publish({\n group\n });\n\n const result = await storageOperations.groups.create({\n group\n });\n\n clearGroupsCache();\n\n await onAfterCreate.publish({\n group: result\n });\n\n return group;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not save data model group.\",\n ex.code || \"ERROR_ON_CREATE\",\n {\n ...(ex.data || {}),\n group,\n input\n }\n );\n }\n },\n updateGroup: async (id, inputData) => {\n const permission = await checkPermissions(\"w\");\n\n const original = await groupsGet(id);\n\n utils.checkOwnership(context, permission, original);\n\n const input = new UpdateContentModelGroupModel().populate(inputData);\n await input.validate();\n\n const updatedDataJson: Partial<CmsGroup> = await input.toJSON({\n onlyDirty: true\n });\n\n /**\n * No need to continue if no values were changed\n */\n if (Object.keys(updatedDataJson).length === 0) {\n return original;\n }\n\n const group: CmsGroup = {\n ...original,\n ...updatedDataJson,\n locale: getLocale().code,\n tenant: getTenant().id,\n savedOn: new Date().toISOString()\n };\n\n try {\n await onBeforeUpdate.publish({\n original,\n group\n });\n\n const updatedGroup = await storageOperations.groups.update({\n group\n });\n clearGroupsCache();\n\n await onAfterUpdate.publish({\n original,\n group: updatedGroup\n });\n\n return updatedGroup;\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"UPDATE_ERROR\", {\n error: ex,\n original,\n group,\n input\n });\n }\n },\n deleteGroup: async id => {\n const permission = await checkPermissions(\"d\");\n\n const group = await groupsGet(id);\n\n utils.checkOwnership(context, permission, group);\n\n try {\n await onBeforeDelete.publish({\n group\n });\n\n await storageOperations.groups.delete({ group });\n clearGroupsCache();\n\n await onAfterDelete.publish({\n group\n });\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"DELETE_ERROR\", {\n ...(ex.data || {}),\n id\n });\n }\n\n return true;\n }\n };\n};\n"],"mappings":"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"}
|