@webiny/api-headless-cms 0.0.0-unstable.1e66d121db → 0.0.0-unstable.2696f9d9e8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants.d.ts +32 -0
- package/constants.js +57 -0
- package/constants.js.map +1 -0
- package/context.d.ts +5 -2
- package/context.js +100 -25
- package/context.js.map +1 -1
- package/crud/contentEntry/afterDelete.js +2 -5
- package/crud/contentEntry/afterDelete.js.map +1 -1
- package/crud/contentEntry/beforeCreate.js +2 -3
- package/crud/contentEntry/beforeCreate.js.map +1 -1
- package/crud/contentEntry/beforeUpdate.js +2 -3
- package/crud/contentEntry/beforeUpdate.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createEntryData.d.ts +20 -0
- package/crud/contentEntry/entryDataFactories/createEntryData.js +228 -0
- package/crud/contentEntry/entryDataFactories/createEntryData.js.map +1 -0
- package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.d.ts +21 -0
- package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js +114 -0
- package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js.map +1 -0
- package/crud/contentEntry/entryDataFactories/createPublishEntryData.d.ts +13 -0
- package/crud/contentEntry/entryDataFactories/createPublishEntryData.js +61 -0
- package/crud/contentEntry/entryDataFactories/createPublishEntryData.js.map +1 -0
- package/crud/contentEntry/entryDataFactories/createRepublishEntryData.d.ts +12 -0
- package/crud/contentEntry/entryDataFactories/createRepublishEntryData.js +57 -0
- package/crud/contentEntry/entryDataFactories/createRepublishEntryData.js.map +1 -0
- package/crud/contentEntry/entryDataFactories/createUnpublishEntryData.d.ts +12 -0
- package/crud/contentEntry/entryDataFactories/createUnpublishEntryData.js +38 -0
- package/crud/contentEntry/entryDataFactories/createUnpublishEntryData.js.map +1 -0
- package/crud/contentEntry/entryDataFactories/createUpdateEntryData.d.ts +20 -0
- package/crud/contentEntry/entryDataFactories/createUpdateEntryData.js +122 -0
- package/crud/contentEntry/entryDataFactories/createUpdateEntryData.js.map +1 -0
- package/crud/contentEntry/entryDataFactories/index.d.ts +8 -0
- package/crud/contentEntry/entryDataFactories/index.js +95 -0
- package/crud/contentEntry/entryDataFactories/index.js.map +1 -0
- package/crud/contentEntry/entryDataFactories/mapAndCleanUpdatedInputData.d.ts +5 -0
- package/crud/contentEntry/entryDataFactories/mapAndCleanUpdatedInputData.js +36 -0
- package/crud/contentEntry/entryDataFactories/mapAndCleanUpdatedInputData.js.map +1 -0
- package/crud/contentEntry/entryDataFactories/statuses.d.ts +4 -0
- package/crud/contentEntry/entryDataFactories/statuses.js +15 -0
- package/crud/contentEntry/entryDataFactories/statuses.js.map +1 -0
- package/crud/contentEntry/entryDataValidation.d.ts +4 -2
- package/crud/contentEntry/entryDataValidation.js +222 -83
- package/crud/contentEntry/entryDataValidation.js.map +1 -1
- package/crud/contentEntry/markLockedFields.d.ts +1 -1
- package/crud/contentEntry/markLockedFields.js +34 -37
- package/crud/contentEntry/markLockedFields.js.map +1 -1
- package/crud/contentEntry/referenceFieldsMapping.d.ts +6 -0
- package/crud/contentEntry/referenceFieldsMapping.js +145 -145
- package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
- package/crud/contentEntry/searchableFields.d.ts +9 -0
- package/crud/contentEntry/searchableFields.js +73 -0
- package/crud/contentEntry/searchableFields.js.map +1 -0
- package/crud/contentEntry.crud.d.ts +9 -5
- package/crud/contentEntry.crud.js +1121 -1070
- package/crud/contentEntry.crud.js.map +1 -1
- package/crud/contentModel/beforeCreate.d.ts +2 -3
- package/crud/contentModel/beforeCreate.js +53 -117
- package/crud/contentModel/beforeCreate.js.map +1 -1
- package/crud/contentModel/beforeDelete.d.ts +1 -1
- package/crud/contentModel/beforeDelete.js +3 -15
- package/crud/contentModel/beforeDelete.js.map +1 -1
- package/crud/contentModel/beforeUpdate.d.ts +2 -4
- package/crud/contentModel/beforeUpdate.js +32 -12
- package/crud/contentModel/beforeUpdate.js.map +1 -1
- package/crud/contentModel/compatibility/modelApiName.d.ts +3 -0
- package/crud/contentModel/compatibility/modelApiName.js +26 -0
- package/crud/contentModel/compatibility/modelApiName.js.map +1 -0
- package/crud/contentModel/contentModelManagerFactory.js +2 -7
- package/crud/contentModel/contentModelManagerFactory.js.map +1 -1
- package/crud/contentModel/createFieldStorageId.js +6 -3
- package/crud/contentModel/createFieldStorageId.js.map +1 -1
- package/crud/contentModel/defaultFields.d.ts +5 -0
- package/crud/contentModel/defaultFields.js +60 -0
- package/crud/contentModel/defaultFields.js.map +1 -0
- package/crud/contentModel/ensureTypeTag.d.ts +5 -0
- package/crud/contentModel/ensureTypeTag.js +21 -0
- package/crud/contentModel/ensureTypeTag.js.map +1 -0
- package/crud/contentModel/fields/descriptionField.d.ts +2 -0
- package/crud/contentModel/fields/descriptionField.js +44 -0
- package/crud/contentModel/fields/descriptionField.js.map +1 -0
- package/crud/contentModel/fields/imageField.d.ts +2 -0
- package/crud/contentModel/fields/imageField.js +44 -0
- package/crud/contentModel/fields/imageField.js.map +1 -0
- package/crud/contentModel/fields/titleField.d.ts +2 -0
- package/crud/contentModel/fields/titleField.js +60 -0
- package/crud/contentModel/fields/titleField.js.map +1 -0
- package/crud/contentModel/listModelsFromDatabase.d.ts +10 -0
- package/crud/contentModel/listModelsFromDatabase.js +38 -0
- package/crud/contentModel/listModelsFromDatabase.js.map +1 -0
- package/crud/contentModel/validate/endingAllowed.d.ts +6 -0
- package/crud/contentModel/validate/endingAllowed.js +28 -0
- package/crud/contentModel/validate/endingAllowed.js.map +1 -0
- package/crud/contentModel/validate/isModelEndingAllowed.d.ts +6 -0
- package/crud/contentModel/validate/isModelEndingAllowed.js +26 -0
- package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -0
- package/crud/contentModel/validate/modelId.d.ts +11 -0
- package/crud/contentModel/validate/modelId.js +38 -0
- package/crud/contentModel/validate/modelId.js.map +1 -0
- package/crud/contentModel/validate/pluralApiName.d.ts +7 -0
- package/crud/contentModel/validate/pluralApiName.js +26 -0
- package/crud/contentModel/validate/pluralApiName.js.map +1 -0
- package/crud/contentModel/validate/singularApiName.d.ts +7 -0
- package/crud/contentModel/validate/singularApiName.js +26 -0
- package/crud/contentModel/validate/singularApiName.js.map +1 -0
- package/crud/contentModel/validateModel.d.ts +4 -4
- package/crud/contentModel/validateModel.js +8 -11
- package/crud/contentModel/validateModel.js.map +1 -1
- package/crud/contentModel/validateModelFields.d.ts +4 -4
- package/crud/contentModel/validateModelFields.js +136 -152
- package/crud/contentModel/validateModelFields.js.map +1 -1
- package/crud/contentModel/validation.d.ts +872 -0
- package/crud/contentModel/validation.js +205 -0
- package/crud/contentModel/validation.js.map +1 -0
- package/crud/contentModel.crud.d.ts +2 -0
- package/crud/contentModel.crud.js +436 -445
- package/crud/contentModel.crud.js.map +1 -1
- package/crud/contentModelGroup/beforeCreate.d.ts +1 -1
- package/crud/contentModelGroup/beforeCreate.js +14 -12
- package/crud/contentModelGroup/beforeCreate.js.map +1 -1
- package/crud/contentModelGroup/beforeDelete.js +2 -8
- package/crud/contentModelGroup/beforeDelete.js.map +1 -1
- package/crud/contentModelGroup/beforeUpdate.js +2 -5
- package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
- package/crud/contentModelGroup/listGroupsFromDatabase.d.ts +8 -0
- package/crud/contentModelGroup/listGroupsFromDatabase.js +22 -0
- package/crud/contentModelGroup/listGroupsFromDatabase.js.map +1 -0
- package/crud/contentModelGroup/validation.d.ts +33 -0
- package/crud/contentModelGroup/validation.js +37 -0
- package/crud/contentModelGroup/validation.js.map +1 -0
- package/crud/contentModelGroup.crud.d.ts +3 -1
- package/crud/contentModelGroup.crud.js +291 -289
- package/crud/contentModelGroup.crud.js.map +1 -1
- package/crud/system.crud.js +8 -106
- package/crud/system.crud.js.map +1 -1
- package/export/crud/exporting.d.ts +3 -0
- package/export/crud/exporting.js +49 -0
- package/export/crud/exporting.js.map +1 -0
- package/export/crud/importing.d.ts +3 -0
- package/export/crud/importing.js +79 -0
- package/export/crud/importing.js.map +1 -0
- package/export/crud/imports/importData.d.ts +14 -0
- package/export/crud/imports/importData.js +52 -0
- package/export/crud/imports/importData.js.map +1 -0
- package/export/crud/imports/importGroups.d.ts +8 -0
- package/export/crud/imports/importGroups.js +104 -0
- package/export/crud/imports/importGroups.js.map +1 -0
- package/export/crud/imports/importModels.d.ts +8 -0
- package/export/crud/imports/importModels.js +136 -0
- package/export/crud/imports/importModels.js.map +1 -0
- package/export/crud/imports/validateGroups.d.ts +8 -0
- package/export/crud/imports/validateGroups.js +112 -0
- package/export/crud/imports/validateGroups.js.map +1 -0
- package/export/crud/imports/validateInput.d.ts +19 -0
- package/export/crud/imports/validateInput.js +55 -0
- package/export/crud/imports/validateInput.js.map +1 -0
- package/export/crud/imports/validateModels.d.ts +12 -0
- package/export/crud/imports/validateModels.js +203 -0
- package/export/crud/imports/validateModels.js.map +1 -0
- package/export/crud/index.d.ts +4 -0
- package/export/crud/index.js +15 -0
- package/export/crud/index.js.map +1 -0
- package/export/crud/sanitize.d.ts +4 -0
- package/export/crud/sanitize.js +35 -0
- package/export/crud/sanitize.js.map +1 -0
- package/export/graphql/index.d.ts +3 -0
- package/export/graphql/index.js +188 -0
- package/export/graphql/index.js.map +1 -0
- package/export/index.d.ts +2 -0
- package/export/index.js +29 -0
- package/export/index.js.map +1 -0
- package/export/types.d.ts +113 -0
- package/export/types.js +22 -0
- package/export/types.js.map +1 -0
- package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js +3 -19
- package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.d.ts +11 -0
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +200 -0
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -0
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +46 -90
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/index.d.ts +2 -1
- package/fieldConverters/index.js +4 -5
- package/fieldConverters/index.js.map +1 -1
- package/graphql/buildSchemaPlugins.d.ts +8 -3
- package/graphql/buildSchemaPlugins.js +9 -11
- package/graphql/buildSchemaPlugins.js.map +1 -1
- package/graphql/checkEndpointAccess.d.ts +2 -0
- package/graphql/checkEndpointAccess.js +20 -0
- package/graphql/checkEndpointAccess.js.map +1 -0
- package/graphql/createExecutableSchema.d.ts +6 -0
- package/graphql/createExecutableSchema.js +31 -0
- package/graphql/createExecutableSchema.js.map +1 -0
- package/graphql/createRequestBody.d.ts +2 -0
- package/graphql/createRequestBody.js +16 -0
- package/graphql/createRequestBody.js.map +1 -0
- package/graphql/formatErrorPayload.d.ts +1 -0
- package/graphql/formatErrorPayload.js +27 -0
- package/graphql/formatErrorPayload.js.map +1 -0
- package/graphql/generateSchema.d.ts +8 -0
- package/graphql/generateSchema.js +33 -0
- package/graphql/generateSchema.js.map +1 -0
- package/graphql/getSchema.d.ts +16 -0
- package/graphql/getSchema.js +118 -0
- package/graphql/getSchema.js.map +1 -0
- package/graphql/graphQLHandlerFactory.js +8 -129
- package/graphql/graphQLHandlerFactory.js.map +1 -1
- package/graphql/handleRequest.d.ts +11 -0
- package/graphql/handleRequest.js +79 -0
- package/graphql/handleRequest.js.map +1 -0
- package/graphql/index.d.ts +1 -3
- package/graphql/index.js +4 -46
- package/graphql/index.js.map +1 -1
- package/graphql/schema/baseContentSchema.d.ts +6 -2
- package/graphql/schema/baseContentSchema.js +20 -29
- package/graphql/schema/baseContentSchema.js.map +1 -1
- package/graphql/schema/baseSchema.d.ts +2 -0
- package/graphql/schema/baseSchema.js +146 -0
- package/graphql/schema/baseSchema.js.map +1 -0
- package/graphql/schema/contentEntries.d.ts +6 -2
- package/graphql/schema/contentEntries.js +160 -111
- package/graphql/schema/contentEntries.js.map +1 -1
- package/graphql/schema/contentModelGroups.d.ts +6 -2
- package/graphql/schema/contentModelGroups.js +20 -30
- package/graphql/schema/contentModelGroups.js.map +1 -1
- package/graphql/schema/contentModels.d.ts +6 -2
- package/graphql/schema/contentModels.js +81 -26
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/createFieldResolvers.d.ts +2 -2
- package/graphql/schema/createFieldResolvers.js +29 -40
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/graphql/schema/createFieldTypePluginRecords.d.ts +3 -0
- package/graphql/schema/createFieldTypePluginRecords.js +15 -0
- package/graphql/schema/createFieldTypePluginRecords.js.map +1 -0
- package/graphql/schema/createManageResolvers.d.ts +1 -1
- package/graphql/schema/createManageResolvers.js +59 -52
- package/graphql/schema/createManageResolvers.js.map +1 -1
- package/graphql/schema/createManageSDL.d.ts +3 -0
- package/graphql/schema/createManageSDL.js +119 -81
- package/graphql/schema/createManageSDL.js.map +1 -1
- package/graphql/schema/createPreviewResolvers.js +9 -22
- package/graphql/schema/createPreviewResolvers.js.map +1 -1
- package/graphql/schema/createReadResolvers.js +14 -22
- package/graphql/schema/createReadResolvers.js.map +1 -1
- package/graphql/schema/createReadSDL.d.ts +3 -0
- package/graphql/schema/createReadSDL.js +57 -48
- package/graphql/schema/createReadSDL.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveCreate.d.ts +2 -1
- package/graphql/schema/resolvers/manage/resolveCreate.js +3 -4
- package/graphql/schema/resolvers/manage/resolveCreate.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveCreateFrom.d.ts +2 -1
- package/graphql/schema/resolvers/manage/resolveCreateFrom.js +3 -4
- package/graphql/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveDelete.d.ts +2 -1
- package/graphql/schema/resolvers/manage/resolveDelete.js +15 -9
- package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveDeleteMultiple.d.ts +7 -0
- package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js +22 -0
- package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js.map +1 -0
- package/graphql/schema/resolvers/manage/resolveGet.js +11 -20
- package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveGetByIds.js +2 -3
- package/graphql/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveGetRevisions.js +2 -3
- package/graphql/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.d.ts +4 -0
- package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js +20 -0
- package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js.map +1 -0
- package/graphql/schema/resolvers/manage/resolveList.js +2 -3
- package/graphql/schema/resolvers/manage/resolveList.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveMove.d.ts +8 -0
- package/graphql/schema/resolvers/manage/resolveMove.js +27 -0
- package/graphql/schema/resolvers/manage/resolveMove.js.map +1 -0
- package/graphql/schema/resolvers/manage/resolvePublish.js +2 -3
- package/graphql/schema/resolvers/manage/resolvePublish.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveRepublish.js +2 -3
- package/graphql/schema/resolvers/manage/resolveRepublish.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveUnpublish.js +2 -3
- package/graphql/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveUpdate.d.ts +2 -1
- package/graphql/schema/resolvers/manage/resolveUpdate.js +3 -4
- package/graphql/schema/resolvers/manage/resolveUpdate.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveValidate.d.ts +8 -0
- package/graphql/schema/resolvers/manage/{resolveRequestChanges.js → resolveValidate.js} +5 -6
- package/graphql/schema/resolvers/manage/resolveValidate.js.map +1 -0
- package/graphql/schema/resolvers/preview/resolveGet.js +5 -12
- package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
- package/graphql/schema/resolvers/preview/resolveList.js +2 -3
- package/graphql/schema/resolvers/preview/resolveList.js.map +1 -1
- package/graphql/schema/resolvers/read/resolveGet.js +5 -12
- package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
- package/graphql/schema/resolvers/read/resolveList.js +2 -3
- package/graphql/schema/resolvers/read/resolveList.js.map +1 -1
- package/graphql/schema/schemaPlugins.d.ts +8 -3
- package/graphql/schema/schemaPlugins.js +60 -69
- package/graphql/schema/schemaPlugins.js.map +1 -1
- package/graphql/system.d.ts +2 -5
- package/graphql/system.js +58 -98
- package/graphql/system.js.map +1 -1
- package/graphqlFields/boolean.js +2 -12
- package/graphqlFields/boolean.js.map +1 -1
- package/graphqlFields/datetime.js +4 -21
- package/graphqlFields/datetime.js.map +1 -1
- package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +2 -0
- package/graphqlFields/dynamicZone/dynamicZoneField.js +266 -0
- package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.d.ts +3 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.js +111 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -0
- package/graphqlFields/dynamicZone/index.d.ts +2 -0
- package/graphqlFields/dynamicZone/index.js +21 -0
- package/graphqlFields/dynamicZone/index.js.map +1 -0
- package/graphqlFields/file.js +2 -8
- package/graphqlFields/file.js.map +1 -1
- package/graphqlFields/helpers.d.ts +0 -1
- package/graphqlFields/helpers.js +5 -27
- package/graphqlFields/helpers.js.map +1 -1
- package/graphqlFields/index.d.ts +1 -1
- package/graphqlFields/index.js +5 -12
- package/graphqlFields/index.js.map +1 -1
- package/graphqlFields/json.d.ts +2 -0
- package/graphqlFields/json.js +49 -0
- package/graphqlFields/json.js.map +1 -0
- package/graphqlFields/longText.js +13 -12
- package/graphqlFields/longText.js.map +1 -1
- package/graphqlFields/number.js +7 -12
- package/graphqlFields/number.js.map +1 -1
- package/graphqlFields/object.js +114 -101
- package/graphqlFields/object.js.map +1 -1
- package/graphqlFields/ref.js +111 -119
- package/graphqlFields/ref.js.map +1 -1
- package/graphqlFields/richText.js +2 -9
- package/graphqlFields/richText.js.map +1 -1
- package/graphqlFields/text.js +4 -11
- package/graphqlFields/text.js.map +1 -1
- package/index.d.ts +6 -3
- package/index.js +43 -29
- package/index.js.map +1 -1
- package/modelManager/DefaultCmsModelManager.js +2 -20
- package/modelManager/DefaultCmsModelManager.js.map +1 -1
- package/modelManager/index.js +2 -4
- package/modelManager/index.js.map +1 -1
- package/package.json +36 -43
- package/parameters/context.js +3 -5
- package/parameters/context.js.map +1 -1
- package/parameters/header.js +6 -16
- package/parameters/header.js.map +1 -1
- package/parameters/index.js +3 -9
- package/parameters/index.js.map +1 -1
- package/parameters/manual.js +9 -11
- package/parameters/manual.js.map +1 -1
- package/parameters/path.js +3 -13
- package/parameters/path.js.map +1 -1
- package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
- package/plugins/CmsGraphQLSchemaPlugin.js +13 -0
- package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +20 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.js +27 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -0
- package/plugins/CmsGroupPlugin.d.ts +6 -3
- package/plugins/CmsGroupPlugin.js +7 -13
- package/plugins/CmsGroupPlugin.js.map +1 -1
- package/plugins/CmsModelFieldConverterPlugin.d.ts +2 -2
- package/plugins/CmsModelFieldConverterPlugin.js +5 -9
- package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
- package/plugins/CmsModelPlugin.d.ts +25 -5
- package/plugins/CmsModelPlugin.js +72 -57
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/plugins/CmsParametersPlugin.js +6 -10
- package/plugins/CmsParametersPlugin.js.map +1 -1
- package/plugins/StorageOperationsCmsModelPlugin.d.ts +23 -0
- package/plugins/StorageOperationsCmsModelPlugin.js +41 -0
- package/plugins/StorageOperationsCmsModelPlugin.js.map +1 -0
- package/plugins/StorageTransformPlugin.d.ts +13 -13
- package/plugins/StorageTransformPlugin.js +3 -13
- package/plugins/StorageTransformPlugin.js.map +1 -1
- package/plugins/index.d.ts +3 -0
- package/plugins/index.js +36 -11
- package/plugins/index.js.map +1 -1
- package/storage/default.js +2 -3
- package/storage/default.js.map +1 -1
- package/storage/index.d.ts +1 -0
- package/storage/index.js +15 -0
- package/storage/index.js.map +1 -0
- package/storage/json.d.ts +2 -0
- package/storage/json.js +27 -0
- package/storage/json.js.map +1 -0
- package/storage/object.js +11 -27
- package/storage/object.js.map +1 -1
- package/types.d.ts +755 -384
- package/types.js +83 -90
- package/types.js.map +1 -1
- package/utils/access.d.ts +9 -8
- package/utils/access.js +11 -75
- package/utils/access.js.map +1 -1
- package/utils/caching/Cache.d.ts +2 -0
- package/utils/caching/Cache.js +51 -0
- package/utils/caching/Cache.js.map +1 -0
- package/utils/caching/CacheKey.d.ts +2 -0
- package/utils/caching/CacheKey.js +40 -0
- package/utils/caching/CacheKey.js.map +1 -0
- package/utils/caching/index.d.ts +2 -0
- package/utils/caching/index.js +29 -0
- package/utils/caching/index.js.map +1 -0
- package/utils/caching/types.d.ts +11 -0
- package/utils/caching/types.js +7 -0
- package/utils/caching/types.js.map +1 -0
- package/utils/converters/Converter.js +3 -17
- package/utils/converters/Converter.js.map +1 -1
- package/utils/converters/ConverterCollection.d.ts +7 -0
- package/utils/converters/ConverterCollection.js +43 -31
- package/utils/converters/ConverterCollection.js.map +1 -1
- package/utils/converters/valueKeyStorageConverter.d.ts +1 -5
- package/utils/converters/valueKeyStorageConverter.js +32 -45
- package/utils/converters/valueKeyStorageConverter.js.map +1 -1
- package/utils/createTypeFromFields.d.ts +16 -0
- package/utils/createTypeFromFields.js +71 -0
- package/utils/createTypeFromFields.js.map +1 -0
- package/utils/createTypeName.d.ts +0 -2
- package/utils/createTypeName.js +4 -17
- package/utils/createTypeName.js.map +1 -1
- package/utils/date.d.ts +10 -0
- package/utils/date.js +36 -0
- package/utils/date.js.map +1 -0
- package/utils/entryStorage.d.ts +4 -4
- package/utils/entryStorage.js +27 -38
- package/utils/entryStorage.js.map +1 -1
- package/utils/filterAsync.js +8 -12
- package/utils/filterAsync.js.map +1 -1
- package/utils/getBaseFieldType.d.ts +2 -0
- package/utils/getBaseFieldType.js +12 -0
- package/utils/getBaseFieldType.js.map +1 -0
- package/utils/getEntryDescription.d.ts +2 -0
- package/utils/getEntryDescription.js +19 -0
- package/utils/getEntryDescription.js.map +1 -0
- package/utils/getEntryImage.d.ts +2 -0
- package/utils/getEntryImage.js +19 -0
- package/utils/getEntryImage.js.map +1 -0
- package/utils/getEntryTitle.d.ts +1 -1
- package/utils/getEntryTitle.js +3 -10
- package/utils/getEntryTitle.js.map +1 -1
- package/utils/getSchemaFromFieldPlugins.d.ts +14 -6
- package/utils/getSchemaFromFieldPlugins.js +39 -17
- package/utils/getSchemaFromFieldPlugins.js.map +1 -1
- package/utils/identity.d.ts +2 -0
- package/utils/identity.js +20 -0
- package/utils/identity.js.map +1 -0
- package/utils/incrementEntryIdVersion.d.ts +5 -0
- package/utils/incrementEntryIdVersion.js +31 -0
- package/utils/incrementEntryIdVersion.js.map +1 -0
- package/utils/index.d.ts +1 -0
- package/utils/index.js +18 -0
- package/utils/index.js.map +1 -0
- package/utils/permissions/EntriesPermissions.d.ts +4 -0
- package/utils/permissions/EntriesPermissions.js +11 -0
- package/utils/permissions/EntriesPermissions.js.map +1 -0
- package/utils/permissions/ModelGroupsPermissions.d.ts +9 -0
- package/utils/permissions/ModelGroupsPermissions.js +50 -0
- package/utils/permissions/ModelGroupsPermissions.js.map +1 -0
- package/utils/permissions/ModelsPermissions.d.ts +22 -0
- package/utils/permissions/ModelsPermissions.js +90 -0
- package/utils/permissions/ModelsPermissions.js.map +1 -0
- package/utils/renderFields.d.ts +4 -2
- package/utils/renderFields.js +14 -11
- package/utils/renderFields.js.map +1 -1
- package/utils/renderGetFilterFields.d.ts +2 -2
- package/utils/renderGetFilterFields.js +10 -30
- package/utils/renderGetFilterFields.js.map +1 -1
- package/utils/renderInputFields.d.ts +4 -2
- package/utils/renderInputFields.js +21 -14
- package/utils/renderInputFields.js.map +1 -1
- package/utils/renderListFilterFields.d.ts +3 -1
- package/utils/renderListFilterFields.js +27 -30
- package/utils/renderListFilterFields.js.map +1 -1
- package/utils/renderSortEnum.d.ts +9 -5
- package/utils/renderSortEnum.js +29 -12
- package/utils/renderSortEnum.js.map +1 -1
- package/utils/toSlug.js +2 -4
- package/utils/toSlug.js.map +1 -1
- package/validators/dateGte.js +2 -7
- package/validators/dateGte.js.map +1 -1
- package/validators/dateLte.js +2 -7
- package/validators/dateLte.js.map +1 -1
- package/validators/gte.js +3 -10
- package/validators/gte.js.map +1 -1
- package/validators/in.js +3 -10
- package/validators/in.js.map +1 -1
- package/validators/index.js +2 -15
- package/validators/index.js.map +1 -1
- package/validators/lte.js +3 -10
- package/validators/lte.js.map +1 -1
- package/validators/maxLength.js +3 -10
- package/validators/maxLength.js.map +1 -1
- package/validators/minLength.js +3 -10
- package/validators/minLength.js.map +1 -1
- package/validators/pattern.js +4 -11
- package/validators/pattern.js.map +1 -1
- package/validators/patternPlugins/email.js +2 -2
- package/validators/patternPlugins/email.js.map +1 -1
- package/validators/patternPlugins/index.js +2 -8
- package/validators/patternPlugins/index.js.map +1 -1
- package/validators/patternPlugins/lowerCase.js +2 -2
- package/validators/patternPlugins/lowerCase.js.map +1 -1
- package/validators/patternPlugins/lowerCaseSpace.js +2 -2
- package/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
- package/validators/patternPlugins/upperCase.js +2 -2
- package/validators/patternPlugins/upperCase.js.map +1 -1
- package/validators/patternPlugins/upperCaseSpace.js +2 -2
- package/validators/patternPlugins/upperCaseSpace.js.map +1 -1
- package/validators/patternPlugins/url.js +2 -2
- package/validators/patternPlugins/url.js.map +1 -1
- package/validators/required.js +2 -5
- package/validators/required.js.map +1 -1
- package/validators/timeGte.js +3 -10
- package/validators/timeGte.js.map +1 -1
- package/validators/timeLte.js +3 -10
- package/validators/timeLte.js.map +1 -1
- package/validators/unique.js +3 -8
- package/validators/unique.js.map +1 -1
- package/crud/contentModel/afterCreate.d.ts +0 -8
- package/crud/contentModel/afterCreate.js +0 -18
- package/crud/contentModel/afterCreate.js.map +0 -1
- package/crud/contentModel/afterCreateFrom.d.ts +0 -8
- package/crud/contentModel/afterCreateFrom.js +0 -18
- package/crud/contentModel/afterCreateFrom.js.map +0 -1
- package/crud/contentModel/afterDelete.d.ts +0 -8
- package/crud/contentModel/afterDelete.js +0 -18
- package/crud/contentModel/afterDelete.js.map +0 -1
- package/crud/contentModel/afterUpdate.d.ts +0 -8
- package/crud/contentModel/afterUpdate.js +0 -18
- package/crud/contentModel/afterUpdate.js.map +0 -1
- package/crud/contentModel/createFieldModels.d.ts +0 -2
- package/crud/contentModel/createFieldModels.js +0 -26
- package/crud/contentModel/createFieldModels.js.map +0 -1
- package/crud/contentModel/fieldIdValidation.d.ts +0 -1
- package/crud/contentModel/fieldIdValidation.js +0 -25
- package/crud/contentModel/fieldIdValidation.js.map +0 -1
- package/crud/contentModel/idValidation.d.ts +0 -1
- package/crud/contentModel/idValidation.js +0 -22
- package/crud/contentModel/idValidation.js.map +0 -1
- package/crud/contentModel/models.d.ts +0 -4
- package/crud/contentModel/models.js +0 -180
- package/crud/contentModel/models.js.map +0 -1
- package/crud/contentModel/systemFields.d.ts +0 -1
- package/crud/contentModel/systemFields.js +0 -8
- package/crud/contentModel/systemFields.js.map +0 -1
- package/crud/contentModel/validateLayout.d.ts +0 -2
- package/crud/contentModel/validateLayout.js +0 -36
- package/crud/contentModel/validateLayout.js.map +0 -1
- package/crud/index.d.ts +0 -6
- package/crud/index.js +0 -85
- package/crud/index.js.map +0 -1
- package/crud/settings.crud.d.ts +0 -10
- package/crud/settings.crud.js +0 -83
- package/crud/settings.crud.js.map +0 -1
- package/graphql/schema/resolvers/commonFieldResolvers.d.ts +0 -6
- package/graphql/schema/resolvers/commonFieldResolvers.js +0 -14
- package/graphql/schema/resolvers/commonFieldResolvers.js.map +0 -1
- package/graphql/schema/resolvers/manage/resolveRequestChanges.d.ts +0 -7
- package/graphql/schema/resolvers/manage/resolveRequestChanges.js.map +0 -1
- package/graphql/schema/resolvers/manage/resolveRequestReview.d.ts +0 -7
- package/graphql/schema/resolvers/manage/resolveRequestReview.js +0 -21
- package/graphql/schema/resolvers/manage/resolveRequestReview.js.map +0 -1
- package/upgrades/5.33.0/index.d.ts +0 -3
- package/upgrades/5.33.0/index.js +0 -182
- package/upgrades/5.33.0/index.js.map +0 -1
- package/upgrades/index.d.ts +0 -1
- package/upgrades/index.js +0 -12
- package/upgrades/index.js.map +0 -1
- package/utils/filterModelFields.d.ts +0 -16
- package/utils/filterModelFields.js +0 -77
- package/utils/filterModelFields.js.map +0 -1
- package/utils/ownership.d.ts +0 -8
- package/utils/ownership.js +0 -41
- package/utils/ownership.js.map +0 -1
- package/utils/permissions.d.ts +0 -7
- package/utils/permissions.js +0 -106
- package/utils/permissions.js.map +0 -1
- package/utils/pluralizedTypeName.d.ts +0 -1
- package/utils/pluralizedTypeName.js +0 -26
- package/utils/pluralizedTypeName.js.map +0 -1
|
@@ -1,303 +1,123 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
|
-
exports.createContentEntryCrud =
|
|
9
|
-
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
var _mdbid = _interopRequireDefault(require("mdbid"));
|
|
13
|
-
|
|
7
|
+
exports.createContentEntryCrud = void 0;
|
|
8
|
+
var _utils = require("@webiny/utils");
|
|
9
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
14
10
|
var _handlerGraphql = require("@webiny/handler-graphql");
|
|
15
|
-
|
|
16
11
|
var _entryDataValidation = require("./contentEntry/entryDataValidation");
|
|
17
|
-
|
|
18
|
-
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
19
|
-
|
|
20
12
|
var _pubsub = require("@webiny/pubsub");
|
|
21
|
-
|
|
22
13
|
var _beforeCreate = require("./contentEntry/beforeCreate");
|
|
23
|
-
|
|
24
14
|
var _beforeUpdate = require("./contentEntry/beforeUpdate");
|
|
25
|
-
|
|
26
|
-
var _utils = require("@webiny/utils");
|
|
27
|
-
|
|
28
15
|
var _afterDelete = require("./contentEntry/afterDelete");
|
|
29
|
-
|
|
30
|
-
var _referenceFieldsMapping = require("./contentEntry/referenceFieldsMapping");
|
|
31
|
-
|
|
32
|
-
var _merge = _interopRequireDefault(require("lodash/merge"));
|
|
33
|
-
|
|
34
|
-
var _permissions = require("../utils/permissions");
|
|
35
|
-
|
|
36
|
-
var _access = require("../utils/access");
|
|
37
|
-
|
|
38
|
-
var _ownership = require("../utils/ownership");
|
|
39
|
-
|
|
40
16
|
var _entryStorage = require("../utils/entryStorage");
|
|
41
|
-
|
|
42
|
-
var
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
exports.STATUS_DRAFT = STATUS_DRAFT;
|
|
50
|
-
const STATUS_PUBLISHED = "published";
|
|
51
|
-
exports.STATUS_PUBLISHED = STATUS_PUBLISHED;
|
|
52
|
-
const STATUS_UNPUBLISHED = "unpublished";
|
|
53
|
-
exports.STATUS_UNPUBLISHED = STATUS_UNPUBLISHED;
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Used for some fields to convert their values.
|
|
57
|
-
*/
|
|
58
|
-
const convertDefaultValue = (field, value) => {
|
|
59
|
-
switch (field.type) {
|
|
60
|
-
case "boolean":
|
|
61
|
-
return Boolean(value);
|
|
62
|
-
|
|
63
|
-
case "number":
|
|
64
|
-
return Number(value);
|
|
65
|
-
|
|
66
|
-
default:
|
|
67
|
-
return value;
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const getDefaultValue = field => {
|
|
72
|
-
const {
|
|
73
|
-
settings,
|
|
74
|
-
multipleValues
|
|
75
|
-
} = field;
|
|
76
|
-
|
|
77
|
-
if (settings && settings.defaultValue !== undefined) {
|
|
78
|
-
return convertDefaultValue(field, settings.defaultValue);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const {
|
|
82
|
-
predefinedValues
|
|
83
|
-
} = field;
|
|
84
|
-
|
|
85
|
-
if (!predefinedValues || !predefinedValues.enabled || Array.isArray(predefinedValues.values) === false) {
|
|
86
|
-
return undefined;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (!multipleValues) {
|
|
90
|
-
const selectedValue = predefinedValues.values.find(value => {
|
|
91
|
-
return !!value.selected;
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
if (selectedValue) {
|
|
95
|
-
return convertDefaultValue(field, selectedValue.value);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return undefined;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return predefinedValues.values.filter(({
|
|
102
|
-
selected
|
|
103
|
-
}) => !!selected).map(({
|
|
104
|
-
value
|
|
105
|
-
}) => {
|
|
106
|
-
return convertDefaultValue(field, value);
|
|
107
|
-
});
|
|
108
|
-
};
|
|
109
|
-
/**
|
|
110
|
-
* Cleans and adds default values to create input data.
|
|
111
|
-
*/
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const mapAndCleanCreateInputData = (model, input) => {
|
|
115
|
-
return model.fields.reduce((acc, field) => {
|
|
116
|
-
/**
|
|
117
|
-
* This should never happen, but let's make it sure.
|
|
118
|
-
* The fix would be for the user to add the fieldId on the field definition.
|
|
119
|
-
*/
|
|
120
|
-
if (!field.fieldId) {
|
|
121
|
-
throw new _error.default("Field does not have an fieldId.", "MISSING_FIELD_ID", {
|
|
122
|
-
field
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const value = input[field.fieldId];
|
|
127
|
-
/**
|
|
128
|
-
* We set the default value on create input if value is not defined.
|
|
129
|
-
*/
|
|
130
|
-
|
|
131
|
-
acc[field.fieldId] = value === undefined ? getDefaultValue(field) : value;
|
|
132
|
-
return acc;
|
|
133
|
-
}, {});
|
|
134
|
-
};
|
|
135
|
-
/**
|
|
136
|
-
* Cleans the update input entry data.
|
|
137
|
-
*/
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const mapAndCleanUpdatedInputData = (model, input) => {
|
|
141
|
-
return model.fields.reduce((acc, field) => {
|
|
142
|
-
/**
|
|
143
|
-
* This should never happen, but let's make it sure.
|
|
144
|
-
* The fix would be for the user to add the fieldId on the field definition.
|
|
145
|
-
*/
|
|
146
|
-
if (!field.fieldId) {
|
|
147
|
-
throw new _error.default("Field does not have an fieldId.", "MISSING_FIELD_ID", {
|
|
148
|
-
field
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* We cannot set default value here because user might want to update only certain field values.
|
|
153
|
-
*/
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const value = input[field.fieldId];
|
|
157
|
-
|
|
158
|
-
if (value === undefined) {
|
|
159
|
-
return acc;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
acc[field.fieldId] = value;
|
|
163
|
-
return acc;
|
|
164
|
-
}, {});
|
|
165
|
-
};
|
|
166
|
-
/**
|
|
167
|
-
* This method takes original entry meta and new input.
|
|
168
|
-
* When new meta is merged onto the existing one, everything that has undefined or null value is removed.
|
|
169
|
-
*/
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const createEntryMeta = (input, original) => {
|
|
173
|
-
const meta = (0, _merge.default)(original || {}, input || {});
|
|
174
|
-
|
|
175
|
-
for (const key in meta) {
|
|
176
|
-
if (meta[key] !== undefined || meta[key] !== null) {
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
delete meta[key];
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
return meta;
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
const createEntryId = version => {
|
|
187
|
-
const entryId = (0, _mdbid.default)();
|
|
188
|
-
return {
|
|
189
|
-
entryId,
|
|
190
|
-
version,
|
|
191
|
-
id: (0, _utils.createIdentifier)({
|
|
192
|
-
id: entryId,
|
|
193
|
-
version
|
|
194
|
-
})
|
|
195
|
-
};
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
const increaseEntryIdVersion = id => {
|
|
199
|
-
const {
|
|
200
|
-
id: entryId,
|
|
201
|
-
version
|
|
202
|
-
} = (0, _utils.parseIdentifier)(id);
|
|
203
|
-
|
|
204
|
-
if (!version) {
|
|
205
|
-
throw new _error.default("Cannot increase version on the ID without the version part.", "WRONG_ID", {
|
|
206
|
-
id
|
|
207
|
-
});
|
|
17
|
+
var _searchableFields = require("./contentEntry/searchableFields");
|
|
18
|
+
var _filterAsync = require("../utils/filterAsync");
|
|
19
|
+
var _apiSecurity = require("@webiny/api-security");
|
|
20
|
+
var _constants = require("../constants");
|
|
21
|
+
var _entryDataFactories = require("./contentEntry/entryDataFactories");
|
|
22
|
+
const createSort = sort => {
|
|
23
|
+
if (Array.isArray(sort) && sort.filter(Boolean).length > 0) {
|
|
24
|
+
return sort;
|
|
208
25
|
}
|
|
209
|
-
|
|
210
|
-
return {
|
|
211
|
-
entryId,
|
|
212
|
-
version: version + 1,
|
|
213
|
-
id: (0, _utils.createIdentifier)({
|
|
214
|
-
id: entryId,
|
|
215
|
-
version: version + 1
|
|
216
|
-
})
|
|
217
|
-
};
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
const getSearchableFields = params => {
|
|
221
|
-
const {
|
|
222
|
-
plugins,
|
|
223
|
-
model,
|
|
224
|
-
fields
|
|
225
|
-
} = params;
|
|
226
|
-
const fieldPluginMap = plugins.byType("cms-model-field-to-graphql").reduce((collection, field) => {
|
|
227
|
-
collection[field.fieldType] = field;
|
|
228
|
-
return collection;
|
|
229
|
-
}, {});
|
|
230
|
-
return model.fields.filter(field => {
|
|
231
|
-
if (!field.fieldId) {
|
|
232
|
-
return false;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const plugin = fieldPluginMap[field.type];
|
|
236
|
-
|
|
237
|
-
if (!plugin) {
|
|
238
|
-
return false;
|
|
239
|
-
} else if (!plugin.fullTextSearch) {
|
|
240
|
-
return false;
|
|
241
|
-
} else if (!fields || fields.length === 0) {
|
|
242
|
-
return true;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
return fields.includes(field.fieldId);
|
|
246
|
-
}).map(field => field.fieldId);
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
const allowedEntryStatus = ["draft", "published", "unpublished"];
|
|
250
|
-
|
|
251
|
-
const transformEntryStatus = status => {
|
|
252
|
-
return allowedEntryStatus.includes(status) ? status : "draft";
|
|
26
|
+
return ["revisionCreatedOn_DESC"];
|
|
253
27
|
};
|
|
254
|
-
|
|
255
28
|
const createContentEntryCrud = params => {
|
|
256
29
|
const {
|
|
257
30
|
storageOperations,
|
|
31
|
+
entriesPermissions,
|
|
32
|
+
modelsPermissions,
|
|
258
33
|
context,
|
|
259
|
-
getIdentity,
|
|
260
|
-
getTenant
|
|
34
|
+
getIdentity: getSecurityIdentity,
|
|
35
|
+
getTenant,
|
|
36
|
+
getLocale
|
|
261
37
|
} = params;
|
|
262
|
-
const {
|
|
263
|
-
plugins
|
|
264
|
-
} = context; // create
|
|
265
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Create
|
|
41
|
+
*/
|
|
266
42
|
const onEntryBeforeCreate = (0, _pubsub.createTopic)("cms.onEntryBeforeCreate");
|
|
267
43
|
const onEntryAfterCreate = (0, _pubsub.createTopic)("cms.onEntryAfterCreate");
|
|
268
|
-
const onEntryCreateError = (0, _pubsub.createTopic)("cms.onEntryCreateError");
|
|
44
|
+
const onEntryCreateError = (0, _pubsub.createTopic)("cms.onEntryCreateError");
|
|
269
45
|
|
|
46
|
+
/**
|
|
47
|
+
* Create new revision
|
|
48
|
+
*/
|
|
270
49
|
const onEntryBeforeCreateRevision = (0, _pubsub.createTopic)("cms.onEntryBeforeCreateRevision");
|
|
271
50
|
const onEntryRevisionAfterCreate = (0, _pubsub.createTopic)("cms.onEntryRevisionAfterCreate");
|
|
272
|
-
const onEntryCreateRevisionError = (0, _pubsub.createTopic)("cms.onEntryCreateRevisionError");
|
|
51
|
+
const onEntryCreateRevisionError = (0, _pubsub.createTopic)("cms.onEntryCreateRevisionError");
|
|
273
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Update
|
|
55
|
+
*/
|
|
274
56
|
const onEntryBeforeUpdate = (0, _pubsub.createTopic)("cms.onEntryBeforeUpdate");
|
|
275
57
|
const onEntryAfterUpdate = (0, _pubsub.createTopic)("cms.onEntryAfterUpdate");
|
|
276
|
-
const onEntryUpdateError = (0, _pubsub.createTopic)("cms.onEntryUpdateError");
|
|
58
|
+
const onEntryUpdateError = (0, _pubsub.createTopic)("cms.onEntryUpdateError");
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Move
|
|
62
|
+
*/
|
|
63
|
+
const onEntryBeforeMove = (0, _pubsub.createTopic)("cms.onEntryBeforeMove");
|
|
64
|
+
const onEntryAfterMove = (0, _pubsub.createTopic)("cms.onEntryAfterMove");
|
|
65
|
+
const onEntryMoveError = (0, _pubsub.createTopic)("cms.onEntryMoveError");
|
|
277
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Publish
|
|
69
|
+
*/
|
|
278
70
|
const onEntryBeforePublish = (0, _pubsub.createTopic)("cms.onEntryBeforePublish");
|
|
279
|
-
const onEntryAfterPublish = (0, _pubsub.createTopic)("cms.
|
|
280
|
-
const onEntryPublishError = (0, _pubsub.createTopic)("cms.onEntryPublishError");
|
|
71
|
+
const onEntryAfterPublish = (0, _pubsub.createTopic)("cms.onEntryAfterPublish");
|
|
72
|
+
const onEntryPublishError = (0, _pubsub.createTopic)("cms.onEntryPublishError");
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Republish
|
|
76
|
+
*/
|
|
77
|
+
const onEntryBeforeRepublish = (0, _pubsub.createTopic)("cms.onEntryBeforeRepublish");
|
|
78
|
+
const onEntryAfterRepublish = (0, _pubsub.createTopic)("cms.onEntryAfterRepublish");
|
|
79
|
+
const onEntryRepublishError = (0, _pubsub.createTopic)("cms.onEntryRepublishError");
|
|
281
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Unpublish
|
|
83
|
+
*/
|
|
282
84
|
const onEntryBeforeUnpublish = (0, _pubsub.createTopic)("cms.onEntryBeforeUnpublish");
|
|
283
85
|
const onEntryAfterUnpublish = (0, _pubsub.createTopic)("cms.onEntryAfterUnpublish");
|
|
284
|
-
const onEntryUnpublishError = (0, _pubsub.createTopic)("cms.onEntryUnpublishError");
|
|
86
|
+
const onEntryUnpublishError = (0, _pubsub.createTopic)("cms.onEntryUnpublishError");
|
|
285
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Delete
|
|
90
|
+
*/
|
|
286
91
|
const onEntryBeforeDelete = (0, _pubsub.createTopic)("cms.onEntryBeforeDelete");
|
|
287
92
|
const onEntryAfterDelete = (0, _pubsub.createTopic)("cms.onEntryAfterDelete");
|
|
288
|
-
const onEntryDeleteError = (0, _pubsub.createTopic)("cms.onEntryDeleteError");
|
|
93
|
+
const onEntryDeleteError = (0, _pubsub.createTopic)("cms.onEntryDeleteError");
|
|
289
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Delete revision
|
|
97
|
+
*/
|
|
290
98
|
const onEntryRevisionBeforeDelete = (0, _pubsub.createTopic)("cms.onEntryRevisionBeforeDelete");
|
|
291
99
|
const onEntryRevisionAfterDelete = (0, _pubsub.createTopic)("cms.onEntryRevisionAfterDelete");
|
|
292
|
-
const onEntryRevisionDeleteError = (0, _pubsub.createTopic)("cms.onEntryRevisionDeleteError");
|
|
100
|
+
const onEntryRevisionDeleteError = (0, _pubsub.createTopic)("cms.onEntryRevisionDeleteError");
|
|
101
|
+
/**
|
|
102
|
+
* Delete multiple entries
|
|
103
|
+
*/
|
|
104
|
+
const onEntryBeforeDeleteMultiple = (0, _pubsub.createTopic)("cms.onEntryBeforeDeleteMultiple");
|
|
105
|
+
const onEntryAfterDeleteMultiple = (0, _pubsub.createTopic)("cms.onEntryAfterDeleteMultiple");
|
|
106
|
+
const onEntryDeleteMultipleError = (0, _pubsub.createTopic)("cms.onEntryDeleteMultipleError");
|
|
293
107
|
|
|
294
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Get entry
|
|
110
|
+
*/
|
|
111
|
+
const onEntryBeforeGet = (0, _pubsub.createTopic)("cms.onEntryBeforeGet");
|
|
295
112
|
|
|
113
|
+
/**
|
|
114
|
+
* List entries
|
|
115
|
+
*/
|
|
296
116
|
const onEntryBeforeList = (0, _pubsub.createTopic)("cms.onEntryBeforeList");
|
|
117
|
+
|
|
297
118
|
/**
|
|
298
119
|
* We need to assign some default behaviors.
|
|
299
120
|
*/
|
|
300
|
-
|
|
301
121
|
(0, _beforeCreate.assignBeforeEntryCreate)({
|
|
302
122
|
context,
|
|
303
123
|
onEntryBeforeCreate
|
|
@@ -311,20 +131,14 @@ const createContentEntryCrud = params => {
|
|
|
311
131
|
onEntryAfterDelete
|
|
312
132
|
});
|
|
313
133
|
|
|
314
|
-
const checkEntryPermissions = check => {
|
|
315
|
-
return (0, _permissions.checkPermissions)(context, "cms.contentEntry", check);
|
|
316
|
-
};
|
|
317
134
|
/**
|
|
318
135
|
* A helper to delete the entire entry.
|
|
319
136
|
*/
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
const deleteEntry = async params => {
|
|
137
|
+
const deleteEntryHelper = async params => {
|
|
323
138
|
const {
|
|
324
139
|
model,
|
|
325
140
|
entry
|
|
326
141
|
} = params;
|
|
327
|
-
|
|
328
142
|
try {
|
|
329
143
|
await onEntryBeforeDelete.publish({
|
|
330
144
|
entry,
|
|
@@ -351,905 +165,1142 @@ const createContentEntryCrud = params => {
|
|
|
351
165
|
/**
|
|
352
166
|
* A helper to get entries by revision IDs
|
|
353
167
|
*/
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
168
|
+
const getEntriesByIds = async (model, ids) => {
|
|
169
|
+
return context.benchmark.measure("headlessCms.crud.entries.getEntriesByIds", async () => {
|
|
170
|
+
await entriesPermissions.ensure({
|
|
171
|
+
rwd: "r"
|
|
172
|
+
});
|
|
173
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
174
|
+
model
|
|
175
|
+
});
|
|
176
|
+
const entries = await storageOperations.entries.getByIds(model, {
|
|
177
|
+
ids
|
|
178
|
+
});
|
|
179
|
+
return (0, _filterAsync.filterAsync)(entries, async entry => {
|
|
180
|
+
return entriesPermissions.ensure({
|
|
181
|
+
owns: entry.revisionCreatedBy
|
|
182
|
+
}, {
|
|
183
|
+
throw: false
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
const getEntryById = async (model, id) => {
|
|
189
|
+
const where = {
|
|
190
|
+
id
|
|
191
|
+
};
|
|
192
|
+
await onEntryBeforeGet.publish({
|
|
193
|
+
where,
|
|
194
|
+
model
|
|
195
|
+
});
|
|
196
|
+
const [entry] = await getEntriesByIds(model, [id]);
|
|
197
|
+
if (!entry) {
|
|
198
|
+
throw new _handlerGraphql.NotFoundError(`Entry by ID "${id}" not found.`);
|
|
199
|
+
}
|
|
200
|
+
return entry;
|
|
201
|
+
};
|
|
202
|
+
const getPublishedEntriesByIds = async (model, ids) => {
|
|
203
|
+
await entriesPermissions.ensure({
|
|
358
204
|
rwd: "r"
|
|
359
205
|
});
|
|
360
|
-
await
|
|
361
|
-
|
|
362
|
-
model: initialModel,
|
|
363
|
-
plugins
|
|
206
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
207
|
+
model
|
|
364
208
|
});
|
|
365
|
-
const entries = await storageOperations.entries.
|
|
209
|
+
const entries = await storageOperations.entries.getPublishedByIds(model, {
|
|
366
210
|
ids
|
|
367
211
|
});
|
|
368
|
-
return
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
* Deprecated - will be removed in 5.35.0
|
|
374
|
-
*/
|
|
375
|
-
onBeforeEntryCreate: onEntryBeforeCreate,
|
|
376
|
-
onAfterEntryCreate: onEntryAfterCreate,
|
|
377
|
-
onBeforeEntryCreateRevision: onEntryBeforeCreateRevision,
|
|
378
|
-
onAfterEntryCreateRevision: onEntryRevisionAfterCreate,
|
|
379
|
-
onBeforeEntryUpdate: onEntryBeforeUpdate,
|
|
380
|
-
onAfterEntryUpdate: onEntryAfterUpdate,
|
|
381
|
-
onBeforeEntryDelete: onEntryBeforeDelete,
|
|
382
|
-
onAfterEntryDelete: onEntryAfterDelete,
|
|
383
|
-
onBeforeEntryDeleteRevision: onEntryRevisionBeforeDelete,
|
|
384
|
-
onAfterEntryDeleteRevision: onEntryRevisionAfterDelete,
|
|
385
|
-
onBeforeEntryPublish: onEntryBeforePublish,
|
|
386
|
-
onAfterEntryPublish: onEntryAfterPublish,
|
|
387
|
-
onBeforeEntryUnpublish: onEntryBeforeUnpublish,
|
|
388
|
-
onAfterEntryUnpublish: onEntryAfterUnpublish,
|
|
389
|
-
onBeforeEntryGet: onEntryBeforeGet,
|
|
390
|
-
onBeforeEntryList: onEntryBeforeList,
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* Released in 5.34.0
|
|
394
|
-
*/
|
|
395
|
-
onEntryBeforeCreate,
|
|
396
|
-
onEntryAfterCreate,
|
|
397
|
-
onEntryCreateError,
|
|
398
|
-
onEntryRevisionBeforeCreate: onEntryBeforeCreateRevision,
|
|
399
|
-
onEntryRevisionAfterCreate,
|
|
400
|
-
onEntryRevisionCreateError: onEntryCreateRevisionError,
|
|
401
|
-
onEntryBeforeUpdate,
|
|
402
|
-
onEntryAfterUpdate,
|
|
403
|
-
onEntryUpdateError,
|
|
404
|
-
onEntryBeforeDelete,
|
|
405
|
-
onEntryAfterDelete,
|
|
406
|
-
onEntryDeleteError,
|
|
407
|
-
onEntryRevisionBeforeDelete,
|
|
408
|
-
onEntryRevisionAfterDelete,
|
|
409
|
-
onEntryRevisionDeleteError,
|
|
410
|
-
onEntryBeforePublish,
|
|
411
|
-
onEntryAfterPublish,
|
|
412
|
-
onEntryPublishError,
|
|
413
|
-
onEntryBeforeUnpublish,
|
|
414
|
-
onEntryAfterUnpublish,
|
|
415
|
-
onEntryUnpublishError,
|
|
416
|
-
onEntryBeforeGet,
|
|
417
|
-
onEntryBeforeList,
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Get entries by exact revision IDs from the database.
|
|
421
|
-
*/
|
|
422
|
-
getEntriesByIds: getEntriesByIds,
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* Get a single entry by revision ID from the database.
|
|
426
|
-
*/
|
|
427
|
-
async getEntryById(initialModel, id) {
|
|
428
|
-
const where = {
|
|
429
|
-
id
|
|
430
|
-
};
|
|
431
|
-
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
432
|
-
model: initialModel,
|
|
433
|
-
plugins
|
|
212
|
+
return (0, _filterAsync.filterAsync)(entries, async entry => {
|
|
213
|
+
return entriesPermissions.ensure({
|
|
214
|
+
owns: entry.revisionCreatedBy
|
|
215
|
+
}, {
|
|
216
|
+
throw: false
|
|
434
217
|
});
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
const getLatestEntriesByIds = async (model, ids) => {
|
|
221
|
+
await entriesPermissions.ensure({
|
|
222
|
+
rwd: "r"
|
|
223
|
+
});
|
|
224
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
225
|
+
model
|
|
226
|
+
});
|
|
227
|
+
const entries = await storageOperations.entries.getLatestByIds(model, {
|
|
228
|
+
ids
|
|
229
|
+
});
|
|
230
|
+
return (0, _filterAsync.filterAsync)(entries, async entry => {
|
|
231
|
+
return entriesPermissions.ensure({
|
|
232
|
+
owns: entry.revisionCreatedBy
|
|
233
|
+
}, {
|
|
234
|
+
throw: false
|
|
438
235
|
});
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
236
|
+
});
|
|
237
|
+
};
|
|
238
|
+
const getEntry = async (model, params) => {
|
|
239
|
+
await entriesPermissions.ensure({
|
|
240
|
+
rwd: "r"
|
|
241
|
+
});
|
|
242
|
+
const {
|
|
243
|
+
where,
|
|
244
|
+
sort
|
|
245
|
+
} = params;
|
|
246
|
+
await onEntryBeforeGet.publish({
|
|
247
|
+
where,
|
|
248
|
+
model
|
|
249
|
+
});
|
|
250
|
+
const [items] = await listEntries(model, {
|
|
251
|
+
where,
|
|
252
|
+
sort,
|
|
253
|
+
limit: 1
|
|
254
|
+
});
|
|
255
|
+
const item = items.shift();
|
|
256
|
+
if (!item) {
|
|
257
|
+
throw new _handlerGraphql.NotFoundError(`Entry not found!`);
|
|
258
|
+
}
|
|
259
|
+
return item;
|
|
260
|
+
};
|
|
261
|
+
const getEntryRevisions = async (model, entryId) => {
|
|
262
|
+
return storageOperations.entries.getRevisions(model, {
|
|
263
|
+
id: entryId
|
|
264
|
+
});
|
|
265
|
+
};
|
|
266
|
+
const listEntries = async (model, params) => {
|
|
267
|
+
try {
|
|
268
|
+
await entriesPermissions.ensure({
|
|
453
269
|
rwd: "r"
|
|
454
270
|
});
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
const entries = await storageOperations.entries.getPublishedByIds(model, {
|
|
461
|
-
ids
|
|
271
|
+
} catch {
|
|
272
|
+
throw new _apiSecurity.NotAuthorizedError({
|
|
273
|
+
data: {
|
|
274
|
+
reason: 'Not allowed to perform "read" on "cms.contentEntry".'
|
|
275
|
+
}
|
|
462
276
|
});
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
277
|
+
}
|
|
278
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
279
|
+
model
|
|
280
|
+
});
|
|
281
|
+
const {
|
|
282
|
+
where: initialWhere,
|
|
283
|
+
limit: initialLimit
|
|
284
|
+
} = params;
|
|
285
|
+
const limit = initialLimit && initialLimit > 0 ? initialLimit : 50;
|
|
286
|
+
const where = {
|
|
287
|
+
...initialWhere
|
|
288
|
+
};
|
|
466
289
|
/**
|
|
467
|
-
*
|
|
290
|
+
* Possibly only get records which are owned by current user.
|
|
291
|
+
* Or if searching for the owner set that value - in the case that user can see other entries than their own.
|
|
468
292
|
*/
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
});
|
|
473
|
-
await (0, _access.checkModelAccess)(context, initialModel);
|
|
474
|
-
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
475
|
-
model: initialModel,
|
|
476
|
-
plugins
|
|
477
|
-
});
|
|
478
|
-
const entries = await storageOperations.entries.getLatestByIds(model, {
|
|
479
|
-
ids
|
|
480
|
-
});
|
|
481
|
-
return entries.filter(entry => (0, _ownership.validateOwnership)(context, permission, entry));
|
|
482
|
-
},
|
|
483
|
-
|
|
484
|
-
async getEntryRevisions(initialModel, entryId) {
|
|
485
|
-
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
486
|
-
model: initialModel,
|
|
487
|
-
plugins
|
|
488
|
-
});
|
|
489
|
-
return storageOperations.entries.getRevisions(model, {
|
|
490
|
-
id: entryId
|
|
491
|
-
});
|
|
492
|
-
},
|
|
293
|
+
if (await entriesPermissions.canAccessOnlyOwnRecords()) {
|
|
294
|
+
where.createdBy = getSecurityIdentity().id;
|
|
295
|
+
}
|
|
493
296
|
|
|
494
297
|
/**
|
|
495
|
-
*
|
|
496
|
-
*
|
|
497
|
-
* @internal
|
|
298
|
+
* Where must contain either latest or published keys.
|
|
299
|
+
* We cannot list entries without one of those
|
|
498
300
|
*/
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
301
|
+
if (where.latest && where.published) {
|
|
302
|
+
throw new _error.default("Cannot list entries that are both published and latest.", "LIST_ENTRIES_ERROR", {
|
|
303
|
+
where
|
|
502
304
|
});
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
305
|
+
} else if (!where.latest && !where.published) {
|
|
306
|
+
throw new _error.default("Cannot list entries if we do not have latest or published defined.", "LIST_ENTRIES_ERROR", {
|
|
307
|
+
where
|
|
506
308
|
});
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
309
|
+
}
|
|
310
|
+
const fields = (0, _searchableFields.getSearchableFields)({
|
|
311
|
+
fields: model.fields,
|
|
312
|
+
plugins: context.plugins,
|
|
313
|
+
input: params.fields || []
|
|
314
|
+
});
|
|
315
|
+
try {
|
|
316
|
+
await onEntryBeforeList.publish({
|
|
512
317
|
where,
|
|
513
318
|
model
|
|
514
319
|
});
|
|
515
|
-
const
|
|
320
|
+
const {
|
|
321
|
+
hasMoreItems,
|
|
322
|
+
totalCount,
|
|
323
|
+
cursor,
|
|
324
|
+
items
|
|
325
|
+
} = await storageOperations.entries.list(model, {
|
|
326
|
+
...params,
|
|
327
|
+
sort: createSort(params.sort),
|
|
328
|
+
limit,
|
|
516
329
|
where,
|
|
517
|
-
|
|
518
|
-
limit: 1
|
|
519
|
-
});
|
|
520
|
-
|
|
521
|
-
if (items.length === 0) {
|
|
522
|
-
throw new _handlerGraphql.NotFoundError(`Entry not found!`);
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
return items[0];
|
|
526
|
-
},
|
|
527
|
-
|
|
528
|
-
/**
|
|
529
|
-
* @description Should not be used directly. Internal use only!
|
|
530
|
-
*
|
|
531
|
-
* @internal
|
|
532
|
-
*/
|
|
533
|
-
async listEntries(initialModel, params) {
|
|
534
|
-
const permission = await checkEntryPermissions({
|
|
535
|
-
rwd: "r"
|
|
536
|
-
});
|
|
537
|
-
await (0, _access.checkModelAccess)(context, initialModel);
|
|
538
|
-
const model = (0, _valueKeyStorageConverter.attachCmsModelFieldConverters)({
|
|
539
|
-
model: initialModel,
|
|
540
|
-
plugins
|
|
330
|
+
fields
|
|
541
331
|
});
|
|
542
|
-
const {
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
/**
|
|
561
|
-
* Where must contain either latest or published keys.
|
|
562
|
-
* We cannot list entries without one of those
|
|
563
|
-
*/
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
if (where.latest && where.published) {
|
|
567
|
-
throw new _error.default("Cannot list entries that are both published and latest.", "LIST_ENTRIES_ERROR", {
|
|
568
|
-
where
|
|
569
|
-
});
|
|
570
|
-
} else if (!where.latest && !where.published) {
|
|
571
|
-
throw new _error.default("Cannot list entries if we do not have latest or published defined.", "LIST_ENTRIES_ERROR", {
|
|
572
|
-
where
|
|
573
|
-
});
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
const fields = getSearchableFields({
|
|
332
|
+
const meta = {
|
|
333
|
+
hasMoreItems,
|
|
334
|
+
totalCount,
|
|
335
|
+
/**
|
|
336
|
+
* Cursor should be null if there are no more items to load.
|
|
337
|
+
* Just make sure of that, disregarding what is returned from the storageOperations.entries.list method.
|
|
338
|
+
*/
|
|
339
|
+
cursor: hasMoreItems ? cursor : null
|
|
340
|
+
};
|
|
341
|
+
return [items, meta];
|
|
342
|
+
} catch (ex) {
|
|
343
|
+
throw new _error.default("Error while fetching entries from storage.", "LIST_ENTRIES_ERROR", {
|
|
344
|
+
params,
|
|
345
|
+
error: {
|
|
346
|
+
message: ex.message,
|
|
347
|
+
code: ex.code,
|
|
348
|
+
data: ex.data
|
|
349
|
+
},
|
|
577
350
|
model,
|
|
578
|
-
|
|
579
|
-
fields: params.fields || []
|
|
351
|
+
fields
|
|
580
352
|
});
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
params,
|
|
610
|
-
error: {
|
|
611
|
-
message: ex.message,
|
|
612
|
-
code: ex.code,
|
|
613
|
-
data: ex.data
|
|
614
|
-
},
|
|
615
|
-
model,
|
|
616
|
-
fields
|
|
617
|
-
});
|
|
618
|
-
}
|
|
619
|
-
},
|
|
620
|
-
|
|
621
|
-
async listLatestEntries(model, params) {
|
|
622
|
-
const where = (params === null || params === void 0 ? void 0 : params.where) || {};
|
|
623
|
-
return this.listEntries(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
|
624
|
-
sort: ["createdOn_DESC"]
|
|
625
|
-
}, params || {}), {}, {
|
|
626
|
-
where: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, where), {}, {
|
|
627
|
-
latest: true
|
|
628
|
-
})
|
|
629
|
-
}));
|
|
630
|
-
},
|
|
631
|
-
|
|
632
|
-
async listPublishedEntries(model, params) {
|
|
633
|
-
const where = (params === null || params === void 0 ? void 0 : params.where) || {};
|
|
634
|
-
return this.listEntries(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
|
635
|
-
sort: ["createdOn_DESC"]
|
|
636
|
-
}, params || {}), {}, {
|
|
637
|
-
where: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, where), {}, {
|
|
638
|
-
published: true
|
|
639
|
-
})
|
|
640
|
-
}));
|
|
641
|
-
},
|
|
642
|
-
|
|
643
|
-
async createEntry(initialModel, inputData) {
|
|
644
|
-
await checkEntryPermissions({
|
|
645
|
-
rwd: "w"
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
const createEntry = async (model, rawInput, options) => {
|
|
356
|
+
await entriesPermissions.ensure({
|
|
357
|
+
rwd: "w"
|
|
358
|
+
});
|
|
359
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
360
|
+
model
|
|
361
|
+
});
|
|
362
|
+
const {
|
|
363
|
+
entry,
|
|
364
|
+
input
|
|
365
|
+
} = await (0, _entryDataFactories.createEntryData)({
|
|
366
|
+
context,
|
|
367
|
+
model,
|
|
368
|
+
options,
|
|
369
|
+
rawInput,
|
|
370
|
+
getLocale,
|
|
371
|
+
getTenant,
|
|
372
|
+
getIdentity: getSecurityIdentity,
|
|
373
|
+
entriesPermissions
|
|
374
|
+
});
|
|
375
|
+
let storageEntry = null;
|
|
376
|
+
try {
|
|
377
|
+
await onEntryBeforeCreate.publish({
|
|
378
|
+
entry,
|
|
379
|
+
input,
|
|
380
|
+
model
|
|
646
381
|
});
|
|
647
|
-
await (0,
|
|
648
|
-
const
|
|
649
|
-
|
|
650
|
-
|
|
382
|
+
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
383
|
+
const result = await storageOperations.entries.create(model, {
|
|
384
|
+
entry,
|
|
385
|
+
storageEntry
|
|
651
386
|
});
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
const initialInput = mapAndCleanCreateInputData(model, inputData);
|
|
657
|
-
await (0, _entryDataValidation.validateModelEntryData)({
|
|
658
|
-
context,
|
|
387
|
+
await onEntryAfterCreate.publish({
|
|
388
|
+
entry,
|
|
389
|
+
storageEntry: result,
|
|
659
390
|
model,
|
|
660
|
-
|
|
391
|
+
input
|
|
661
392
|
});
|
|
662
|
-
|
|
663
|
-
|
|
393
|
+
return entry;
|
|
394
|
+
} catch (ex) {
|
|
395
|
+
await onEntryCreateError.publish({
|
|
396
|
+
error: ex,
|
|
397
|
+
entry,
|
|
664
398
|
model,
|
|
665
|
-
input
|
|
666
|
-
validateEntries: true
|
|
667
|
-
});
|
|
668
|
-
const identity = context.security.getIdentity();
|
|
669
|
-
const locale = this.getLocale();
|
|
670
|
-
const owner = {
|
|
671
|
-
id: identity.id,
|
|
672
|
-
displayName: identity.displayName,
|
|
673
|
-
type: identity.type
|
|
674
|
-
};
|
|
675
|
-
const {
|
|
676
|
-
id,
|
|
677
|
-
entryId,
|
|
678
|
-
version
|
|
679
|
-
} = createEntryId(1);
|
|
680
|
-
const entry = {
|
|
681
|
-
webinyVersion: context.WEBINY_VERSION,
|
|
682
|
-
tenant: getTenant().id,
|
|
683
|
-
entryId,
|
|
684
|
-
id,
|
|
685
|
-
modelId: model.modelId,
|
|
686
|
-
locale: locale.code,
|
|
687
|
-
createdOn: new Date().toISOString(),
|
|
688
|
-
savedOn: new Date().toISOString(),
|
|
689
|
-
createdBy: owner,
|
|
690
|
-
ownedBy: owner,
|
|
691
|
-
version,
|
|
692
|
-
locked: false,
|
|
693
|
-
status: STATUS_DRAFT,
|
|
694
|
-
values: input
|
|
695
|
-
};
|
|
696
|
-
let storageEntry = null;
|
|
697
|
-
|
|
698
|
-
try {
|
|
699
|
-
await onEntryBeforeCreate.publish({
|
|
700
|
-
entry,
|
|
701
|
-
input,
|
|
702
|
-
model
|
|
703
|
-
});
|
|
704
|
-
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
705
|
-
const result = await storageOperations.entries.create(model, {
|
|
706
|
-
entry,
|
|
707
|
-
storageEntry
|
|
708
|
-
});
|
|
709
|
-
await onEntryAfterCreate.publish({
|
|
710
|
-
entry,
|
|
711
|
-
storageEntry: result,
|
|
712
|
-
model,
|
|
713
|
-
input
|
|
714
|
-
});
|
|
715
|
-
return result;
|
|
716
|
-
} catch (ex) {
|
|
717
|
-
await onEntryCreateError.publish({
|
|
718
|
-
error: ex,
|
|
719
|
-
entry,
|
|
720
|
-
model,
|
|
721
|
-
input
|
|
722
|
-
});
|
|
723
|
-
throw new _error.default(ex.message || "Could not create content entry.", ex.code || "CREATE_ENTRY_ERROR", ex.data || {
|
|
724
|
-
error: ex,
|
|
725
|
-
input,
|
|
726
|
-
entry,
|
|
727
|
-
storageEntry
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
},
|
|
731
|
-
|
|
732
|
-
async createEntryRevisionFrom(initialModel, sourceId, inputData) {
|
|
733
|
-
const permission = await checkEntryPermissions({
|
|
734
|
-
rwd: "w"
|
|
399
|
+
input
|
|
735
400
|
});
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
401
|
+
throw new _error.default(ex.message || "Could not create content entry.", ex.code || "CREATE_ENTRY_ERROR", ex.data || {
|
|
402
|
+
error: ex,
|
|
403
|
+
input,
|
|
404
|
+
entry,
|
|
405
|
+
storageEntry
|
|
740
406
|
});
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
const createEntryRevisionFrom = async (model, sourceId, rawInput, options) => {
|
|
410
|
+
await entriesPermissions.ensure({
|
|
411
|
+
rwd: "w"
|
|
412
|
+
});
|
|
413
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
414
|
+
model
|
|
415
|
+
});
|
|
744
416
|
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
417
|
+
/**
|
|
418
|
+
* Entries are identified by a common parent ID + Revision number.
|
|
419
|
+
*/
|
|
420
|
+
const {
|
|
421
|
+
id: uniqueId
|
|
422
|
+
} = (0, _utils.parseIdentifier)(sourceId);
|
|
423
|
+
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
424
|
+
id: sourceId
|
|
425
|
+
});
|
|
426
|
+
const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {
|
|
427
|
+
id: uniqueId
|
|
428
|
+
});
|
|
429
|
+
if (!originalStorageEntry) {
|
|
430
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${sourceId}" of model "${model.modelId}" was not found.`);
|
|
431
|
+
}
|
|
432
|
+
if (!latestStorageEntry) {
|
|
433
|
+
throw new _handlerGraphql.NotFoundError(`Latest entry "${uniqueId}" of model "${model.modelId}" was not found.`);
|
|
434
|
+
}
|
|
749
435
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
436
|
+
/**
|
|
437
|
+
* We need to convert data from DB to its original form before using it further.
|
|
438
|
+
*/
|
|
439
|
+
const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
440
|
+
await entriesPermissions.ensure({
|
|
441
|
+
owns: originalEntry.createdBy
|
|
442
|
+
});
|
|
443
|
+
const {
|
|
444
|
+
entry,
|
|
445
|
+
input
|
|
446
|
+
} = await (0, _entryDataFactories.createEntryRevisionFromData)({
|
|
447
|
+
sourceId,
|
|
448
|
+
model,
|
|
449
|
+
rawInput,
|
|
450
|
+
options,
|
|
451
|
+
context,
|
|
452
|
+
getIdentity: getSecurityIdentity,
|
|
453
|
+
getTenant,
|
|
454
|
+
getLocale,
|
|
455
|
+
originalEntry,
|
|
456
|
+
latestStorageEntry
|
|
457
|
+
});
|
|
458
|
+
let storageEntry = null;
|
|
459
|
+
try {
|
|
460
|
+
await onEntryBeforeCreateRevision.publish({
|
|
461
|
+
input,
|
|
462
|
+
entry,
|
|
463
|
+
original: originalEntry,
|
|
464
|
+
model
|
|
755
465
|
});
|
|
756
|
-
|
|
757
|
-
|
|
466
|
+
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
467
|
+
const result = await storageOperations.entries.createRevisionFrom(model, {
|
|
468
|
+
entry,
|
|
469
|
+
storageEntry
|
|
758
470
|
});
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
}
|
|
763
|
-
/**
|
|
764
|
-
* We need to convert data from DB to its original form before using it further.
|
|
765
|
-
*/
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
769
|
-
const initialValues = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry.values), input);
|
|
770
|
-
await (0, _entryDataValidation.validateModelEntryData)({
|
|
771
|
-
context,
|
|
471
|
+
await onEntryRevisionAfterCreate.publish({
|
|
472
|
+
input,
|
|
473
|
+
entry,
|
|
772
474
|
model,
|
|
773
|
-
|
|
774
|
-
|
|
475
|
+
original: originalEntry,
|
|
476
|
+
storageEntry: result
|
|
775
477
|
});
|
|
776
|
-
|
|
777
|
-
|
|
478
|
+
return entry;
|
|
479
|
+
} catch (ex) {
|
|
480
|
+
await onEntryCreateRevisionError.publish({
|
|
481
|
+
entry,
|
|
482
|
+
original: originalEntry,
|
|
778
483
|
model,
|
|
779
|
-
input
|
|
780
|
-
|
|
484
|
+
input,
|
|
485
|
+
error: ex
|
|
781
486
|
});
|
|
782
|
-
(
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
} = increaseEntryIdVersion(latestId);
|
|
789
|
-
const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
|
|
790
|
-
id,
|
|
791
|
-
version: nextVersion,
|
|
792
|
-
savedOn: new Date().toISOString(),
|
|
793
|
-
createdOn: new Date().toISOString(),
|
|
794
|
-
createdBy: {
|
|
795
|
-
id: identity.id,
|
|
796
|
-
displayName: identity.displayName,
|
|
797
|
-
type: identity.type
|
|
798
|
-
},
|
|
799
|
-
locked: false,
|
|
800
|
-
publishedOn: undefined,
|
|
801
|
-
status: STATUS_DRAFT,
|
|
802
|
-
values
|
|
487
|
+
throw new _error.default(ex.message || "Could not create entry from existing one.", ex.code || "CREATE_FROM_REVISION_ERROR", {
|
|
488
|
+
error: ex,
|
|
489
|
+
entry,
|
|
490
|
+
storageEntry,
|
|
491
|
+
originalEntry,
|
|
492
|
+
originalStorageEntry
|
|
803
493
|
});
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
814
|
-
const result = await storageOperations.entries.createRevisionFrom(model, {
|
|
815
|
-
entry,
|
|
816
|
-
storageEntry
|
|
817
|
-
});
|
|
818
|
-
await onEntryRevisionAfterCreate.publish({
|
|
819
|
-
input,
|
|
820
|
-
entry,
|
|
821
|
-
model,
|
|
822
|
-
original: originalEntry,
|
|
823
|
-
storageEntry: result
|
|
824
|
-
});
|
|
825
|
-
return result;
|
|
826
|
-
} catch (ex) {
|
|
827
|
-
await onEntryCreateRevisionError.publish({
|
|
828
|
-
entry,
|
|
829
|
-
model,
|
|
830
|
-
input,
|
|
831
|
-
error: ex
|
|
832
|
-
});
|
|
833
|
-
throw new _error.default(ex.message || "Could not create entry from existing one.", ex.code || "CREATE_FROM_REVISION_ERROR", {
|
|
834
|
-
error: ex,
|
|
835
|
-
entry,
|
|
836
|
-
storageEntry,
|
|
837
|
-
originalEntry,
|
|
838
|
-
originalStorageEntry
|
|
839
|
-
});
|
|
840
|
-
}
|
|
841
|
-
},
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
const updateEntry = async (model, id, rawInput, metaInput, options) => {
|
|
497
|
+
await entriesPermissions.ensure({
|
|
498
|
+
rwd: "w"
|
|
499
|
+
});
|
|
500
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
501
|
+
model
|
|
502
|
+
});
|
|
842
503
|
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
504
|
+
/**
|
|
505
|
+
* The entry we are going to update.
|
|
506
|
+
*/
|
|
507
|
+
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
508
|
+
id
|
|
509
|
+
});
|
|
510
|
+
if (!originalStorageEntry) {
|
|
511
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${id}" of model "${model.modelId}" was not found.`);
|
|
512
|
+
}
|
|
513
|
+
if (originalStorageEntry.locked) {
|
|
514
|
+
throw new _error.default(`Cannot update entry because it's locked.`, "CONTENT_ENTRY_UPDATE_ERROR");
|
|
515
|
+
}
|
|
516
|
+
const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
517
|
+
await entriesPermissions.ensure({
|
|
518
|
+
owns: originalEntry.revisionCreatedBy
|
|
519
|
+
});
|
|
520
|
+
const {
|
|
521
|
+
entry,
|
|
522
|
+
input
|
|
523
|
+
} = await (0, _entryDataFactories.createUpdateEntryData)({
|
|
524
|
+
model,
|
|
525
|
+
rawInput,
|
|
526
|
+
options,
|
|
527
|
+
context,
|
|
528
|
+
getIdentity: getSecurityIdentity,
|
|
529
|
+
getTenant,
|
|
530
|
+
getLocale,
|
|
531
|
+
originalEntry,
|
|
532
|
+
metaInput
|
|
533
|
+
});
|
|
534
|
+
let storageEntry = null;
|
|
535
|
+
try {
|
|
536
|
+
await onEntryBeforeUpdate.publish({
|
|
537
|
+
entry,
|
|
538
|
+
model,
|
|
539
|
+
input,
|
|
540
|
+
original: originalEntry
|
|
846
541
|
});
|
|
847
|
-
await (0,
|
|
848
|
-
const
|
|
849
|
-
|
|
850
|
-
|
|
542
|
+
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
543
|
+
const result = await storageOperations.entries.update(model, {
|
|
544
|
+
entry,
|
|
545
|
+
storageEntry
|
|
851
546
|
});
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
547
|
+
await onEntryAfterUpdate.publish({
|
|
548
|
+
entry,
|
|
549
|
+
storageEntry: result,
|
|
550
|
+
model,
|
|
551
|
+
input,
|
|
552
|
+
original: originalEntry
|
|
553
|
+
});
|
|
554
|
+
return entry;
|
|
555
|
+
} catch (ex) {
|
|
556
|
+
await onEntryUpdateError.publish({
|
|
557
|
+
entry,
|
|
558
|
+
model,
|
|
559
|
+
input,
|
|
560
|
+
error: ex
|
|
561
|
+
});
|
|
562
|
+
throw new _error.default(ex.message || "Could not update existing entry.", ex.code || "UPDATE_ERROR", {
|
|
563
|
+
error: ex,
|
|
564
|
+
entry,
|
|
565
|
+
storageEntry,
|
|
566
|
+
originalEntry,
|
|
567
|
+
input
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
};
|
|
571
|
+
const validateEntry = async (model, id, inputData) => {
|
|
572
|
+
await entriesPermissions.ensure({
|
|
573
|
+
rwd: "w"
|
|
574
|
+
});
|
|
575
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
576
|
+
model
|
|
577
|
+
});
|
|
578
|
+
const input = (0, _entryDataFactories.mapAndCleanUpdatedInputData)(model, inputData || {});
|
|
579
|
+
let originalEntry;
|
|
580
|
+
if (id) {
|
|
857
581
|
/**
|
|
858
582
|
* The entry we are going to update.
|
|
859
583
|
*/
|
|
860
|
-
|
|
861
584
|
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
862
585
|
id
|
|
863
586
|
});
|
|
864
|
-
|
|
865
587
|
if (!originalStorageEntry) {
|
|
866
588
|
throw new _handlerGraphql.NotFoundError(`Entry "${id}" of model "${model.modelId}" was not found.`);
|
|
867
589
|
}
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
590
|
+
originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
591
|
+
}
|
|
592
|
+
const result = await (0, _entryDataValidation.validateModelEntryData)({
|
|
593
|
+
context,
|
|
594
|
+
model,
|
|
595
|
+
data: input,
|
|
596
|
+
entry: originalEntry
|
|
597
|
+
});
|
|
598
|
+
return result.length > 0 ? result : [];
|
|
599
|
+
};
|
|
600
|
+
const moveEntry = async (model, id, folderId) => {
|
|
601
|
+
await entriesPermissions.ensure({
|
|
602
|
+
rwd: "w"
|
|
603
|
+
});
|
|
604
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
605
|
+
model
|
|
606
|
+
});
|
|
607
|
+
/**
|
|
608
|
+
* The entry we are going to move to another folder.
|
|
609
|
+
*/
|
|
610
|
+
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
611
|
+
id
|
|
612
|
+
});
|
|
613
|
+
if (!originalStorageEntry) {
|
|
614
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${id}" of model "${model.modelId}" was not found.`);
|
|
615
|
+
}
|
|
616
|
+
const entry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
617
|
+
/**
|
|
618
|
+
* No need to continue if the entry is already in the requested folder.
|
|
619
|
+
*/
|
|
620
|
+
if (entry.location?.folderId === folderId) {
|
|
621
|
+
return entry;
|
|
622
|
+
}
|
|
623
|
+
try {
|
|
624
|
+
await onEntryBeforeMove.publish({
|
|
625
|
+
entry,
|
|
876
626
|
model,
|
|
877
|
-
|
|
878
|
-
entry: originalEntry
|
|
627
|
+
folderId
|
|
879
628
|
});
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
context,
|
|
629
|
+
await storageOperations.entries.move(model, id, folderId);
|
|
630
|
+
await onEntryAfterMove.publish({
|
|
631
|
+
entry,
|
|
884
632
|
model,
|
|
885
|
-
|
|
886
|
-
validateEntries: false
|
|
633
|
+
folderId
|
|
887
634
|
});
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
*/
|
|
896
|
-
|
|
897
|
-
const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
|
|
898
|
-
savedOn: new Date().toISOString(),
|
|
899
|
-
values,
|
|
900
|
-
meta,
|
|
901
|
-
status: transformEntryStatus(originalEntry.status)
|
|
635
|
+
return entry;
|
|
636
|
+
} catch (ex) {
|
|
637
|
+
await onEntryMoveError.publish({
|
|
638
|
+
entry,
|
|
639
|
+
model,
|
|
640
|
+
folderId,
|
|
641
|
+
error: ex
|
|
902
642
|
});
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
});
|
|
917
|
-
await onEntryAfterUpdate.publish({
|
|
918
|
-
entry,
|
|
919
|
-
storageEntry: result,
|
|
920
|
-
model,
|
|
921
|
-
input,
|
|
922
|
-
original: originalEntry
|
|
923
|
-
});
|
|
924
|
-
return result;
|
|
925
|
-
} catch (ex) {
|
|
926
|
-
await onEntryUpdateError.publish({
|
|
927
|
-
entry,
|
|
928
|
-
model,
|
|
929
|
-
input,
|
|
930
|
-
error: ex
|
|
931
|
-
});
|
|
932
|
-
throw new _error.default(ex.message || "Could not update existing entry.", ex.code || "UPDATE_ERROR", {
|
|
933
|
-
error: ex,
|
|
934
|
-
entry,
|
|
935
|
-
storageEntry,
|
|
936
|
-
originalEntry,
|
|
937
|
-
input
|
|
938
|
-
});
|
|
939
|
-
}
|
|
940
|
-
},
|
|
643
|
+
throw _error.default.from(ex, {
|
|
644
|
+
message: `Could not move entry "${id}" of model "${model.modelId}".`,
|
|
645
|
+
code: "MOVE_ENTRY_ERROR"
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
};
|
|
649
|
+
const republishEntry = async (model, id) => {
|
|
650
|
+
await entriesPermissions.ensure({
|
|
651
|
+
rwd: "w"
|
|
652
|
+
});
|
|
653
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
654
|
+
model
|
|
655
|
+
});
|
|
941
656
|
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
657
|
+
/**
|
|
658
|
+
* Fetch the entry from the storage.
|
|
659
|
+
*/
|
|
660
|
+
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
661
|
+
id
|
|
662
|
+
});
|
|
663
|
+
if (!originalStorageEntry) {
|
|
664
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${id}" was not found!`);
|
|
665
|
+
}
|
|
666
|
+
const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
667
|
+
const {
|
|
668
|
+
entry
|
|
669
|
+
} = await (0, _entryDataFactories.createRepublishEntryData)({
|
|
670
|
+
context,
|
|
671
|
+
model,
|
|
672
|
+
originalEntry,
|
|
673
|
+
getIdentity: getSecurityIdentity
|
|
674
|
+
});
|
|
675
|
+
const storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
676
|
+
/**
|
|
677
|
+
* First we need to update existing entry.
|
|
678
|
+
*/
|
|
679
|
+
try {
|
|
680
|
+
await storageOperations.entries.update(model, {
|
|
681
|
+
entry,
|
|
682
|
+
storageEntry
|
|
945
683
|
});
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
plugins
|
|
684
|
+
} catch (ex) {
|
|
685
|
+
throw new _error.default("Could not update existing entry with new data while re-publishing.", "REPUBLISH_UPDATE_ERROR", {
|
|
686
|
+
entry
|
|
950
687
|
});
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* Then we move onto publishing it again.
|
|
691
|
+
*/
|
|
692
|
+
try {
|
|
693
|
+
await onEntryBeforeRepublish.publish({
|
|
694
|
+
entry,
|
|
695
|
+
model
|
|
957
696
|
});
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
}
|
|
962
|
-
|
|
963
|
-
const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
964
|
-
/**
|
|
965
|
-
* We can only process published entries.
|
|
966
|
-
*/
|
|
967
|
-
|
|
968
|
-
if (originalEntry.status !== "published") {
|
|
969
|
-
throw new _error.default("Entry with given ID is not published!", "NOT_PUBLISHED_ERROR", {
|
|
970
|
-
id,
|
|
971
|
-
original: originalEntry
|
|
972
|
-
});
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
const values = await (0, _referenceFieldsMapping.referenceFieldsMapping)({
|
|
976
|
-
context,
|
|
977
|
-
model,
|
|
978
|
-
input: originalEntry.values,
|
|
979
|
-
validateEntries: false
|
|
697
|
+
const result = await storageOperations.entries.publish(model, {
|
|
698
|
+
entry,
|
|
699
|
+
storageEntry
|
|
980
700
|
});
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
701
|
+
await onEntryAfterRepublish.publish({
|
|
702
|
+
entry,
|
|
703
|
+
model,
|
|
704
|
+
storageEntry: result
|
|
985
705
|
});
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
706
|
+
return entry;
|
|
707
|
+
} catch (ex) {
|
|
708
|
+
await onEntryRepublishError.publish({
|
|
709
|
+
entry,
|
|
710
|
+
model,
|
|
711
|
+
error: ex
|
|
712
|
+
});
|
|
713
|
+
throw new _error.default("Could not publish existing entry while re-publishing.", "REPUBLISH_PUBLISH_ERROR", {
|
|
714
|
+
entry
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
};
|
|
718
|
+
const deleteEntryRevision = async (model, revisionId) => {
|
|
719
|
+
await entriesPermissions.ensure({
|
|
720
|
+
rwd: "d"
|
|
721
|
+
});
|
|
722
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
723
|
+
model
|
|
724
|
+
});
|
|
725
|
+
const {
|
|
726
|
+
id: entryId,
|
|
727
|
+
version
|
|
728
|
+
} = (0, _utils.parseIdentifier)(revisionId);
|
|
729
|
+
const storageEntryToDelete = await storageOperations.entries.getRevisionById(model, {
|
|
730
|
+
id: revisionId
|
|
731
|
+
});
|
|
732
|
+
const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {
|
|
733
|
+
id: entryId
|
|
734
|
+
});
|
|
735
|
+
const storagePreviousEntry = await storageOperations.entries.getPreviousRevision(model, {
|
|
736
|
+
entryId,
|
|
737
|
+
version: version
|
|
738
|
+
});
|
|
739
|
+
if (!storageEntryToDelete) {
|
|
740
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${revisionId}" was not found!`);
|
|
741
|
+
}
|
|
742
|
+
await entriesPermissions.ensure({
|
|
743
|
+
owns: storageEntryToDelete.revisionCreatedBy
|
|
744
|
+
});
|
|
745
|
+
const latestEntryRevisionId = latestStorageEntry ? latestStorageEntry.id : null;
|
|
746
|
+
const entryToDelete = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntryToDelete);
|
|
747
|
+
|
|
748
|
+
/**
|
|
749
|
+
* If targeted record is the latest entry record and there is no previous one, we need
|
|
750
|
+
* to run full delete with hooks. In this case, `deleteRevision` hooks are not fired.
|
|
751
|
+
*/
|
|
752
|
+
if (entryToDelete.id === latestEntryRevisionId && !storagePreviousEntry) {
|
|
753
|
+
return await deleteEntryHelper({
|
|
754
|
+
model,
|
|
755
|
+
entry: entryToDelete
|
|
756
|
+
});
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* If targeted record is the latest entry revision, set the previous one as the new latest.
|
|
760
|
+
*/
|
|
761
|
+
let entryToSetAsLatest = null;
|
|
762
|
+
let storageEntryToSetAsLatest = null;
|
|
763
|
+
let updatedEntryToSetAsLatest = null;
|
|
764
|
+
let storageUpdatedEntryToSetAsLatest = null;
|
|
765
|
+
if (entryToDelete.id === latestEntryRevisionId && storagePreviousEntry) {
|
|
766
|
+
entryToSetAsLatest = await (0, _entryStorage.entryFromStorageTransform)(context, model, storagePreviousEntry);
|
|
767
|
+
storageEntryToSetAsLatest = storagePreviousEntry;
|
|
990
768
|
|
|
991
|
-
try {
|
|
992
|
-
await storageOperations.entries.update(model, {
|
|
993
|
-
entry,
|
|
994
|
-
storageEntry
|
|
995
|
-
});
|
|
996
|
-
} catch (ex) {
|
|
997
|
-
throw new _error.default("Could not update existing entry with new data while re-publishing.", "REPUBLISH_UPDATE_ERROR", {
|
|
998
|
-
entry
|
|
999
|
-
});
|
|
1000
|
-
}
|
|
1001
769
|
/**
|
|
1002
|
-
*
|
|
770
|
+
* Since we're setting a different revision as the latest, we need to update entry-level meta
|
|
771
|
+
* fields. The values are taken from the latest revision we're about to delete. The update of the
|
|
772
|
+
* new latest revision is performed within storage operations.
|
|
1003
773
|
*/
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
async deleteEntryRevision(initialModel, revisionId) {
|
|
1019
|
-
const permission = await checkEntryPermissions({
|
|
1020
|
-
rwd: "d"
|
|
774
|
+
const pickedEntryLevelMetaFields = (0, _constants.pickEntryMetaFields)(entryToDelete, _constants.isEntryLevelEntryMetaField);
|
|
775
|
+
updatedEntryToSetAsLatest = {
|
|
776
|
+
...entryToSetAsLatest,
|
|
777
|
+
...pickedEntryLevelMetaFields
|
|
778
|
+
};
|
|
779
|
+
storageUpdatedEntryToSetAsLatest = {
|
|
780
|
+
...storageEntryToSetAsLatest,
|
|
781
|
+
...pickedEntryLevelMetaFields
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
try {
|
|
785
|
+
await onEntryRevisionBeforeDelete.publish({
|
|
786
|
+
entry: entryToDelete,
|
|
787
|
+
model
|
|
1021
788
|
});
|
|
1022
|
-
await
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
789
|
+
await storageOperations.entries.deleteRevision(model, {
|
|
790
|
+
entry: entryToDelete,
|
|
791
|
+
storageEntry: storageEntryToDelete,
|
|
792
|
+
latestEntry: updatedEntryToSetAsLatest,
|
|
793
|
+
latestStorageEntry: storageUpdatedEntryToSetAsLatest
|
|
1026
794
|
});
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
} = (0, _utils.parseIdentifier)(revisionId);
|
|
1031
|
-
const storageEntryToDelete = await storageOperations.entries.getRevisionById(model, {
|
|
1032
|
-
id: revisionId
|
|
795
|
+
await onEntryRevisionAfterDelete.publish({
|
|
796
|
+
entry: entryToDelete,
|
|
797
|
+
model
|
|
1033
798
|
});
|
|
1034
|
-
|
|
799
|
+
} catch (ex) {
|
|
800
|
+
await onEntryRevisionDeleteError.publish({
|
|
801
|
+
entry: entryToDelete,
|
|
802
|
+
model,
|
|
803
|
+
error: ex
|
|
804
|
+
});
|
|
805
|
+
throw new _error.default(ex.message, ex.code || "DELETE_REVISION_ERROR", {
|
|
806
|
+
error: ex,
|
|
807
|
+
entry: entryToDelete,
|
|
808
|
+
storageEntry: storageEntryToDelete,
|
|
809
|
+
latestEntry: updatedEntryToSetAsLatest,
|
|
810
|
+
latestStorageEntry: storageUpdatedEntryToSetAsLatest
|
|
811
|
+
});
|
|
812
|
+
}
|
|
813
|
+
};
|
|
814
|
+
const deleteMultipleEntries = async (model, params) => {
|
|
815
|
+
const {
|
|
816
|
+
entries: input
|
|
817
|
+
} = params;
|
|
818
|
+
const maxDeletableEntries = 50;
|
|
819
|
+
const entryIdList = new Set();
|
|
820
|
+
for (const id of input) {
|
|
821
|
+
const {
|
|
1035
822
|
id: entryId
|
|
823
|
+
} = (0, _utils.parseIdentifier)(id);
|
|
824
|
+
entryIdList.add(entryId);
|
|
825
|
+
}
|
|
826
|
+
const ids = Array.from(entryIdList);
|
|
827
|
+
if (ids.length > maxDeletableEntries) {
|
|
828
|
+
throw new _error.default("Cannot delete more than 50 entries at once.", "DELETE_ENTRIES_MAX", {
|
|
829
|
+
entries: ids
|
|
1036
830
|
});
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
831
|
+
}
|
|
832
|
+
await entriesPermissions.ensure({
|
|
833
|
+
rwd: "d"
|
|
834
|
+
});
|
|
835
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
836
|
+
model
|
|
837
|
+
});
|
|
838
|
+
const {
|
|
839
|
+
items: entries
|
|
840
|
+
} = await storageOperations.entries.list(model, {
|
|
841
|
+
where: {
|
|
842
|
+
latest: true,
|
|
843
|
+
entryId_in: ids
|
|
844
|
+
},
|
|
845
|
+
limit: maxDeletableEntries + 1
|
|
846
|
+
});
|
|
847
|
+
/**
|
|
848
|
+
* We do not want to allow deleting entries that user does not own or cannot access.
|
|
849
|
+
*/
|
|
850
|
+
const items = (await (0, _filterAsync.filterAsync)(entries, async entry => {
|
|
851
|
+
return entriesPermissions.ensure({
|
|
852
|
+
owns: entry.createdBy
|
|
853
|
+
}, {
|
|
854
|
+
throw: false
|
|
1040
855
|
});
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
const latestEntryRevisionId = latestStorageEntry ? latestStorageEntry.id : null;
|
|
1048
|
-
const entryToDelete = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntryToDelete);
|
|
1049
|
-
/**
|
|
1050
|
-
* If targeted record is the latest entry record and there is no previous one, we need to run full delete with hooks.
|
|
1051
|
-
* At this point deleteRevision hooks are not fired.
|
|
1052
|
-
*/
|
|
1053
|
-
|
|
1054
|
-
if (entryToDelete.id === latestEntryRevisionId && !previousStorageEntry) {
|
|
1055
|
-
return await deleteEntry({
|
|
1056
|
-
model,
|
|
1057
|
-
entry: entryToDelete
|
|
1058
|
-
});
|
|
1059
|
-
}
|
|
1060
|
-
/**
|
|
1061
|
-
* If targeted record is latest entry revision, set the previous one as the new latest
|
|
1062
|
-
*/
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
let entryToSetAsLatest = null;
|
|
1066
|
-
let storageEntryToSetAsLatest = null;
|
|
1067
|
-
|
|
1068
|
-
if (entryToDelete.id === latestEntryRevisionId && previousStorageEntry) {
|
|
1069
|
-
entryToSetAsLatest = await (0, _entryStorage.entryFromStorageTransform)(context, model, previousStorageEntry);
|
|
1070
|
-
storageEntryToSetAsLatest = previousStorageEntry;
|
|
1071
|
-
}
|
|
1072
|
-
|
|
1073
|
-
try {
|
|
1074
|
-
await onEntryRevisionBeforeDelete.publish({
|
|
1075
|
-
entry: entryToDelete,
|
|
1076
|
-
model
|
|
1077
|
-
});
|
|
1078
|
-
await storageOperations.entries.deleteRevision(model, {
|
|
1079
|
-
entry: entryToDelete,
|
|
1080
|
-
storageEntry: storageEntryToDelete,
|
|
1081
|
-
latestEntry: entryToSetAsLatest,
|
|
1082
|
-
latestStorageEntry: storageEntryToSetAsLatest
|
|
1083
|
-
});
|
|
1084
|
-
await onEntryRevisionAfterDelete.publish({
|
|
1085
|
-
entry: entryToDelete,
|
|
1086
|
-
model
|
|
1087
|
-
});
|
|
1088
|
-
} catch (ex) {
|
|
1089
|
-
await onEntryRevisionDeleteError.publish({
|
|
1090
|
-
entry: entryToDelete,
|
|
1091
|
-
model,
|
|
1092
|
-
error: ex
|
|
1093
|
-
});
|
|
1094
|
-
throw new _error.default(ex.message, ex.code || "DELETE_REVISION_ERROR", {
|
|
1095
|
-
error: ex,
|
|
1096
|
-
entry: entryToDelete,
|
|
1097
|
-
storageEntry: storageEntryToDelete,
|
|
1098
|
-
latestEntry: entryToSetAsLatest,
|
|
1099
|
-
latestStorageEntry: storageEntryToSetAsLatest
|
|
1100
|
-
});
|
|
1101
|
-
}
|
|
1102
|
-
},
|
|
1103
|
-
|
|
1104
|
-
async deleteEntry(initialModel, entryId) {
|
|
1105
|
-
const permission = await checkEntryPermissions({
|
|
1106
|
-
rwd: "d"
|
|
856
|
+
})).map(entry => entry.id);
|
|
857
|
+
try {
|
|
858
|
+
await onEntryBeforeDeleteMultiple.publish({
|
|
859
|
+
entries,
|
|
860
|
+
ids,
|
|
861
|
+
model
|
|
1107
862
|
});
|
|
1108
|
-
await
|
|
1109
|
-
|
|
1110
|
-
model: initialModel,
|
|
1111
|
-
plugins
|
|
863
|
+
await storageOperations.entries.deleteMultipleEntries(model, {
|
|
864
|
+
entries: items
|
|
1112
865
|
});
|
|
1113
|
-
|
|
866
|
+
await onEntryAfterDeleteMultiple.publish({
|
|
867
|
+
entries,
|
|
868
|
+
ids,
|
|
869
|
+
model
|
|
870
|
+
});
|
|
871
|
+
return items.map(id => {
|
|
872
|
+
return {
|
|
873
|
+
id
|
|
874
|
+
};
|
|
875
|
+
});
|
|
876
|
+
} catch (ex) {
|
|
877
|
+
await onEntryDeleteMultipleError.publish({
|
|
878
|
+
entries,
|
|
879
|
+
ids,
|
|
880
|
+
model,
|
|
881
|
+
error: ex
|
|
882
|
+
});
|
|
883
|
+
throw new _error.default(ex.message, ex.code || "DELETE_ENTRIES_MULTIPLE_ERROR", {
|
|
884
|
+
error: ex,
|
|
885
|
+
entries
|
|
886
|
+
});
|
|
887
|
+
}
|
|
888
|
+
};
|
|
889
|
+
const deleteEntry = async (model, id, options) => {
|
|
890
|
+
await entriesPermissions.ensure({
|
|
891
|
+
rwd: "d"
|
|
892
|
+
});
|
|
893
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
894
|
+
model
|
|
895
|
+
});
|
|
896
|
+
const {
|
|
897
|
+
force
|
|
898
|
+
} = options || {};
|
|
899
|
+
const storageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {
|
|
900
|
+
id
|
|
901
|
+
});
|
|
902
|
+
/**
|
|
903
|
+
* If there is no entry, and we do not force the deletion, just throw an error.
|
|
904
|
+
*/
|
|
905
|
+
if (!storageEntry && !force) {
|
|
906
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${id}" was not found!`);
|
|
907
|
+
}
|
|
908
|
+
/**
|
|
909
|
+
* In the case we are forcing the deletion, we do not need the storageEntry to exist as it might be an error when loading single database record.
|
|
910
|
+
*
|
|
911
|
+
* This happens, sometimes, in the Elasticsearch system as the entry might get deleted from the DynamoDB but not from the Elasticsearch.
|
|
912
|
+
* This is due to high load on the Elasticsearch at the time of the deletion.
|
|
913
|
+
*/
|
|
914
|
+
//
|
|
915
|
+
else if (!storageEntry && force) {
|
|
916
|
+
const {
|
|
1114
917
|
id: entryId
|
|
918
|
+
} = (0, _utils.parseIdentifier)(id);
|
|
919
|
+
return await deleteEntryHelper({
|
|
920
|
+
model,
|
|
921
|
+
entry: {
|
|
922
|
+
id,
|
|
923
|
+
entryId
|
|
924
|
+
}
|
|
1115
925
|
});
|
|
926
|
+
}
|
|
927
|
+
await entriesPermissions.ensure({
|
|
928
|
+
owns: storageEntry.createdBy
|
|
929
|
+
});
|
|
930
|
+
const entry = await (0, _entryStorage.entryFromStorageTransform)(context, model, storageEntry);
|
|
931
|
+
return await deleteEntryHelper({
|
|
932
|
+
model,
|
|
933
|
+
entry
|
|
934
|
+
});
|
|
935
|
+
};
|
|
936
|
+
const publishEntry = async (model, id) => {
|
|
937
|
+
await entriesPermissions.ensure({
|
|
938
|
+
pw: "p"
|
|
939
|
+
});
|
|
940
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
941
|
+
model
|
|
942
|
+
});
|
|
943
|
+
const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {
|
|
944
|
+
id
|
|
945
|
+
});
|
|
946
|
+
if (!originalStorageEntry) {
|
|
947
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${id}" in the model "${model.modelId}" was not found.`);
|
|
948
|
+
}
|
|
949
|
+
await entriesPermissions.ensure({
|
|
950
|
+
owns: originalStorageEntry.revisionCreatedBy
|
|
951
|
+
});
|
|
952
|
+
const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
1116
953
|
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
954
|
+
// We need the latest entry to get the latest entry-level meta fields.
|
|
955
|
+
const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {
|
|
956
|
+
id: originalEntry.entryId
|
|
957
|
+
});
|
|
958
|
+
if (!latestStorageEntry) {
|
|
959
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${id}" in the model "${model.modelId}" was not found.`);
|
|
960
|
+
}
|
|
961
|
+
const latestEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, latestStorageEntry);
|
|
962
|
+
const {
|
|
963
|
+
entry
|
|
964
|
+
} = await (0, _entryDataFactories.createPublishEntryData)({
|
|
965
|
+
context,
|
|
966
|
+
model,
|
|
967
|
+
originalEntry,
|
|
968
|
+
latestEntry,
|
|
969
|
+
getIdentity: getSecurityIdentity
|
|
970
|
+
});
|
|
971
|
+
let storageEntry = null;
|
|
972
|
+
try {
|
|
973
|
+
await onEntryBeforePublish.publish({
|
|
974
|
+
original: originalEntry,
|
|
975
|
+
entry,
|
|
976
|
+
model
|
|
977
|
+
});
|
|
978
|
+
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
979
|
+
const result = await storageOperations.entries.publish(model, {
|
|
980
|
+
entry,
|
|
981
|
+
storageEntry
|
|
982
|
+
});
|
|
983
|
+
await onEntryAfterPublish.publish({
|
|
984
|
+
original: originalEntry,
|
|
985
|
+
entry,
|
|
986
|
+
storageEntry: result,
|
|
987
|
+
model
|
|
988
|
+
});
|
|
989
|
+
return entry;
|
|
990
|
+
} catch (ex) {
|
|
991
|
+
await onEntryPublishError.publish({
|
|
992
|
+
original: originalEntry,
|
|
993
|
+
entry,
|
|
994
|
+
model,
|
|
995
|
+
error: ex
|
|
996
|
+
});
|
|
997
|
+
throw new _error.default(ex.message || "Could not publish entry.", ex.code || "PUBLISH_ERROR", {
|
|
998
|
+
error: ex,
|
|
999
|
+
entry,
|
|
1000
|
+
storageEntry,
|
|
1001
|
+
originalEntry,
|
|
1002
|
+
originalStorageEntry
|
|
1003
|
+
});
|
|
1004
|
+
}
|
|
1005
|
+
};
|
|
1006
|
+
const unpublishEntry = async (model, id) => {
|
|
1007
|
+
await entriesPermissions.ensure({
|
|
1008
|
+
pw: "u"
|
|
1009
|
+
});
|
|
1010
|
+
const {
|
|
1011
|
+
id: entryId
|
|
1012
|
+
} = (0, _utils.parseIdentifier)(id);
|
|
1013
|
+
const originalStorageEntry = await storageOperations.entries.getPublishedRevisionByEntryId(model, {
|
|
1014
|
+
id: entryId
|
|
1015
|
+
});
|
|
1016
|
+
if (!originalStorageEntry) {
|
|
1017
|
+
throw new _handlerGraphql.NotFoundError(`Entry "${id}" of model "${model.modelId}" was not found.`);
|
|
1018
|
+
}
|
|
1019
|
+
if (originalStorageEntry.id !== id) {
|
|
1020
|
+
throw new _error.default(`Entry is not published.`, "UNPUBLISH_ERROR", {
|
|
1021
|
+
entry: originalStorageEntry
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
await entriesPermissions.ensure({
|
|
1025
|
+
owns: originalStorageEntry.revisionCreatedBy
|
|
1026
|
+
});
|
|
1027
|
+
const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
1028
|
+
const {
|
|
1029
|
+
entry
|
|
1030
|
+
} = await (0, _entryDataFactories.createUnpublishEntryData)({
|
|
1031
|
+
context,
|
|
1032
|
+
model,
|
|
1033
|
+
originalEntry,
|
|
1034
|
+
getIdentity: getSecurityIdentity
|
|
1035
|
+
});
|
|
1036
|
+
let storageEntry = null;
|
|
1037
|
+
try {
|
|
1038
|
+
await onEntryBeforeUnpublish.publish({
|
|
1039
|
+
entry,
|
|
1040
|
+
model
|
|
1041
|
+
});
|
|
1042
|
+
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
1043
|
+
const result = await storageOperations.entries.unpublish(model, {
|
|
1044
|
+
entry,
|
|
1045
|
+
storageEntry
|
|
1046
|
+
});
|
|
1047
|
+
await onEntryAfterUnpublish.publish({
|
|
1048
|
+
entry,
|
|
1049
|
+
storageEntry: result,
|
|
1050
|
+
model
|
|
1051
|
+
});
|
|
1052
|
+
return entry;
|
|
1053
|
+
} catch (ex) {
|
|
1054
|
+
await onEntryUnpublishError.publish({
|
|
1055
|
+
entry,
|
|
1056
|
+
model,
|
|
1057
|
+
error: ex
|
|
1058
|
+
});
|
|
1059
|
+
throw new _error.default(ex.message || "Could not unpublish entry.", ex.code || "UNPUBLISH_ERROR", {
|
|
1060
|
+
originalEntry,
|
|
1061
|
+
originalStorageEntry,
|
|
1062
|
+
entry,
|
|
1063
|
+
storageEntry
|
|
1064
|
+
});
|
|
1065
|
+
}
|
|
1066
|
+
};
|
|
1067
|
+
const getUniqueFieldValues = async (model, params) => {
|
|
1068
|
+
await entriesPermissions.ensure({
|
|
1069
|
+
rwd: "r"
|
|
1070
|
+
});
|
|
1071
|
+
await modelsPermissions.ensureCanAccessModel({
|
|
1072
|
+
model
|
|
1073
|
+
});
|
|
1074
|
+
const {
|
|
1075
|
+
where: initialWhere,
|
|
1076
|
+
fieldId
|
|
1077
|
+
} = params;
|
|
1078
|
+
const where = {
|
|
1079
|
+
...initialWhere
|
|
1080
|
+
};
|
|
1081
|
+
/**
|
|
1082
|
+
* Possibly only get records which are owned by current user.
|
|
1083
|
+
* Or if searching for the owner set that value - in the case that user can see other entries than their own.
|
|
1084
|
+
*/
|
|
1085
|
+
if (await entriesPermissions.canAccessOnlyOwnRecords()) {
|
|
1086
|
+
where.createdBy = getSecurityIdentity().id;
|
|
1087
|
+
}
|
|
1120
1088
|
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1089
|
+
/**
|
|
1090
|
+
* Where must contain either latest or published keys.
|
|
1091
|
+
* We cannot list entries without one of those
|
|
1092
|
+
*/
|
|
1093
|
+
if (where.latest && where.published) {
|
|
1094
|
+
throw new _error.default("Cannot list entries that are both published and latest.", "LIST_ENTRIES_ERROR", {
|
|
1095
|
+
where
|
|
1096
|
+
});
|
|
1097
|
+
} else if (!where.latest && !where.published) {
|
|
1098
|
+
throw new _error.default("Cannot list entries if we do not have latest or published defined.", "LIST_ENTRIES_ERROR", {
|
|
1099
|
+
where
|
|
1100
|
+
});
|
|
1101
|
+
}
|
|
1102
|
+
/**
|
|
1103
|
+
* We need to verify that the field in question is searchable.
|
|
1104
|
+
*/
|
|
1105
|
+
const fields = (0, _searchableFields.getSearchableFields)({
|
|
1106
|
+
fields: model.fields,
|
|
1107
|
+
plugins: context.plugins,
|
|
1108
|
+
input: []
|
|
1109
|
+
});
|
|
1110
|
+
if (!fields.includes(fieldId)) {
|
|
1111
|
+
throw new _error.default("Cannot list unique entry field values if the field is not searchable.", "LIST_UNIQUE_ENTRY_VALUES_ERROR", {
|
|
1112
|
+
fieldId
|
|
1113
|
+
});
|
|
1114
|
+
}
|
|
1115
|
+
try {
|
|
1116
|
+
return await storageOperations.entries.getUniqueFieldValues(model, {
|
|
1117
|
+
where,
|
|
1118
|
+
fieldId
|
|
1119
|
+
});
|
|
1120
|
+
} catch (ex) {
|
|
1121
|
+
throw new _error.default("Error while fetching unique entry values from storage.", "LIST_UNIQUE_ENTRY_VALUES_ERROR", {
|
|
1122
|
+
error: {
|
|
1123
|
+
message: ex.message,
|
|
1124
|
+
code: ex.code,
|
|
1125
|
+
data: ex.data
|
|
1126
|
+
},
|
|
1124
1127
|
model,
|
|
1125
|
-
|
|
1128
|
+
where,
|
|
1129
|
+
fieldId
|
|
1130
|
+
});
|
|
1131
|
+
}
|
|
1132
|
+
};
|
|
1133
|
+
return {
|
|
1134
|
+
onEntryBeforeCreate,
|
|
1135
|
+
onEntryAfterCreate,
|
|
1136
|
+
onEntryCreateError,
|
|
1137
|
+
onEntryRevisionBeforeCreate: onEntryBeforeCreateRevision,
|
|
1138
|
+
onEntryRevisionAfterCreate,
|
|
1139
|
+
onEntryRevisionCreateError: onEntryCreateRevisionError,
|
|
1140
|
+
onEntryBeforeUpdate,
|
|
1141
|
+
onEntryAfterUpdate,
|
|
1142
|
+
onEntryUpdateError,
|
|
1143
|
+
onEntryBeforeMove,
|
|
1144
|
+
onEntryAfterMove,
|
|
1145
|
+
onEntryMoveError,
|
|
1146
|
+
onEntryBeforeDelete,
|
|
1147
|
+
onEntryAfterDelete,
|
|
1148
|
+
onEntryDeleteError,
|
|
1149
|
+
onEntryRevisionBeforeDelete,
|
|
1150
|
+
onEntryRevisionAfterDelete,
|
|
1151
|
+
onEntryRevisionDeleteError,
|
|
1152
|
+
onEntryBeforePublish,
|
|
1153
|
+
onEntryAfterPublish,
|
|
1154
|
+
onEntryPublishError,
|
|
1155
|
+
onEntryBeforeRepublish,
|
|
1156
|
+
onEntryAfterRepublish,
|
|
1157
|
+
onEntryRepublishError,
|
|
1158
|
+
onEntryBeforeUnpublish,
|
|
1159
|
+
onEntryAfterUnpublish,
|
|
1160
|
+
onEntryUnpublishError,
|
|
1161
|
+
onEntryBeforeGet,
|
|
1162
|
+
onEntryBeforeList,
|
|
1163
|
+
/**
|
|
1164
|
+
* Get entries by exact revision IDs from the database.
|
|
1165
|
+
*/
|
|
1166
|
+
getEntriesByIds,
|
|
1167
|
+
/**
|
|
1168
|
+
* Get a single entry by revision ID from the database.
|
|
1169
|
+
*/
|
|
1170
|
+
async getEntryById(model, id) {
|
|
1171
|
+
return context.benchmark.measure("headlessCms.crud.entries.getEntryById", async () => {
|
|
1172
|
+
return getEntryById(model, id);
|
|
1126
1173
|
});
|
|
1127
1174
|
},
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1175
|
+
/**
|
|
1176
|
+
* Get published revisions by entry IDs.
|
|
1177
|
+
*/
|
|
1178
|
+
async getPublishedEntriesByIds(model, ids) {
|
|
1179
|
+
return context.benchmark.measure("headlessCms.crud.entries.getPublishedEntriesByIds", async () => {
|
|
1180
|
+
return getPublishedEntriesByIds(model, ids);
|
|
1132
1181
|
});
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1182
|
+
},
|
|
1183
|
+
/**
|
|
1184
|
+
* Get the latest revisions by entry IDs.
|
|
1185
|
+
*/
|
|
1186
|
+
async getLatestEntriesByIds(model, ids) {
|
|
1187
|
+
return context.benchmark.measure("headlessCms.crud.entries.getLatestEntriesByIds", async () => {
|
|
1188
|
+
return getLatestEntriesByIds(model, ids);
|
|
1137
1189
|
});
|
|
1138
|
-
|
|
1139
|
-
|
|
1190
|
+
},
|
|
1191
|
+
async getEntryRevisions(model, entryId) {
|
|
1192
|
+
return context.benchmark.measure("headlessCms.crud.entries.getEntryRevisions", async () => {
|
|
1193
|
+
return getEntryRevisions(model, entryId);
|
|
1140
1194
|
});
|
|
1141
|
-
|
|
1142
|
-
if (!originalStorageEntry) {
|
|
1143
|
-
throw new _handlerGraphql.NotFoundError(`Entry "${id}" in the model "${model.modelId}" was not found.`);
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
|
-
(0, _ownership.checkOwnership)(context, permission, originalStorageEntry);
|
|
1147
|
-
const originalEntry = await (0, _entryStorage.entryFromStorageTransform)(context, model, originalStorageEntry);
|
|
1148
|
-
const currentDate = new Date().toISOString();
|
|
1149
|
-
const entry = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalEntry), {}, {
|
|
1150
|
-
status: STATUS_PUBLISHED,
|
|
1151
|
-
locked: true,
|
|
1152
|
-
savedOn: currentDate,
|
|
1153
|
-
publishedOn: currentDate
|
|
1154
|
-
});
|
|
1155
|
-
let storageEntry = null;
|
|
1156
|
-
|
|
1157
|
-
try {
|
|
1158
|
-
await onEntryBeforePublish.publish({
|
|
1159
|
-
entry,
|
|
1160
|
-
model
|
|
1161
|
-
});
|
|
1162
|
-
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
1163
|
-
const result = await storageOperations.entries.publish(model, {
|
|
1164
|
-
entry,
|
|
1165
|
-
storageEntry
|
|
1166
|
-
});
|
|
1167
|
-
await onEntryAfterPublish.publish({
|
|
1168
|
-
entry,
|
|
1169
|
-
storageEntry: result,
|
|
1170
|
-
model
|
|
1171
|
-
});
|
|
1172
|
-
return result;
|
|
1173
|
-
} catch (ex) {
|
|
1174
|
-
await onEntryPublishError.publish({
|
|
1175
|
-
entry,
|
|
1176
|
-
model,
|
|
1177
|
-
error: ex
|
|
1178
|
-
});
|
|
1179
|
-
throw new _error.default(ex.message || "Could not publish entry.", ex.code || "PUBLISH_ERROR", {
|
|
1180
|
-
error: ex,
|
|
1181
|
-
entry,
|
|
1182
|
-
storageEntry,
|
|
1183
|
-
originalEntry,
|
|
1184
|
-
originalStorageEntry
|
|
1185
|
-
});
|
|
1186
|
-
}
|
|
1187
1195
|
},
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1196
|
+
/**
|
|
1197
|
+
* TODO determine if this method is required at all.
|
|
1198
|
+
*
|
|
1199
|
+
* @internal
|
|
1200
|
+
*/
|
|
1201
|
+
async getEntry(model, params) {
|
|
1202
|
+
return context.benchmark.measure("headlessCms.crud.entries.getEntry", async () => {
|
|
1203
|
+
return getEntry(model, params);
|
|
1192
1204
|
});
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1205
|
+
},
|
|
1206
|
+
/**
|
|
1207
|
+
* @description Should not be used directly. Internal use only!
|
|
1208
|
+
*
|
|
1209
|
+
* @internal
|
|
1210
|
+
*/
|
|
1211
|
+
async listEntries(model, params) {
|
|
1212
|
+
return context.benchmark.measure("headlessCms.crud.entries.listEntries", async () => {
|
|
1213
|
+
return listEntries(model, params);
|
|
1196
1214
|
});
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1215
|
+
},
|
|
1216
|
+
async listLatestEntries(model, params) {
|
|
1217
|
+
const where = params?.where || {};
|
|
1218
|
+
return this.listEntries(model, {
|
|
1219
|
+
sort: ["createdOn_DESC"],
|
|
1220
|
+
...(params || {}),
|
|
1221
|
+
where: {
|
|
1222
|
+
...where,
|
|
1223
|
+
latest: true
|
|
1224
|
+
}
|
|
1202
1225
|
});
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1226
|
+
},
|
|
1227
|
+
async listPublishedEntries(model, params) {
|
|
1228
|
+
const where = params?.where || {};
|
|
1229
|
+
return this.listEntries(model, {
|
|
1230
|
+
sort: ["createdOn_DESC"],
|
|
1231
|
+
...(params || {}),
|
|
1232
|
+
where: {
|
|
1233
|
+
...where,
|
|
1234
|
+
published: true
|
|
1235
|
+
}
|
|
1236
|
+
});
|
|
1237
|
+
},
|
|
1238
|
+
async createEntry(model, input, options) {
|
|
1239
|
+
return context.benchmark.measure("headlessCms.crud.entries.createEntry", async () => {
|
|
1240
|
+
return createEntry(model, input, options);
|
|
1241
|
+
});
|
|
1242
|
+
},
|
|
1243
|
+
async createEntryRevisionFrom(model, sourceId, input, options) {
|
|
1244
|
+
return context.benchmark.measure("headlessCms.crud.entries.createEntryRevisionFrom", async () => {
|
|
1245
|
+
return createEntryRevisionFrom(model, sourceId, input, options);
|
|
1246
|
+
});
|
|
1247
|
+
},
|
|
1248
|
+
async updateEntry(model, id, input, meta, options) {
|
|
1249
|
+
return context.benchmark.measure("headlessCms.crud.entries.updateEntry", async () => {
|
|
1250
|
+
return updateEntry(model, id, input, meta, options);
|
|
1251
|
+
});
|
|
1252
|
+
},
|
|
1253
|
+
async validateEntry(model, id, input) {
|
|
1254
|
+
return context.benchmark.measure("headlessCms.crud.entries.validateEntry", async () => {
|
|
1255
|
+
return validateEntry(model, id, input);
|
|
1256
|
+
});
|
|
1257
|
+
},
|
|
1258
|
+
async moveEntry(model, id, folderId) {
|
|
1259
|
+
return context.benchmark.measure("headlessCms.crud.entries.moveEntry", async () => {
|
|
1260
|
+
return moveEntry(model, id, folderId);
|
|
1261
|
+
});
|
|
1262
|
+
},
|
|
1263
|
+
/**
|
|
1264
|
+
* Method used internally. Not documented and should not be used in users systems.
|
|
1265
|
+
* @internal
|
|
1266
|
+
*/
|
|
1267
|
+
async republishEntry(model, id) {
|
|
1268
|
+
return context.benchmark.measure("headlessCms.crud.entries.republishEntry", async () => {
|
|
1269
|
+
return republishEntry(model, id);
|
|
1270
|
+
});
|
|
1271
|
+
},
|
|
1272
|
+
async deleteEntryRevision(model, id) {
|
|
1273
|
+
return context.benchmark.measure("headlessCms.crud.entries.deleteEntryRevision", async () => {
|
|
1274
|
+
return deleteEntryRevision(model, id);
|
|
1275
|
+
});
|
|
1276
|
+
},
|
|
1277
|
+
async deleteEntry(model, entryId, options) {
|
|
1278
|
+
return context.benchmark.measure("headlessCms.crud.entries.deleteEntry", async () => {
|
|
1279
|
+
return deleteEntry(model, entryId, options);
|
|
1280
|
+
});
|
|
1281
|
+
},
|
|
1282
|
+
async deleteMultipleEntries(model, ids) {
|
|
1283
|
+
return context.benchmark.measure("headlessCms.crud.entries.deleteMultipleEntries", async () => {
|
|
1284
|
+
return deleteMultipleEntries(model, ids);
|
|
1285
|
+
});
|
|
1286
|
+
},
|
|
1287
|
+
async publishEntry(model, id) {
|
|
1288
|
+
return context.benchmark.measure("headlessCms.crud.entries.publishEntry", async () => {
|
|
1289
|
+
return publishEntry(model, id);
|
|
1290
|
+
});
|
|
1291
|
+
},
|
|
1292
|
+
async unpublishEntry(model, id) {
|
|
1293
|
+
return context.benchmark.measure("headlessCms.crud.entries.unpublishEntry", async () => {
|
|
1294
|
+
return unpublishEntry(model, id);
|
|
1295
|
+
});
|
|
1296
|
+
},
|
|
1297
|
+
async getUniqueFieldValues(model, params) {
|
|
1298
|
+
return context.benchmark.measure("headlessCms.crud.entries.getUniqueFieldValues", async () => {
|
|
1299
|
+
return getUniqueFieldValues(model, params);
|
|
1218
1300
|
});
|
|
1219
|
-
let storageEntry = null;
|
|
1220
|
-
|
|
1221
|
-
try {
|
|
1222
|
-
await onEntryBeforeUnpublish.publish({
|
|
1223
|
-
entry,
|
|
1224
|
-
model
|
|
1225
|
-
});
|
|
1226
|
-
storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
|
|
1227
|
-
const result = await storageOperations.entries.unpublish(model, {
|
|
1228
|
-
entry,
|
|
1229
|
-
storageEntry
|
|
1230
|
-
});
|
|
1231
|
-
await onEntryAfterUnpublish.publish({
|
|
1232
|
-
entry,
|
|
1233
|
-
storageEntry: result,
|
|
1234
|
-
model
|
|
1235
|
-
});
|
|
1236
|
-
return result;
|
|
1237
|
-
} catch (ex) {
|
|
1238
|
-
await onEntryUnpublishError.publish({
|
|
1239
|
-
entry,
|
|
1240
|
-
model,
|
|
1241
|
-
error: ex
|
|
1242
|
-
});
|
|
1243
|
-
throw new _error.default(ex.message || "Could not unpublish entry.", ex.code || "UNPUBLISH_ERROR", {
|
|
1244
|
-
originalEntry,
|
|
1245
|
-
originalStorageEntry,
|
|
1246
|
-
entry,
|
|
1247
|
-
storageEntry
|
|
1248
|
-
});
|
|
1249
|
-
}
|
|
1250
1301
|
}
|
|
1251
|
-
|
|
1252
1302
|
};
|
|
1253
1303
|
};
|
|
1304
|
+
exports.createContentEntryCrud = createContentEntryCrud;
|
|
1254
1305
|
|
|
1255
|
-
|
|
1306
|
+
//# sourceMappingURL=contentEntry.crud.js.map
|