payload 3.89.0 → 3.90.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/forms/Field.d.ts +2 -0
- package/dist/admin/forms/Field.d.ts.map +1 -1
- package/dist/admin/forms/Field.js.map +1 -1
- package/dist/admin/forms/Form.d.ts +2 -0
- package/dist/admin/forms/Form.d.ts.map +1 -1
- package/dist/admin/forms/Form.js.map +1 -1
- package/dist/admin/functions/index.d.ts +3 -1
- package/dist/admin/functions/index.d.ts.map +1 -1
- package/dist/admin/functions/index.js.map +1 -1
- package/dist/admin/views/dashboard.d.ts +1 -1
- package/dist/admin/views/dashboard.d.ts.map +1 -1
- package/dist/admin/views/dashboard.js.map +1 -1
- package/dist/auth/applyUserReadAccess.d.ts +15 -0
- package/dist/auth/applyUserReadAccess.d.ts.map +1 -0
- package/dist/auth/applyUserReadAccess.js +41 -0
- package/dist/auth/applyUserReadAccess.js.map +1 -0
- package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.js +20 -0
- package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.js.map +1 -0
- package/dist/auth/baseFields/apiKey/encryptAPIKey.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/encryptAPIKey.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/encryptAPIKey.js +16 -0
- package/dist/auth/baseFields/apiKey/encryptAPIKey.js.map +1 -0
- package/dist/auth/baseFields/apiKey/index.d.ts +6 -0
- package/dist/auth/baseFields/apiKey/index.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/index.js +112 -0
- package/dist/auth/baseFields/apiKey/index.js.map +1 -0
- package/dist/auth/baseFields/apiKey/omitAPIKey.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/omitAPIKey.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/omitAPIKey.js +8 -0
- package/dist/auth/baseFields/apiKey/omitAPIKey.js.map +1 -0
- package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.js +5 -0
- package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.js.map +1 -0
- package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.js +5 -0
- package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.js.map +1 -0
- package/dist/auth/baseFields/apiKey/setAPIKeyIndex.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/setAPIKeyIndex.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/setAPIKeyIndex.js +17 -0
- package/dist/auth/baseFields/apiKey/setAPIKeyIndex.js.map +1 -0
- package/dist/auth/baseFields/auth.d.ts +1 -0
- package/dist/auth/baseFields/auth.d.ts.map +1 -1
- package/dist/auth/baseFields/auth.js +9 -0
- package/dist/auth/baseFields/auth.js.map +1 -1
- package/dist/auth/defaultUnlockAccess.d.ts +3 -0
- package/dist/auth/defaultUnlockAccess.d.ts.map +1 -0
- package/dist/auth/defaultUnlockAccess.js +8 -0
- package/dist/auth/defaultUnlockAccess.js.map +1 -0
- package/dist/auth/endpoints/index.d.ts +1 -0
- package/dist/auth/endpoints/index.d.ts.map +1 -1
- package/dist/auth/endpoints/index.js +8 -0
- package/dist/auth/endpoints/index.js.map +1 -1
- package/dist/auth/endpoints/revealAPIKey.d.ts +7 -0
- package/dist/auth/endpoints/revealAPIKey.d.ts.map +1 -0
- package/dist/auth/endpoints/revealAPIKey.js +120 -0
- package/dist/auth/endpoints/revealAPIKey.js.map +1 -0
- package/dist/auth/executeAccess.d.ts +3 -1
- package/dist/auth/executeAccess.d.ts.map +1 -1
- package/dist/auth/executeAccess.js +2 -1
- package/dist/auth/executeAccess.js.map +1 -1
- package/dist/auth/getAuthFields.d.ts +1 -1
- package/dist/auth/getAuthFields.d.ts.map +1 -1
- package/dist/auth/getAuthFields.js +7 -4
- package/dist/auth/getAuthFields.js.map +1 -1
- package/dist/auth/getFieldsToSign.d.ts.map +1 -1
- package/dist/auth/getFieldsToSign.js +17 -10
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/getFieldsToSign.spec.js +114 -0
- package/dist/auth/getFieldsToSign.spec.js.map +1 -0
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +2 -0
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/jwt.spec.js +24 -0
- package/dist/auth/jwt.spec.js.map +1 -0
- package/dist/auth/jwtAuth.d.ts +9 -0
- package/dist/auth/jwtAuth.d.ts.map +1 -0
- package/dist/auth/jwtAuth.js +8 -0
- package/dist/auth/jwtAuth.js.map +1 -0
- package/dist/auth/operations/auth.d.ts.map +1 -1
- package/dist/auth/operations/auth.js +2 -1
- package/dist/auth/operations/auth.js.map +1 -1
- package/dist/auth/operations/forgotPassword.d.ts.map +1 -1
- package/dist/auth/operations/forgotPassword.js +95 -7
- package/dist/auth/operations/forgotPassword.js.map +1 -1
- package/dist/auth/operations/local/auth.js +3 -1
- package/dist/auth/operations/local/auth.js.map +1 -1
- package/dist/auth/operations/login.d.ts.map +1 -1
- package/dist/auth/operations/login.js +48 -26
- package/dist/auth/operations/login.js.map +1 -1
- package/dist/auth/operations/refresh.d.ts.map +1 -1
- package/dist/auth/operations/refresh.js +32 -9
- package/dist/auth/operations/refresh.js.map +1 -1
- package/dist/auth/operations/registerFirstUser.d.ts.map +1 -1
- package/dist/auth/operations/registerFirstUser.js +3 -4
- package/dist/auth/operations/registerFirstUser.js.map +1 -1
- package/dist/auth/operations/resetPassword.d.ts.map +1 -1
- package/dist/auth/operations/resetPassword.js +31 -22
- package/dist/auth/operations/resetPassword.js.map +1 -1
- package/dist/auth/operations/unlock.d.ts.map +1 -1
- package/dist/auth/operations/unlock.js +1 -0
- package/dist/auth/operations/unlock.js.map +1 -1
- package/dist/auth/strategies/apiKey.d.ts.map +1 -1
- package/dist/auth/strategies/apiKey.js +15 -1
- package/dist/auth/strategies/apiKey.js.map +1 -1
- package/dist/auth/strategies/jwt.d.ts.map +1 -1
- package/dist/auth/strategies/jwt.js +61 -10
- package/dist/auth/strategies/jwt.js.map +1 -1
- package/dist/auth/strategies/jwt.spec.js +281 -0
- package/dist/auth/strategies/jwt.spec.js.map +1 -0
- package/dist/auth/strategies/local/authenticate.d.ts +5 -1
- package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
- package/dist/auth/strategies/local/authenticate.js +8 -3
- package/dist/auth/strategies/local/authenticate.js.map +1 -1
- package/dist/auth/strategies/local/authenticate.spec.js +37 -10
- package/dist/auth/strategies/local/authenticate.spec.js.map +1 -1
- package/dist/auth/strategies/local/generatePasswordSaltHash.d.ts +9 -1
- package/dist/auth/strategies/local/generatePasswordSaltHash.d.ts.map +1 -1
- package/dist/auth/strategies/local/generatePasswordSaltHash.js +61 -34
- package/dist/auth/strategies/local/generatePasswordSaltHash.js.map +1 -1
- package/dist/auth/types.d.ts +16 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/collections/config/client.d.ts +1 -0
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +3 -0
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.d.ts.map +1 -1
- package/dist/collections/config/defaults.js +4 -2
- package/dist/collections/config/defaults.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +17 -6
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/endpoints/index.d.ts +1 -0
- package/dist/collections/endpoints/index.d.ts.map +1 -1
- package/dist/collections/endpoints/index.js +6 -5
- package/dist/collections/endpoints/index.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +105 -8
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/deleteByID.js +13 -13
- package/dist/collections/operations/deleteByID.js.map +1 -1
- package/dist/collections/operations/findDistinct.d.ts.map +1 -1
- package/dist/collections/operations/findDistinct.js +96 -18
- package/dist/collections/operations/findDistinct.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/restoreVersion.js +47 -13
- package/dist/collections/operations/restoreVersion.js.map +1 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +118 -18
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.js +62 -2
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +71 -15
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/config/orderable/index.d.ts.map +1 -1
- package/dist/config/orderable/index.js +67 -14
- package/dist/config/orderable/index.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +1 -1
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +13 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/getLocalizedPaths.d.ts +2 -1
- package/dist/database/getLocalizedPaths.d.ts.map +1 -1
- package/dist/database/getLocalizedPaths.js +12 -3
- package/dist/database/getLocalizedPaths.js.map +1 -1
- package/dist/database/isNestedRelationshipQuery.d.ts +9 -0
- package/dist/database/isNestedRelationshipQuery.d.ts.map +1 -0
- package/dist/database/isNestedRelationshipQuery.js +14 -0
- package/dist/database/isNestedRelationshipQuery.js.map +1 -0
- package/dist/database/prefixWherePaths.d.ts +6 -0
- package/dist/database/prefixWherePaths.d.ts.map +1 -0
- package/dist/database/prefixWherePaths.js +19 -0
- package/dist/database/prefixWherePaths.js.map +1 -0
- package/dist/database/prefixWherePaths.spec.js +46 -0
- package/dist/database/prefixWherePaths.spec.js.map +1 -0
- package/dist/database/queryValidation/validateQueryPaths.d.ts +2 -1
- package/dist/database/queryValidation/validateQueryPaths.d.ts.map +1 -1
- package/dist/database/queryValidation/validateQueryPaths.js +4 -1
- package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.d.ts +2 -1
- package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.js +82 -4
- package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
- package/dist/database/types.d.ts +5 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/email/normalizeSendEmailOptions.js.map +1 -1
- package/dist/email/types.d.ts +4 -1
- package/dist/email/types.d.ts.map +1 -1
- package/dist/email/types.js.map +1 -1
- package/dist/exports/internal.d.ts +7 -0
- package/dist/exports/internal.d.ts.map +1 -1
- package/dist/exports/internal.js +7 -1
- package/dist/exports/internal.js.map +1 -1
- package/dist/exports/shared.d.ts +3 -0
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +3 -0
- package/dist/exports/shared.js.map +1 -1
- package/dist/fields/config/types.d.ts +7 -5
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/beforeChange/index.d.ts +7 -1
- package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/index.js +4 -2
- package/dist/fields/hooks/beforeChange/index.js.map +1 -1
- package/dist/fields/hooks/beforeChange/index.spec.js +206 -0
- package/dist/fields/hooks/beforeChange/index.spec.js.map +1 -0
- package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +51 -9
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js +3 -2
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeDuplicate/promise.js +4 -0
- package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/getFallbackValue.d.ts +2 -1
- package/dist/fields/hooks/beforeValidate/getFallbackValue.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/getFallbackValue.js +2 -2
- package/dist/fields/hooks/beforeValidate/getFallbackValue.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.d.ts +6 -1
- package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.js +3 -1
- package/dist/fields/hooks/beforeValidate/index.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.spec.js +90 -0
- package/dist/fields/hooks/beforeValidate/index.spec.js.map +1 -0
- package/dist/fields/hooks/beforeValidate/promise.d.ts +6 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +23 -8
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts +6 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js +3 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +3 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +45 -11
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/globals/operations/update.d.ts.map +1 -1
- package/dist/globals/operations/update.js +95 -16
- package/dist/globals/operations/update.js.map +1 -1
- package/dist/index.bundled.d.ts +102 -24
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/preferences/config.d.ts.map +1 -1
- package/dist/preferences/config.js +2 -1
- package/dist/preferences/config.js.map +1 -1
- package/dist/query-presets/access.d.ts.map +1 -1
- package/dist/query-presets/access.js +2 -1
- package/dist/query-presets/access.js.map +1 -1
- package/dist/queues/config/types/index.d.ts +2 -1
- package/dist/queues/config/types/index.d.ts.map +1 -1
- package/dist/queues/config/types/index.js.map +1 -1
- package/dist/uploads/assertClientUploadAccess.d.ts +7 -0
- package/dist/uploads/assertClientUploadAccess.d.ts.map +1 -0
- package/dist/uploads/assertClientUploadAccess.js +27 -0
- package/dist/uploads/assertClientUploadAccess.js.map +1 -0
- package/dist/uploads/assertClientUploadAllowed.d.ts +11 -0
- package/dist/uploads/assertClientUploadAllowed.d.ts.map +1 -0
- package/dist/uploads/assertClientUploadAllowed.js +46 -0
- package/dist/uploads/assertClientUploadAllowed.js.map +1 -0
- package/dist/uploads/assertClientUploadAllowed.spec.js +91 -0
- package/dist/uploads/assertClientUploadAllowed.spec.js.map +1 -0
- package/dist/uploads/checkFileRestrictions.d.ts +4 -1
- package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
- package/dist/uploads/checkFileRestrictions.js +66 -26
- package/dist/uploads/checkFileRestrictions.js.map +1 -1
- package/dist/uploads/clientUploadReceipt.d.ts +23 -0
- package/dist/uploads/clientUploadReceipt.d.ts.map +1 -0
- package/dist/uploads/clientUploadReceipt.js +55 -0
- package/dist/uploads/clientUploadReceipt.js.map +1 -0
- package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
- package/dist/uploads/deleteAssociatedFiles.js +33 -8
- package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
- package/dist/uploads/deleteAssociatedFiles.spec.js +124 -0
- package/dist/uploads/deleteAssociatedFiles.spec.js.map +1 -0
- package/dist/uploads/detectSvgFromXml.d.ts +1 -3
- package/dist/uploads/detectSvgFromXml.d.ts.map +1 -1
- package/dist/uploads/detectSvgFromXml.js +3 -40
- package/dist/uploads/detectSvgFromXml.js.map +1 -1
- package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
- package/dist/uploads/endpoints/getFile.js +5 -3
- package/dist/uploads/endpoints/getFile.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/handlers.d.ts +2 -2
- package/dist/uploads/fetchAPI-multipart/handlers.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/handlers.js +18 -5
- package/dist/uploads/fetchAPI-multipart/handlers.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/index.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/index.js +24 -2
- package/dist/uploads/fetchAPI-multipart/index.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts +0 -6
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.js +146 -126
- package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.spec.js +663 -0
- package/dist/uploads/fetchAPI-multipart/processMultipart.spec.js.map +1 -0
- package/dist/uploads/generateFileData.d.ts +3 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +29 -16
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getBaseFields.d.ts.map +1 -1
- package/dist/uploads/getBaseFields.js +3 -1
- package/dist/uploads/getBaseFields.js.map +1 -1
- package/dist/uploads/getExternalFile.d.ts +1 -1
- package/dist/uploads/getExternalFile.d.ts.map +1 -1
- package/dist/uploads/getExternalFile.js +60 -15
- package/dist/uploads/getExternalFile.js.map +1 -1
- package/dist/uploads/getFileTypeFallback.d.ts.map +1 -1
- package/dist/uploads/getFileTypeFallback.js +3 -1
- package/dist/uploads/getFileTypeFallback.js.map +1 -1
- package/dist/uploads/getFileTypeIdentity.d.ts +19 -0
- package/dist/uploads/getFileTypeIdentity.d.ts.map +1 -0
- package/dist/uploads/getFileTypeIdentity.js +34 -0
- package/dist/uploads/getFileTypeIdentity.js.map +1 -0
- package/dist/uploads/getFileTypeIdentity.spec.js +43 -0
- package/dist/uploads/getFileTypeIdentity.spec.js.map +1 -0
- package/dist/uploads/isProcessableImage.d.ts +2 -0
- package/dist/uploads/isProcessableImage.d.ts.map +1 -0
- package/dist/uploads/isProcessableImage.js +7 -0
- package/dist/uploads/isProcessableImage.js.map +1 -0
- package/dist/uploads/safeFetch.d.ts.map +1 -1
- package/dist/uploads/safeFetch.js +3 -2
- package/dist/uploads/safeFetch.js.map +1 -1
- package/dist/uploads/sanitizeUploadData.d.ts +26 -0
- package/dist/uploads/sanitizeUploadData.d.ts.map +1 -0
- package/dist/uploads/sanitizeUploadData.js +159 -0
- package/dist/uploads/sanitizeUploadData.js.map +1 -0
- package/dist/uploads/sanitizeUploadData.spec.js +255 -0
- package/dist/uploads/sanitizeUploadData.spec.js.map +1 -0
- package/dist/uploads/types.d.ts +11 -3
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/uploads/uploadContentSecurityPolicy.d.ts +2 -0
- package/dist/uploads/uploadContentSecurityPolicy.d.ts.map +1 -0
- package/dist/uploads/uploadContentSecurityPolicy.js +3 -0
- package/dist/uploads/uploadContentSecurityPolicy.js.map +1 -0
- package/dist/uploads/validateISOBaseMediaFile.d.ts +4 -0
- package/dist/uploads/validateISOBaseMediaFile.d.ts.map +1 -0
- package/dist/uploads/validateISOBaseMediaFile.js +91 -0
- package/dist/uploads/validateISOBaseMediaFile.js.map +1 -0
- package/dist/uploads/validateISOBaseMediaFile.spec.js +130 -0
- package/dist/uploads/validateISOBaseMediaFile.spec.js.map +1 -0
- package/dist/uploads/validateSvg.d.ts +10 -4
- package/dist/uploads/validateSvg.d.ts.map +1 -1
- package/dist/uploads/validateSvg.js +280 -40
- package/dist/uploads/validateSvg.js.map +1 -1
- package/dist/uploads/validateSvg.spec.js +123 -0
- package/dist/uploads/validateSvg.spec.js.map +1 -0
- package/dist/uploads/validateUploadFilename.d.ts +3 -0
- package/dist/uploads/validateUploadFilename.d.ts.map +1 -0
- package/dist/uploads/validateUploadFilename.js +13 -0
- package/dist/uploads/validateUploadFilename.js.map +1 -0
- package/dist/uploads/validateUploadFilename.spec.js +24 -0
- package/dist/uploads/validateUploadFilename.spec.js.map +1 -0
- package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.js +28 -1
- package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.spec.js +158 -0
- package/dist/utilities/addDataAndFileToRequest.spec.js.map +1 -1
- package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
- package/dist/utilities/createPayloadRequest.js +2 -1
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/deepCopyObject.d.ts.map +1 -1
- package/dist/utilities/deepCopyObject.js +110 -19
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/deepCopyObject.spec.js +216 -0
- package/dist/utilities/deepCopyObject.spec.js.map +1 -0
- package/dist/utilities/fieldPath.d.ts +13 -0
- package/dist/utilities/fieldPath.d.ts.map +1 -0
- package/dist/utilities/fieldPath.js +51 -0
- package/dist/utilities/fieldPath.js.map +1 -0
- package/dist/utilities/fieldPath.spec.js +155 -0
- package/dist/utilities/fieldPath.spec.js.map +1 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
- package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
- package/dist/utilities/getObjectDotNotation.js +7 -1
- package/dist/utilities/getObjectDotNotation.js.map +1 -1
- package/dist/utilities/getObjectDotNotation.spec.js +33 -0
- package/dist/utilities/getObjectDotNotation.spec.js.map +1 -0
- package/dist/utilities/getSafeRedirect.spec.js +14 -0
- package/dist/utilities/getSafeRedirect.spec.js.map +1 -1
- package/dist/utilities/getTopLevelFieldNames.d.ts +2 -0
- package/dist/utilities/getTopLevelFieldNames.d.ts.map +1 -0
- package/dist/utilities/getTopLevelFieldNames.js +3 -0
- package/dist/utilities/getTopLevelFieldNames.js.map +1 -0
- package/dist/utilities/getTopLevelFieldNames.spec.js +18 -0
- package/dist/utilities/getTopLevelFieldNames.spec.js.map +1 -0
- package/dist/utilities/handleEndpoints.js +1 -1
- package/dist/utilities/handleEndpoints.js.map +1 -1
- package/dist/utilities/parseParams/index.d.ts.map +1 -1
- package/dist/utilities/parseParams/index.js +3 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseParams/index.spec.js +8 -0
- package/dist/utilities/parseParams/index.spec.js.map +1 -1
- package/dist/utilities/traverseFields.d.ts.map +1 -1
- package/dist/utilities/traverseFields.js +5 -14
- package/dist/utilities/traverseFields.js.map +1 -1
- package/dist/utilities/unflatten.d.ts.map +1 -1
- package/dist/utilities/unflatten.js +21 -9
- package/dist/utilities/unflatten.js.map +1 -1
- package/dist/utilities/unflatten.spec.js +38 -0
- package/dist/utilities/unflatten.spec.js.map +1 -0
- package/dist/versions/allLocalesPublicationStatus.d.ts +38 -0
- package/dist/versions/allLocalesPublicationStatus.d.ts.map +1 -0
- package/dist/versions/allLocalesPublicationStatus.js +57 -0
- package/dist/versions/allLocalesPublicationStatus.js.map +1 -0
- package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
- package/dist/versions/getLatestGlobalVersion.js +10 -2
- package/dist/versions/getLatestGlobalVersion.js.map +1 -1
- package/dist/versions/getRestoredStatusesToAuthorize.d.ts +9 -0
- package/dist/versions/getRestoredStatusesToAuthorize.d.ts.map +1 -0
- package/dist/versions/getRestoredStatusesToAuthorize.js +22 -0
- package/dist/versions/getRestoredStatusesToAuthorize.js.map +1 -0
- package/dist/versions/getRestoredStatusesToAuthorize.spec.js +50 -0
- package/dist/versions/getRestoredStatusesToAuthorize.spec.js.map +1 -0
- package/dist/versions/schedule/job.d.ts +2 -2
- package/dist/versions/schedule/job.d.ts.map +1 -1
- package/dist/versions/schedule/job.js +11 -7
- package/dist/versions/schedule/job.js.map +1 -1
- package/dist/versions/schedule/types.d.ts +5 -1
- package/dist/versions/schedule/types.d.ts.map +1 -1
- package/dist/versions/schedule/types.js.map +1 -1
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/deleteByID.ts"],"sourcesContent":["import type { CollectionSlug, FindOptions } from '../../index.js'\nimport type {\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type { Collection, DataFromCollectionSlug } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { deleteUserPreferences } from '../../preferences/deleteUserPreferences.js'\nimport { deleteAssociatedFiles } from '../../uploads/deleteAssociatedFiles.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { checkDocumentLockStatus } from '../../utilities/checkDocumentLockStatus.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { hasScheduledPublishEnabled } from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { deleteCollectionVersions } from '../../versions/deleteCollectionVersions.js'\nimport { deleteScheduledPublishJobs } from '../../versions/deleteScheduledPublishJobs.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type Arguments<TSlug extends CollectionSlug, TSelect extends SelectType> = {\n collection: Collection\n depth?: number\n disableTransaction?: boolean\n id: number | string\n overrideAccess?: boolean\n overrideLock?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<FindOptions<TSlug, TSelect>, 'select'>\n\nexport const deleteByIDOperation = async <TSlug extends CollectionSlug, TSelect extends SelectType>(\n incomingArgs: Arguments<TSlug, TSelect>,\n): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n let args = incomingArgs\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(args.req))\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'delete',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n id,\n collection: { config: collectionConfig },\n depth,\n overrideAccess,\n overrideLock,\n populate,\n req: {\n fallbackLocale,\n locale,\n payload: { config },\n payload,\n },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess({ id, req }, collectionConfig.access.delete)\n : true\n const hasWhereAccess = hasWhereAccessResult(accessResults)\n\n // /////////////////////////////////////\n // beforeDelete - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeDelete?.length) {\n for (const hook of collectionConfig.hooks.beforeDelete) {\n await hook({\n id,\n collection: collectionConfig,\n context: req.context,\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // Retrieve document\n // /////////////////////////////////////\n\n let where = combineQueries({ id: { equals: id } }, accessResults)\n\n // Exclude trashed documents when trash: false\n where = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where,\n })\n\n const docToDelete = await req.payload.db.findOne({\n collection: collectionConfig.slug,\n locale: req.locale!,\n req,\n where,\n })\n\n if (!docToDelete && !hasWhereAccess) {\n throw new NotFound(req.t)\n }\n if (!docToDelete && hasWhereAccess) {\n throw new Forbidden(req.t)\n }\n\n // /////////////////////////////////////\n // Handle potentially locked documents\n // /////////////////////////////////////\n\n await checkDocumentLockStatus({\n id,\n collectionSlug: collectionConfig.slug,\n lockErrorMessage: `Document with ID ${id} is currently locked and cannot be deleted.`,\n overrideLock,\n req,\n })\n\n await deleteAssociatedFiles({\n collectionConfig,\n config,\n doc: docToDelete!,\n overrideDelete: true,\n req,\n })\n\n // /////////////////////////////////////\n // Delete versions\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n await deleteCollectionVersions({\n id,\n slug: collectionConfig.slug,\n payload,\n req,\n })\n }\n\n // /////////////////////////////////////\n // Delete scheduled posts\n // /////////////////////////////////////\n if (hasScheduledPublishEnabled(collectionConfig)) {\n await deleteScheduledPublishJobs({\n id,\n slug: collectionConfig.slug,\n payload,\n req,\n })\n }\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n forceSelect: collectionConfig.forceSelect,\n select: incomingSelect,\n })\n\n // /////////////////////////////////////\n // Delete document\n // /////////////////////////////////////\n\n let result: DataFromCollectionSlug<TSlug> = await req.payload.db.deleteOne({\n collection: collectionConfig.slug,\n req,\n select,\n where: { id: { equals: id } },\n })\n\n // /////////////////////////////////////\n // Add collection property for auth collections\n // /////////////////////////////////////\n\n if (collectionConfig.auth) {\n result = { ...result, collection: collectionConfig.slug }\n }\n\n // /////////////////////////////////////\n // Delete Preferences\n // /////////////////////////////////////\n\n await deleteUserPreferences({\n collectionConfig,\n ids: [id],\n payload,\n req,\n })\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: depth!,\n doc: result,\n draft: undefined!,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterDelete - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterDelete?.length) {\n for (const hook of collectionConfig.hooks.afterDelete) {\n result =\n (await hook({\n id,\n collection: collectionConfig,\n context: req.context,\n doc: result,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'deleteByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // 8. Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result as TransformCollectionWithSelect<TSlug, TSelect>\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["executeAccess","hasWhereAccessResult","combineQueries","Forbidden","NotFound","afterRead","deleteUserPreferences","deleteAssociatedFiles","appendNonTrashedFilter","checkDocumentLockStatus","commitTransaction","hasScheduledPublishEnabled","initTransaction","killTransaction","sanitizeSelect","deleteCollectionVersions","deleteScheduledPublishJobs","buildAfterOperation","buildBeforeOperation","deleteByIDOperation","incomingArgs","args","shouldCommit","disableTransaction","req","collection","config","operation","overrideAccess","id","collectionConfig","depth","overrideLock","populate","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","trash","accessResults","access","delete","hasWhereAccess","hooks","beforeDelete","length","hook","context","where","equals","enableTrash","docToDelete","db","findOne","slug","t","collectionSlug","lockErrorMessage","doc","overrideDelete","versions","fields","flattenedFields","forceSelect","result","deleteOne","auth","ids","draft","undefined","global","afterDelete","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/deleteByID.ts"],"sourcesContent":["import type { CollectionSlug, FindOptions } from '../../index.js'\nimport type {\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type { Collection, DataFromCollectionSlug } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { deleteUserPreferences } from '../../preferences/deleteUserPreferences.js'\nimport { deleteAssociatedFiles } from '../../uploads/deleteAssociatedFiles.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { checkDocumentLockStatus } from '../../utilities/checkDocumentLockStatus.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { hasScheduledPublishEnabled } from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { deleteCollectionVersions } from '../../versions/deleteCollectionVersions.js'\nimport { deleteScheduledPublishJobs } from '../../versions/deleteScheduledPublishJobs.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type Arguments<TSlug extends CollectionSlug, TSelect extends SelectType> = {\n collection: Collection\n depth?: number\n disableTransaction?: boolean\n id: number | string\n overrideAccess?: boolean\n overrideLock?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<FindOptions<TSlug, TSelect>, 'select'>\n\nexport const deleteByIDOperation = async <TSlug extends CollectionSlug, TSelect extends SelectType>(\n incomingArgs: Arguments<TSlug, TSelect>,\n): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n let args = incomingArgs\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(args.req))\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'delete',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n id,\n collection: { config: collectionConfig },\n depth,\n overrideAccess,\n overrideLock,\n populate,\n req: {\n fallbackLocale,\n locale,\n payload: { config },\n payload,\n },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess({ id, req }, collectionConfig.access.delete)\n : true\n const hasWhereAccess = hasWhereAccessResult(accessResults)\n\n // /////////////////////////////////////\n // Retrieve document\n // /////////////////////////////////////\n\n let where = combineQueries({ id: { equals: id } }, accessResults)\n\n // Exclude trashed documents when trash: false\n where = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where,\n })\n\n const docToDelete = await req.payload.db.findOne({\n collection: collectionConfig.slug,\n locale: req.locale!,\n req,\n where,\n })\n\n if (!docToDelete && !hasWhereAccess) {\n throw new NotFound(req.t)\n }\n if (!docToDelete && hasWhereAccess) {\n throw new Forbidden(req.t)\n }\n\n // /////////////////////////////////////\n // beforeDelete - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeDelete?.length) {\n for (const hook of collectionConfig.hooks.beforeDelete) {\n await hook({\n id,\n collection: collectionConfig,\n context: req.context,\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // Handle potentially locked documents\n // /////////////////////////////////////\n\n await checkDocumentLockStatus({\n id,\n collectionSlug: collectionConfig.slug,\n lockErrorMessage: `Document with ID ${id} is currently locked and cannot be deleted.`,\n overrideLock,\n req,\n })\n\n await deleteAssociatedFiles({\n collectionConfig,\n config,\n doc: docToDelete!,\n overrideDelete: true,\n req,\n })\n\n // /////////////////////////////////////\n // Delete versions\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n await deleteCollectionVersions({\n id,\n slug: collectionConfig.slug,\n payload,\n req,\n })\n }\n\n // /////////////////////////////////////\n // Delete scheduled posts\n // /////////////////////////////////////\n if (hasScheduledPublishEnabled(collectionConfig)) {\n await deleteScheduledPublishJobs({\n id,\n slug: collectionConfig.slug,\n payload,\n req,\n })\n }\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n forceSelect: collectionConfig.forceSelect,\n select: incomingSelect,\n })\n\n // /////////////////////////////////////\n // Delete document\n // /////////////////////////////////////\n\n let result: DataFromCollectionSlug<TSlug> = await req.payload.db.deleteOne({\n collection: collectionConfig.slug,\n req,\n select,\n where: { id: { equals: id } },\n })\n\n // /////////////////////////////////////\n // Add collection property for auth collections\n // /////////////////////////////////////\n\n if (collectionConfig.auth) {\n result = { ...result, collection: collectionConfig.slug }\n }\n\n // /////////////////////////////////////\n // Delete Preferences\n // /////////////////////////////////////\n\n await deleteUserPreferences({\n collectionConfig,\n ids: [id],\n payload,\n req,\n })\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: depth!,\n doc: result,\n draft: undefined!,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterDelete - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterDelete?.length) {\n for (const hook of collectionConfig.hooks.afterDelete) {\n result =\n (await hook({\n id,\n collection: collectionConfig,\n context: req.context,\n doc: result,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'deleteByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // 8. Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result as TransformCollectionWithSelect<TSlug, TSelect>\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["executeAccess","hasWhereAccessResult","combineQueries","Forbidden","NotFound","afterRead","deleteUserPreferences","deleteAssociatedFiles","appendNonTrashedFilter","checkDocumentLockStatus","commitTransaction","hasScheduledPublishEnabled","initTransaction","killTransaction","sanitizeSelect","deleteCollectionVersions","deleteScheduledPublishJobs","buildAfterOperation","buildBeforeOperation","deleteByIDOperation","incomingArgs","args","shouldCommit","disableTransaction","req","collection","config","operation","overrideAccess","id","collectionConfig","depth","overrideLock","populate","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","trash","accessResults","access","delete","hasWhereAccess","where","equals","enableTrash","docToDelete","db","findOne","slug","t","hooks","beforeDelete","length","hook","context","collectionSlug","lockErrorMessage","doc","overrideDelete","versions","fields","flattenedFields","forceSelect","result","deleteOne","auth","ids","draft","undefined","global","afterDelete","error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findDistinct.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findDistinct.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"findDistinct.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findDistinct.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAmBpD,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAmBD,eAAO,MAAM,qBAAqB,iBAClB,SAAS,KACtB,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0SxD,CAAA"}
|
|
@@ -1,17 +1,32 @@
|
|
|
1
1
|
import httpStatus from 'http-status';
|
|
2
2
|
import { executeAccess } from '../../auth/executeAccess.js';
|
|
3
3
|
import { combineQueries } from '../../database/combineQueries.js';
|
|
4
|
+
import { getLocalizedPaths } from '../../database/getLocalizedPaths.js';
|
|
5
|
+
import { prefixWherePaths } from '../../database/prefixWherePaths.js';
|
|
4
6
|
import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js';
|
|
5
7
|
import { validateSortQuery } from '../../database/queryValidation/validateSortQuery.js';
|
|
6
8
|
import { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js';
|
|
7
9
|
import { APIError } from '../../errors/APIError.js';
|
|
8
10
|
import { Forbidden } from '../../errors/Forbidden.js';
|
|
11
|
+
import { QueryError } from '../../errors/QueryError.js';
|
|
9
12
|
import { relationshipPopulationPromise } from '../../fields/hooks/afterRead/relationshipPopulationPromise.js';
|
|
10
13
|
import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js';
|
|
11
14
|
import { getFieldByPath } from '../../utilities/getFieldByPath.js';
|
|
12
15
|
import { killTransaction } from '../../utilities/killTransaction.js';
|
|
13
16
|
import { buildAfterOperation } from './utilities/buildAfterOperation.js';
|
|
14
17
|
import { buildBeforeOperation } from './utilities/buildBeforeOperation.js';
|
|
18
|
+
const getEmptyResult = ({ limit })=>({
|
|
19
|
+
hasNextPage: false,
|
|
20
|
+
hasPrevPage: false,
|
|
21
|
+
limit: limit || 0,
|
|
22
|
+
nextPage: null,
|
|
23
|
+
page: 1,
|
|
24
|
+
pagingCounter: 1,
|
|
25
|
+
prevPage: null,
|
|
26
|
+
totalDocs: 0,
|
|
27
|
+
totalPages: 0,
|
|
28
|
+
values: []
|
|
29
|
+
});
|
|
15
30
|
export const findDistinctOperation = async (incomingArgs)=>{
|
|
16
31
|
let args = incomingArgs;
|
|
17
32
|
try {
|
|
@@ -38,18 +53,9 @@ export const findDistinctOperation = async (incomingArgs)=>{
|
|
|
38
53
|
}, collectionConfig.access.read);
|
|
39
54
|
// If errors are disabled, and access returns false, return empty results
|
|
40
55
|
if (accessResult === false) {
|
|
41
|
-
return {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
limit: args.limit || 0,
|
|
45
|
-
nextPage: null,
|
|
46
|
-
page: 1,
|
|
47
|
-
pagingCounter: 1,
|
|
48
|
-
prevPage: null,
|
|
49
|
-
totalDocs: 0,
|
|
50
|
-
totalPages: 0,
|
|
51
|
-
values: []
|
|
52
|
-
};
|
|
56
|
+
return getEmptyResult({
|
|
57
|
+
limit: args.limit
|
|
58
|
+
});
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
61
|
// /////////////////////////////////////
|
|
@@ -67,6 +73,7 @@ export const findDistinctOperation = async (incomingArgs)=>{
|
|
|
67
73
|
trash,
|
|
68
74
|
where: fullWhere
|
|
69
75
|
});
|
|
76
|
+
const relatedAccessByPath = {};
|
|
70
77
|
await validateQueryPaths({
|
|
71
78
|
collectionConfig,
|
|
72
79
|
overrideAccess: overrideAccess,
|
|
@@ -93,12 +100,82 @@ export const findDistinctOperation = async (incomingArgs)=>{
|
|
|
93
100
|
throw new Forbidden(req.t);
|
|
94
101
|
}
|
|
95
102
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
103
|
+
if (!overrideAccess) {
|
|
104
|
+
const paths = getLocalizedPaths({
|
|
105
|
+
collectionSlug: collectionConfig.slug,
|
|
106
|
+
fields: collectionConfig.flattenedFields,
|
|
107
|
+
incomingPath: args.field,
|
|
108
|
+
locale: req.locale,
|
|
109
|
+
overrideAccess: true,
|
|
110
|
+
payload
|
|
111
|
+
});
|
|
112
|
+
if (paths.at(-1)?.path === 'id') {
|
|
113
|
+
const previousField = paths.at(-2)?.field;
|
|
114
|
+
if (previousField && (previousField.type === 'relationship' || previousField.type === 'upload') && typeof previousField.relationTo === 'string') {
|
|
115
|
+
paths.pop();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const relatedAccessByCollection = new Map();
|
|
119
|
+
for(let pathIndex = 1; pathIndex < paths.length; pathIndex++){
|
|
120
|
+
const collectionSlug = paths[pathIndex]?.collectionSlug;
|
|
121
|
+
if (!collectionSlug) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (!relatedAccessByCollection.has(collectionSlug)) {
|
|
125
|
+
const relatedCollectionConfig = payload.collections[collectionSlug].config;
|
|
126
|
+
const relatedAccess = await executeAccess({
|
|
127
|
+
disableErrors: true,
|
|
128
|
+
req
|
|
129
|
+
}, relatedCollectionConfig.access.read);
|
|
130
|
+
if (typeof relatedAccess === 'object') {
|
|
131
|
+
sanitizeWhereQuery({
|
|
132
|
+
fields: relatedCollectionConfig.flattenedFields,
|
|
133
|
+
payload,
|
|
134
|
+
where: relatedAccess
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
relatedAccessByCollection.set(collectionSlug, relatedAccess);
|
|
138
|
+
}
|
|
139
|
+
const relatedAccess = relatedAccessByCollection.get(collectionSlug);
|
|
140
|
+
if (relatedAccess === false) {
|
|
141
|
+
if (disableErrors) {
|
|
142
|
+
return getEmptyResult({
|
|
143
|
+
limit: args.limit
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
throw new QueryError([
|
|
147
|
+
{
|
|
148
|
+
path: args.field
|
|
149
|
+
}
|
|
150
|
+
]);
|
|
151
|
+
}
|
|
152
|
+
if (typeof relatedAccess === 'object') {
|
|
153
|
+
const relationshipPath = paths.slice(0, pathIndex).map(({ path })=>path).join('.');
|
|
154
|
+
relatedAccessByPath[relationshipPath] = relatedAccess;
|
|
155
|
+
fullWhere = combineQueries(fullWhere, prefixWherePaths({
|
|
156
|
+
prefix: relationshipPath,
|
|
157
|
+
where: relatedAccess
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
await validateQueryPaths({
|
|
162
|
+
collectionConfig,
|
|
163
|
+
overrideAccess: false,
|
|
164
|
+
req,
|
|
165
|
+
showHiddenFields,
|
|
166
|
+
where: {
|
|
167
|
+
[args.field]: {
|
|
168
|
+
exists: true
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
await validateSortQuery({
|
|
173
|
+
collectionConfig,
|
|
174
|
+
overrideAccess: false,
|
|
175
|
+
req,
|
|
176
|
+
sort: args.sort
|
|
177
|
+
});
|
|
178
|
+
}
|
|
102
179
|
if ('virtual' in fieldResult.field && fieldResult.field.virtual) {
|
|
103
180
|
if (typeof fieldResult.field.virtual !== 'string') {
|
|
104
181
|
throw new APIError(`Cannot findDistinct by a virtual field that isn't linked to a relationship field.`);
|
|
@@ -146,6 +223,7 @@ export const findDistinctOperation = async (incomingArgs)=>{
|
|
|
146
223
|
limit: args.limit,
|
|
147
224
|
locale: locale,
|
|
148
225
|
page: args.page,
|
|
226
|
+
relatedAccess: relatedAccessByPath,
|
|
149
227
|
req,
|
|
150
228
|
sort: args.sort,
|
|
151
229
|
where: fullWhere
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/findDistinct.ts"],"sourcesContent":["import httpStatus from 'http-status'\n\nimport type { AccessResult } from '../../config/types.js'\nimport type { PaginatedDistinctDocs } from '../../database/types.js'\nimport type { FlattenedField } from '../../fields/config/types.js'\nimport type { PayloadRequest, PopulateType, Sort, Where } from '../../types/index.js'\nimport type { Collection } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js'\nimport { validateSortQuery } from '../../database/queryValidation/validateSortQuery.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { APIError } from '../../errors/APIError.js'\nimport { Forbidden } from '../../errors/Forbidden.js'\nimport { relationshipPopulationPromise } from '../../fields/hooks/afterRead/relationshipPopulationPromise.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { getFieldByPath } from '../../utilities/getFieldByPath.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type Arguments = {\n collection: Collection\n depth?: number\n disableErrors?: boolean\n field: string\n limit?: number\n locale?: string\n overrideAccess?: boolean\n page?: number\n populate?: PopulateType\n req?: PayloadRequest\n showHiddenFields?: boolean\n sort?: Sort\n trash?: boolean\n where?: Where\n}\nexport const findDistinctOperation = async (\n incomingArgs: Arguments,\n): Promise<PaginatedDistinctDocs<Record<string, unknown>>> => {\n let args = incomingArgs\n\n try {\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'readDistinct',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n collection: { config: collectionConfig },\n disableErrors,\n overrideAccess,\n populate,\n showHiddenFields = false,\n trash = false,\n where,\n } = args\n\n const req = args.req!\n const { locale, payload } = req\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n let accessResult: AccessResult\n\n if (!overrideAccess) {\n accessResult = await executeAccess({ disableErrors, req }, collectionConfig.access.read)\n\n // If errors are disabled, and access returns false, return empty results\n if (accessResult === false) {\n return {\n hasNextPage: false,\n hasPrevPage: false,\n limit: args.limit || 0,\n nextPage: null,\n page: 1,\n pagingCounter: 1,\n prevPage: null,\n totalDocs: 0,\n totalPages: 0,\n values: [],\n }\n }\n }\n\n // /////////////////////////////////////\n // Find Distinct\n // /////////////////////////////////////\n\n let fullWhere = combineQueries(where!, accessResult!)\n sanitizeWhereQuery({ fields: collectionConfig.flattenedFields, payload, where: fullWhere })\n\n // Exclude trashed documents when trash: false\n fullWhere = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess: overrideAccess!,\n req,\n where: where ?? {},\n })\n\n const fieldResult = getFieldByPath({\n config: payload.config,\n fields: collectionConfig.flattenedFields,\n includeRelationships: true,\n path: args.field,\n })\n\n if (!fieldResult) {\n throw new APIError(\n `Field ${args.field} was not found in the collection ${collectionConfig.slug}`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n if (fieldResult.field.hidden && !showHiddenFields) {\n throw new Forbidden(req.t)\n }\n\n if (fieldResult.field.access?.read) {\n const hasAccess = await fieldResult.field.access.read({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n await validateSortQuery({\n collectionConfig,\n overrideAccess: overrideAccess!,\n req,\n sort: args.sort,\n })\n\n if ('virtual' in fieldResult.field && fieldResult.field.virtual) {\n if (typeof fieldResult.field.virtual !== 'string') {\n throw new APIError(\n `Cannot findDistinct by a virtual field that isn't linked to a relationship field.`,\n )\n }\n\n let relationPath: string = ''\n let currentFields: FlattenedField[] = collectionConfig.flattenedFields\n const fieldPathSegments = fieldResult.field.virtual.split('.')\n for (const segment of fieldResult.field.virtual.split('.')) {\n relationPath = `${relationPath}${segment}`\n fieldPathSegments.shift()\n const field = currentFields.find((e) => e.name === segment)!\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n typeof field.relationTo === 'string'\n ) {\n break\n }\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n }\n }\n\n const path = `${relationPath}.${fieldPathSegments.join('.')}`\n\n const result = await payload.findDistinct({\n collection: collectionConfig.slug,\n depth: args.depth,\n disableErrors,\n field: path,\n limit: args.limit,\n locale,\n overrideAccess,\n page: args.page,\n populate,\n req,\n showHiddenFields,\n sort: args.sort,\n trash,\n where,\n })\n\n for (const val of result.values) {\n val[args.field] = val[path]\n delete val[path]\n }\n\n return result\n }\n\n let result = await payload.db.findDistinct({\n collection: collectionConfig.slug,\n field: args.field,\n limit: args.limit,\n locale: locale!,\n page: args.page,\n req,\n sort: args.sort,\n where: fullWhere,\n })\n\n if (\n (fieldResult.field.type === 'relationship' || fieldResult.field.type === 'upload') &&\n args.depth\n ) {\n const populationPromises: Promise<void>[] = []\n const sanitizedField = { ...fieldResult.field }\n if (fieldResult.field.hasMany) {\n sanitizedField.hasMany = false\n }\n for (const doc of result.values) {\n populationPromises.push(\n relationshipPopulationPromise({\n currentDepth: 0,\n depth: args.depth,\n draft: false,\n fallbackLocale: req.fallbackLocale || null,\n field: sanitizedField,\n locale: req.locale || null,\n overrideAccess: args.overrideAccess ?? true,\n parentIsLocalized: false,\n populate,\n req,\n showHiddenFields: false,\n siblingDoc: doc,\n }),\n )\n }\n await Promise.all(populationPromises)\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findDistinct',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req!)\n throw error\n }\n}\n"],"names":["httpStatus","executeAccess","combineQueries","validateQueryPaths","validateSortQuery","sanitizeWhereQuery","APIError","Forbidden","relationshipPopulationPromise","appendNonTrashedFilter","getFieldByPath","killTransaction","buildAfterOperation","buildBeforeOperation","findDistinctOperation","incomingArgs","args","collection","config","operation","overrideAccess","collectionConfig","disableErrors","populate","showHiddenFields","trash","where","req","locale","payload","accessResult","access","read","hasNextPage","hasPrevPage","limit","nextPage","page","pagingCounter","prevPage","totalDocs","totalPages","values","fullWhere","fields","flattenedFields","enableTrash","fieldResult","includeRelationships","path","field","slug","BAD_REQUEST","hidden","t","hasAccess","sort","virtual","relationPath","currentFields","fieldPathSegments","split","segment","shift","find","e","name","type","relationTo","join","result","findDistinct","depth","val","db","populationPromises","sanitizedField","hasMany","doc","push","currentDepth","draft","fallbackLocale","parentIsLocalized","siblingDoc","Promise","all","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/findDistinct.ts"],"sourcesContent":["import httpStatus from 'http-status'\n\nimport type { AccessResult } from '../../config/types.js'\nimport type { PaginatedDistinctDocs } from '../../database/types.js'\nimport type { FlattenedField } from '../../fields/config/types.js'\nimport type { PayloadRequest, PopulateType, Sort, Where } from '../../types/index.js'\nimport type { Collection } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { getLocalizedPaths } from '../../database/getLocalizedPaths.js'\nimport { prefixWherePaths } from '../../database/prefixWherePaths.js'\nimport { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js'\nimport { validateSortQuery } from '../../database/queryValidation/validateSortQuery.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { APIError } from '../../errors/APIError.js'\nimport { Forbidden } from '../../errors/Forbidden.js'\nimport { QueryError } from '../../errors/QueryError.js'\nimport { relationshipPopulationPromise } from '../../fields/hooks/afterRead/relationshipPopulationPromise.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { getFieldByPath } from '../../utilities/getFieldByPath.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type Arguments = {\n collection: Collection\n depth?: number\n disableErrors?: boolean\n field: string\n limit?: number\n locale?: string\n overrideAccess?: boolean\n page?: number\n populate?: PopulateType\n req?: PayloadRequest\n showHiddenFields?: boolean\n sort?: Sort\n trash?: boolean\n where?: Where\n}\n\nconst getEmptyResult = ({\n limit,\n}: {\n limit?: number\n}): PaginatedDistinctDocs<Record<string, unknown>> => ({\n hasNextPage: false,\n hasPrevPage: false,\n limit: limit || 0,\n nextPage: null,\n page: 1,\n pagingCounter: 1,\n prevPage: null,\n totalDocs: 0,\n totalPages: 0,\n values: [],\n})\n\nexport const findDistinctOperation = async (\n incomingArgs: Arguments,\n): Promise<PaginatedDistinctDocs<Record<string, unknown>>> => {\n let args = incomingArgs\n\n try {\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'readDistinct',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n collection: { config: collectionConfig },\n disableErrors,\n overrideAccess,\n populate,\n showHiddenFields = false,\n trash = false,\n where,\n } = args\n\n const req = args.req!\n const { locale, payload } = req\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n let accessResult: AccessResult\n\n if (!overrideAccess) {\n accessResult = await executeAccess({ disableErrors, req }, collectionConfig.access.read)\n\n // If errors are disabled, and access returns false, return empty results\n if (accessResult === false) {\n return getEmptyResult({ limit: args.limit })\n }\n }\n\n // /////////////////////////////////////\n // Find Distinct\n // /////////////////////////////////////\n\n let fullWhere = combineQueries(where!, accessResult!)\n sanitizeWhereQuery({ fields: collectionConfig.flattenedFields, payload, where: fullWhere })\n\n // Exclude trashed documents when trash: false\n fullWhere = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n const relatedAccessByPath: Record<string, Where> = {}\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess: overrideAccess!,\n req,\n where: where ?? {},\n })\n\n const fieldResult = getFieldByPath({\n config: payload.config,\n fields: collectionConfig.flattenedFields,\n includeRelationships: true,\n path: args.field,\n })\n\n if (!fieldResult) {\n throw new APIError(\n `Field ${args.field} was not found in the collection ${collectionConfig.slug}`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n if (fieldResult.field.hidden && !showHiddenFields) {\n throw new Forbidden(req.t)\n }\n\n if (fieldResult.field.access?.read) {\n const hasAccess = await fieldResult.field.access.read({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n if (!overrideAccess) {\n const paths = getLocalizedPaths({\n collectionSlug: collectionConfig.slug,\n fields: collectionConfig.flattenedFields,\n incomingPath: args.field,\n locale: req.locale!,\n overrideAccess: true,\n payload,\n })\n\n if (paths.at(-1)?.path === 'id') {\n const previousField = paths.at(-2)?.field\n if (\n previousField &&\n (previousField.type === 'relationship' || previousField.type === 'upload') &&\n typeof previousField.relationTo === 'string'\n ) {\n paths.pop()\n }\n }\n\n const relatedAccessByCollection = new Map<string, AccessResult>()\n\n for (let pathIndex = 1; pathIndex < paths.length; pathIndex++) {\n const collectionSlug = paths[pathIndex]?.collectionSlug\n\n if (!collectionSlug) {\n continue\n }\n\n if (!relatedAccessByCollection.has(collectionSlug)) {\n const relatedCollectionConfig = payload.collections[collectionSlug]!.config\n const relatedAccess = await executeAccess(\n { disableErrors: true, req },\n relatedCollectionConfig.access.read,\n )\n\n if (typeof relatedAccess === 'object') {\n sanitizeWhereQuery({\n fields: relatedCollectionConfig.flattenedFields,\n payload,\n where: relatedAccess,\n })\n }\n\n relatedAccessByCollection.set(collectionSlug, relatedAccess)\n }\n\n const relatedAccess = relatedAccessByCollection.get(collectionSlug)!\n\n if (relatedAccess === false) {\n if (disableErrors) {\n return getEmptyResult({ limit: args.limit })\n }\n\n throw new QueryError([{ path: args.field }])\n }\n\n if (typeof relatedAccess === 'object') {\n const relationshipPath = paths\n .slice(0, pathIndex)\n .map(({ path }) => path)\n .join('.')\n\n relatedAccessByPath[relationshipPath] = relatedAccess\n fullWhere = combineQueries(\n fullWhere,\n prefixWherePaths({ prefix: relationshipPath, where: relatedAccess }),\n )\n }\n }\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess: false,\n req,\n showHiddenFields,\n where: {\n [args.field]: {\n exists: true,\n },\n },\n })\n\n await validateSortQuery({\n collectionConfig,\n overrideAccess: false,\n req,\n sort: args.sort,\n })\n }\n\n if ('virtual' in fieldResult.field && fieldResult.field.virtual) {\n if (typeof fieldResult.field.virtual !== 'string') {\n throw new APIError(\n `Cannot findDistinct by a virtual field that isn't linked to a relationship field.`,\n )\n }\n\n let relationPath: string = ''\n let currentFields: FlattenedField[] = collectionConfig.flattenedFields\n const fieldPathSegments = fieldResult.field.virtual.split('.')\n for (const segment of fieldResult.field.virtual.split('.')) {\n relationPath = `${relationPath}${segment}`\n fieldPathSegments.shift()\n const field = currentFields.find((e) => e.name === segment)!\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n typeof field.relationTo === 'string'\n ) {\n break\n }\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n }\n }\n\n const path = `${relationPath}.${fieldPathSegments.join('.')}`\n\n const result = await payload.findDistinct({\n collection: collectionConfig.slug,\n depth: args.depth,\n disableErrors,\n field: path,\n limit: args.limit,\n locale,\n overrideAccess,\n page: args.page,\n populate,\n req,\n showHiddenFields,\n sort: args.sort,\n trash,\n where,\n })\n\n for (const val of result.values) {\n val[args.field] = val[path]\n delete val[path]\n }\n\n return result\n }\n\n let result = await payload.db.findDistinct({\n collection: collectionConfig.slug,\n field: args.field,\n limit: args.limit,\n locale: locale!,\n page: args.page,\n relatedAccess: relatedAccessByPath,\n req,\n sort: args.sort,\n where: fullWhere,\n })\n\n if (\n (fieldResult.field.type === 'relationship' || fieldResult.field.type === 'upload') &&\n args.depth\n ) {\n const populationPromises: Promise<void>[] = []\n const sanitizedField = { ...fieldResult.field }\n if (fieldResult.field.hasMany) {\n sanitizedField.hasMany = false\n }\n for (const doc of result.values) {\n populationPromises.push(\n relationshipPopulationPromise({\n currentDepth: 0,\n depth: args.depth,\n draft: false,\n fallbackLocale: req.fallbackLocale || null,\n field: sanitizedField,\n locale: req.locale || null,\n overrideAccess: args.overrideAccess ?? true,\n parentIsLocalized: false,\n populate,\n req,\n showHiddenFields: false,\n siblingDoc: doc,\n }),\n )\n }\n await Promise.all(populationPromises)\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findDistinct',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req!)\n throw error\n }\n}\n"],"names":["httpStatus","executeAccess","combineQueries","getLocalizedPaths","prefixWherePaths","validateQueryPaths","validateSortQuery","sanitizeWhereQuery","APIError","Forbidden","QueryError","relationshipPopulationPromise","appendNonTrashedFilter","getFieldByPath","killTransaction","buildAfterOperation","buildBeforeOperation","getEmptyResult","limit","hasNextPage","hasPrevPage","nextPage","page","pagingCounter","prevPage","totalDocs","totalPages","values","findDistinctOperation","incomingArgs","args","collection","config","operation","overrideAccess","collectionConfig","disableErrors","populate","showHiddenFields","trash","where","req","locale","payload","accessResult","access","read","fullWhere","fields","flattenedFields","enableTrash","relatedAccessByPath","fieldResult","includeRelationships","path","field","slug","BAD_REQUEST","hidden","t","hasAccess","paths","collectionSlug","incomingPath","at","previousField","type","relationTo","pop","relatedAccessByCollection","Map","pathIndex","length","has","relatedCollectionConfig","collections","relatedAccess","set","get","relationshipPath","slice","map","join","prefix","exists","sort","virtual","relationPath","currentFields","fieldPathSegments","split","segment","shift","find","e","name","result","findDistinct","depth","val","db","populationPromises","sanitizedField","hasMany","doc","push","currentDepth","draft","fallbackLocale","parentIsLocalized","siblingDoc","Promise","all","error"],"mappings":"AAAA,OAAOA,gBAAgB,cAAa;AAQpC,SAASC,aAAa,QAAQ,8BAA6B;AAC3D,SAASC,cAAc,QAAQ,mCAAkC;AACjE,SAASC,iBAAiB,QAAQ,sCAAqC;AACvE,SAASC,gBAAgB,QAAQ,qCAAoC;AACrE,SAASC,kBAAkB,QAAQ,uDAAsD;AACzF,SAASC,iBAAiB,QAAQ,sDAAqD;AACvF,SAASC,kBAAkB,QAAQ,uCAAsC;AACzE,SAASC,QAAQ,QAAQ,2BAA0B;AACnD,SAASC,SAAS,QAAQ,4BAA2B;AACrD,SAASC,UAAU,QAAQ,6BAA4B;AACvD,SAASC,6BAA6B,QAAQ,gEAA+D;AAC7G,SAASC,sBAAsB,QAAQ,4CAA2C;AAClF,SAASC,cAAc,QAAQ,oCAAmC;AAClE,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,mBAAmB,QAAQ,qCAAoC;AACxE,SAASC,oBAAoB,QAAQ,sCAAqC;AAmB1E,MAAMC,iBAAiB,CAAC,EACtBC,KAAK,EAGN,GAAsD,CAAA;QACrDC,aAAa;QACbC,aAAa;QACbF,OAAOA,SAAS;QAChBG,UAAU;QACVC,MAAM;QACNC,eAAe;QACfC,UAAU;QACVC,WAAW;QACXC,YAAY;QACZC,QAAQ,EAAE;IACZ,CAAA;AAEA,OAAO,MAAMC,wBAAwB,OACnCC;IAEA,IAAIC,OAAOD;IAEX,IAAI;QACF,wCAAwC;QACxC,+BAA+B;QAC/B,wCAAwC;QAExCC,OAAO,MAAMd,qBAAqB;YAChCc;YACAC,YAAYD,KAAKC,UAAU,CAACC,MAAM;YAClCC,WAAW;YACXC,gBAAgBJ,KAAKI,cAAc;QACrC;QAEA,MAAM,EACJH,YAAY,EAAEC,QAAQG,gBAAgB,EAAE,EACxCC,aAAa,EACbF,cAAc,EACdG,QAAQ,EACRC,mBAAmB,KAAK,EACxBC,QAAQ,KAAK,EACbC,KAAK,EACN,GAAGV;QAEJ,MAAMW,MAAMX,KAAKW,GAAG;QACpB,MAAM,EAAEC,MAAM,EAAEC,OAAO,EAAE,GAAGF;QAE5B,wCAAwC;QACxC,SAAS;QACT,wCAAwC;QAExC,IAAIG;QAEJ,IAAI,CAACV,gBAAgB;YACnBU,eAAe,MAAM3C,cAAc;gBAAEmC;gBAAeK;YAAI,GAAGN,iBAAiBU,MAAM,CAACC,IAAI;YAEvF,yEAAyE;YACzE,IAAIF,iBAAiB,OAAO;gBAC1B,OAAO3B,eAAe;oBAAEC,OAAOY,KAAKZ,KAAK;gBAAC;YAC5C;QACF;QAEA,wCAAwC;QACxC,gBAAgB;QAChB,wCAAwC;QAExC,IAAI6B,YAAY7C,eAAesC,OAAQI;QACvCrC,mBAAmB;YAAEyC,QAAQb,iBAAiBc,eAAe;YAAEN;YAASH,OAAOO;QAAU;QAEzF,8CAA8C;QAC9CA,YAAYnC,uBAAuB;YACjCsC,aAAaf,iBAAiBI,KAAK;YACnCA;YACAC,OAAOO;QACT;QAEA,MAAMI,sBAA6C,CAAC;QAEpD,MAAM9C,mBAAmB;YACvB8B;YACAD,gBAAgBA;YAChBO;YACAD,OAAOA,SAAS,CAAC;QACnB;QAEA,MAAMY,cAAcvC,eAAe;YACjCmB,QAAQW,QAAQX,MAAM;YACtBgB,QAAQb,iBAAiBc,eAAe;YACxCI,sBAAsB;YACtBC,MAAMxB,KAAKyB,KAAK;QAClB;QAEA,IAAI,CAACH,aAAa;YAChB,MAAM,IAAI5C,SACR,CAAC,MAAM,EAAEsB,KAAKyB,KAAK,CAAC,iCAAiC,EAAEpB,iBAAiBqB,IAAI,EAAE,EAC9ExD,WAAWyD,WAAW;QAE1B;QAEA,IAAIL,YAAYG,KAAK,CAACG,MAAM,IAAI,CAACpB,kBAAkB;YACjD,MAAM,IAAI7B,UAAUgC,IAAIkB,CAAC;QAC3B;QAEA,IAAIP,YAAYG,KAAK,CAACV,MAAM,EAAEC,MAAM;YAClC,MAAMc,YAAY,MAAMR,YAAYG,KAAK,CAACV,MAAM,CAACC,IAAI,CAAC;gBAAEL;YAAI;YAC5D,IAAI,CAACmB,WAAW;gBACd,MAAM,IAAInD,UAAUgC,IAAIkB,CAAC;YAC3B;QACF;QAEA,IAAI,CAACzB,gBAAgB;YACnB,MAAM2B,QAAQ1D,kBAAkB;gBAC9B2D,gBAAgB3B,iBAAiBqB,IAAI;gBACrCR,QAAQb,iBAAiBc,eAAe;gBACxCc,cAAcjC,KAAKyB,KAAK;gBACxBb,QAAQD,IAAIC,MAAM;gBAClBR,gBAAgB;gBAChBS;YACF;YAEA,IAAIkB,MAAMG,EAAE,CAAC,CAAC,IAAIV,SAAS,MAAM;gBAC/B,MAAMW,gBAAgBJ,MAAMG,EAAE,CAAC,CAAC,IAAIT;gBACpC,IACEU,iBACCA,CAAAA,cAAcC,IAAI,KAAK,kBAAkBD,cAAcC,IAAI,KAAK,QAAO,KACxE,OAAOD,cAAcE,UAAU,KAAK,UACpC;oBACAN,MAAMO,GAAG;gBACX;YACF;YAEA,MAAMC,4BAA4B,IAAIC;YAEtC,IAAK,IAAIC,YAAY,GAAGA,YAAYV,MAAMW,MAAM,EAAED,YAAa;gBAC7D,MAAMT,iBAAiBD,KAAK,CAACU,UAAU,EAAET;gBAEzC,IAAI,CAACA,gBAAgB;oBACnB;gBACF;gBAEA,IAAI,CAACO,0BAA0BI,GAAG,CAACX,iBAAiB;oBAClD,MAAMY,0BAA0B/B,QAAQgC,WAAW,CAACb,eAAe,CAAE9B,MAAM;oBAC3E,MAAM4C,gBAAgB,MAAM3E,cAC1B;wBAAEmC,eAAe;wBAAMK;oBAAI,GAC3BiC,wBAAwB7B,MAAM,CAACC,IAAI;oBAGrC,IAAI,OAAO8B,kBAAkB,UAAU;wBACrCrE,mBAAmB;4BACjByC,QAAQ0B,wBAAwBzB,eAAe;4BAC/CN;4BACAH,OAAOoC;wBACT;oBACF;oBAEAP,0BAA0BQ,GAAG,CAACf,gBAAgBc;gBAChD;gBAEA,MAAMA,gBAAgBP,0BAA0BS,GAAG,CAAChB;gBAEpD,IAAIc,kBAAkB,OAAO;oBAC3B,IAAIxC,eAAe;wBACjB,OAAOnB,eAAe;4BAAEC,OAAOY,KAAKZ,KAAK;wBAAC;oBAC5C;oBAEA,MAAM,IAAIR,WAAW;wBAAC;4BAAE4C,MAAMxB,KAAKyB,KAAK;wBAAC;qBAAE;gBAC7C;gBAEA,IAAI,OAAOqB,kBAAkB,UAAU;oBACrC,MAAMG,mBAAmBlB,MACtBmB,KAAK,CAAC,GAAGT,WACTU,GAAG,CAAC,CAAC,EAAE3B,IAAI,EAAE,GAAKA,MAClB4B,IAAI,CAAC;oBAER/B,mBAAmB,CAAC4B,iBAAiB,GAAGH;oBACxC7B,YAAY7C,eACV6C,WACA3C,iBAAiB;wBAAE+E,QAAQJ;wBAAkBvC,OAAOoC;oBAAc;gBAEtE;YACF;YAEA,MAAMvE,mBAAmB;gBACvB8B;gBACAD,gBAAgB;gBAChBO;gBACAH;gBACAE,OAAO;oBACL,CAACV,KAAKyB,KAAK,CAAC,EAAE;wBACZ6B,QAAQ;oBACV;gBACF;YACF;YAEA,MAAM9E,kBAAkB;gBACtB6B;gBACAD,gBAAgB;gBAChBO;gBACA4C,MAAMvD,KAAKuD,IAAI;YACjB;QACF;QAEA,IAAI,aAAajC,YAAYG,KAAK,IAAIH,YAAYG,KAAK,CAAC+B,OAAO,EAAE;YAC/D,IAAI,OAAOlC,YAAYG,KAAK,CAAC+B,OAAO,KAAK,UAAU;gBACjD,MAAM,IAAI9E,SACR,CAAC,iFAAiF,CAAC;YAEvF;YAEA,IAAI+E,eAAuB;YAC3B,IAAIC,gBAAkCrD,iBAAiBc,eAAe;YACtE,MAAMwC,oBAAoBrC,YAAYG,KAAK,CAAC+B,OAAO,CAACI,KAAK,CAAC;YAC1D,KAAK,MAAMC,WAAWvC,YAAYG,KAAK,CAAC+B,OAAO,CAACI,KAAK,CAAC,KAAM;gBAC1DH,eAAe,GAAGA,eAAeI,SAAS;gBAC1CF,kBAAkBG,KAAK;gBACvB,MAAMrC,QAAQiC,cAAcK,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKJ;gBACnD,IACE,AAACpC,CAAAA,MAAMW,IAAI,KAAK,kBAAkBX,MAAMW,IAAI,KAAK,QAAO,KACxD,OAAOX,MAAMY,UAAU,KAAK,UAC5B;oBACA;gBACF;gBACA,IAAI,qBAAqBZ,OAAO;oBAC9BiC,gBAAgBjC,MAAMN,eAAe;gBACvC;YACF;YAEA,MAAMK,OAAO,GAAGiC,aAAa,CAAC,EAAEE,kBAAkBP,IAAI,CAAC,MAAM;YAE7D,MAAMc,SAAS,MAAMrD,QAAQsD,YAAY,CAAC;gBACxClE,YAAYI,iBAAiBqB,IAAI;gBACjC0C,OAAOpE,KAAKoE,KAAK;gBACjB9D;gBACAmB,OAAOD;gBACPpC,OAAOY,KAAKZ,KAAK;gBACjBwB;gBACAR;gBACAZ,MAAMQ,KAAKR,IAAI;gBACfe;gBACAI;gBACAH;gBACA+C,MAAMvD,KAAKuD,IAAI;gBACf9C;gBACAC;YACF;YAEA,KAAK,MAAM2D,OAAOH,OAAOrE,MAAM,CAAE;gBAC/BwE,GAAG,CAACrE,KAAKyB,KAAK,CAAC,GAAG4C,GAAG,CAAC7C,KAAK;gBAC3B,OAAO6C,GAAG,CAAC7C,KAAK;YAClB;YAEA,OAAO0C;QACT;QAEA,IAAIA,SAAS,MAAMrD,QAAQyD,EAAE,CAACH,YAAY,CAAC;YACzClE,YAAYI,iBAAiBqB,IAAI;YACjCD,OAAOzB,KAAKyB,KAAK;YACjBrC,OAAOY,KAAKZ,KAAK;YACjBwB,QAAQA;YACRpB,MAAMQ,KAAKR,IAAI;YACfsD,eAAezB;YACfV;YACA4C,MAAMvD,KAAKuD,IAAI;YACf7C,OAAOO;QACT;QAEA,IACE,AAACK,CAAAA,YAAYG,KAAK,CAACW,IAAI,KAAK,kBAAkBd,YAAYG,KAAK,CAACW,IAAI,KAAK,QAAO,KAChFpC,KAAKoE,KAAK,EACV;YACA,MAAMG,qBAAsC,EAAE;YAC9C,MAAMC,iBAAiB;gBAAE,GAAGlD,YAAYG,KAAK;YAAC;YAC9C,IAAIH,YAAYG,KAAK,CAACgD,OAAO,EAAE;gBAC7BD,eAAeC,OAAO,GAAG;YAC3B;YACA,KAAK,MAAMC,OAAOR,OAAOrE,MAAM,CAAE;gBAC/B0E,mBAAmBI,IAAI,CACrB9F,8BAA8B;oBAC5B+F,cAAc;oBACdR,OAAOpE,KAAKoE,KAAK;oBACjBS,OAAO;oBACPC,gBAAgBnE,IAAImE,cAAc,IAAI;oBACtCrD,OAAO+C;oBACP5D,QAAQD,IAAIC,MAAM,IAAI;oBACtBR,gBAAgBJ,KAAKI,cAAc,IAAI;oBACvC2E,mBAAmB;oBACnBxE;oBACAI;oBACAH,kBAAkB;oBAClBwE,YAAYN;gBACd;YAEJ;YACA,MAAMO,QAAQC,GAAG,CAACX;QACpB;QAEA,wCAAwC;QACxC,8BAA8B;QAC9B,wCAAwC;QAExCL,SAAS,MAAMjF,oBAAoB;YACjCe;YACAC,YAAYI;YACZF,WAAW;YACXC;YACA8D;QACF;QAEA,wCAAwC;QACxC,iBAAiB;QACjB,wCAAwC;QAExC,OAAOA;IACT,EAAE,OAAOiB,OAAgB;QACvB,MAAMnG,gBAAgBgB,KAAKW,GAAG;QAC9B,MAAMwE;IACR;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoreVersion.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/restoreVersion.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"restoreVersion.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/restoreVersion.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EAEX,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AA2BlD,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEnD,eAAO,MAAM,uBAAuB,GAClC,KAAK,SAAS,UAAU,GAAG,UAAU,kCAE/B,SAAS,KACd,OAAO,CAAC,KAAK,CAmYf,CAAA"}
|
|
@@ -7,13 +7,16 @@ import { afterChange } from '../../fields/hooks/afterChange/index.js';
|
|
|
7
7
|
import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
8
8
|
import { beforeChange } from '../../fields/hooks/beforeChange/index.js';
|
|
9
9
|
import { beforeValidate } from '../../fields/hooks/beforeValidate/index.js';
|
|
10
|
+
import { getLocalizedUploadProperties, restoreUploadDataFromDocument, sanitizeUploadData } from '../../uploads/sanitizeUploadData.js';
|
|
10
11
|
import { commitTransaction } from '../../utilities/commitTransaction.js';
|
|
11
12
|
import { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js';
|
|
12
13
|
import { hasDraftValidationEnabled } from '../../utilities/getVersionsConfig.js';
|
|
13
14
|
import { initTransaction } from '../../utilities/initTransaction.js';
|
|
15
|
+
import { isolateObjectProperty } from '../../utilities/isolateObjectProperty.js';
|
|
14
16
|
import { killTransaction } from '../../utilities/killTransaction.js';
|
|
15
17
|
import { sanitizeSelect } from '../../utilities/sanitizeSelect.js';
|
|
16
18
|
import { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js';
|
|
19
|
+
import { getRestoredStatusesToAuthorize } from '../../versions/getRestoredStatusesToAuthorize.js';
|
|
17
20
|
import { saveVersion } from '../../versions/saveVersion.js';
|
|
18
21
|
import { buildAfterOperation } from './utilities/buildAfterOperation.js';
|
|
19
22
|
import { buildBeforeOperation } from './utilities/buildBeforeOperation.js';
|
|
@@ -52,15 +55,35 @@ export const restoreVersionOperation = async (args)=>{
|
|
|
52
55
|
if (!rawVersionToRestore) {
|
|
53
56
|
throw new NotFound(req.t);
|
|
54
57
|
}
|
|
55
|
-
const { parent: parentDocID
|
|
58
|
+
const { parent: parentDocID } = rawVersionToRestore;
|
|
59
|
+
let versionToRestoreWithLocales = rawVersionToRestore.version;
|
|
56
60
|
// /////////////////////////////////////
|
|
57
61
|
// Access
|
|
58
62
|
// /////////////////////////////////////
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
const restoredStatuses = draftArg ? [
|
|
64
|
+
'draft'
|
|
65
|
+
] : getRestoredStatusesToAuthorize(versionToRestoreWithLocales?._status);
|
|
66
|
+
// A localized `_status` can publish and unpublish locales in one restore, so authorize every
|
|
67
|
+
// status it writes. executeAccess throws Forbidden on the first denial; Where constraints are
|
|
68
|
+
// AND-combined into the lookup below.
|
|
69
|
+
const accessResultsList = [];
|
|
70
|
+
if (overrideAccess) {
|
|
71
|
+
accessResultsList.push(true);
|
|
72
|
+
} else {
|
|
73
|
+
const statusesToAuthorize = restoredStatuses.length > 0 ? restoredStatuses : [
|
|
74
|
+
undefined
|
|
75
|
+
];
|
|
76
|
+
for (const status of statusesToAuthorize){
|
|
77
|
+
accessResultsList.push(await executeAccess({
|
|
78
|
+
id: parentDocID,
|
|
79
|
+
data: {
|
|
80
|
+
_status: status
|
|
81
|
+
},
|
|
82
|
+
req
|
|
83
|
+
}, collectionConfig.access.update));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const hasWherePolicy = accessResultsList.some((result)=>hasWhereAccessResult(result));
|
|
64
87
|
// /////////////////////////////////////
|
|
65
88
|
// Retrieve document
|
|
66
89
|
// /////////////////////////////////////
|
|
@@ -68,11 +91,11 @@ export const restoreVersionOperation = async (args)=>{
|
|
|
68
91
|
collection: collectionConfig.slug,
|
|
69
92
|
locale: 'all',
|
|
70
93
|
req,
|
|
71
|
-
where: combineQueries({
|
|
94
|
+
where: accessResultsList.reduce((where, result)=>combineQueries(where, result), {
|
|
72
95
|
id: {
|
|
73
96
|
equals: parentDocID
|
|
74
97
|
}
|
|
75
|
-
}
|
|
98
|
+
})
|
|
76
99
|
};
|
|
77
100
|
// Get the document from the non versioned collection
|
|
78
101
|
const doc = await req.payload.db.findOne(findOneArgs);
|
|
@@ -110,8 +133,11 @@ export const restoreVersionOperation = async (args)=>{
|
|
|
110
133
|
req,
|
|
111
134
|
showHiddenFields: true
|
|
112
135
|
});
|
|
136
|
+
if (collectionConfig.upload && !overrideAccess) {
|
|
137
|
+
versionToRestoreWithLocales = restoreUploadDataFromDocument(sanitizeUploadData(versionToRestoreWithLocales, 'update'), prevDocWithLocales);
|
|
138
|
+
}
|
|
113
139
|
// Use locale-hoisted version data for validation while preserving all locales in docWithLocales.
|
|
114
|
-
|
|
140
|
+
let prevVersionDoc = await afterRead({
|
|
115
141
|
collection: collectionConfig,
|
|
116
142
|
context: req.context,
|
|
117
143
|
depth: 0,
|
|
@@ -124,14 +150,22 @@ export const restoreVersionOperation = async (args)=>{
|
|
|
124
150
|
req,
|
|
125
151
|
showHiddenFields: true
|
|
126
152
|
});
|
|
153
|
+
if (collectionConfig.upload && !overrideAccess) {
|
|
154
|
+
prevVersionDoc = restoreUploadDataFromDocument(sanitizeUploadData(prevVersionDoc, 'update'), prevDocWithLocales, {
|
|
155
|
+
locale: validationLocale,
|
|
156
|
+
localizedProperties: getLocalizedUploadProperties(collectionConfig.flattenedFields)
|
|
157
|
+
});
|
|
158
|
+
}
|
|
127
159
|
// /////////////////////////////////////
|
|
128
160
|
// beforeValidate - Fields
|
|
129
161
|
// /////////////////////////////////////
|
|
130
162
|
req.context.isRestoringVersion = true;
|
|
131
|
-
const reqWithValidationLocale =
|
|
132
|
-
fallbackLocale
|
|
133
|
-
locale
|
|
134
|
-
|
|
163
|
+
const reqWithValidationLocale = isolateObjectProperty(req, [
|
|
164
|
+
'fallbackLocale',
|
|
165
|
+
'locale'
|
|
166
|
+
]);
|
|
167
|
+
reqWithValidationLocale.fallbackLocale = null;
|
|
168
|
+
reqWithValidationLocale.locale = validationLocale;
|
|
135
169
|
let data = await beforeValidate({
|
|
136
170
|
id: parentDocID,
|
|
137
171
|
collection: collectionConfig,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/restoreVersion.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { FindOneArgs } from '../../database/types.js'\nimport type { JsonObject, PayloadRequest, PopulateType, SelectType } from '../../types/index.js'\nimport type { Collection, TypeWithID } from '../config/types.js'\nimport type { FindOptions } from './local/find.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { afterChange } from '../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../fields/hooks/beforeValidate/index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js'\nimport { hasDraftValidationEnabled } from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\nexport type Arguments = {\n collection: Collection\n currentDepth?: number\n depth?: number\n disableErrors?: boolean\n disableTransaction?: boolean\n draft?: boolean\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const restoreVersionOperation = async <\n TData extends JsonObject & TypeWithID = JsonObject & TypeWithID,\n>(\n args: Arguments,\n): Promise<TData> => {\n const {\n id,\n collection: { config: collectionConfig },\n depth,\n draft: draftArg = false,\n overrideAccess = false,\n populate,\n req,\n req: { fallbackLocale, locale, payload },\n select: incomingSelect,\n showHiddenFields,\n } = args\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(args.req))\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'restoreVersion',\n overrideAccess,\n })\n\n if (!id) {\n throw new APIError('Missing ID of version to restore.', httpStatus.BAD_REQUEST)\n }\n\n // /////////////////////////////////////\n // Retrieve original raw version\n // /////////////////////////////////////\n\n const { docs: versionDocs } = await req.payload.db.findVersions({\n collection: collectionConfig.slug,\n limit: 1,\n locale: 'all',\n pagination: false,\n req,\n where: { id: { equals: id } },\n })\n\n const [rawVersionToRestore] = versionDocs\n\n if (!rawVersionToRestore) {\n throw new NotFound(req.t)\n }\n\n const { parent: parentDocID, version: versionToRestoreWithLocales } = rawVersionToRestore\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess({ id: parentDocID, req }, collectionConfig.access.update)\n : true\n const hasWherePolicy = hasWhereAccessResult(accessResults)\n\n // /////////////////////////////////////\n // Retrieve document\n // /////////////////////////////////////\n\n const findOneArgs: FindOneArgs = {\n collection: collectionConfig.slug,\n locale: 'all',\n req,\n where: combineQueries({ id: { equals: parentDocID } }, accessResults),\n }\n\n // Get the document from the non versioned collection\n const doc = await req.payload.db.findOne<TData>(findOneArgs)\n\n if (!doc && !hasWherePolicy) {\n throw new NotFound(req.t)\n }\n if (!doc && hasWherePolicy) {\n throw new Forbidden(req.t)\n }\n\n if (collectionConfig.trash && doc?.deletedAt) {\n throw new APIError(\n `Cannot restore a version of a trashed document (ID: ${parentDocID}). Restore the document first.`,\n httpStatus.FORBIDDEN,\n )\n }\n\n // /////////////////////////////////////\n // fetch previousDoc\n // /////////////////////////////////////\n const prevDocWithLocales = await getLatestCollectionVersion({\n id: parentDocID,\n config: collectionConfig,\n payload,\n query: findOneArgs,\n req,\n })\n\n // originalDoc with hoisted localized data\n const validationLocale = payload.config.localization\n ? payload.config.localization.defaultLocale\n : locale!\n\n const originalDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(prevDocWithLocales),\n draft: draftArg,\n fallbackLocale: null,\n global: null,\n locale: validationLocale,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n\n // Use locale-hoisted version data for validation while preserving all locales in docWithLocales.\n const prevVersionDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(rawVersionToRestore.version),\n draft: draftArg,\n fallbackLocale: null,\n global: null,\n locale: validationLocale,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n req.context.isRestoringVersion = true\n\n const reqWithValidationLocale = Object.assign(Object.create(req), req, {\n fallbackLocale: null,\n locale: validationLocale,\n })\n\n let data = await beforeValidate({\n id: parentDocID,\n collection: collectionConfig,\n context: req.context,\n data: deepCopyObjectSimple(prevVersionDoc),\n doc: originalDoc,\n global: null,\n operation: 'update',\n overrideAccess,\n req: reqWithValidationLocale,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeValidate?.length) {\n for (const hook of collectionConfig.hooks.beforeValidate) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc,\n req: reqWithValidationLocale,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeChange?.length) {\n for (const hook of collectionConfig.hooks.beforeChange) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc,\n req: reqWithValidationLocale,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n let result = await beforeChange({\n id: parentDocID,\n collection: collectionConfig,\n context: req.context,\n data: { ...data, id: parentDocID },\n doc: originalDoc,\n docWithLocales: versionToRestoreWithLocales,\n global: null,\n operation: 'update',\n overrideAccess,\n req: reqWithValidationLocale,\n skipValidation: draftArg && !hasDraftValidationEnabled(collectionConfig),\n })\n\n // /////////////////////////////////////\n // Update\n // /////////////////////////////////////\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n forceSelect: collectionConfig.forceSelect,\n select: incomingSelect,\n })\n\n // Ensure updatedAt date is always updated\n result.updatedAt = new Date().toISOString()\n // Ensure status respects restoreAsDraft arg\n result._status = draftArg ? 'draft' : result._status\n if (!draftArg) {\n result = await req.payload.db.updateOne({\n id: parentDocID,\n collection: collectionConfig.slug,\n data: result,\n req: reqWithValidationLocale,\n select,\n })\n }\n\n // /////////////////////////////////////\n // Save restored doc as a new version\n // /////////////////////////////////////\n\n result = await saveVersion({\n id: parentDocID,\n autosave: false,\n collection: collectionConfig,\n docWithLocales: result,\n draft: draftArg,\n operation: 'restoreVersion',\n payload,\n req: reqWithValidationLocale,\n select,\n })\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: depth!,\n doc: result,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n draft: undefined,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: collectionConfig,\n context: req.context,\n data: result,\n doc: result,\n global: null,\n operation: 'update',\n previousDoc: prevDocWithLocales,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterChange?.length) {\n for (const hook of collectionConfig.hooks.afterChange) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data: result,\n doc: result,\n operation: 'update',\n overrideAccess,\n previousDoc: prevDocWithLocales,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'restoreVersion',\n overrideAccess,\n result,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["status","httpStatus","executeAccess","hasWhereAccessResult","combineQueries","APIError","Forbidden","NotFound","afterChange","afterRead","beforeChange","beforeValidate","commitTransaction","deepCopyObjectSimple","hasDraftValidationEnabled","initTransaction","killTransaction","sanitizeSelect","getLatestCollectionVersion","saveVersion","buildAfterOperation","buildBeforeOperation","restoreVersionOperation","args","id","collection","config","collectionConfig","depth","draft","draftArg","overrideAccess","populate","req","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","shouldCommit","disableTransaction","operation","BAD_REQUEST","docs","versionDocs","db","findVersions","slug","limit","pagination","where","equals","rawVersionToRestore","t","parent","parentDocID","version","versionToRestoreWithLocales","accessResults","access","update","hasWherePolicy","findOneArgs","doc","findOne","trash","deletedAt","FORBIDDEN","prevDocWithLocales","query","validationLocale","localization","defaultLocale","originalDoc","context","global","prevVersionDoc","isRestoringVersion","reqWithValidationLocale","Object","assign","create","data","hooks","length","hook","result","docWithLocales","skipValidation","fields","flattenedFields","forceSelect","updatedAt","Date","toISOString","_status","updateOne","autosave","undefined","previousDoc","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/restoreVersion.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { FindOneArgs } from '../../database/types.js'\nimport type {\n JsonObject,\n PayloadRequest,\n PopulateType,\n SelectType,\n Where,\n} from '../../types/index.js'\nimport type { Collection, TypeWithID } from '../config/types.js'\nimport type { FindOptions } from './local/find.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { afterChange } from '../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../fields/hooks/beforeValidate/index.js'\nimport {\n getLocalizedUploadProperties,\n restoreUploadDataFromDocument,\n sanitizeUploadData,\n} from '../../uploads/sanitizeUploadData.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js'\nimport { hasDraftValidationEnabled } from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { isolateObjectProperty } from '../../utilities/isolateObjectProperty.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js'\nimport { getRestoredStatusesToAuthorize } from '../../versions/getRestoredStatusesToAuthorize.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\nexport type Arguments = {\n collection: Collection\n currentDepth?: number\n depth?: number\n disableErrors?: boolean\n disableTransaction?: boolean\n draft?: boolean\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const restoreVersionOperation = async <\n TData extends JsonObject & TypeWithID = JsonObject & TypeWithID,\n>(\n args: Arguments,\n): Promise<TData> => {\n const {\n id,\n collection: { config: collectionConfig },\n depth,\n draft: draftArg = false,\n overrideAccess = false,\n populate,\n req,\n req: { fallbackLocale, locale, payload },\n select: incomingSelect,\n showHiddenFields,\n } = args\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(args.req))\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'restoreVersion',\n overrideAccess,\n })\n\n if (!id) {\n throw new APIError('Missing ID of version to restore.', httpStatus.BAD_REQUEST)\n }\n\n // /////////////////////////////////////\n // Retrieve original raw version\n // /////////////////////////////////////\n\n const { docs: versionDocs } = await req.payload.db.findVersions({\n collection: collectionConfig.slug,\n limit: 1,\n locale: 'all',\n pagination: false,\n req,\n where: { id: { equals: id } },\n })\n\n const [rawVersionToRestore] = versionDocs\n\n if (!rawVersionToRestore) {\n throw new NotFound(req.t)\n }\n\n const { parent: parentDocID } = rawVersionToRestore\n let versionToRestoreWithLocales = rawVersionToRestore.version\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const restoredStatuses = draftArg\n ? ['draft']\n : getRestoredStatusesToAuthorize(versionToRestoreWithLocales?._status)\n\n // A localized `_status` can publish and unpublish locales in one restore, so authorize every\n // status it writes. executeAccess throws Forbidden on the first denial; Where constraints are\n // AND-combined into the lookup below.\n const accessResultsList: Array<boolean | Where> = []\n\n if (overrideAccess) {\n accessResultsList.push(true)\n } else {\n const statusesToAuthorize = restoredStatuses.length > 0 ? restoredStatuses : [undefined]\n\n for (const status of statusesToAuthorize) {\n accessResultsList.push(\n await executeAccess(\n { id: parentDocID, data: { _status: status }, req },\n collectionConfig.access.update,\n ),\n )\n }\n }\n\n const hasWherePolicy = accessResultsList.some((result) => hasWhereAccessResult(result))\n\n // /////////////////////////////////////\n // Retrieve document\n // /////////////////////////////////////\n\n const findOneArgs: FindOneArgs = {\n collection: collectionConfig.slug,\n locale: 'all',\n req,\n where: accessResultsList.reduce<Where>((where, result) => combineQueries(where, result), {\n id: { equals: parentDocID },\n }),\n }\n\n // Get the document from the non versioned collection\n const doc = await req.payload.db.findOne<TData>(findOneArgs)\n\n if (!doc && !hasWherePolicy) {\n throw new NotFound(req.t)\n }\n if (!doc && hasWherePolicy) {\n throw new Forbidden(req.t)\n }\n\n if (collectionConfig.trash && doc?.deletedAt) {\n throw new APIError(\n `Cannot restore a version of a trashed document (ID: ${parentDocID}). Restore the document first.`,\n httpStatus.FORBIDDEN,\n )\n }\n\n // /////////////////////////////////////\n // fetch previousDoc\n // /////////////////////////////////////\n const prevDocWithLocales = await getLatestCollectionVersion({\n id: parentDocID,\n config: collectionConfig,\n payload,\n query: findOneArgs,\n req,\n })\n\n // originalDoc with hoisted localized data\n const validationLocale = payload.config.localization\n ? payload.config.localization.defaultLocale\n : locale!\n\n const originalDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(prevDocWithLocales),\n draft: draftArg,\n fallbackLocale: null,\n global: null,\n locale: validationLocale,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n\n if (collectionConfig.upload && !overrideAccess) {\n versionToRestoreWithLocales = restoreUploadDataFromDocument(\n sanitizeUploadData(versionToRestoreWithLocales, 'update'),\n prevDocWithLocales,\n )\n }\n\n // Use locale-hoisted version data for validation while preserving all locales in docWithLocales.\n let prevVersionDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(rawVersionToRestore.version),\n draft: draftArg,\n fallbackLocale: null,\n global: null,\n locale: validationLocale,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n\n if (collectionConfig.upload && !overrideAccess) {\n prevVersionDoc = restoreUploadDataFromDocument(\n sanitizeUploadData(prevVersionDoc, 'update'),\n prevDocWithLocales,\n {\n locale: validationLocale,\n localizedProperties: getLocalizedUploadProperties(collectionConfig.flattenedFields),\n },\n )\n }\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n req.context.isRestoringVersion = true\n\n const reqWithValidationLocale = isolateObjectProperty(req, ['fallbackLocale', 'locale'])\n reqWithValidationLocale.fallbackLocale = null\n reqWithValidationLocale.locale = validationLocale\n\n let data = await beforeValidate({\n id: parentDocID,\n collection: collectionConfig,\n context: req.context,\n data: deepCopyObjectSimple(prevVersionDoc),\n doc: originalDoc,\n global: null,\n operation: 'update',\n overrideAccess,\n req: reqWithValidationLocale,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeValidate?.length) {\n for (const hook of collectionConfig.hooks.beforeValidate) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc,\n req: reqWithValidationLocale,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeChange?.length) {\n for (const hook of collectionConfig.hooks.beforeChange) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc,\n req: reqWithValidationLocale,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n let result = await beforeChange({\n id: parentDocID,\n collection: collectionConfig,\n context: req.context,\n data: { ...data, id: parentDocID },\n doc: originalDoc,\n docWithLocales: versionToRestoreWithLocales,\n global: null,\n operation: 'update',\n overrideAccess,\n req: reqWithValidationLocale,\n skipValidation: draftArg && !hasDraftValidationEnabled(collectionConfig),\n })\n\n // /////////////////////////////////////\n // Update\n // /////////////////////////////////////\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n forceSelect: collectionConfig.forceSelect,\n select: incomingSelect,\n })\n\n // Ensure updatedAt date is always updated\n result.updatedAt = new Date().toISOString()\n // Ensure status respects restoreAsDraft arg\n result._status = draftArg ? 'draft' : result._status\n if (!draftArg) {\n result = await req.payload.db.updateOne({\n id: parentDocID,\n collection: collectionConfig.slug,\n data: result,\n req: reqWithValidationLocale,\n select,\n })\n }\n\n // /////////////////////////////////////\n // Save restored doc as a new version\n // /////////////////////////////////////\n\n result = await saveVersion({\n id: parentDocID,\n autosave: false,\n collection: collectionConfig,\n docWithLocales: result,\n draft: draftArg,\n operation: 'restoreVersion',\n payload,\n req: reqWithValidationLocale,\n select,\n })\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: depth!,\n doc: result,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n draft: undefined,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: collectionConfig,\n context: req.context,\n data: result,\n doc: result,\n global: null,\n operation: 'update',\n previousDoc: prevDocWithLocales,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterChange?.length) {\n for (const hook of collectionConfig.hooks.afterChange) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data: result,\n doc: result,\n operation: 'update',\n overrideAccess,\n previousDoc: prevDocWithLocales,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'restoreVersion',\n overrideAccess,\n result,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["status","httpStatus","executeAccess","hasWhereAccessResult","combineQueries","APIError","Forbidden","NotFound","afterChange","afterRead","beforeChange","beforeValidate","getLocalizedUploadProperties","restoreUploadDataFromDocument","sanitizeUploadData","commitTransaction","deepCopyObjectSimple","hasDraftValidationEnabled","initTransaction","isolateObjectProperty","killTransaction","sanitizeSelect","getLatestCollectionVersion","getRestoredStatusesToAuthorize","saveVersion","buildAfterOperation","buildBeforeOperation","restoreVersionOperation","args","id","collection","config","collectionConfig","depth","draft","draftArg","overrideAccess","populate","req","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","shouldCommit","disableTransaction","operation","BAD_REQUEST","docs","versionDocs","db","findVersions","slug","limit","pagination","where","equals","rawVersionToRestore","t","parent","parentDocID","versionToRestoreWithLocales","version","restoredStatuses","_status","accessResultsList","push","statusesToAuthorize","length","undefined","data","access","update","hasWherePolicy","some","result","findOneArgs","reduce","doc","findOne","trash","deletedAt","FORBIDDEN","prevDocWithLocales","query","validationLocale","localization","defaultLocale","originalDoc","context","global","upload","prevVersionDoc","localizedProperties","flattenedFields","isRestoringVersion","reqWithValidationLocale","hooks","hook","docWithLocales","skipValidation","fields","forceSelect","updatedAt","Date","toISOString","updateOne","autosave","previousDoc","error"],"mappings":"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"}
|