@webiny/api-headless-cms 5.32.0-beta.0 → 5.33.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/crud/contentEntry/entryDataValidation.js +1 -0
- package/crud/contentEntry/entryDataValidation.js.map +1 -1
- package/crud/contentEntry/markLockedFields.js +2 -2
- package/crud/contentEntry/markLockedFields.js.map +1 -1
- package/crud/contentEntry.crud.js +170 -60
- package/crud/contentEntry.crud.js.map +1 -1
- package/crud/contentModel/beforeCreate.js +11 -4
- package/crud/contentModel/beforeCreate.js.map +1 -1
- package/crud/contentModel/beforeDelete.js +6 -1
- package/crud/contentModel/beforeDelete.js.map +1 -1
- package/crud/contentModel/beforeUpdate.js +18 -4
- package/crud/contentModel/beforeUpdate.js.map +1 -1
- package/crud/contentModel/createFieldStorageId.d.ts +2 -0
- package/crud/contentModel/createFieldStorageId.js +16 -0
- package/crud/contentModel/createFieldStorageId.js.map +1 -0
- package/crud/contentModel/fieldIdValidation.d.ts +1 -0
- package/crud/contentModel/fieldIdValidation.js +25 -0
- package/crud/contentModel/fieldIdValidation.js.map +1 -0
- package/crud/contentModel/models.js +9 -8
- package/crud/contentModel/models.js.map +1 -1
- package/crud/contentModel/systemFields.d.ts +1 -0
- package/crud/contentModel/systemFields.js +8 -0
- package/crud/contentModel/systemFields.js.map +1 -0
- package/crud/contentModel/validateLayout.d.ts +1 -1
- package/crud/contentModel/validateLayout.js +1 -2
- package/crud/contentModel/validateLayout.js.map +1 -1
- package/crud/contentModel/validateModel.d.ts +9 -0
- package/crud/contentModel/validateModel.js +32 -0
- package/crud/contentModel/validateModel.js.map +1 -0
- package/crud/contentModel/validateModelFields.d.ts +3 -2
- package/crud/contentModel/validateModelFields.js +200 -38
- package/crud/contentModel/validateModelFields.js.map +1 -1
- package/crud/contentModel.crud.js +59 -5
- package/crud/contentModel.crud.js.map +1 -1
- package/crud/contentModelGroup/beforeCreate.js +3 -3
- package/crud/contentModelGroup/beforeCreate.js.map +1 -1
- package/fieldConverters/CmsModelDefaultFieldConverterPlugin.d.ts +7 -0
- package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js +66 -0
- package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -0
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.d.ts +11 -0
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +306 -0
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -0
- package/fieldConverters/index.d.ts +3 -0
- package/fieldConverters/index.js +16 -0
- package/fieldConverters/index.js.map +1 -0
- package/graphql/schema/contentModels.js +6 -0
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/createFieldResolvers.js +13 -1
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/graphql/schema/createReadSDL.js +3 -2
- package/graphql/schema/createReadSDL.js.map +1 -1
- package/graphql/schema/schemaPlugins.js +7 -1
- package/graphql/schema/schemaPlugins.js.map +1 -1
- package/graphqlFields/datetime.js +6 -1
- package/graphqlFields/datetime.js.map +1 -1
- package/graphqlFields/helpers.js +1 -1
- package/graphqlFields/helpers.js.map +1 -1
- package/graphqlFields/object.js +1 -1
- package/graphqlFields/object.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.js +3 -1
- package/index.js.map +1 -1
- package/package.json +24 -24
- package/plugins/CmsGroupPlugin.d.ts +1 -1
- package/plugins/CmsGroupPlugin.js.map +1 -1
- package/plugins/CmsModelFieldConverterPlugin.d.ts +14 -0
- package/plugins/CmsModelFieldConverterPlugin.js +17 -0
- package/plugins/CmsModelFieldConverterPlugin.js.map +1 -0
- package/plugins/CmsModelPlugin.d.ts +32 -4
- package/plugins/CmsModelPlugin.js +160 -1
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/plugins/index.d.ts +1 -0
- package/plugins/index.js +13 -0
- package/plugins/index.js.map +1 -1
- package/types.d.ts +143 -81
- package/types.js +24 -0
- package/types.js.map +1 -1
- package/upgrades/5.33.0/index.d.ts +3 -0
- package/upgrades/5.33.0/index.js +186 -0
- package/upgrades/5.33.0/index.js.map +1 -0
- package/upgrades/index.d.ts +1 -1
- package/upgrades/index.js +3 -1
- package/upgrades/index.js.map +1 -1
- package/utils/converters/Converter.d.ts +27 -0
- package/utils/converters/Converter.js +71 -0
- package/utils/converters/Converter.js.map +1 -0
- package/utils/converters/ConverterCollection.d.ts +24 -0
- package/utils/converters/ConverterCollection.js +115 -0
- package/utils/converters/ConverterCollection.js.map +1 -0
- package/utils/converters/valueKeyStorageConverter.d.ts +18 -0
- package/utils/converters/valueKeyStorageConverter.js +152 -0
- package/utils/converters/valueKeyStorageConverter.js.map +1 -0
- package/utils/filterModelFields.d.ts +16 -0
- package/utils/filterModelFields.js +81 -0
- package/utils/filterModelFields.js.map +1 -0
- package/utils/getEntryTitle.js +6 -5
- package/utils/getEntryTitle.js.map +1 -1
- package/utils/ownership.js +4 -2
- package/utils/ownership.js.map +1 -1
- package/utils/renderGetFilterFields.js +3 -3
- package/utils/renderGetFilterFields.js.map +1 -1
- package/utils/renderListFilterFields.js +6 -5
- package/utils/renderListFilterFields.js.map +1 -1
- package/utils/renderSortEnum.js +4 -4
- package/utils/renderSortEnum.js.map +1 -1
- package/validators/unique.js +1 -0
- package/validators/unique.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["validateValue","args","fieldValidators","value","validatorList","context","field","model","entry","fieldValidator","name","validations","length","validate","result","validator","message","ex","validatePredefinedValue","enabled","values","predefinedValues","Array","isArray","predefinedValue","runFieldMultipleValuesValidations","data","fieldId","valuesError","listValidation","valueError","validation","predefinedValueError","runFieldValueValidations","error","execValidation","multipleValues","validateModelEntryData","params","plugins","byType","reduce","acc","plugin","push","invalidFields","fields","WebinyError"],"sources":["entryDataValidation.ts"],"sourcesContent":["import {\n CmsModel,\n CmsModelField,\n CmsModelFieldValidation,\n CmsContext,\n CmsModelFieldValidatorPlugin,\n CmsModelFieldValidatorValidateParams,\n CmsEntry\n} from \"~/types\";\nimport WebinyError from \"@webiny/error\";\n\ntype PluginValidationCallable = (params: CmsModelFieldValidatorValidateParams) => Promise<boolean>;\ntype PluginValidationList = Record<string, PluginValidationCallable[]>;\ntype InputData = Record<string, any>;\n\ninterface ValidateArgs {\n validatorList: PluginValidationList;\n field: CmsModelField;\n model: CmsModel;\n data: InputData;\n context: CmsContext;\n entry?: CmsEntry;\n}\n\ntype PossibleValue = boolean | number | string | null | undefined;\n\nconst validateValue = async (\n args: ValidateArgs,\n fieldValidators: CmsModelFieldValidation[],\n value: PossibleValue | PossibleValue[]\n): Promise<string | null> => {\n if (!fieldValidators) {\n return null;\n }\n\n const { validatorList, context, field, model, entry } = args;\n try {\n for (const fieldValidator of fieldValidators) {\n const name = fieldValidator.name;\n const validations = validatorList[name];\n if (!validations || validations.length === 0) {\n return `There are no \"${name}\" validators defined.`;\n }\n for (const validate of validations) {\n const result = await validate({\n value,\n context,\n validator: fieldValidator,\n field,\n model,\n entry\n });\n if (!result) {\n return fieldValidator.message;\n }\n }\n }\n } catch (ex) {\n return ex.message;\n }\n\n return null;\n};\n\nconst validatePredefinedValue = (field: CmsModelField, value: any | any[]): string | null => {\n const { enabled = false, values: predefinedValues = [] } = field.predefinedValues || {};\n if (!enabled) {\n return null;\n } else if (Array.isArray(predefinedValues) === false || predefinedValues.length === 0) {\n return \"Missing predefined values to validate against.\";\n }\n for (const predefinedValue of predefinedValues) {\n if (predefinedValue.value == value) {\n return null;\n }\n }\n return \"Value sent does not match any of the available predefined values.\";\n};\n/**\n * When multiple values is selected we must run validations on the array containing the values\n * And then on each value in the array\n */\nconst runFieldMultipleValuesValidations = async (args: ValidateArgs): Promise<string | null> => {\n const { field, data } = args;\n const values = data[field.fieldId] || [];\n if (Array.isArray(values) === false) {\n return `Value of the field \"${field.fieldId}\" is not an array.`;\n }\n const valuesError = await validateValue(args, field.listValidation || [], values);\n if (valuesError) {\n return valuesError;\n }\n for (const value of values) {\n const valueError = await validateValue(args, field.validation || [], value);\n if (valueError) {\n return valueError;\n }\n const predefinedValueError = validatePredefinedValue(field, value);\n if (predefinedValueError) {\n return predefinedValueError;\n }\n }\n return null;\n};\n/**\n * Runs validation on given value.\n */\nconst runFieldValueValidations = async (args: ValidateArgs): Promise<string | null> => {\n const { data, field } = args;\n const value = data[field.fieldId];\n const error = await validateValue(args, field.validation || [], value);\n if (error) {\n return error;\n }\n return validatePredefinedValue(field, value);\n};\n\nconst execValidation = async (args: ValidateArgs): Promise<string | null> => {\n if (args.field.multipleValues) {\n return await runFieldMultipleValuesValidations(args);\n }\n return await runFieldValueValidations(args);\n};\n\nexport interface ValidateModelEntryDataParams {\n context: CmsContext;\n model: CmsModel;\n data: InputData;\n entry?: CmsEntry;\n}\nexport const validateModelEntryData = async (params: ValidateModelEntryDataParams) => {\n const { context, model, entry, data } = params;\n /**\n * To later simplify searching for the validations we map them to a name.\n * @see CmsModelFieldValidatorPlugin.validator.validate\n */\n const validatorList: PluginValidationList = context.plugins\n .byType<CmsModelFieldValidatorPlugin>(\"cms-model-field-validator\")\n .reduce((acc, plugin) => {\n const name = plugin.validator.name;\n if (!acc[name]) {\n acc[name] = [];\n }\n acc[name].push(plugin.validator.validate);\n\n return acc;\n }, {} as PluginValidationList);\n\n /**\n * Loop through model fields and validate the corresponding data.\n * Run validation only if the field has validation configured.\n */\n const invalidFields = [];\n for (const field of model.fields) {\n const error = await execValidation({\n model,\n validatorList,\n field,\n data: {\n ...(entry?.values || {}),\n ...data\n },\n context,\n entry\n });\n if (!error) {\n continue;\n }\n invalidFields.push({\n fieldId: field.fieldId,\n error\n });\n }\n\n if (invalidFields.length > 0) {\n throw new WebinyError(\"Validation failed.\", \"VALIDATION_FAILED\", invalidFields);\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["validateValue","args","fieldValidators","value","validatorList","context","field","model","entry","fieldValidator","name","validations","length","validate","result","validator","message","ex","validatePredefinedValue","enabled","values","predefinedValues","Array","isArray","predefinedValue","runFieldMultipleValuesValidations","data","fieldId","valuesError","listValidation","valueError","validation","predefinedValueError","runFieldValueValidations","error","execValidation","multipleValues","validateModelEntryData","params","plugins","byType","reduce","acc","plugin","push","invalidFields","fields","storageId","WebinyError"],"sources":["entryDataValidation.ts"],"sourcesContent":["import {\n CmsModel,\n CmsModelField,\n CmsModelFieldValidation,\n CmsContext,\n CmsModelFieldValidatorPlugin,\n CmsModelFieldValidatorValidateParams,\n CmsEntry\n} from \"~/types\";\nimport WebinyError from \"@webiny/error\";\n\ntype PluginValidationCallable = (params: CmsModelFieldValidatorValidateParams) => Promise<boolean>;\ntype PluginValidationList = Record<string, PluginValidationCallable[]>;\ntype InputData = Record<string, any>;\n\ninterface ValidateArgs {\n validatorList: PluginValidationList;\n field: CmsModelField;\n model: CmsModel;\n data: InputData;\n context: CmsContext;\n entry?: CmsEntry;\n}\n\ntype PossibleValue = boolean | number | string | null | undefined;\n\nconst validateValue = async (\n args: ValidateArgs,\n fieldValidators: CmsModelFieldValidation[],\n value: PossibleValue | PossibleValue[]\n): Promise<string | null> => {\n if (!fieldValidators) {\n return null;\n }\n\n const { validatorList, context, field, model, entry } = args;\n try {\n for (const fieldValidator of fieldValidators) {\n const name = fieldValidator.name;\n const validations = validatorList[name];\n if (!validations || validations.length === 0) {\n return `There are no \"${name}\" validators defined.`;\n }\n for (const validate of validations) {\n const result = await validate({\n value,\n context,\n validator: fieldValidator,\n field,\n model,\n entry\n });\n if (!result) {\n return fieldValidator.message;\n }\n }\n }\n } catch (ex) {\n return ex.message;\n }\n\n return null;\n};\n\nconst validatePredefinedValue = (field: CmsModelField, value: any | any[]): string | null => {\n const { enabled = false, values: predefinedValues = [] } = field.predefinedValues || {};\n if (!enabled) {\n return null;\n } else if (Array.isArray(predefinedValues) === false || predefinedValues.length === 0) {\n return \"Missing predefined values to validate against.\";\n }\n for (const predefinedValue of predefinedValues) {\n if (predefinedValue.value == value) {\n return null;\n }\n }\n return \"Value sent does not match any of the available predefined values.\";\n};\n/**\n * When multiple values is selected we must run validations on the array containing the values\n * And then on each value in the array\n */\nconst runFieldMultipleValuesValidations = async (args: ValidateArgs): Promise<string | null> => {\n const { field, data } = args;\n const values = data[field.fieldId] || [];\n if (Array.isArray(values) === false) {\n return `Value of the field \"${field.fieldId}\" is not an array.`;\n }\n const valuesError = await validateValue(args, field.listValidation || [], values);\n if (valuesError) {\n return valuesError;\n }\n for (const value of values) {\n const valueError = await validateValue(args, field.validation || [], value);\n if (valueError) {\n return valueError;\n }\n const predefinedValueError = validatePredefinedValue(field, value);\n if (predefinedValueError) {\n return predefinedValueError;\n }\n }\n return null;\n};\n/**\n * Runs validation on given value.\n */\nconst runFieldValueValidations = async (args: ValidateArgs): Promise<string | null> => {\n const { data, field } = args;\n const value = data[field.fieldId];\n const error = await validateValue(args, field.validation || [], value);\n if (error) {\n return error;\n }\n return validatePredefinedValue(field, value);\n};\n\nconst execValidation = async (args: ValidateArgs): Promise<string | null> => {\n if (args.field.multipleValues) {\n return await runFieldMultipleValuesValidations(args);\n }\n return await runFieldValueValidations(args);\n};\n\nexport interface ValidateModelEntryDataParams {\n context: CmsContext;\n model: CmsModel;\n data: InputData;\n entry?: CmsEntry;\n}\nexport const validateModelEntryData = async (params: ValidateModelEntryDataParams) => {\n const { context, model, entry, data } = params;\n /**\n * To later simplify searching for the validations we map them to a name.\n * @see CmsModelFieldValidatorPlugin.validator.validate\n */\n const validatorList: PluginValidationList = context.plugins\n .byType<CmsModelFieldValidatorPlugin>(\"cms-model-field-validator\")\n .reduce((acc, plugin) => {\n const name = plugin.validator.name;\n if (!acc[name]) {\n acc[name] = [];\n }\n acc[name].push(plugin.validator.validate);\n\n return acc;\n }, {} as PluginValidationList);\n\n /**\n * Loop through model fields and validate the corresponding data.\n * Run validation only if the field has validation configured.\n */\n const invalidFields = [];\n for (const field of model.fields) {\n const error = await execValidation({\n model,\n validatorList,\n field,\n data: {\n ...(entry?.values || {}),\n ...data\n },\n context,\n entry\n });\n if (!error) {\n continue;\n }\n invalidFields.push({\n fieldId: field.fieldId,\n storageId: field.storageId,\n error\n });\n }\n\n if (invalidFields.length > 0) {\n throw new WebinyError(\"Validation failed.\", \"VALIDATION_FAILED\", invalidFields);\n }\n};\n"],"mappings":"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"}
|
|
@@ -37,7 +37,7 @@ const markLockedFields = async params => {
|
|
|
37
37
|
const lockedFields = [];
|
|
38
38
|
|
|
39
39
|
for (const field of model.fields) {
|
|
40
|
-
const alreadyLocked = existingLockedFields.some(lockedField => lockedField.fieldId === field.
|
|
40
|
+
const alreadyLocked = existingLockedFields.some(lockedField => lockedField.fieldId === field.storageId);
|
|
41
41
|
|
|
42
42
|
if (alreadyLocked) {
|
|
43
43
|
continue;
|
|
@@ -58,7 +58,7 @@ const markLockedFields = async params => {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
lockedFields.push(_objectSpread({
|
|
61
|
-
fieldId: field.
|
|
61
|
+
fieldId: field.storageId,
|
|
62
62
|
multipleValues: !!field.multipleValues,
|
|
63
63
|
type: field.type
|
|
64
64
|
}, lockedFieldData));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["markLockedFields","params","model","context","plugins","byType","CmsModelPlugin","type","find","plugin","contentModel","modelId","cmsLockedFieldPlugins","existingLockedFields","lockedFields","field","fields","alreadyLocked","some","lockedField","fieldId","lockedFieldData","lockedFieldPlugins","filter","pl","fieldType","getLockedFieldData","data","push","multipleValues","length","newLockedFields","concat","cms","updateModelDirect","original","ex","WebinyError","markUnlockedFields"],"sources":["markLockedFields.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { CmsEntry, CmsModel, CmsContext, CmsModelLockedFieldPlugin, LockedField } from \"~/types\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\n\ninterface MarkLockedFieldsParams {\n model: CmsModel;\n entry: CmsEntry;\n context: CmsContext;\n}\nexport const markLockedFields = async (params: MarkLockedFieldsParams): Promise<void> => {\n const { model, context } = params;\n /**\n * If the model is registered via a plugin, we don't need do process anything.\n */\n const plugins = context.plugins.byType<CmsModelPlugin>(CmsModelPlugin.type);\n if (plugins.find(plugin => plugin.contentModel.modelId === model.modelId)) {\n return;\n }\n\n const cmsLockedFieldPlugins =\n context.plugins.byType<CmsModelLockedFieldPlugin>(\"cms-model-locked-field\");\n\n const existingLockedFields = model.lockedFields || [];\n const lockedFields: LockedField[] = [];\n for (const field of model.fields) {\n const alreadyLocked = existingLockedFields.some(\n lockedField => lockedField.fieldId === field.
|
|
1
|
+
{"version":3,"names":["markLockedFields","params","model","context","plugins","byType","CmsModelPlugin","type","find","plugin","contentModel","modelId","cmsLockedFieldPlugins","existingLockedFields","lockedFields","field","fields","alreadyLocked","some","lockedField","fieldId","storageId","lockedFieldData","lockedFieldPlugins","filter","pl","fieldType","getLockedFieldData","data","push","multipleValues","length","newLockedFields","concat","cms","updateModelDirect","original","ex","WebinyError","markUnlockedFields"],"sources":["markLockedFields.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { CmsEntry, CmsModel, CmsContext, CmsModelLockedFieldPlugin, LockedField } from \"~/types\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\n\ninterface MarkLockedFieldsParams {\n model: CmsModel;\n entry: CmsEntry;\n context: CmsContext;\n}\nexport const markLockedFields = async (params: MarkLockedFieldsParams): Promise<void> => {\n const { model, context } = params;\n /**\n * If the model is registered via a plugin, we don't need do process anything.\n */\n const plugins = context.plugins.byType<CmsModelPlugin>(CmsModelPlugin.type);\n if (plugins.find(plugin => plugin.contentModel.modelId === model.modelId)) {\n return;\n }\n\n const cmsLockedFieldPlugins =\n context.plugins.byType<CmsModelLockedFieldPlugin>(\"cms-model-locked-field\");\n\n const existingLockedFields = model.lockedFields || [];\n const lockedFields: LockedField[] = [];\n for (const field of model.fields) {\n const alreadyLocked = existingLockedFields.some(\n lockedField => lockedField.fieldId === field.storageId\n );\n if (alreadyLocked) {\n continue;\n }\n\n let lockedFieldData = {};\n\n const lockedFieldPlugins = cmsLockedFieldPlugins.filter(pl => pl.fieldType === field.type);\n for (const plugin of lockedFieldPlugins) {\n if (typeof plugin.getLockedFieldData !== \"function\") {\n continue;\n }\n const data = plugin.getLockedFieldData({\n field\n });\n lockedFieldData = { ...lockedFieldData, ...data };\n }\n\n lockedFields.push({\n fieldId: field.storageId,\n multipleValues: !!field.multipleValues,\n type: field.type,\n ...lockedFieldData\n });\n }\n // no need to update anything if no locked fields were added\n if (lockedFields.length === 0) {\n return;\n }\n\n const newLockedFields = existingLockedFields.concat(lockedFields);\n\n try {\n await context.cms.updateModelDirect({\n original: model,\n model: {\n ...model,\n lockedFields: newLockedFields\n }\n });\n model.lockedFields = newLockedFields;\n } catch (ex) {\n throw new WebinyError(\n `Could not update model \"${model.modelId}\" with new locked fields.`,\n \"MODEL_LOCKED_FIELDS_UPDATE_FAILED\",\n ex\n );\n }\n};\n\nexport interface MarkFieldsUnlockedParams {\n context: CmsContext;\n model: CmsModel;\n}\nexport const markUnlockedFields = async (params: MarkFieldsUnlockedParams) => {\n const { context, model } = params;\n /**\n * If the model is registered via a plugin, we don't need do process anything.\n */\n const plugins = context.plugins.byType<CmsModelPlugin>(CmsModelPlugin.type);\n if (plugins.find(plugin => plugin.contentModel.modelId === model.modelId)) {\n return;\n }\n\n try {\n await context.cms.updateModelDirect({\n original: model,\n model: {\n ...model,\n lockedFields: []\n }\n });\n model.lockedFields = [];\n } catch (ex) {\n throw new WebinyError(\n `Could not update model \"${model.modelId}\" with unlocked fields.`,\n \"MODEL_UNLOCKED_FIELDS_UPDATE_FAILED\",\n ex\n );\n }\n};\n"],"mappings":"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"}
|
|
@@ -39,6 +39,8 @@ var _ownership = require("../utils/ownership");
|
|
|
39
39
|
|
|
40
40
|
var _entryStorage = require("../utils/entryStorage");
|
|
41
41
|
|
|
42
|
+
var _valueKeyStorageConverter = require("../utils/converters/valueKeyStorageConverter");
|
|
43
|
+
|
|
42
44
|
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; }
|
|
43
45
|
|
|
44
46
|
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; }
|
|
@@ -113,8 +115,18 @@ const getDefaultValue = field => {
|
|
|
113
115
|
*/
|
|
114
116
|
|
|
115
117
|
|
|
116
|
-
const
|
|
118
|
+
const mapAndCleanCreateInputData = (model, input) => {
|
|
117
119
|
return model.fields.reduce((acc, field) => {
|
|
120
|
+
/**
|
|
121
|
+
* This should never happen, but let's make it sure.
|
|
122
|
+
* The fix would be for the user to add the fieldId on the field definition.
|
|
123
|
+
*/
|
|
124
|
+
if (!field.fieldId) {
|
|
125
|
+
throw new _error.default("Field does not have an fieldId.", "MISSING_FIELD_ID", {
|
|
126
|
+
field
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
118
130
|
const value = input[field.fieldId];
|
|
119
131
|
/**
|
|
120
132
|
* We set the default value on create input if value is not defined.
|
|
@@ -129,16 +141,29 @@ const cleanInputData = (model, input) => {
|
|
|
129
141
|
*/
|
|
130
142
|
|
|
131
143
|
|
|
132
|
-
const
|
|
144
|
+
const mapAndCleanUpdatedInputData = (model, input) => {
|
|
133
145
|
return model.fields.reduce((acc, field) => {
|
|
134
146
|
/**
|
|
135
|
-
*
|
|
147
|
+
* This should never happen, but let's make it sure.
|
|
148
|
+
* The fix would be for the user to add the fieldId on the field definition.
|
|
136
149
|
*/
|
|
137
|
-
if (
|
|
150
|
+
if (!field.fieldId) {
|
|
151
|
+
throw new _error.default("Field does not have an fieldId.", "MISSING_FIELD_ID", {
|
|
152
|
+
field
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* We cannot set default value here because user might want to update only certain field values.
|
|
157
|
+
*/
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
const value = input[field.fieldId];
|
|
161
|
+
|
|
162
|
+
if (value === undefined) {
|
|
138
163
|
return acc;
|
|
139
164
|
}
|
|
140
165
|
|
|
141
|
-
acc[field.fieldId] =
|
|
166
|
+
acc[field.fieldId] = value;
|
|
142
167
|
return acc;
|
|
143
168
|
}, {});
|
|
144
169
|
};
|
|
@@ -207,6 +232,10 @@ const getSearchableFields = params => {
|
|
|
207
232
|
return collection;
|
|
208
233
|
}, {});
|
|
209
234
|
return model.fields.filter(field => {
|
|
235
|
+
if (!field.fieldId) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
|
|
210
239
|
const plugin = fieldPluginMap[field.type];
|
|
211
240
|
|
|
212
241
|
if (!plugin) {
|
|
@@ -228,6 +257,9 @@ const createContentEntryCrud = params => {
|
|
|
228
257
|
getIdentity,
|
|
229
258
|
getTenant
|
|
230
259
|
} = params;
|
|
260
|
+
const {
|
|
261
|
+
plugins
|
|
262
|
+
} = context;
|
|
231
263
|
const onBeforeEntryCreate = (0, _pubsub.createTopic)();
|
|
232
264
|
const onAfterEntryCreate = (0, _pubsub.createTopic)();
|
|
233
265
|
const onBeforeEntryCreateRevision = (0, _pubsub.createTopic)();
|
|
@@ -302,11 +334,15 @@ const createContentEntryCrud = params => {
|
|
|
302
334
|
*/
|
|
303
335
|
|
|
304
336
|
|
|
305
|
-
const getEntriesByIds = async (
|
|
337
|
+
const getEntriesByIds = async (initialModel, ids) => {
|
|
306
338
|
const permission = await checkEntryPermissions({
|
|
307
339
|
rwd: "r"
|
|
308
340
|
});
|
|
309
|
-
await (0, _access.checkModelAccess)(context,
|
|
341
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
342
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
343
|
+
model: initialModel,
|
|
344
|
+
plugins
|
|
345
|
+
});
|
|
310
346
|
const entries = await storageOperations.entries.getByIds(model, {
|
|
311
347
|
ids
|
|
312
348
|
});
|
|
@@ -343,10 +379,14 @@ const createContentEntryCrud = params => {
|
|
|
343
379
|
/**
|
|
344
380
|
* Get a single entry by revision ID from the database.
|
|
345
381
|
*/
|
|
346
|
-
getEntryById: async (
|
|
382
|
+
getEntryById: async (initialModel, id) => {
|
|
347
383
|
const where = {
|
|
348
384
|
id
|
|
349
385
|
};
|
|
386
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
387
|
+
model: initialModel,
|
|
388
|
+
plugins
|
|
389
|
+
});
|
|
350
390
|
await onBeforeEntryGet.publish({
|
|
351
391
|
where,
|
|
352
392
|
model
|
|
@@ -363,11 +403,15 @@ const createContentEntryCrud = params => {
|
|
|
363
403
|
/**
|
|
364
404
|
* Get published revisions by entry IDs.
|
|
365
405
|
*/
|
|
366
|
-
getPublishedEntriesByIds: async (
|
|
406
|
+
getPublishedEntriesByIds: async (initialModel, ids) => {
|
|
367
407
|
const permission = await checkEntryPermissions({
|
|
368
408
|
rwd: "r"
|
|
369
409
|
});
|
|
370
|
-
await (0, _access.checkModelAccess)(context,
|
|
410
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
411
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
412
|
+
model: initialModel,
|
|
413
|
+
plugins
|
|
414
|
+
});
|
|
371
415
|
const entries = await storageOperations.entries.getPublishedByIds(model, {
|
|
372
416
|
ids
|
|
373
417
|
});
|
|
@@ -377,17 +421,25 @@ const createContentEntryCrud = params => {
|
|
|
377
421
|
/**
|
|
378
422
|
* Get latest revisions by entry IDs.
|
|
379
423
|
*/
|
|
380
|
-
getLatestEntriesByIds: async (
|
|
424
|
+
getLatestEntriesByIds: async (initialModel, ids) => {
|
|
381
425
|
const permission = await checkEntryPermissions({
|
|
382
426
|
rwd: "r"
|
|
383
427
|
});
|
|
384
|
-
await (0, _access.checkModelAccess)(context,
|
|
428
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
429
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
430
|
+
model: initialModel,
|
|
431
|
+
plugins
|
|
432
|
+
});
|
|
385
433
|
const entries = await storageOperations.entries.getLatestByIds(model, {
|
|
386
434
|
ids
|
|
387
435
|
});
|
|
388
436
|
return entries.filter(entry => (0, _ownership.validateOwnership)(context, permission, entry));
|
|
389
437
|
},
|
|
390
|
-
getEntryRevisions: async (
|
|
438
|
+
getEntryRevisions: async (initialModel, entryId) => {
|
|
439
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
440
|
+
model: initialModel,
|
|
441
|
+
plugins
|
|
442
|
+
});
|
|
391
443
|
return storageOperations.entries.getRevisions(model, {
|
|
392
444
|
id: entryId
|
|
393
445
|
});
|
|
@@ -398,10 +450,14 @@ const createContentEntryCrud = params => {
|
|
|
398
450
|
*
|
|
399
451
|
* @internal
|
|
400
452
|
*/
|
|
401
|
-
getEntry: async (
|
|
453
|
+
getEntry: async (initialModel, params) => {
|
|
402
454
|
await checkEntryPermissions({
|
|
403
455
|
rwd: "r"
|
|
404
456
|
});
|
|
457
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
458
|
+
model: initialModel,
|
|
459
|
+
plugins
|
|
460
|
+
});
|
|
405
461
|
const {
|
|
406
462
|
where,
|
|
407
463
|
sort
|
|
@@ -428,11 +484,15 @@ const createContentEntryCrud = params => {
|
|
|
428
484
|
*
|
|
429
485
|
* @internal
|
|
430
486
|
*/
|
|
431
|
-
listEntries: async (
|
|
487
|
+
listEntries: async (initialModel, params) => {
|
|
432
488
|
const permission = await checkEntryPermissions({
|
|
433
489
|
rwd: "r"
|
|
434
490
|
});
|
|
435
|
-
await (0, _access.checkModelAccess)(context,
|
|
491
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
492
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
493
|
+
model: initialModel,
|
|
494
|
+
plugins
|
|
495
|
+
});
|
|
436
496
|
const {
|
|
437
497
|
where: initialWhere
|
|
438
498
|
} = params;
|
|
@@ -468,35 +528,45 @@ const createContentEntryCrud = params => {
|
|
|
468
528
|
});
|
|
469
529
|
}
|
|
470
530
|
|
|
471
|
-
await onBeforeEntryList.publish({
|
|
472
|
-
where,
|
|
473
|
-
model
|
|
474
|
-
});
|
|
475
531
|
const fields = getSearchableFields({
|
|
476
532
|
model,
|
|
477
533
|
plugins: context.plugins,
|
|
478
534
|
fields: params.fields || []
|
|
479
535
|
});
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
536
|
+
|
|
537
|
+
try {
|
|
538
|
+
await onBeforeEntryList.publish({
|
|
539
|
+
where,
|
|
540
|
+
model
|
|
541
|
+
});
|
|
542
|
+
const {
|
|
543
|
+
hasMoreItems,
|
|
544
|
+
totalCount,
|
|
545
|
+
cursor,
|
|
546
|
+
items
|
|
547
|
+
} = await storageOperations.entries.list(model, _objectSpread(_objectSpread({}, params), {}, {
|
|
548
|
+
where,
|
|
549
|
+
fields
|
|
550
|
+
}));
|
|
551
|
+
const meta = {
|
|
552
|
+
hasMoreItems,
|
|
553
|
+
totalCount,
|
|
554
|
+
|
|
555
|
+
/**
|
|
556
|
+
* Cursor should be null if there are no more items to load.
|
|
557
|
+
* Just make sure of that, disregarding what is returned from the storageOperations.entries.list method.
|
|
558
|
+
*/
|
|
559
|
+
cursor: hasMoreItems ? cursor : null
|
|
560
|
+
};
|
|
561
|
+
return [items, meta];
|
|
562
|
+
} catch (ex) {
|
|
563
|
+
throw new _error.default("Error while fetching entries from storage.", "LIST_ENTRIES_ERROR", {
|
|
564
|
+
params,
|
|
565
|
+
error: ex,
|
|
566
|
+
model,
|
|
567
|
+
fields
|
|
568
|
+
});
|
|
569
|
+
}
|
|
500
570
|
},
|
|
501
571
|
listLatestEntries: async function (model, params) {
|
|
502
572
|
const where = (params === null || params === void 0 ? void 0 : params.where) || {};
|
|
@@ -518,16 +588,20 @@ const createContentEntryCrud = params => {
|
|
|
518
588
|
})
|
|
519
589
|
}));
|
|
520
590
|
},
|
|
521
|
-
createEntry: async (
|
|
591
|
+
createEntry: async (initialModel, inputData) => {
|
|
522
592
|
await checkEntryPermissions({
|
|
523
593
|
rwd: "w"
|
|
524
594
|
});
|
|
525
|
-
await (0, _access.checkModelAccess)(context,
|
|
595
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
596
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
597
|
+
model: initialModel,
|
|
598
|
+
plugins
|
|
599
|
+
});
|
|
526
600
|
/**
|
|
527
601
|
* Make sure we only work with fields that are defined in the model.
|
|
528
602
|
*/
|
|
529
603
|
|
|
530
|
-
const initialInput =
|
|
604
|
+
const initialInput = mapAndCleanCreateInputData(model, inputData);
|
|
531
605
|
await (0, _entryDataValidation.validateModelEntryData)({
|
|
532
606
|
context,
|
|
533
607
|
model,
|
|
@@ -596,16 +670,20 @@ const createContentEntryCrud = params => {
|
|
|
596
670
|
});
|
|
597
671
|
}
|
|
598
672
|
},
|
|
599
|
-
createEntryRevisionFrom: async (
|
|
673
|
+
createEntryRevisionFrom: async (initialModel, sourceId, inputData) => {
|
|
600
674
|
const permission = await checkEntryPermissions({
|
|
601
675
|
rwd: "w"
|
|
602
676
|
});
|
|
603
|
-
await (0, _access.checkModelAccess)(context,
|
|
677
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
678
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
679
|
+
model: initialModel,
|
|
680
|
+
plugins
|
|
681
|
+
});
|
|
604
682
|
/**
|
|
605
683
|
* Make sure we only work with fields that are defined in the model.
|
|
606
684
|
*/
|
|
607
685
|
|
|
608
|
-
const input =
|
|
686
|
+
const input = mapAndCleanUpdatedInputData(model, inputData);
|
|
609
687
|
/**
|
|
610
688
|
* Entries are identified by a common parent ID + Revision number.
|
|
611
689
|
*/
|
|
@@ -700,16 +778,20 @@ const createContentEntryCrud = params => {
|
|
|
700
778
|
});
|
|
701
779
|
}
|
|
702
780
|
},
|
|
703
|
-
updateEntry: async (
|
|
781
|
+
updateEntry: async (initialModel, id, inputData, metaInput) => {
|
|
704
782
|
const permission = await checkEntryPermissions({
|
|
705
783
|
rwd: "w"
|
|
706
784
|
});
|
|
707
|
-
await (0, _access.checkModelAccess)(context,
|
|
785
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
786
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
787
|
+
model: initialModel,
|
|
788
|
+
plugins
|
|
789
|
+
});
|
|
708
790
|
/**
|
|
709
791
|
* Make sure we only work with fields that are defined in the model.
|
|
710
792
|
*/
|
|
711
793
|
|
|
712
|
-
const input =
|
|
794
|
+
const input = mapAndCleanUpdatedInputData(model, inputData);
|
|
713
795
|
/**
|
|
714
796
|
* The entry we are going to update.
|
|
715
797
|
*/
|
|
@@ -790,11 +872,15 @@ const createContentEntryCrud = params => {
|
|
|
790
872
|
});
|
|
791
873
|
}
|
|
792
874
|
},
|
|
793
|
-
republishEntry: async (
|
|
875
|
+
republishEntry: async (initialModel, id) => {
|
|
794
876
|
await checkEntryPermissions({
|
|
795
877
|
rwd: "w"
|
|
796
878
|
});
|
|
797
|
-
await (0, _access.checkModelAccess)(context,
|
|
879
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
880
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
881
|
+
model: initialModel,
|
|
882
|
+
plugins
|
|
883
|
+
});
|
|
798
884
|
/**
|
|
799
885
|
* Fetch the entry from the storage.
|
|
800
886
|
*/
|
|
@@ -863,11 +949,15 @@ const createContentEntryCrud = params => {
|
|
|
863
949
|
});
|
|
864
950
|
}
|
|
865
951
|
},
|
|
866
|
-
deleteEntryRevision: async (
|
|
952
|
+
deleteEntryRevision: async (initialModel, revisionId) => {
|
|
867
953
|
const permission = await checkEntryPermissions({
|
|
868
954
|
rwd: "d"
|
|
869
955
|
});
|
|
870
|
-
await (0, _access.checkModelAccess)(context,
|
|
956
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
957
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
958
|
+
model: initialModel,
|
|
959
|
+
plugins
|
|
960
|
+
});
|
|
871
961
|
const {
|
|
872
962
|
id: entryId,
|
|
873
963
|
version
|
|
@@ -939,11 +1029,15 @@ const createContentEntryCrud = params => {
|
|
|
939
1029
|
});
|
|
940
1030
|
}
|
|
941
1031
|
},
|
|
942
|
-
deleteEntry: async (
|
|
1032
|
+
deleteEntry: async (initialModel, entryId) => {
|
|
943
1033
|
const permission = await checkEntryPermissions({
|
|
944
1034
|
rwd: "d"
|
|
945
1035
|
});
|
|
946
|
-
await (0, _access.checkModelAccess)(context,
|
|
1036
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
1037
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
1038
|
+
model: initialModel,
|
|
1039
|
+
plugins
|
|
1040
|
+
});
|
|
947
1041
|
const storageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {
|
|
948
1042
|
id: entryId
|
|
949
1043
|
});
|
|
@@ -959,11 +1053,15 @@ const createContentEntryCrud = params => {
|
|
|
959
1053
|
entry
|
|
960
1054
|
});
|
|
961
1055
|
},
|
|
962
|
-
publishEntry: async (
|
|
1056
|
+
publishEntry: async (initialModel, id) => {
|
|
963
1057
|
const permission = await checkEntryPermissions({
|
|
964
1058
|
pw: "p"
|
|
965
1059
|
});
|
|
966
|
-
await (0, _access.checkModelAccess)(context,
|
|
1060
|
+
await (0, _access.checkModelAccess)(context, initialModel);
|
|
1061
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
1062
|
+
model: initialModel,
|
|
1063
|
+
plugins
|
|
1064
|
+
});
|
|
967
1065
|
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
968
1066
|
id
|
|
969
1067
|
});
|
|
@@ -1011,10 +1109,14 @@ const createContentEntryCrud = params => {
|
|
|
1011
1109
|
});
|
|
1012
1110
|
}
|
|
1013
1111
|
},
|
|
1014
|
-
requestEntryChanges: async (
|
|
1112
|
+
requestEntryChanges: async (initialModel, id) => {
|
|
1015
1113
|
const permission = await checkEntryPermissions({
|
|
1016
1114
|
pw: "c"
|
|
1017
1115
|
});
|
|
1116
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
1117
|
+
model: initialModel,
|
|
1118
|
+
plugins
|
|
1119
|
+
});
|
|
1018
1120
|
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
1019
1121
|
id
|
|
1020
1122
|
});
|
|
@@ -1066,13 +1168,17 @@ const createContentEntryCrud = params => {
|
|
|
1066
1168
|
});
|
|
1067
1169
|
}
|
|
1068
1170
|
},
|
|
1069
|
-
requestEntryReview: async (
|
|
1171
|
+
requestEntryReview: async (initialModel, id) => {
|
|
1070
1172
|
const permission = await checkEntryPermissions({
|
|
1071
1173
|
pw: "r"
|
|
1072
1174
|
});
|
|
1073
1175
|
const {
|
|
1074
1176
|
id: entryId
|
|
1075
1177
|
} = (0, _utils.parseIdentifier)(id);
|
|
1178
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
1179
|
+
model: initialModel,
|
|
1180
|
+
plugins
|
|
1181
|
+
});
|
|
1076
1182
|
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
1077
1183
|
id
|
|
1078
1184
|
});
|
|
@@ -1126,10 +1232,14 @@ const createContentEntryCrud = params => {
|
|
|
1126
1232
|
});
|
|
1127
1233
|
}
|
|
1128
1234
|
},
|
|
1129
|
-
unpublishEntry: async (
|
|
1235
|
+
unpublishEntry: async (initialModel, id) => {
|
|
1130
1236
|
const permission = await checkEntryPermissions({
|
|
1131
1237
|
pw: "u"
|
|
1132
1238
|
});
|
|
1239
|
+
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
1240
|
+
model: initialModel,
|
|
1241
|
+
plugins
|
|
1242
|
+
});
|
|
1133
1243
|
const {
|
|
1134
1244
|
id: entryId
|
|
1135
1245
|
} = (0, _utils.parseIdentifier)(id);
|