@webiny/api-headless-cms-workflows 0.0.0-unstable.7c2def32a7 → 0.0.0-unstable.9609e4e0c9
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/CmsWorkflowsFeature.js +8 -4
- package/CmsWorkflowsFeature.js.map +1 -1
- package/domain/errors.d.ts +27 -0
- package/domain/errors.js +14 -0
- package/domain/errors.js.map +1 -0
- package/features/Workflows/feature.js +2 -0
- package/features/Workflows/feature.js.map +1 -1
- package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeCreate.d.ts +18 -6
- package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeCreate.js +30 -13
- package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeCreate.js.map +1 -1
- package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeUpdate.d.ts +23 -0
- package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeUpdate.js +44 -0
- package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeUpdate.js.map +1 -0
- package/features/hooks/BlockDeleteMultipleWhileInReview.d.ts +22 -0
- package/features/hooks/BlockDeleteMultipleWhileInReview.js +64 -0
- package/features/hooks/BlockDeleteMultipleWhileInReview.js.map +1 -0
- package/features/hooks/BlockDeleteWhileInReview.d.ts +18 -0
- package/features/hooks/BlockDeleteWhileInReview.js +45 -0
- package/features/hooks/BlockDeleteWhileInReview.js.map +1 -0
- package/features/hooks/BlockFolderChangeWhileInReview.d.ts +21 -0
- package/features/hooks/BlockFolderChangeWhileInReview.js +44 -0
- package/features/hooks/BlockFolderChangeWhileInReview.js.map +1 -0
- package/features/hooks/BlockMoveWhileInReview.d.ts +19 -0
- package/features/hooks/BlockMoveWhileInReview.js +46 -0
- package/features/hooks/BlockMoveWhileInReview.js.map +1 -0
- package/features/hooks/BlockRevisionDeleteWhileInReview.d.ts +17 -0
- package/features/hooks/BlockRevisionDeleteWhileInReview.js +46 -0
- package/features/hooks/BlockRevisionDeleteWhileInReview.js.map +1 -0
- package/features/hooks/BlockUpdateWhileInReview.d.ts +25 -0
- package/features/hooks/BlockUpdateWhileInReview.js +43 -0
- package/features/hooks/BlockUpdateWhileInReview.js.map +1 -0
- package/features/hooks/DeleteModelBoundToWorkflowDecorator.d.ts +22 -0
- package/features/hooks/DeleteModelBoundToWorkflowDecorator.js +52 -0
- package/features/hooks/DeleteModelBoundToWorkflowDecorator.js.map +1 -0
- package/features/hooks/DeleteModelTaskBoundToWorkflowDecorator.d.ts +27 -0
- package/features/hooks/DeleteModelTaskBoundToWorkflowDecorator.js +64 -0
- package/features/hooks/DeleteModelTaskBoundToWorkflowDecorator.js.map +1 -0
- package/features/hooks/DeleteReviewsOnEntriesDeleteMultiple.d.ts +19 -0
- package/features/hooks/DeleteReviewsOnEntriesDeleteMultiple.js +47 -0
- package/features/hooks/DeleteReviewsOnEntriesDeleteMultiple.js.map +1 -0
- package/features/hooks/DeleteReviewsOnEntryDelete.d.ts +19 -0
- package/features/hooks/DeleteReviewsOnEntryDelete.js +46 -0
- package/features/hooks/DeleteReviewsOnEntryDelete.js.map +1 -0
- package/features/hooks/DeleteReviewsOnRevisionDelete.d.ts +18 -0
- package/features/hooks/DeleteReviewsOnRevisionDelete.js +46 -0
- package/features/hooks/DeleteReviewsOnRevisionDelete.js.map +1 -0
- package/features/hooks/FullyDeleteModelBoundToWorkflowDecorator.d.ts +28 -0
- package/features/hooks/FullyDeleteModelBoundToWorkflowDecorator.js +63 -0
- package/features/hooks/FullyDeleteModelBoundToWorkflowDecorator.js.map +1 -0
- package/features/hooks/NullReviewStateOnRevisionCreate.d.ts +15 -0
- package/features/hooks/NullReviewStateOnRevisionCreate.js +17 -0
- package/features/hooks/NullReviewStateOnRevisionCreate.js.map +1 -0
- package/features/hooks/RequireApprovedReviewOnPublish.d.ts +22 -0
- package/features/hooks/RequireApprovedReviewOnPublish.js +43 -0
- package/features/hooks/RequireApprovedReviewOnPublish.js.map +1 -0
- package/features/hooks/RequireApprovedReviewOnRepublish.d.ts +23 -0
- package/features/hooks/RequireApprovedReviewOnRepublish.js +49 -0
- package/features/hooks/RequireApprovedReviewOnRepublish.js.map +1 -0
- package/features/hooks/feature.d.ts +8 -0
- package/features/hooks/feature.js +39 -0
- package/features/hooks/feature.js.map +1 -0
- package/features/target/CandidateFolderReadRules/CandidateFolderReadRules.d.ts +18 -0
- package/features/target/CandidateFolderReadRules/CandidateFolderReadRules.js +97 -0
- package/features/target/CandidateFolderReadRules/CandidateFolderReadRules.js.map +1 -0
- package/features/target/CandidateFolderReadRules/abstractions.d.ts +35 -0
- package/features/target/CandidateFolderReadRules/abstractions.js +5 -0
- package/features/target/CandidateFolderReadRules/abstractions.js.map +1 -0
- package/features/target/CandidateFolderReadRules/index.d.ts +1 -0
- package/features/target/CandidateFolderReadRules/index.js +1 -0
- package/features/target/CmsEntryAccess/CmsEntryAccess.d.ts +32 -0
- package/features/target/CmsEntryAccess/CmsEntryAccess.js +141 -0
- package/features/target/CmsEntryAccess/CmsEntryAccess.js.map +1 -0
- package/features/target/CmsEntryAccess/abstractions.d.ts +48 -0
- package/features/target/CmsEntryAccess/abstractions.js +5 -0
- package/features/target/CmsEntryAccess/abstractions.js.map +1 -0
- package/features/target/CmsEntryAccess/index.d.ts +2 -0
- package/features/target/CmsEntryAccess/index.js +2 -0
- package/features/target/CmsEntryAccess/unreadableCodes.d.ts +1 -0
- package/features/target/CmsEntryAccess/unreadableCodes.js +9 -0
- package/features/target/CmsEntryAccess/unreadableCodes.js.map +1 -0
- package/features/target/CmsEntryDeniedFolders/CmsEntryDeniedFolders.d.ts +21 -0
- package/features/target/CmsEntryDeniedFolders/CmsEntryDeniedFolders.js +66 -0
- package/features/target/CmsEntryDeniedFolders/CmsEntryDeniedFolders.js.map +1 -0
- package/features/target/CmsEntryDeniedFolders/abstractions.d.ts +23 -0
- package/features/target/CmsEntryDeniedFolders/abstractions.js +5 -0
- package/features/target/CmsEntryDeniedFolders/abstractions.js.map +1 -0
- package/features/target/CmsEntryDeniedFolders/index.d.ts +1 -0
- package/features/target/CmsEntryDeniedFolders/index.js +1 -0
- package/features/target/CmsEntryFolderExistsService/CmsEntryFolderExistsService.d.ts +18 -0
- package/features/target/CmsEntryFolderExistsService/CmsEntryFolderExistsService.js +43 -0
- package/features/target/CmsEntryFolderExistsService/CmsEntryFolderExistsService.js.map +1 -0
- package/features/target/CmsEntryFolderExistsService/abstractions.d.ts +23 -0
- package/features/target/CmsEntryFolderExistsService/abstractions.js +5 -0
- package/features/target/CmsEntryFolderExistsService/abstractions.js.map +1 -0
- package/features/target/CmsEntryFolderExistsService/index.d.ts +1 -0
- package/features/target/CmsEntryFolderExistsService/index.js +1 -0
- package/features/target/CmsEntryReviewNamespace/CmsModelReviewNamespace.d.ts +10 -0
- package/features/target/CmsEntryReviewNamespace/CmsModelReviewNamespace.js +14 -0
- package/features/target/CmsEntryReviewNamespace/CmsModelReviewNamespace.js.map +1 -0
- package/features/target/CmsEntryReviewNamespace/abstractions.d.ts +17 -0
- package/features/target/CmsEntryReviewNamespace/abstractions.js +5 -0
- package/features/target/CmsEntryReviewNamespace/abstractions.js.map +1 -0
- package/features/target/CmsEntryReviewNamespace/index.d.ts +1 -0
- package/features/target/CmsEntryReviewNamespace/index.js +1 -0
- package/features/target/CmsEntryReviewReadFilter/CmsEntryReviewReadFilter.d.ts +20 -0
- package/features/target/CmsEntryReviewReadFilter/CmsEntryReviewReadFilter.js +80 -0
- package/features/target/CmsEntryReviewReadFilter/CmsEntryReviewReadFilter.js.map +1 -0
- package/features/target/CmsEntryReviewReadFilter/abstractions.d.ts +24 -0
- package/features/target/CmsEntryReviewReadFilter/abstractions.js +5 -0
- package/features/target/CmsEntryReviewReadFilter/abstractions.js.map +1 -0
- package/features/target/CmsEntryReviewReadFilter/index.d.ts +1 -0
- package/features/target/CmsEntryReviewReadFilter/index.js +1 -0
- package/features/target/CmsEntryReviewTargetEditor.d.ts +28 -0
- package/features/target/CmsEntryReviewTargetEditor.js +128 -0
- package/features/target/CmsEntryReviewTargetEditor.js.map +1 -0
- package/features/target/CmsEntryReviewTargetFolderChain.d.ts +22 -0
- package/features/target/CmsEntryReviewTargetFolderChain.js +37 -0
- package/features/target/CmsEntryReviewTargetFolderChain.js.map +1 -0
- package/features/target/CmsEntryReviewTargetLink.d.ts +17 -0
- package/features/target/CmsEntryReviewTargetLink.js +18 -0
- package/features/target/CmsEntryReviewTargetLink.js.map +1 -0
- package/features/target/CmsEntryReviewTargetLoader.d.ts +16 -0
- package/features/target/CmsEntryReviewTargetLoader.js +29 -0
- package/features/target/CmsEntryReviewTargetLoader.js.map +1 -0
- package/features/target/CmsEntryReviewTargetReadAccess.d.ts +41 -0
- package/features/target/CmsEntryReviewTargetReadAccess.js +91 -0
- package/features/target/CmsEntryReviewTargetReadAccess.js.map +1 -0
- package/features/target/CmsEntryReviewTargetSync.d.ts +23 -0
- package/features/target/CmsEntryReviewTargetSync.js +42 -0
- package/features/target/CmsEntryReviewTargetSync.js.map +1 -0
- package/features/target/CmsEntryTargetReader/CmsEntryTargetReader.d.ts +27 -0
- package/features/target/CmsEntryTargetReader/CmsEntryTargetReader.js +81 -0
- package/features/target/CmsEntryTargetReader/CmsEntryTargetReader.js.map +1 -0
- package/features/target/CmsEntryTargetReader/abstractions.d.ts +40 -0
- package/features/target/CmsEntryTargetReader/abstractions.js +5 -0
- package/features/target/CmsEntryTargetReader/abstractions.js.map +1 -0
- package/features/target/CmsEntryTargetReader/index.d.ts +1 -0
- package/features/target/CmsEntryTargetReader/index.js +1 -0
- package/features/target/CmsModelGroupService/CmsModelGroupService.d.ts +12 -0
- package/features/target/CmsModelGroupService/CmsModelGroupService.js +25 -0
- package/features/target/CmsModelGroupService/CmsModelGroupService.js.map +1 -0
- package/features/target/CmsModelGroupService/abstractions.d.ts +24 -0
- package/features/target/CmsModelGroupService/abstractions.js +5 -0
- package/features/target/CmsModelGroupService/abstractions.js.map +1 -0
- package/features/target/CmsModelGroupService/index.d.ts +1 -0
- package/features/target/CmsModelGroupService/index.js +1 -0
- package/features/target/CmsWorkflowModelParser.d.ts +9 -0
- package/features/target/CmsWorkflowModelParser.js +18 -0
- package/features/target/CmsWorkflowModelParser.js.map +1 -0
- package/features/target/FolderReadRule.d.ts +9 -0
- package/features/target/FolderReadRule.js +0 -0
- package/features/target/WorkflowEntrySystemField.d.ts +13 -0
- package/features/target/WorkflowEntrySystemField.js +35 -0
- package/features/target/WorkflowEntrySystemField.js.map +1 -0
- package/features/target/feature.d.ts +5 -0
- package/features/target/feature.js +41 -0
- package/features/target/feature.js.map +1 -0
- package/features/target/getModelSafeValidationMessage.d.ts +11 -0
- package/features/target/getModelSafeValidationMessage.js +28 -0
- package/features/target/getModelSafeValidationMessage.js.map +1 -0
- package/features/target/isEditorFieldValue.d.ts +9 -0
- package/features/target/isEditorFieldValue.js +30 -0
- package/features/target/isEditorFieldValue.js.map +1 -0
- package/features/target/toCmsReviewTarget.d.ts +4 -0
- package/features/target/toCmsReviewTarget.js +26 -0
- package/features/target/toCmsReviewTarget.js.map +1 -0
- package/features/target/toEditorFields.d.ts +9 -0
- package/features/target/toEditorFields.js +48 -0
- package/features/target/toEditorFields.js.map +1 -0
- package/features/target/toEntryValuesPatch.d.ts +9 -0
- package/features/target/toEntryValuesPatch.js +31 -0
- package/features/target/toEntryValuesPatch.js.map +1 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/ApproveCmsEntryReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/ApproveCmsEntryReviewStepUseCase.js +35 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/ApproveCmsEntryReviewStepUseCase.js.map +1 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/abstractions.d.ts +26 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/abstractions.js +5 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/feature.d.ts +4 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/feature.js +11 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/feature.js.map +1 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/index.d.ts +1 -0
- package/features/wrappers/ApproveCmsEntryReviewStep/index.js +1 -0
- package/features/wrappers/CancelCmsEntryReview/CancelCmsEntryReviewUseCase.d.ts +13 -0
- package/features/wrappers/CancelCmsEntryReview/CancelCmsEntryReviewUseCase.js +37 -0
- package/features/wrappers/CancelCmsEntryReview/CancelCmsEntryReviewUseCase.js.map +1 -0
- package/features/wrappers/CancelCmsEntryReview/abstractions.d.ts +30 -0
- package/features/wrappers/CancelCmsEntryReview/abstractions.js +5 -0
- package/features/wrappers/CancelCmsEntryReview/abstractions.js.map +1 -0
- package/features/wrappers/CancelCmsEntryReview/feature.d.ts +4 -0
- package/features/wrappers/CancelCmsEntryReview/feature.js +11 -0
- package/features/wrappers/CancelCmsEntryReview/feature.js.map +1 -0
- package/features/wrappers/CancelCmsEntryReview/index.d.ts +1 -0
- package/features/wrappers/CancelCmsEntryReview/index.js +1 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/CancelCmsEntryReviewsForDeleteUseCase.d.ts +19 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/CancelCmsEntryReviewsForDeleteUseCase.js +85 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/CancelCmsEntryReviewsForDeleteUseCase.js.map +1 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/abstractions.d.ts +41 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/abstractions.js +5 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/abstractions.js.map +1 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/feature.d.ts +4 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/feature.js +11 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/feature.js.map +1 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/index.d.ts +1 -0
- package/features/wrappers/CancelCmsEntryReviewsForDelete/index.js +1 -0
- package/features/wrappers/CmsEntryFolderExists/CmsEntryFolderExistsUseCase.d.ts +15 -0
- package/features/wrappers/CmsEntryFolderExists/CmsEntryFolderExistsUseCase.js +46 -0
- package/features/wrappers/CmsEntryFolderExists/CmsEntryFolderExistsUseCase.js.map +1 -0
- package/features/wrappers/CmsEntryFolderExists/abstractions.d.ts +29 -0
- package/features/wrappers/CmsEntryFolderExists/abstractions.js +5 -0
- package/features/wrappers/CmsEntryFolderExists/abstractions.js.map +1 -0
- package/features/wrappers/CmsEntryFolderExists/feature.d.ts +4 -0
- package/features/wrappers/CmsEntryFolderExists/feature.js +11 -0
- package/features/wrappers/CmsEntryFolderExists/feature.js.map +1 -0
- package/features/wrappers/CmsEntryFolderExists/index.d.ts +1 -0
- package/features/wrappers/CmsEntryFolderExists/index.js +1 -0
- package/features/wrappers/CmsEntryReviewGuardService/CmsEntryReviewGuardService.d.ts +17 -0
- package/features/wrappers/CmsEntryReviewGuardService/CmsEntryReviewGuardService.js +63 -0
- package/features/wrappers/CmsEntryReviewGuardService/CmsEntryReviewGuardService.js.map +1 -0
- package/features/wrappers/CmsEntryReviewGuardService/abstractions.d.ts +37 -0
- package/features/wrappers/CmsEntryReviewGuardService/abstractions.js +5 -0
- package/features/wrappers/CmsEntryReviewGuardService/abstractions.js.map +1 -0
- package/features/wrappers/CmsEntryReviewGuardService/index.d.ts +1 -0
- package/features/wrappers/CmsEntryReviewGuardService/index.js +1 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/DeleteCmsEntryWorkflowUseCase.d.ts +25 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/DeleteCmsEntryWorkflowUseCase.js +98 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/DeleteCmsEntryWorkflowUseCase.js.map +1 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/abstractions.d.ts +32 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/abstractions.js +5 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/abstractions.js.map +1 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/feature.d.ts +4 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/feature.js +11 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/feature.js.map +1 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/index.d.ts +1 -0
- package/features/wrappers/DeleteCmsEntryWorkflow/index.js +1 -0
- package/features/wrappers/GetCmsEntryReview/GetCmsEntryReviewUseCase.d.ts +13 -0
- package/features/wrappers/GetCmsEntryReview/GetCmsEntryReviewUseCase.js +40 -0
- package/features/wrappers/GetCmsEntryReview/GetCmsEntryReviewUseCase.js.map +1 -0
- package/features/wrappers/GetCmsEntryReview/abstractions.d.ts +28 -0
- package/features/wrappers/GetCmsEntryReview/abstractions.js +5 -0
- package/features/wrappers/GetCmsEntryReview/abstractions.js.map +1 -0
- package/features/{EntryWorkflows → wrappers/GetCmsEntryReview}/feature.d.ts +1 -1
- package/features/wrappers/GetCmsEntryReview/feature.js +11 -0
- package/features/wrappers/GetCmsEntryReview/feature.js.map +1 -0
- package/features/wrappers/GetCmsEntryReview/index.d.ts +1 -0
- package/features/wrappers/GetCmsEntryReview/index.js +1 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/GetCmsEntryReviewStepRunUseCase.d.ts +13 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/GetCmsEntryReviewStepRunUseCase.js +39 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/GetCmsEntryReviewStepRunUseCase.js.map +1 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/abstractions.d.ts +33 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/abstractions.js +5 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/abstractions.js.map +1 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/feature.d.ts +4 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/feature.js +11 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/feature.js.map +1 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/index.d.ts +1 -0
- package/features/wrappers/GetCmsEntryReviewStepRun/index.js +1 -0
- package/features/wrappers/GetCmsEntryTargetReview/GetCmsEntryTargetReviewUseCase.d.ts +19 -0
- package/features/wrappers/GetCmsEntryTargetReview/GetCmsEntryTargetReviewUseCase.js +76 -0
- package/features/wrappers/GetCmsEntryTargetReview/GetCmsEntryTargetReviewUseCase.js.map +1 -0
- package/features/wrappers/GetCmsEntryTargetReview/abstractions.d.ts +36 -0
- package/features/wrappers/GetCmsEntryTargetReview/abstractions.js +5 -0
- package/features/wrappers/GetCmsEntryTargetReview/abstractions.js.map +1 -0
- package/features/wrappers/GetCmsEntryTargetReview/feature.d.ts +4 -0
- package/features/wrappers/GetCmsEntryTargetReview/feature.js +11 -0
- package/features/wrappers/GetCmsEntryTargetReview/feature.js.map +1 -0
- package/features/wrappers/GetCmsEntryTargetReview/index.d.ts +1 -0
- package/features/wrappers/GetCmsEntryTargetReview/index.js +1 -0
- package/features/wrappers/GetCmsEntryWorkflow/GetCmsEntryWorkflowUseCase.d.ts +13 -0
- package/features/wrappers/GetCmsEntryWorkflow/GetCmsEntryWorkflowUseCase.js +34 -0
- package/features/wrappers/GetCmsEntryWorkflow/GetCmsEntryWorkflowUseCase.js.map +1 -0
- package/features/wrappers/GetCmsEntryWorkflow/abstractions.d.ts +24 -0
- package/features/wrappers/GetCmsEntryWorkflow/abstractions.js +5 -0
- package/features/wrappers/GetCmsEntryWorkflow/abstractions.js.map +1 -0
- package/features/wrappers/GetCmsEntryWorkflow/feature.d.ts +4 -0
- package/features/wrappers/GetCmsEntryWorkflow/feature.js +11 -0
- package/features/wrappers/GetCmsEntryWorkflow/feature.js.map +1 -0
- package/features/wrappers/GetCmsEntryWorkflow/index.d.ts +1 -0
- package/features/wrappers/GetCmsEntryWorkflow/index.js +1 -0
- package/features/wrappers/InspectCmsEntryRouting/InspectCmsEntryRoutingUseCase.d.ts +19 -0
- package/features/wrappers/InspectCmsEntryRouting/InspectCmsEntryRoutingUseCase.js +54 -0
- package/features/wrappers/InspectCmsEntryRouting/InspectCmsEntryRoutingUseCase.js.map +1 -0
- package/features/wrappers/InspectCmsEntryRouting/abstractions.d.ts +37 -0
- package/features/wrappers/InspectCmsEntryRouting/abstractions.js +5 -0
- package/features/wrappers/InspectCmsEntryRouting/abstractions.js.map +1 -0
- package/features/wrappers/InspectCmsEntryRouting/feature.d.ts +4 -0
- package/features/wrappers/InspectCmsEntryRouting/feature.js +11 -0
- package/features/wrappers/InspectCmsEntryRouting/feature.js.map +1 -0
- package/features/wrappers/InspectCmsEntryRouting/index.d.ts +1 -0
- package/features/wrappers/InspectCmsEntryRouting/index.js +1 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/ListCmsEntryBlockingReviewsUseCase.d.ts +25 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/ListCmsEntryBlockingReviewsUseCase.js +109 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/ListCmsEntryBlockingReviewsUseCase.js.map +1 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/abstractions.d.ts +36 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/abstractions.js +6 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/abstractions.js.map +1 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/feature.d.ts +4 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/feature.js +11 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/feature.js.map +1 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/index.d.ts +1 -0
- package/features/wrappers/ListCmsEntryBlockingReviews/index.js +1 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/ListCmsEntryReviewStepCandidatesUseCase.d.ts +13 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/ListCmsEntryReviewStepCandidatesUseCase.js +41 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/ListCmsEntryReviewStepCandidatesUseCase.js.map +1 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/abstractions.d.ts +30 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/abstractions.js +5 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/abstractions.js.map +1 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/feature.d.ts +4 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/feature.js +11 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/feature.js.map +1 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/index.d.ts +1 -0
- package/features/wrappers/ListCmsEntryReviewStepCandidates/index.js +1 -0
- package/features/wrappers/ListCmsEntryReviews/ListCmsEntryReviewsUseCase.d.ts +17 -0
- package/features/wrappers/ListCmsEntryReviews/ListCmsEntryReviewsUseCase.js +85 -0
- package/features/wrappers/ListCmsEntryReviews/ListCmsEntryReviewsUseCase.js.map +1 -0
- package/features/wrappers/ListCmsEntryReviews/abstractions.d.ts +50 -0
- package/features/wrappers/ListCmsEntryReviews/abstractions.js +5 -0
- package/features/wrappers/ListCmsEntryReviews/abstractions.js.map +1 -0
- package/features/wrappers/ListCmsEntryReviews/feature.d.ts +4 -0
- package/features/wrappers/ListCmsEntryReviews/feature.js +11 -0
- package/features/wrappers/ListCmsEntryReviews/feature.js.map +1 -0
- package/features/wrappers/ListCmsEntryReviews/index.d.ts +1 -0
- package/features/wrappers/ListCmsEntryReviews/index.js +1 -0
- package/features/wrappers/ListCmsEntryStepCandidates/ListCmsEntryStepCandidatesUseCase.d.ts +25 -0
- package/features/wrappers/ListCmsEntryStepCandidates/ListCmsEntryStepCandidatesUseCase.js +83 -0
- package/features/wrappers/ListCmsEntryStepCandidates/ListCmsEntryStepCandidatesUseCase.js.map +1 -0
- package/features/wrappers/ListCmsEntryStepCandidates/abstractions.d.ts +41 -0
- package/features/wrappers/ListCmsEntryStepCandidates/abstractions.js +5 -0
- package/features/wrappers/ListCmsEntryStepCandidates/abstractions.js.map +1 -0
- package/features/wrappers/ListCmsEntryStepCandidates/feature.d.ts +4 -0
- package/features/wrappers/ListCmsEntryStepCandidates/feature.js +11 -0
- package/features/wrappers/ListCmsEntryStepCandidates/feature.js.map +1 -0
- package/features/wrappers/ListCmsEntryStepCandidates/index.d.ts +1 -0
- package/features/wrappers/ListCmsEntryStepCandidates/index.js +1 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/ListCmsEntryWorkflowModelsUseCase.d.ts +17 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/ListCmsEntryWorkflowModelsUseCase.js +106 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/ListCmsEntryWorkflowModelsUseCase.js.map +1 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/abstractions.d.ts +58 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/abstractions.js +5 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/abstractions.js.map +1 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/feature.d.ts +4 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/feature.js +11 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/feature.js.map +1 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/index.d.ts +2 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/index.js +1 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/modelListCursor.d.ts +8 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/modelListCursor.js +20 -0
- package/features/wrappers/ListCmsEntryWorkflowModels/modelListCursor.js.map +1 -0
- package/features/wrappers/ListCmsEntryWorkflows/ListCmsEntryWorkflowsUseCase.d.ts +17 -0
- package/features/wrappers/ListCmsEntryWorkflows/ListCmsEntryWorkflowsUseCase.js +43 -0
- package/features/wrappers/ListCmsEntryWorkflows/ListCmsEntryWorkflowsUseCase.js.map +1 -0
- package/features/wrappers/ListCmsEntryWorkflows/abstractions.d.ts +24 -0
- package/features/wrappers/ListCmsEntryWorkflows/abstractions.js +5 -0
- package/features/wrappers/ListCmsEntryWorkflows/abstractions.js.map +1 -0
- package/features/wrappers/ListCmsEntryWorkflows/feature.d.ts +4 -0
- package/features/wrappers/ListCmsEntryWorkflows/feature.js +11 -0
- package/features/wrappers/ListCmsEntryWorkflows/feature.js.map +1 -0
- package/features/wrappers/ListCmsEntryWorkflows/index.d.ts +1 -0
- package/features/wrappers/ListCmsEntryWorkflows/index.js +1 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/ReassignCmsEntryReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/ReassignCmsEntryReviewStepUseCase.js +40 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/ReassignCmsEntryReviewStepUseCase.js.map +1 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/abstractions.d.ts +32 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/abstractions.js +5 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/feature.d.ts +4 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/feature.js +11 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/feature.js.map +1 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/index.d.ts +1 -0
- package/features/wrappers/ReassignCmsEntryReviewStep/index.js +1 -0
- package/features/wrappers/RejectCmsEntryReviewStep/RejectCmsEntryReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/RejectCmsEntryReviewStep/RejectCmsEntryReviewStepUseCase.js +35 -0
- package/features/wrappers/RejectCmsEntryReviewStep/RejectCmsEntryReviewStepUseCase.js.map +1 -0
- package/features/wrappers/RejectCmsEntryReviewStep/abstractions.d.ts +26 -0
- package/features/wrappers/RejectCmsEntryReviewStep/abstractions.js +5 -0
- package/features/wrappers/RejectCmsEntryReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/RejectCmsEntryReviewStep/feature.d.ts +4 -0
- package/features/wrappers/RejectCmsEntryReviewStep/feature.js +11 -0
- package/features/wrappers/RejectCmsEntryReviewStep/feature.js.map +1 -0
- package/features/wrappers/RejectCmsEntryReviewStep/index.d.ts +1 -0
- package/features/wrappers/RejectCmsEntryReviewStep/index.js +1 -0
- package/features/wrappers/RequestCmsEntryReview/RequestCmsEntryReviewUseCase.d.ts +21 -0
- package/features/wrappers/RequestCmsEntryReview/RequestCmsEntryReviewUseCase.js +63 -0
- package/features/wrappers/RequestCmsEntryReview/RequestCmsEntryReviewUseCase.js.map +1 -0
- package/features/wrappers/RequestCmsEntryReview/abstractions.d.ts +38 -0
- package/features/wrappers/RequestCmsEntryReview/abstractions.js +5 -0
- package/features/wrappers/RequestCmsEntryReview/abstractions.js.map +1 -0
- package/features/wrappers/RequestCmsEntryReview/feature.d.ts +4 -0
- package/features/wrappers/RequestCmsEntryReview/feature.js +11 -0
- package/features/wrappers/RequestCmsEntryReview/feature.js.map +1 -0
- package/features/wrappers/RequestCmsEntryReview/index.d.ts +1 -0
- package/features/wrappers/RequestCmsEntryReview/index.js +1 -0
- package/features/wrappers/RestartCmsEntryReviewStep/RestartCmsEntryReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/RestartCmsEntryReviewStep/RestartCmsEntryReviewStepUseCase.js +39 -0
- package/features/wrappers/RestartCmsEntryReviewStep/RestartCmsEntryReviewStepUseCase.js.map +1 -0
- package/features/wrappers/RestartCmsEntryReviewStep/abstractions.d.ts +30 -0
- package/features/wrappers/RestartCmsEntryReviewStep/abstractions.js +5 -0
- package/features/wrappers/RestartCmsEntryReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/RestartCmsEntryReviewStep/feature.d.ts +4 -0
- package/features/wrappers/RestartCmsEntryReviewStep/feature.js +11 -0
- package/features/wrappers/RestartCmsEntryReviewStep/feature.js.map +1 -0
- package/features/wrappers/RestartCmsEntryReviewStep/index.d.ts +1 -0
- package/features/wrappers/RestartCmsEntryReviewStep/index.js +1 -0
- package/features/wrappers/StartCmsEntryReviewStep/StartCmsEntryReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/StartCmsEntryReviewStep/StartCmsEntryReviewStepUseCase.js +34 -0
- package/features/wrappers/StartCmsEntryReviewStep/StartCmsEntryReviewStepUseCase.js.map +1 -0
- package/features/wrappers/StartCmsEntryReviewStep/abstractions.d.ts +25 -0
- package/features/wrappers/StartCmsEntryReviewStep/abstractions.js +5 -0
- package/features/wrappers/StartCmsEntryReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/StartCmsEntryReviewStep/feature.d.ts +4 -0
- package/features/wrappers/StartCmsEntryReviewStep/feature.js +11 -0
- package/features/wrappers/StartCmsEntryReviewStep/feature.js.map +1 -0
- package/features/wrappers/StartCmsEntryReviewStep/index.d.ts +1 -0
- package/features/wrappers/StartCmsEntryReviewStep/index.js +1 -0
- package/features/wrappers/StoreCmsEntryWorkflow/StoreCmsEntryWorkflowUseCase.d.ts +17 -0
- package/features/wrappers/StoreCmsEntryWorkflow/StoreCmsEntryWorkflowUseCase.js +57 -0
- package/features/wrappers/StoreCmsEntryWorkflow/StoreCmsEntryWorkflowUseCase.js.map +1 -0
- package/features/wrappers/StoreCmsEntryWorkflow/abstractions.d.ts +32 -0
- package/features/wrappers/StoreCmsEntryWorkflow/abstractions.js +5 -0
- package/features/wrappers/StoreCmsEntryWorkflow/abstractions.js.map +1 -0
- package/features/wrappers/StoreCmsEntryWorkflow/feature.d.ts +4 -0
- package/features/wrappers/StoreCmsEntryWorkflow/feature.js +11 -0
- package/features/wrappers/StoreCmsEntryWorkflow/feature.js.map +1 -0
- package/features/wrappers/StoreCmsEntryWorkflow/index.d.ts +1 -0
- package/features/wrappers/StoreCmsEntryWorkflow/index.js +1 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/TakeOverCmsEntryReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/TakeOverCmsEntryReviewStepUseCase.js +35 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/TakeOverCmsEntryReviewStepUseCase.js.map +1 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/abstractions.d.ts +27 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/abstractions.js +5 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/feature.d.ts +4 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/feature.js +11 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/feature.js.map +1 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/index.d.ts +1 -0
- package/features/wrappers/TakeOverCmsEntryReviewStep/index.js +1 -0
- package/features/wrappers/feature.d.ts +9 -0
- package/features/wrappers/feature.js +57 -0
- package/features/wrappers/feature.js.map +1 -0
- package/features/wrappers/shared/cmsWorkflows.d.ts +6 -0
- package/features/wrappers/shared/cmsWorkflows.js +8 -0
- package/features/wrappers/shared/cmsWorkflows.js.map +1 -0
- package/graphql/CmsWorkflowsSchemaFactory.d.ts +14 -0
- package/graphql/CmsWorkflowsSchemaFactory.js +695 -0
- package/graphql/CmsWorkflowsSchemaFactory.js.map +1 -0
- package/graphql/entrySystemSchema.d.ts +4 -0
- package/graphql/entrySystemSchema.js +3 -2
- package/graphql/entrySystemSchema.js.map +1 -1
- package/graphql/isValidRevisionId.d.ts +6 -0
- package/graphql/isValidRevisionId.js +9 -0
- package/graphql/isValidRevisionId.js.map +1 -0
- package/index.d.ts +1 -0
- package/package.json +22 -17
- package/types.d.ts +24 -0
- package/types.js +0 -0
- package/utils/appName.d.ts +9 -5
- package/utils/appName.js +6 -4
- package/utils/appName.js.map +1 -1
- package/utils/folderType.d.ts +4 -0
- package/utils/folderType.js +9 -0
- package/utils/folderType.js.map +1 -0
- package/utils/isBindableModel.d.ts +9 -0
- package/utils/isBindableModel.js +8 -0
- package/utils/isBindableModel.js.map +1 -0
- package/features/EntryWorkflows/decorators/CmsWorkflowStateContextProvider.d.ts +0 -15
- package/features/EntryWorkflows/decorators/CmsWorkflowStateContextProvider.js +0 -35
- package/features/EntryWorkflows/decorators/CmsWorkflowStateContextProvider.js.map +0 -1
- package/features/EntryWorkflows/decorators/CmsWorkflowStateFilter.d.ts +0 -13
- package/features/EntryWorkflows/decorators/CmsWorkflowStateFilter.js +0 -45
- package/features/EntryWorkflows/decorators/CmsWorkflowStateFilter.js.map +0 -1
- package/features/EntryWorkflows/errors.d.ts +0 -11
- package/features/EntryWorkflows/errors.js +0 -12
- package/features/EntryWorkflows/errors.js.map +0 -1
- package/features/EntryWorkflows/feature.js +0 -29
- package/features/EntryWorkflows/feature.js.map +0 -1
- package/features/EntryWorkflows/handlers/BlockMoveOnActiveWorkflowState.d.ts +0 -11
- package/features/EntryWorkflows/handlers/BlockMoveOnActiveWorkflowState.js +0 -37
- package/features/EntryWorkflows/handlers/BlockMoveOnActiveWorkflowState.js.map +0 -1
- package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateAfterDelete.d.ts +0 -13
- package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateAfterDelete.js +0 -35
- package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateAfterDelete.js.map +0 -1
- package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateCancel.d.ts +0 -13
- package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateCancel.js +0 -35
- package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateCancel.js.map +0 -1
- package/features/EntryWorkflows/handlers/DeleteWorkflowStateOnEntryAfterDelete.d.ts +0 -11
- package/features/EntryWorkflows/handlers/DeleteWorkflowStateOnEntryAfterDelete.js +0 -26
- package/features/EntryWorkflows/handlers/DeleteWorkflowStateOnEntryAfterDelete.js.map +0 -1
- package/features/EntryWorkflows/handlers/DeleteWorkflowsOnModelAfterDelete.d.ts +0 -13
- package/features/EntryWorkflows/handlers/DeleteWorkflowsOnModelAfterDelete.js +0 -42
- package/features/EntryWorkflows/handlers/DeleteWorkflowsOnModelAfterDelete.js.map +0 -1
- package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterCreate.d.ts +0 -13
- package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterCreate.js +0 -37
- package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterCreate.js.map +0 -1
- package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterUpdate.d.ts +0 -13
- package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterUpdate.js +0 -36
- package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterUpdate.js.map +0 -1
- package/features/EntryWorkflows/handlers/ValidateWorkflowStateOnEntryBeforePublish.d.ts +0 -11
- package/features/EntryWorkflows/handlers/ValidateWorkflowStateOnEntryBeforePublish.js +0 -46
- package/features/EntryWorkflows/handlers/ValidateWorkflowStateOnEntryBeforePublish.js.map +0 -1
- package/features/EntryWorkflows/index.d.ts +0 -1
- package/features/EntryWorkflows/index.js +0 -1
- package/utils/modelAllowed.d.ts +0 -2
- package/utils/modelAllowed.js +0 -9
- package/utils/modelAllowed.js.map +0 -1
- package/utils/state.d.ts +0 -3
- package/utils/state.js +0 -12
- package/utils/state.js.map +0 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
2
|
+
import { ROOT_FOLDER } from "@webiny/api-headless-cms/constants.js";
|
|
3
|
+
import { ReviewTargetReadAccess } from "@webiny/api-workflows/features/review/ReviewTargetReadAccess/index.js";
|
|
4
|
+
import { CandidateReadAccess } from "@webiny/api-workflows/features/identity/CandidateReadAccess/index.js";
|
|
5
|
+
import { getModelIdFromAppName, isCmsNamespace } from "../../utils/appName.js";
|
|
6
|
+
import { CmsEntryTargetReader } from "./CmsEntryTargetReader/index.js";
|
|
7
|
+
import { CmsEntryAccess } from "./CmsEntryAccess/index.js";
|
|
8
|
+
import { CmsModelGroupService } from "./CmsModelGroupService/index.js";
|
|
9
|
+
import { CandidateFolderReadRules } from "./CandidateFolderReadRules/index.js";
|
|
10
|
+
class CmsEntryReviewTargetReadAccessImpl {
|
|
11
|
+
constructor(targets, access, candidates, getModel, modelGroups, folderRules){
|
|
12
|
+
this.targets = targets;
|
|
13
|
+
this.access = access;
|
|
14
|
+
this.candidates = candidates;
|
|
15
|
+
this.getModel = getModel;
|
|
16
|
+
this.modelGroups = modelGroups;
|
|
17
|
+
this.folderRules = folderRules;
|
|
18
|
+
}
|
|
19
|
+
canHandle(model) {
|
|
20
|
+
return isCmsNamespace(model);
|
|
21
|
+
}
|
|
22
|
+
async filterReadableUsers(params) {
|
|
23
|
+
if (0 === params.users.length) return [];
|
|
24
|
+
let subject;
|
|
25
|
+
try {
|
|
26
|
+
subject = await this.readSubject(params);
|
|
27
|
+
} catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
if (!subject) return [];
|
|
31
|
+
const { check, folderId } = subject;
|
|
32
|
+
let folderRule;
|
|
33
|
+
if (folderId && folderId !== ROOT_FOLDER) folderRule = this.folderRules.create({
|
|
34
|
+
folderId,
|
|
35
|
+
users: params.users
|
|
36
|
+
});
|
|
37
|
+
const readable = [];
|
|
38
|
+
for (const user of params.users){
|
|
39
|
+
if (void 0 !== params.limit && readable.length >= params.limit) break;
|
|
40
|
+
const canRead = await this.candidates.canUserRead(user, ()=>check(folderRule));
|
|
41
|
+
if (canRead) readable.push(user.id);
|
|
42
|
+
}
|
|
43
|
+
return readable;
|
|
44
|
+
}
|
|
45
|
+
async readSubject(params) {
|
|
46
|
+
if ("target" === params.read.type) {
|
|
47
|
+
const { targetId } = params.read;
|
|
48
|
+
const target = await this.targets.read({
|
|
49
|
+
model: params.model,
|
|
50
|
+
targetRevisionId: params.read.targetRevisionId
|
|
51
|
+
});
|
|
52
|
+
if (!target || target.entry.entryId !== targetId) return null;
|
|
53
|
+
return {
|
|
54
|
+
check: (folderRule)=>this.access.canRead(target, folderRule),
|
|
55
|
+
folderId: target.entry.location?.folderId ?? null
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const modelId = getModelIdFromAppName(params.model);
|
|
59
|
+
if (!modelId) return null;
|
|
60
|
+
const modelResult = await this.getModel.execute(modelId);
|
|
61
|
+
if (modelResult.isFail() || modelResult.value.isPrivate) return null;
|
|
62
|
+
const groupResult = await this.modelGroups.getGroup(modelResult.value);
|
|
63
|
+
if (groupResult.isFail()) return null;
|
|
64
|
+
const model = modelResult.value;
|
|
65
|
+
const group = groupResult.value;
|
|
66
|
+
const { folderId } = params.read;
|
|
67
|
+
return {
|
|
68
|
+
check: (folderRule)=>this.access.canReadInFolder({
|
|
69
|
+
model,
|
|
70
|
+
group,
|
|
71
|
+
folderId,
|
|
72
|
+
folderRule
|
|
73
|
+
}),
|
|
74
|
+
folderId
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const CmsEntryReviewTargetReadAccess = ReviewTargetReadAccess.createImplementation({
|
|
79
|
+
implementation: CmsEntryReviewTargetReadAccessImpl,
|
|
80
|
+
dependencies: [
|
|
81
|
+
CmsEntryTargetReader,
|
|
82
|
+
CmsEntryAccess,
|
|
83
|
+
CandidateReadAccess,
|
|
84
|
+
GetModelUseCase,
|
|
85
|
+
CmsModelGroupService,
|
|
86
|
+
CandidateFolderReadRules
|
|
87
|
+
]
|
|
88
|
+
});
|
|
89
|
+
export { CmsEntryReviewTargetReadAccess };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=CmsEntryReviewTargetReadAccess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/CmsEntryReviewTargetReadAccess.js","sources":["../../../src/features/target/CmsEntryReviewTargetReadAccess.ts"],"sourcesContent":["import type { CmsGroup, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { ROOT_FOLDER } from \"@webiny/api-headless-cms/constants.js\";\nimport { ReviewTargetReadAccess } from \"@webiny/api-workflows/features/review/ReviewTargetReadAccess/index.js\";\nimport { CandidateReadAccess } from \"@webiny/api-workflows/features/identity/CandidateReadAccess/index.js\";\nimport { getModelIdFromAppName, isCmsNamespace } from \"~/utils/appName.js\";\nimport { CmsEntryTargetReader } from \"./CmsEntryTargetReader/index.js\";\nimport { CmsEntryAccess } from \"./CmsEntryAccess/index.js\";\nimport { CmsModelGroupService } from \"./CmsModelGroupService/index.js\";\nimport { CandidateFolderReadRules } from \"./CandidateFolderReadRules/index.js\";\nimport type { FolderReadRule } from \"./FolderReadRule.js\";\n\n/** What every candidate's check needs, read once per call as the current identity. */\ninterface CandidateReadSubject {\n /** The candidate check, run as the candidate. */\n check: (folderRule: FolderReadRule | undefined) => Promise<boolean>;\n /** The folder a rule is needed for; `null` for the root folder. */\n folderId: string | null;\n}\n\n/**\n * `filterReadableUsers` for `cms.*` targets (D61, D133, R48, R121). The model, group, revision and\n * the folder's permission record are read once per call, as the current identity, so nothing is\n * read as the other users (A19) and nothing is read per user (Q79); only the CMS access check\n * (group read, model read, entry and folder access, R72) runs as each user, through\n * `CandidateReadAccess` (R67), which wraps it in `withIdentity` and `withAuthorization`.\n *\n * Contract: this class does not widen access itself, and the CMS model cache is filled\n * per tenant after access filtering. A whole AI step run executes inside `withoutAuthorization`\n * (R161), so the model and group reads of the AI editor happen there; the access checks here\n * apply after the cache and run as the candidate user through `CandidateReadAccess`, the only\n * place that changes identity for the check. Any failure, including a throwing target or model\n * read, leaves the users out (fail closed, R50).\n */\nclass CmsEntryReviewTargetReadAccessImpl implements ReviewTargetReadAccess.Interface {\n public constructor(\n private targets: CmsEntryTargetReader.Interface,\n private access: CmsEntryAccess.Interface,\n private candidates: CandidateReadAccess.Interface,\n private getModel: GetModelUseCase.Interface,\n private modelGroups: CmsModelGroupService.Interface,\n private folderRules: CandidateFolderReadRules.Interface\n ) {}\n\n public canHandle(model: string): boolean {\n return isCmsNamespace(model);\n }\n\n public async filterReadableUsers(\n params: ReviewTargetReadAccess.UsersParams\n ): Promise<string[]> {\n if (params.users.length === 0) {\n return [];\n }\n let subject: CandidateReadSubject | null;\n try {\n subject = await this.readSubject(params);\n } catch {\n return [];\n }\n if (!subject) {\n return [];\n }\n const { check, folderId } = subject;\n let folderRule: FolderReadRule | undefined;\n if (folderId && folderId !== ROOT_FOLDER) {\n folderRule = this.folderRules.create({ folderId, users: params.users });\n }\n\n const readable: string[] = [];\n // One user at a time, as that user: the check reads nothing, but each user's own\n // permissions load once (cached per identity), so a limited call stops early.\n for (const user of params.users) {\n if (params.limit !== undefined && readable.length >= params.limit) {\n break;\n }\n // oxlint-disable-next-line no-await-in-loop -- one user at a time, as that user; a limited call stops early.\n const canRead = await this.candidates.canUserRead(user, () => check(folderRule));\n if (canRead) {\n readable.push(user.id);\n }\n }\n return readable;\n }\n\n /**\n * The target revision (or, for a folder without a revision, the model and group, R121) as the\n * current identity; `null` when there is nothing anyone can read.\n */\n private async readSubject(\n params: ReviewTargetReadAccess.UsersParams\n ): Promise<CandidateReadSubject | null> {\n if (params.read.type === \"target\") {\n const { targetId } = params.read;\n const target = await this.targets.read({\n model: params.model,\n targetRevisionId: params.read.targetRevisionId\n });\n if (!target || target.entry.entryId !== targetId) {\n return null;\n }\n return {\n check: folderRule => this.access.canRead(target, folderRule),\n folderId: target.entry.location?.folderId ?? null\n };\n }\n\n // Without an entry (the routing inspector): the model and folder only, so a user shown as\n // readable can still lack access to one entry (own-only permissions, A47).\n const modelId = getModelIdFromAppName(params.model);\n if (!modelId) {\n return null;\n }\n const modelResult = await this.getModel.execute(modelId);\n if (modelResult.isFail() || modelResult.value.isPrivate) {\n return null;\n }\n const groupResult = await this.modelGroups.getGroup(modelResult.value);\n if (groupResult.isFail()) {\n return null;\n }\n const model: CmsModel = modelResult.value;\n const group: CmsGroup = groupResult.value;\n const { folderId } = params.read;\n return {\n check: folderRule =>\n this.access.canReadInFolder({ model, group, folderId, folderRule }),\n folderId\n };\n }\n}\n\nexport const CmsEntryReviewTargetReadAccess = ReviewTargetReadAccess.createImplementation({\n implementation: CmsEntryReviewTargetReadAccessImpl,\n dependencies: [\n CmsEntryTargetReader,\n CmsEntryAccess,\n CandidateReadAccess,\n GetModelUseCase,\n CmsModelGroupService,\n CandidateFolderReadRules\n ]\n});\n"],"names":["CmsEntryReviewTargetReadAccessImpl","targets","access","candidates","getModel","modelGroups","folderRules","model","isCmsNamespace","params","subject","check","folderId","folderRule","ROOT_FOLDER","readable","user","undefined","canRead","targetId","target","modelId","getModelIdFromAppName","modelResult","groupResult","group","CmsEntryReviewTargetReadAccess","ReviewTargetReadAccess","CmsEntryTargetReader","CmsEntryAccess","CandidateReadAccess","GetModelUseCase","CmsModelGroupService","CandidateFolderReadRules"],"mappings":";;;;;;;;;AAkCA,MAAMA;IACF,YACYC,OAAuC,EACvCC,MAAgC,EAChCC,UAAyC,EACzCC,QAAmC,EACnCC,WAA2C,EAC3CC,WAA+C,CACzD;aANUL,OAAO,GAAPA;aACAC,MAAM,GAANA;aACAC,UAAU,GAAVA;aACAC,QAAQ,GAARA;aACAC,WAAW,GAAXA;aACAC,WAAW,GAAXA;IACT;IAEI,UAAUC,KAAa,EAAW;QACrC,OAAOC,eAAeD;IAC1B;IAEA,MAAa,oBACTE,MAA0C,EACzB;QACjB,IAAIA,AAAwB,MAAxBA,OAAO,KAAK,CAAC,MAAM,EACnB,OAAO,EAAE;QAEb,IAAIC;QACJ,IAAI;YACAA,UAAU,MAAM,IAAI,CAAC,WAAW,CAACD;QACrC,EAAE,OAAM;YACJ,OAAO,EAAE;QACb;QACA,IAAI,CAACC,SACD,OAAO,EAAE;QAEb,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGF;QAC5B,IAAIG;QACJ,IAAID,YAAYA,aAAaE,aACzBD,aAAa,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAAED;YAAU,OAAOH,OAAO,KAAK;QAAC;QAGzE,MAAMM,WAAqB,EAAE;QAG7B,KAAK,MAAMC,QAAQP,OAAO,KAAK,CAAE;YAC7B,IAAIA,AAAiBQ,WAAjBR,OAAO,KAAK,IAAkBM,SAAS,MAAM,IAAIN,OAAO,KAAK,EAC7D;YAGJ,MAAMS,UAAU,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAACF,MAAM,IAAML,MAAME;YACpE,IAAIK,SACAH,SAAS,IAAI,CAACC,KAAK,EAAE;QAE7B;QACA,OAAOD;IACX;IAMA,MAAc,YACVN,MAA0C,EACN;QACpC,IAAIA,AAAqB,aAArBA,OAAO,IAAI,CAAC,IAAI,EAAe;YAC/B,MAAM,EAAEU,QAAQ,EAAE,GAAGV,OAAO,IAAI;YAChC,MAAMW,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBACnC,OAAOX,OAAO,KAAK;gBACnB,kBAAkBA,OAAO,IAAI,CAAC,gBAAgB;YAClD;YACA,IAAI,CAACW,UAAUA,OAAO,KAAK,CAAC,OAAO,KAAKD,UACpC,OAAO;YAEX,OAAO;gBACH,OAAON,CAAAA,aAAc,IAAI,CAAC,MAAM,CAAC,OAAO,CAACO,QAAQP;gBACjD,UAAUO,OAAO,KAAK,CAAC,QAAQ,EAAE,YAAY;YACjD;QACJ;QAIA,MAAMC,UAAUC,sBAAsBb,OAAO,KAAK;QAClD,IAAI,CAACY,SACD,OAAO;QAEX,MAAME,cAAc,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACF;QAChD,IAAIE,YAAY,MAAM,MAAMA,YAAY,KAAK,CAAC,SAAS,EACnD,OAAO;QAEX,MAAMC,cAAc,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAACD,YAAY,KAAK;QACrE,IAAIC,YAAY,MAAM,IAClB,OAAO;QAEX,MAAMjB,QAAkBgB,YAAY,KAAK;QACzC,MAAME,QAAkBD,YAAY,KAAK;QACzC,MAAM,EAAEZ,QAAQ,EAAE,GAAGH,OAAO,IAAI;QAChC,OAAO;YACH,OAAOI,CAAAA,aACH,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;oBAAEN;oBAAOkB;oBAAOb;oBAAUC;gBAAW;YACrED;QACJ;IACJ;AACJ;AAEO,MAAMc,iCAAiCC,uBAAuB,oBAAoB,CAAC;IACtF,gBAAgB3B;IAChB,cAAc;QACV4B;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
2
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
3
|
+
import { UpdateEntrySystemUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js";
|
|
4
|
+
import { ReviewTargetSync } from "@webiny/api-workflows/features/review/ReviewTargetSync/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Writes `system.workflow` on the CMS revision (spec 4.5, D52, R63). The model is read as the
|
|
7
|
+
* current identity, never without authorization: an access-free read could fill the tenant-keyed
|
|
8
|
+
* CMS model cache with an unfiltered list (A19). Only the system write runs without authorization,
|
|
9
|
+
* so a reviewer with read access can move the review on. `UpdateEntrySystemUseCase` publishes
|
|
10
|
+
* `EntryBeforeUpdateSystem`, not `EntryBeforeUpdate`, so the save block does not apply (D62).
|
|
11
|
+
*/
|
|
12
|
+
declare class CmsEntryReviewTargetSyncImpl implements ReviewTargetSync.Interface {
|
|
13
|
+
private identityContext;
|
|
14
|
+
private getModel;
|
|
15
|
+
private updateEntrySystem;
|
|
16
|
+
constructor(identityContext: IdentityContext.Interface, getModel: GetModelUseCase.Interface, updateEntrySystem: UpdateEntrySystemUseCase.Interface);
|
|
17
|
+
canSync(model: string): boolean;
|
|
18
|
+
sync(params: ReviewTargetSync.Params): ReviewTargetSync.Return;
|
|
19
|
+
}
|
|
20
|
+
export declare const CmsEntryReviewTargetSync: typeof CmsEntryReviewTargetSyncImpl & {
|
|
21
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-workflows/features/review/ReviewTargetSync/abstractions").IReviewTargetSync>;
|
|
22
|
+
};
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
4
|
+
import { UpdateEntrySystemUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js";
|
|
5
|
+
import { ReviewTargetSync } from "@webiny/api-workflows/features/review/ReviewTargetSync/index.js";
|
|
6
|
+
import { getModelIdFromAppName, isCmsNamespace } from "../../utils/appName.js";
|
|
7
|
+
class CmsEntryReviewTargetSyncImpl {
|
|
8
|
+
constructor(identityContext, getModel, updateEntrySystem){
|
|
9
|
+
this.identityContext = identityContext;
|
|
10
|
+
this.getModel = getModel;
|
|
11
|
+
this.updateEntrySystem = updateEntrySystem;
|
|
12
|
+
}
|
|
13
|
+
canSync(model) {
|
|
14
|
+
return isCmsNamespace(model);
|
|
15
|
+
}
|
|
16
|
+
async sync(params) {
|
|
17
|
+
const modelId = getModelIdFromAppName(params.review.model);
|
|
18
|
+
if (!modelId) return Result.fail(new Error(`"${params.review.model}" is not a Headless CMS review namespace.`));
|
|
19
|
+
try {
|
|
20
|
+
const model = await this.getModel.execute(modelId);
|
|
21
|
+
if (model.isFail()) return Result.fail(model.error);
|
|
22
|
+
const updated = await this.identityContext.withoutAuthorization(()=>this.updateEntrySystem.execute(model.value, params.review.targetRevisionId, {
|
|
23
|
+
workflow: params.systemWorkflow
|
|
24
|
+
}));
|
|
25
|
+
if (updated.isFail()) return Result.fail(updated.error);
|
|
26
|
+
return Result.ok();
|
|
27
|
+
} catch (error) {
|
|
28
|
+
return Result.fail(error instanceof Error ? error : new Error(String(error)));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const CmsEntryReviewTargetSync = ReviewTargetSync.createImplementation({
|
|
33
|
+
implementation: CmsEntryReviewTargetSyncImpl,
|
|
34
|
+
dependencies: [
|
|
35
|
+
IdentityContext,
|
|
36
|
+
GetModelUseCase,
|
|
37
|
+
UpdateEntrySystemUseCase
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
export { CmsEntryReviewTargetSync };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=CmsEntryReviewTargetSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/CmsEntryReviewTargetSync.js","sources":["../../../src/features/target/CmsEntryReviewTargetSync.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { UpdateEntrySystemUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js\";\nimport { ReviewTargetSync } from \"@webiny/api-workflows/features/review/ReviewTargetSync/index.js\";\nimport { getModelIdFromAppName, isCmsNamespace } from \"~/utils/appName.js\";\n\n/**\n * Writes `system.workflow` on the CMS revision (spec 4.5, D52, R63). The model is read as the\n * current identity, never without authorization: an access-free read could fill the tenant-keyed\n * CMS model cache with an unfiltered list (A19). Only the system write runs without authorization,\n * so a reviewer with read access can move the review on. `UpdateEntrySystemUseCase` publishes\n * `EntryBeforeUpdateSystem`, not `EntryBeforeUpdate`, so the save block does not apply (D62).\n */\nclass CmsEntryReviewTargetSyncImpl implements ReviewTargetSync.Interface {\n public constructor(\n private identityContext: IdentityContext.Interface,\n private getModel: GetModelUseCase.Interface,\n private updateEntrySystem: UpdateEntrySystemUseCase.Interface\n ) {}\n\n public canSync(model: string): boolean {\n return isCmsNamespace(model);\n }\n\n public async sync(params: ReviewTargetSync.Params): ReviewTargetSync.Return {\n const modelId = getModelIdFromAppName(params.review.model);\n if (!modelId) {\n return Result.fail(\n new Error(`\"${params.review.model}\" is not a Headless CMS review namespace.`)\n );\n }\n\n try {\n const model = await this.getModel.execute(modelId);\n if (model.isFail()) {\n return Result.fail(model.error);\n }\n\n const updated = await this.identityContext.withoutAuthorization(() => {\n return this.updateEntrySystem.execute(model.value, params.review.targetRevisionId, {\n workflow: params.systemWorkflow\n });\n });\n if (updated.isFail()) {\n return Result.fail(updated.error);\n }\n return Result.ok();\n } catch (error) {\n return Result.fail(error instanceof Error ? error : new Error(String(error)));\n }\n }\n}\n\nexport const CmsEntryReviewTargetSync = ReviewTargetSync.createImplementation({\n implementation: CmsEntryReviewTargetSyncImpl,\n dependencies: [IdentityContext, GetModelUseCase, UpdateEntrySystemUseCase]\n});\n"],"names":["CmsEntryReviewTargetSyncImpl","identityContext","getModel","updateEntrySystem","model","isCmsNamespace","params","modelId","getModelIdFromAppName","Result","Error","updated","error","String","CmsEntryReviewTargetSync","ReviewTargetSync","IdentityContext","GetModelUseCase","UpdateEntrySystemUseCase"],"mappings":";;;;;;AAcA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,QAAmC,EACnCC,iBAAqD,CAC/D;aAHUF,eAAe,GAAfA;aACAC,QAAQ,GAARA;aACAC,iBAAiB,GAAjBA;IACT;IAEI,QAAQC,KAAa,EAAW;QACnC,OAAOC,eAAeD;IAC1B;IAEA,MAAa,KAAKE,MAA+B,EAA2B;QACxE,MAAMC,UAAUC,sBAAsBF,OAAO,MAAM,CAAC,KAAK;QACzD,IAAI,CAACC,SACD,OAAOE,OAAO,IAAI,CACd,IAAIC,MAAM,CAAC,CAAC,EAAEJ,OAAO,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC;QAIpF,IAAI;YACA,MAAMF,QAAQ,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACG;YAC1C,IAAIH,MAAM,MAAM,IACZ,OAAOK,OAAO,IAAI,CAACL,MAAM,KAAK;YAGlC,MAAMO,UAAU,MAAM,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,IACrD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACP,MAAM,KAAK,EAAEE,OAAO,MAAM,CAAC,gBAAgB,EAAE;oBAC/E,UAAUA,OAAO,cAAc;gBACnC;YAEJ,IAAIK,QAAQ,MAAM,IACd,OAAOF,OAAO,IAAI,CAACE,QAAQ,KAAK;YAEpC,OAAOF,OAAO,EAAE;QACpB,EAAE,OAAOG,OAAO;YACZ,OAAOH,OAAO,IAAI,CAACG,iBAAiBF,QAAQE,QAAQ,IAAIF,MAAMG,OAAOD;QACzE;IACJ;AACJ;AAEO,MAAME,2BAA2BC,iBAAiB,oBAAoB,CAAC;IAC1E,gBAAgBf;IAChB,cAAc;QAACgB;QAAiBC;QAAiBC;KAAyB;AAC9E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
2
|
+
import { GetRevisionByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetRevisionById/index.js";
|
|
3
|
+
import { GetEntriesByIdsUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntriesByIds/index.js";
|
|
4
|
+
import { CmsEntryTargetReader as Abstraction } from "./abstractions.js";
|
|
5
|
+
import { CmsModelGroupService } from "../CmsModelGroupService/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* The model is read through the access-controlled `GetModelUseCase` as the current identity: a
|
|
8
|
+
* model the user cannot read is no target for them, and nothing fills the tenant-keyed model cache
|
|
9
|
+
* without access filtering (A19). The group is read the same way, so `CmsEntryAccess` can check
|
|
10
|
+
* group read for another user without reading anything as them. The revision itself is read
|
|
11
|
+
* without entry checks; callers decide access with `CmsEntryAccess`.
|
|
12
|
+
*/
|
|
13
|
+
declare class CmsEntryTargetReaderImpl implements Abstraction.Interface {
|
|
14
|
+
private getModel;
|
|
15
|
+
private modelGroups;
|
|
16
|
+
private getRevisionById;
|
|
17
|
+
private getEntriesByIds;
|
|
18
|
+
constructor(getModel: GetModelUseCase.Interface, modelGroups: CmsModelGroupService.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, getEntriesByIds: GetEntriesByIdsUseCase.Interface);
|
|
19
|
+
read(params: Abstraction.Params): Promise<Abstraction.Target | null>;
|
|
20
|
+
readMany(params: Abstraction.ManyParams): Promise<Abstraction.Target[]>;
|
|
21
|
+
/** The model and its group as the current identity; `null` when they are no target. */
|
|
22
|
+
private readModel;
|
|
23
|
+
}
|
|
24
|
+
export declare const CmsEntryTargetReader: typeof CmsEntryTargetReaderImpl & {
|
|
25
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICmsEntryTargetReader>;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
2
|
+
import { GetRevisionByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetRevisionById/index.js";
|
|
3
|
+
import { GetEntriesByIdsUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntriesByIds/index.js";
|
|
4
|
+
import { getModelIdFromAppName } from "../../../utils/appName.js";
|
|
5
|
+
import { CmsEntryTargetReader } from "./abstractions.js";
|
|
6
|
+
import { CmsModelGroupService } from "../CmsModelGroupService/index.js";
|
|
7
|
+
const MODEL_NOT_FOUND = "Cms/Model/NotFound";
|
|
8
|
+
const MODEL_NOT_AUTHORIZED = "Cms/Model/NotAuthorized";
|
|
9
|
+
const GROUP_NOT_FOUND = "Cms/ModelGroup/NotFound";
|
|
10
|
+
const GROUP_NOT_AUTHORIZED = "Cms/ModelGroup/NotAuthorized";
|
|
11
|
+
const ENTRY_NOT_FOUND = "Cms/Entry/NotFound";
|
|
12
|
+
const ENTRIES_NOT_AUTHORIZED = "Cms/Entry/NotAuthorized";
|
|
13
|
+
class CmsEntryTargetReaderImpl {
|
|
14
|
+
constructor(getModel, modelGroups, getRevisionById, getEntriesByIds){
|
|
15
|
+
this.getModel = getModel;
|
|
16
|
+
this.modelGroups = modelGroups;
|
|
17
|
+
this.getRevisionById = getRevisionById;
|
|
18
|
+
this.getEntriesByIds = getEntriesByIds;
|
|
19
|
+
}
|
|
20
|
+
async read(params) {
|
|
21
|
+
const targetModel = await this.readModel(params.model);
|
|
22
|
+
if (!targetModel) return null;
|
|
23
|
+
const entry = await this.getRevisionById.execute(targetModel.model, params.targetRevisionId);
|
|
24
|
+
if (entry.isFail()) {
|
|
25
|
+
if (entry.error.code === ENTRY_NOT_FOUND) return null;
|
|
26
|
+
throw entry.error;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
...targetModel,
|
|
30
|
+
entry: entry.value
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async readMany(params) {
|
|
34
|
+
if (0 === params.targetRevisionIds.length) return [];
|
|
35
|
+
const targetModel = await this.readModel(params.model);
|
|
36
|
+
if (!targetModel) return [];
|
|
37
|
+
const revisionIds = [
|
|
38
|
+
...new Set(params.targetRevisionIds)
|
|
39
|
+
];
|
|
40
|
+
const entries = await this.getEntriesByIds.execute(targetModel.model, revisionIds);
|
|
41
|
+
if (entries.isFail()) {
|
|
42
|
+
if (entries.error.code === ENTRIES_NOT_AUTHORIZED) return [];
|
|
43
|
+
throw entries.error;
|
|
44
|
+
}
|
|
45
|
+
return entries.value.map((entry)=>({
|
|
46
|
+
...targetModel,
|
|
47
|
+
entry
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
async readModel(namespace) {
|
|
51
|
+
const modelId = getModelIdFromAppName(namespace);
|
|
52
|
+
if (!modelId) return null;
|
|
53
|
+
const model = await this.getModel.execute(modelId);
|
|
54
|
+
if (model.isFail()) {
|
|
55
|
+
if (model.error.code === MODEL_NOT_FOUND || model.error.code === MODEL_NOT_AUTHORIZED) return null;
|
|
56
|
+
throw model.error;
|
|
57
|
+
}
|
|
58
|
+
if (model.value.isPrivate) return null;
|
|
59
|
+
const group = await this.modelGroups.getGroup(model.value);
|
|
60
|
+
if (group.isFail()) {
|
|
61
|
+
if (group.error.code === GROUP_NOT_FOUND || group.error.code === GROUP_NOT_AUTHORIZED) return null;
|
|
62
|
+
throw group.error;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
model: model.value,
|
|
66
|
+
group: group.value
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const CmsEntryTargetReader_CmsEntryTargetReader = CmsEntryTargetReader.createImplementation({
|
|
71
|
+
implementation: CmsEntryTargetReaderImpl,
|
|
72
|
+
dependencies: [
|
|
73
|
+
GetModelUseCase,
|
|
74
|
+
CmsModelGroupService,
|
|
75
|
+
GetRevisionByIdUseCase,
|
|
76
|
+
GetEntriesByIdsUseCase
|
|
77
|
+
]
|
|
78
|
+
});
|
|
79
|
+
export { CmsEntryTargetReader_CmsEntryTargetReader as CmsEntryTargetReader };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=CmsEntryTargetReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/CmsEntryTargetReader/CmsEntryTargetReader.js","sources":["../../../../src/features/target/CmsEntryTargetReader/CmsEntryTargetReader.ts"],"sourcesContent":["import type { CmsGroup, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { GetRevisionByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetRevisionById/index.js\";\nimport { GetEntriesByIdsUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntriesByIds/index.js\";\nimport { getModelIdFromAppName } from \"~/utils/appName.js\";\nimport { CmsEntryTargetReader as Abstraction } from \"./abstractions.js\";\nimport { CmsModelGroupService } from \"../CmsModelGroupService/index.js\";\n\nconst MODEL_NOT_FOUND = \"Cms/Model/NotFound\";\nconst MODEL_NOT_AUTHORIZED = \"Cms/Model/NotAuthorized\";\nconst GROUP_NOT_FOUND = \"Cms/ModelGroup/NotFound\";\nconst GROUP_NOT_AUTHORIZED = \"Cms/ModelGroup/NotAuthorized\";\nconst ENTRY_NOT_FOUND = \"Cms/Entry/NotFound\";\n// The identity has no entry permission on the model, so no revision is a target for it.\nconst ENTRIES_NOT_AUTHORIZED = \"Cms/Entry/NotAuthorized\";\n\ninterface TargetModel {\n model: CmsModel;\n group: CmsGroup;\n}\n\n/**\n * The model is read through the access-controlled `GetModelUseCase` as the current identity: a\n * model the user cannot read is no target for them, and nothing fills the tenant-keyed model cache\n * without access filtering (A19). The group is read the same way, so `CmsEntryAccess` can check\n * group read for another user without reading anything as them. The revision itself is read\n * without entry checks; callers decide access with `CmsEntryAccess`.\n */\nclass CmsEntryTargetReaderImpl implements Abstraction.Interface {\n public constructor(\n private getModel: GetModelUseCase.Interface,\n private modelGroups: CmsModelGroupService.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private getEntriesByIds: GetEntriesByIdsUseCase.Interface\n ) {}\n\n public async read(params: Abstraction.Params): Promise<Abstraction.Target | null> {\n const targetModel = await this.readModel(params.model);\n if (!targetModel) {\n return null;\n }\n\n const entry = await this.getRevisionById.execute(\n targetModel.model,\n params.targetRevisionId\n );\n if (entry.isFail()) {\n if (entry.error.code === ENTRY_NOT_FOUND) {\n return null;\n }\n throw entry.error;\n }\n\n return { ...targetModel, entry: entry.value };\n }\n\n public async readMany(params: Abstraction.ManyParams): Promise<Abstraction.Target[]> {\n if (params.targetRevisionIds.length === 0) {\n return [];\n }\n const targetModel = await this.readModel(params.model);\n if (!targetModel) {\n return [];\n }\n\n // One batch read for every revision (Q79); trashed revisions are left out.\n const revisionIds = [...new Set(params.targetRevisionIds)];\n const entries = await this.getEntriesByIds.execute(targetModel.model, revisionIds);\n if (entries.isFail()) {\n if (entries.error.code === ENTRIES_NOT_AUTHORIZED) {\n return [];\n }\n throw entries.error;\n }\n\n return entries.value.map(entry => ({ ...targetModel, entry }));\n }\n\n /** The model and its group as the current identity; `null` when they are no target. */\n private async readModel(namespace: string): Promise<TargetModel | null> {\n const modelId = getModelIdFromAppName(namespace);\n if (!modelId) {\n return null;\n }\n\n const model = await this.getModel.execute(modelId);\n if (model.isFail()) {\n if (model.error.code === MODEL_NOT_FOUND || model.error.code === MODEL_NOT_AUTHORIZED) {\n return null;\n }\n throw model.error;\n }\n if (model.value.isPrivate) {\n return null;\n }\n\n const group = await this.modelGroups.getGroup(model.value);\n if (group.isFail()) {\n if (group.error.code === GROUP_NOT_FOUND || group.error.code === GROUP_NOT_AUTHORIZED) {\n return null;\n }\n throw group.error;\n }\n\n return { model: model.value, group: group.value };\n }\n}\n\nexport const CmsEntryTargetReader = Abstraction.createImplementation({\n implementation: CmsEntryTargetReaderImpl,\n dependencies: [\n GetModelUseCase,\n CmsModelGroupService,\n GetRevisionByIdUseCase,\n GetEntriesByIdsUseCase\n ]\n});\n"],"names":["MODEL_NOT_FOUND","MODEL_NOT_AUTHORIZED","GROUP_NOT_FOUND","GROUP_NOT_AUTHORIZED","ENTRY_NOT_FOUND","ENTRIES_NOT_AUTHORIZED","CmsEntryTargetReaderImpl","getModel","modelGroups","getRevisionById","getEntriesByIds","params","targetModel","entry","revisionIds","Set","entries","namespace","modelId","getModelIdFromAppName","model","group","CmsEntryTargetReader","Abstraction","GetModelUseCase","CmsModelGroupService","GetRevisionByIdUseCase","GetEntriesByIdsUseCase"],"mappings":";;;;;;AAQA,MAAMA,kBAAkB;AACxB,MAAMC,uBAAuB;AAC7B,MAAMC,kBAAkB;AACxB,MAAMC,uBAAuB;AAC7B,MAAMC,kBAAkB;AAExB,MAAMC,yBAAyB;AAc/B,MAAMC;IACF,YACYC,QAAmC,EACnCC,WAA2C,EAC3CC,eAAiD,EACjDC,eAAiD,CAC3D;aAJUH,QAAQ,GAARA;aACAC,WAAW,GAAXA;aACAC,eAAe,GAAfA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAa,KAAKC,MAA0B,EAAsC;QAC9E,MAAMC,cAAc,MAAM,IAAI,CAAC,SAAS,CAACD,OAAO,KAAK;QACrD,IAAI,CAACC,aACD,OAAO;QAGX,MAAMC,QAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAC5CD,YAAY,KAAK,EACjBD,OAAO,gBAAgB;QAE3B,IAAIE,MAAM,MAAM,IAAI;YAChB,IAAIA,MAAM,KAAK,CAAC,IAAI,KAAKT,iBACrB,OAAO;YAEX,MAAMS,MAAM,KAAK;QACrB;QAEA,OAAO;YAAE,GAAGD,WAAW;YAAE,OAAOC,MAAM,KAAK;QAAC;IAChD;IAEA,MAAa,SAASF,MAA8B,EAAiC;QACjF,IAAIA,AAAoC,MAApCA,OAAO,iBAAiB,CAAC,MAAM,EAC/B,OAAO,EAAE;QAEb,MAAMC,cAAc,MAAM,IAAI,CAAC,SAAS,CAACD,OAAO,KAAK;QACrD,IAAI,CAACC,aACD,OAAO,EAAE;QAIb,MAAME,cAAc;eAAI,IAAIC,IAAIJ,OAAO,iBAAiB;SAAE;QAC1D,MAAMK,UAAU,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACJ,YAAY,KAAK,EAAEE;QACtE,IAAIE,QAAQ,MAAM,IAAI;YAClB,IAAIA,QAAQ,KAAK,CAAC,IAAI,KAAKX,wBACvB,OAAO,EAAE;YAEb,MAAMW,QAAQ,KAAK;QACvB;QAEA,OAAOA,QAAQ,KAAK,CAAC,GAAG,CAACH,CAAAA,QAAU;gBAAE,GAAGD,WAAW;gBAAEC;YAAM;IAC/D;IAGA,MAAc,UAAUI,SAAiB,EAA+B;QACpE,MAAMC,UAAUC,sBAAsBF;QACtC,IAAI,CAACC,SACD,OAAO;QAGX,MAAME,QAAQ,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACF;QAC1C,IAAIE,MAAM,MAAM,IAAI;YAChB,IAAIA,MAAM,KAAK,CAAC,IAAI,KAAKpB,mBAAmBoB,MAAM,KAAK,CAAC,IAAI,KAAKnB,sBAC7D,OAAO;YAEX,MAAMmB,MAAM,KAAK;QACrB;QACA,IAAIA,MAAM,KAAK,CAAC,SAAS,EACrB,OAAO;QAGX,MAAMC,QAAQ,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAACD,MAAM,KAAK;QACzD,IAAIC,MAAM,MAAM,IAAI;YAChB,IAAIA,MAAM,KAAK,CAAC,IAAI,KAAKnB,mBAAmBmB,MAAM,KAAK,CAAC,IAAI,KAAKlB,sBAC7D,OAAO;YAEX,MAAMkB,MAAM,KAAK;QACrB;QAEA,OAAO;YAAE,OAAOD,MAAM,KAAK;YAAE,OAAOC,MAAM,KAAK;QAAC;IACpD;AACJ;AAEO,MAAMC,4CAAuBC,qBAAAA,oBAAgC,CAAC;IACjE,gBAAgBjB;IAChB,cAAc;QACVkB;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CmsEntry, CmsGroup, CmsModel } from "@webiny/api-headless-cms/types/index.js";
|
|
2
|
+
export interface CmsEntryTargetReadParams {
|
|
3
|
+
/** Namespace id, e.g. "cms.article". */
|
|
4
|
+
model: string;
|
|
5
|
+
targetRevisionId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CmsEntryTargetsReadParams {
|
|
8
|
+
/** Namespace id, e.g. "cms.article". */
|
|
9
|
+
model: string;
|
|
10
|
+
targetRevisionIds: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface CmsEntryTarget {
|
|
13
|
+
model: CmsModel;
|
|
14
|
+
/** The model's group, read as the current identity; group read is part of entry access (R72). */
|
|
15
|
+
group: CmsGroup;
|
|
16
|
+
entry: CmsEntry;
|
|
17
|
+
}
|
|
18
|
+
export interface ICmsEntryTargetReader {
|
|
19
|
+
/**
|
|
20
|
+
* Reads the revision as the current identity. `null` when the namespace is not `cms.*`, the
|
|
21
|
+
* model or its group does not exist or cannot be read, the model is private, or the revision
|
|
22
|
+
* does not exist (a trashed revision reads as missing). Other failures are thrown.
|
|
23
|
+
*/
|
|
24
|
+
read(params: CmsEntryTargetReadParams): Promise<CmsEntryTarget | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Reads many revisions of one model in one batch read, as the current identity, in no
|
|
27
|
+
* particular order. A revision that does not exist (or is trashed) is left out; `[]` when the
|
|
28
|
+
* model or group cannot be read, the model is private or the identity has no entry
|
|
29
|
+
* permission on it. Other failures are thrown.
|
|
30
|
+
*/
|
|
31
|
+
readMany(params: CmsEntryTargetsReadParams): Promise<CmsEntryTarget[]>;
|
|
32
|
+
}
|
|
33
|
+
/** Loads a CMS target revision for the `cms.*` adapter and wrappers (R47). */
|
|
34
|
+
export declare const CmsEntryTargetReader: import("@webiny/di").Abstraction<ICmsEntryTargetReader>;
|
|
35
|
+
export declare namespace CmsEntryTargetReader {
|
|
36
|
+
type Interface = ICmsEntryTargetReader;
|
|
37
|
+
type Params = CmsEntryTargetReadParams;
|
|
38
|
+
type ManyParams = CmsEntryTargetsReadParams;
|
|
39
|
+
type Target = CmsEntryTarget;
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/CmsEntryTargetReader/abstractions.js","sources":["../../../../src/features/target/CmsEntryTargetReader/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsEntry, CmsGroup, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\n\nexport interface CmsEntryTargetReadParams {\n /** Namespace id, e.g. \"cms.article\". */\n model: string;\n targetRevisionId: string;\n}\n\nexport interface CmsEntryTargetsReadParams {\n /** Namespace id, e.g. \"cms.article\". */\n model: string;\n targetRevisionIds: string[];\n}\n\nexport interface CmsEntryTarget {\n model: CmsModel;\n /** The model's group, read as the current identity; group read is part of entry access (R72). */\n group: CmsGroup;\n entry: CmsEntry;\n}\n\nexport interface ICmsEntryTargetReader {\n /**\n * Reads the revision as the current identity. `null` when the namespace is not `cms.*`, the\n * model or its group does not exist or cannot be read, the model is private, or the revision\n * does not exist (a trashed revision reads as missing). Other failures are thrown.\n */\n read(params: CmsEntryTargetReadParams): Promise<CmsEntryTarget | null>;\n /**\n * Reads many revisions of one model in one batch read, as the current identity, in no\n * particular order. A revision that does not exist (or is trashed) is left out; `[]` when the\n * model or group cannot be read, the model is private or the identity has no entry\n * permission on it. Other failures are thrown.\n */\n readMany(params: CmsEntryTargetsReadParams): Promise<CmsEntryTarget[]>;\n}\n\n/** Loads a CMS target revision for the `cms.*` adapter and wrappers (R47). */\nexport const CmsEntryTargetReader =\n createAbstraction<ICmsEntryTargetReader>(\"CmsEntryTargetReader\");\n\nexport namespace CmsEntryTargetReader {\n export type Interface = ICmsEntryTargetReader;\n export type Params = CmsEntryTargetReadParams;\n export type ManyParams = CmsEntryTargetsReadParams;\n export type Target = CmsEntryTarget;\n}\n"],"names":["CmsEntryTargetReader","createAbstraction"],"mappings":";AAuCO,MAAMA,uBACTC,kBAAyC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CmsEntryTargetReader } from "./abstractions.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CmsEntryTargetReader } from "./abstractions.js";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CmsModel } from "@webiny/api-headless-cms/types/index.js";
|
|
2
|
+
import { ListGroupsUseCase } from "@webiny/api-headless-cms/features/contentModelGroup/ListGroups/index.js";
|
|
3
|
+
import { CmsModelGroupService as Abstraction } from "./abstractions.js";
|
|
4
|
+
declare class CmsModelGroupServiceImpl implements Abstraction.Interface {
|
|
5
|
+
private listGroups;
|
|
6
|
+
constructor(listGroups: ListGroupsUseCase.Interface);
|
|
7
|
+
getGroup(model: CmsModel): Abstraction.Return;
|
|
8
|
+
}
|
|
9
|
+
export declare const CmsModelGroupService: typeof CmsModelGroupServiceImpl & {
|
|
10
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICmsModelGroupService>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { ListGroupsUseCase } from "@webiny/api-headless-cms/features/contentModelGroup/ListGroups/index.js";
|
|
3
|
+
import { GroupNotFoundError } from "@webiny/api-headless-cms/domain/contentModelGroup/errors.js";
|
|
4
|
+
import { CmsModelGroupService } from "./abstractions.js";
|
|
5
|
+
class CmsModelGroupServiceImpl {
|
|
6
|
+
constructor(listGroups){
|
|
7
|
+
this.listGroups = listGroups;
|
|
8
|
+
}
|
|
9
|
+
async getGroup(model) {
|
|
10
|
+
const groups = await this.listGroups.execute();
|
|
11
|
+
if (groups.isFail()) return Result.fail(groups.error);
|
|
12
|
+
const group = groups.value.find((item)=>item.slug === model.group);
|
|
13
|
+
if (!group) return Result.fail(new GroupNotFoundError(model.group));
|
|
14
|
+
return Result.ok(group);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const CmsModelGroupService_CmsModelGroupService = CmsModelGroupService.createImplementation({
|
|
18
|
+
implementation: CmsModelGroupServiceImpl,
|
|
19
|
+
dependencies: [
|
|
20
|
+
ListGroupsUseCase
|
|
21
|
+
]
|
|
22
|
+
});
|
|
23
|
+
export { CmsModelGroupService_CmsModelGroupService as CmsModelGroupService };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=CmsModelGroupService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/CmsModelGroupService/CmsModelGroupService.js","sources":["../../../../src/features/target/CmsModelGroupService/CmsModelGroupService.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { ListGroupsUseCase } from \"@webiny/api-headless-cms/features/contentModelGroup/ListGroups/index.js\";\nimport { GroupNotFoundError } from \"@webiny/api-headless-cms/domain/contentModelGroup/errors.js\";\nimport { CmsModelGroupService as Abstraction } from \"./abstractions.js\";\n\nclass CmsModelGroupServiceImpl implements Abstraction.Interface {\n public constructor(private listGroups: ListGroupsUseCase.Interface) {}\n\n public async getGroup(model: CmsModel): Abstraction.Return {\n const groups = await this.listGroups.execute();\n if (groups.isFail()) {\n return Result.fail(groups.error);\n }\n const group = groups.value.find(item => item.slug === model.group);\n if (!group) {\n return Result.fail(new GroupNotFoundError(model.group));\n }\n return Result.ok(group);\n }\n}\n\nexport const CmsModelGroupService = Abstraction.createImplementation({\n implementation: CmsModelGroupServiceImpl,\n dependencies: [ListGroupsUseCase]\n});\n"],"names":["CmsModelGroupServiceImpl","listGroups","model","groups","Result","group","item","GroupNotFoundError","CmsModelGroupService","Abstraction","ListGroupsUseCase"],"mappings":";;;;AAMA,MAAMA;IACF,YAA2BC,UAAuC,CAAE;aAAzCA,UAAU,GAAVA;IAA0C;IAErE,MAAa,SAASC,KAAe,EAAsB;QACvD,MAAMC,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO;QAC5C,IAAIA,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAACD,OAAO,KAAK;QAEnC,MAAME,QAAQF,OAAO,KAAK,CAAC,IAAI,CAACG,CAAAA,OAAQA,KAAK,IAAI,KAAKJ,MAAM,KAAK;QACjE,IAAI,CAACG,OACD,OAAOD,OAAO,IAAI,CAAC,IAAIG,mBAAmBL,MAAM,KAAK;QAEzD,OAAOE,OAAO,EAAE,CAACC;IACrB;AACJ;AAEO,MAAMG,4CAAuBC,qBAAAA,oBAAgC,CAAC;IACjE,gBAAgBT;IAChB,cAAc;QAACU;KAAkB;AACrC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Result } from "@webiny/feature/api";
|
|
2
|
+
import type { CmsGroup, CmsModel } from "@webiny/api-headless-cms/types/index.js";
|
|
3
|
+
import type { GroupNotFoundError } from "@webiny/api-headless-cms/domain/contentModelGroup/errors.js";
|
|
4
|
+
import type { ListGroupsUseCase } from "@webiny/api-headless-cms/features/contentModelGroup/ListGroups/index.js";
|
|
5
|
+
export type CmsModelGroupError = GroupNotFoundError | ListGroupsUseCase.Error;
|
|
6
|
+
export interface ICmsModelGroupService {
|
|
7
|
+
/**
|
|
8
|
+
* The model's group, read as the current identity. Fails with `Cms/ModelGroup/NotFound` when
|
|
9
|
+
* no readable group has the model's slug, `Cms/ModelGroup/NotAuthorized` without group read,
|
|
10
|
+
* or the list's persistence error.
|
|
11
|
+
*/
|
|
12
|
+
getGroup(model: CmsModel): Promise<Result<CmsGroup, CmsModelGroupError>>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Finds a model's group. A model holds its group's slug, not its id (database groups get a
|
|
16
|
+
* generated id), so the group is found by slug in the access-controlled group list, as the CMS
|
|
17
|
+
* `AccessControl` does.
|
|
18
|
+
*/
|
|
19
|
+
export declare const CmsModelGroupService: import("@webiny/di").Abstraction<ICmsModelGroupService>;
|
|
20
|
+
export declare namespace CmsModelGroupService {
|
|
21
|
+
type Interface = ICmsModelGroupService;
|
|
22
|
+
type Error = CmsModelGroupError;
|
|
23
|
+
type Return = Promise<Result<CmsGroup, CmsModelGroupError>>;
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/CmsModelGroupService/abstractions.js","sources":["../../../../src/features/target/CmsModelGroupService/abstractions.ts"],"sourcesContent":["import { createAbstraction, type Result } from \"@webiny/feature/api\";\nimport type { CmsGroup, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { GroupNotFoundError } from \"@webiny/api-headless-cms/domain/contentModelGroup/errors.js\";\nimport type { ListGroupsUseCase } from \"@webiny/api-headless-cms/features/contentModelGroup/ListGroups/index.js\";\n\nexport type CmsModelGroupError = GroupNotFoundError | ListGroupsUseCase.Error;\n\nexport interface ICmsModelGroupService {\n /**\n * The model's group, read as the current identity. Fails with `Cms/ModelGroup/NotFound` when\n * no readable group has the model's slug, `Cms/ModelGroup/NotAuthorized` without group read,\n * or the list's persistence error.\n */\n getGroup(model: CmsModel): Promise<Result<CmsGroup, CmsModelGroupError>>;\n}\n\n/**\n * Finds a model's group. A model holds its group's slug, not its id (database groups get a\n * generated id), so the group is found by slug in the access-controlled group list, as the CMS\n * `AccessControl` does.\n */\nexport const CmsModelGroupService =\n createAbstraction<ICmsModelGroupService>(\"CmsModelGroupService\");\n\nexport namespace CmsModelGroupService {\n export type Interface = ICmsModelGroupService;\n export type Error = CmsModelGroupError;\n export type Return = Promise<Result<CmsGroup, CmsModelGroupError>>;\n}\n"],"names":["CmsModelGroupService","createAbstraction"],"mappings":";AAqBO,MAAMA,uBACTC,kBAAyC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CmsModelGroupService } from "./abstractions.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CmsModelGroupService } from "./abstractions.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { WorkflowModelParser } from "@webiny/api-workflows/features/model/WorkflowModelParser/index.js";
|
|
2
|
+
/** A `cms.<modelId>` workflow model: the `cms` app and the CMS model id (D15, D137, R113). */
|
|
3
|
+
declare class CmsWorkflowModelParserImpl implements WorkflowModelParser.Interface {
|
|
4
|
+
parse(model: string): WorkflowModelParser.Parsed | null;
|
|
5
|
+
}
|
|
6
|
+
export declare const CmsWorkflowModelParser: typeof CmsWorkflowModelParserImpl & {
|
|
7
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-workflows/features/model/WorkflowModelParser/abstractions").IWorkflowModelParser>;
|
|
8
|
+
};
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { WorkflowModelParser } from "@webiny/api-workflows/features/model/WorkflowModelParser/index.js";
|
|
2
|
+
import { getModelIdFromAppName } from "../../utils/appName.js";
|
|
3
|
+
class CmsWorkflowModelParserImpl {
|
|
4
|
+
parse(model) {
|
|
5
|
+
const modelId = getModelIdFromAppName(model);
|
|
6
|
+
return modelId ? {
|
|
7
|
+
app: "cms",
|
|
8
|
+
modelId
|
|
9
|
+
} : null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const CmsWorkflowModelParser = WorkflowModelParser.createImplementation({
|
|
13
|
+
implementation: CmsWorkflowModelParserImpl,
|
|
14
|
+
dependencies: []
|
|
15
|
+
});
|
|
16
|
+
export { CmsWorkflowModelParser };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=CmsWorkflowModelParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/CmsWorkflowModelParser.js","sources":["../../../src/features/target/CmsWorkflowModelParser.ts"],"sourcesContent":["import { WorkflowModelParser } from \"@webiny/api-workflows/features/model/WorkflowModelParser/index.js\";\nimport { getModelIdFromAppName } from \"~/utils/appName.js\";\n\n/** A `cms.<modelId>` workflow model: the `cms` app and the CMS model id (D15, D137, R113). */\nclass CmsWorkflowModelParserImpl implements WorkflowModelParser.Interface {\n public parse(model: string): WorkflowModelParser.Parsed | null {\n const modelId = getModelIdFromAppName(model);\n return modelId ? { app: \"cms\", modelId } : null;\n }\n}\n\nexport const CmsWorkflowModelParser = WorkflowModelParser.createImplementation({\n implementation: CmsWorkflowModelParserImpl,\n dependencies: []\n});\n"],"names":["CmsWorkflowModelParserImpl","model","modelId","getModelIdFromAppName","CmsWorkflowModelParser","WorkflowModelParser"],"mappings":";;AAIA,MAAMA;IACK,MAAMC,KAAa,EAAqC;QAC3D,MAAMC,UAAUC,sBAAsBF;QACtC,OAAOC,UAAU;YAAE,KAAK;YAAOA;QAAQ,IAAI;IAC/C;AACJ;AAEO,MAAME,yBAAyBC,oBAAoB,oBAAoB,CAAC;IAC3E,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folder content read of the current identity, decided from folder permissions loaded once for
|
|
3
|
+
* many checks (Q79), instead of one `getFolderLevelPermissions` read per check. Used by the
|
|
4
|
+
* access checks (`CmsEntryAccess`, `WbPageAccess`) for bulk and candidate checks.
|
|
5
|
+
*/
|
|
6
|
+
export interface FolderReadRule {
|
|
7
|
+
/** Whether the current identity can read content in the folder (never the root folder). */
|
|
8
|
+
canReadFolder(folderId: string): Promise<boolean>;
|
|
9
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CmsEntrySystemField } from "@webiny/api-headless-cms/features/contentEntry/EntrySystemField/index.js";
|
|
2
|
+
import type { CmsModelField } from "@webiny/api-headless-cms/types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Makes `system.workflow` filterable in CMS entry listing (spec 4.5), on every storage. Website
|
|
5
|
+
* Builder pages are CMS entries, so this covers them too.
|
|
6
|
+
*/
|
|
7
|
+
declare class WorkflowEntrySystemFieldImpl implements CmsEntrySystemField.Interface {
|
|
8
|
+
readonly field: CmsModelField;
|
|
9
|
+
}
|
|
10
|
+
export declare const WorkflowEntrySystemField: typeof WorkflowEntrySystemFieldImpl & {
|
|
11
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-headless-cms/features/contentEntry/EntrySystemField/abstractions").ICmsEntrySystemField>;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createModelField } from "@webiny/api-headless-cms";
|
|
2
|
+
import { CmsEntrySystemField } from "@webiny/api-headless-cms/features/contentEntry/EntrySystemField/index.js";
|
|
3
|
+
const WORKFLOW_TEXT_FIELDS = [
|
|
4
|
+
"workflowId",
|
|
5
|
+
"reviewState",
|
|
6
|
+
"stepId",
|
|
7
|
+
"stepState"
|
|
8
|
+
];
|
|
9
|
+
class WorkflowEntrySystemFieldImpl {
|
|
10
|
+
constructor(){
|
|
11
|
+
this.field = createModelField({
|
|
12
|
+
id: "workflow",
|
|
13
|
+
fieldId: "workflow",
|
|
14
|
+
storageId: "workflow",
|
|
15
|
+
type: "object",
|
|
16
|
+
label: "Workflow",
|
|
17
|
+
settings: {
|
|
18
|
+
fields: WORKFLOW_TEXT_FIELDS.map((fieldId)=>createModelField({
|
|
19
|
+
id: fieldId,
|
|
20
|
+
fieldId,
|
|
21
|
+
storageId: fieldId,
|
|
22
|
+
type: "text",
|
|
23
|
+
label: fieldId
|
|
24
|
+
}))
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const WorkflowEntrySystemField = CmsEntrySystemField.createImplementation({
|
|
30
|
+
implementation: WorkflowEntrySystemFieldImpl,
|
|
31
|
+
dependencies: []
|
|
32
|
+
});
|
|
33
|
+
export { WorkflowEntrySystemField };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=WorkflowEntrySystemField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/WorkflowEntrySystemField.js","sources":["../../../src/features/target/WorkflowEntrySystemField.ts"],"sourcesContent":["import { createModelField } from \"@webiny/api-headless-cms\";\nimport { CmsEntrySystemField } from \"@webiny/api-headless-cms/features/contentEntry/EntrySystemField/index.js\";\nimport type { CmsModelField } from \"@webiny/api-headless-cms/types/index.js\";\n\nconst WORKFLOW_TEXT_FIELDS = [\"workflowId\", \"reviewState\", \"stepId\", \"stepState\"];\n\n/**\n * Makes `system.workflow` filterable in CMS entry listing (spec 4.5), on every storage. Website\n * Builder pages are CMS entries, so this covers them too.\n */\nclass WorkflowEntrySystemFieldImpl implements CmsEntrySystemField.Interface {\n public readonly field: CmsModelField = createModelField({\n id: \"workflow\",\n fieldId: \"workflow\",\n storageId: \"workflow\",\n type: \"object\",\n label: \"Workflow\",\n settings: {\n fields: WORKFLOW_TEXT_FIELDS.map(fieldId => {\n return createModelField({\n id: fieldId,\n fieldId,\n storageId: fieldId,\n type: \"text\",\n label: fieldId\n });\n })\n }\n });\n}\n\nexport const WorkflowEntrySystemField = CmsEntrySystemField.createImplementation({\n implementation: WorkflowEntrySystemFieldImpl,\n dependencies: []\n});\n"],"names":["WORKFLOW_TEXT_FIELDS","WorkflowEntrySystemFieldImpl","createModelField","fieldId","WorkflowEntrySystemField","CmsEntrySystemField"],"mappings":";;AAIA,MAAMA,uBAAuB;IAAC;IAAc;IAAe;IAAU;CAAY;AAMjF,MAAMC;;aACc,KAAK,GAAkBC,iBAAiB;YACpD,IAAI;YACJ,SAAS;YACT,WAAW;YACX,MAAM;YACN,OAAO;YACP,UAAU;gBACN,QAAQF,qBAAqB,GAAG,CAACG,CAAAA,UACtBD,iBAAiB;wBACpB,IAAIC;wBACJA;wBACA,WAAWA;wBACX,MAAM;wBACN,OAAOA;oBACX;YAER;QACJ;;AACJ;AAEO,MAAMC,2BAA2BC,oBAAoB,oBAAoB,CAAC;IAC7E,gBAAgBJ;IAChB,cAAc,EAAE;AACpB"}
|