@webiny/api-website-builder-workflows 0.0.0-unstable.9f53ea597d → 0.0.0-unstable.a85ef555b2
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/WebsiteBuilderPageSchemaFactory.d.ts +15 -0
- package/WebsiteBuilderPageSchemaFactory.js +30 -0
- package/WebsiteBuilderPageSchemaFactory.js.map +1 -0
- package/WebsiteBuilderWorkflowsFeature.d.ts +5 -0
- package/WebsiteBuilderWorkflowsFeature.js +21 -0
- package/WebsiteBuilderWorkflowsFeature.js.map +1 -0
- package/constants.d.ts +4 -0
- package/constants.js +5 -0
- package/constants.js.map +1 -0
- package/features/hooks/BlockPageDeleteWhileInReview.d.ts +20 -0
- package/features/hooks/BlockPageDeleteWhileInReview.js +43 -0
- package/features/hooks/BlockPageDeleteWhileInReview.js.map +1 -0
- package/features/hooks/BlockPageFolderChangeWhileInReview.d.ts +19 -0
- package/features/hooks/BlockPageFolderChangeWhileInReview.js +27 -0
- package/features/hooks/BlockPageFolderChangeWhileInReview.js.map +1 -0
- package/features/hooks/BlockPageMoveWhileInReview.d.ts +18 -0
- package/features/hooks/BlockPageMoveWhileInReview.js +44 -0
- package/features/hooks/BlockPageMoveWhileInReview.js.map +1 -0
- package/features/hooks/BlockPageRevisionDeleteWhileInReview.d.ts +13 -0
- package/features/hooks/BlockPageRevisionDeleteWhileInReview.js +44 -0
- package/features/hooks/BlockPageRevisionDeleteWhileInReview.js.map +1 -0
- package/features/hooks/BlockPageTrashWhileInReview.d.ts +21 -0
- package/features/hooks/BlockPageTrashWhileInReview.js +43 -0
- package/features/hooks/BlockPageTrashWhileInReview.js.map +1 -0
- package/features/hooks/BlockPageUpdateWhileInReview.d.ts +20 -0
- package/features/hooks/BlockPageUpdateWhileInReview.js +25 -0
- package/features/hooks/BlockPageUpdateWhileInReview.js.map +1 -0
- package/features/hooks/DeleteReviewsOnPageDelete.d.ts +20 -0
- package/features/hooks/DeleteReviewsOnPageDelete.js +43 -0
- package/features/hooks/DeleteReviewsOnPageDelete.js.map +1 -0
- package/features/hooks/DeleteReviewsOnPageRevisionDelete.d.ts +13 -0
- package/features/hooks/DeleteReviewsOnPageRevisionDelete.js +44 -0
- package/features/hooks/DeleteReviewsOnPageRevisionDelete.js.map +1 -0
- package/features/hooks/NullReviewStateOnGraduatedVariantDecorator.d.ts +27 -0
- package/features/hooks/NullReviewStateOnGraduatedVariantDecorator.js +53 -0
- package/features/hooks/NullReviewStateOnGraduatedVariantDecorator.js.map +1 -0
- package/features/hooks/NullReviewStateOnPageRevisionCreate.d.ts +26 -0
- package/features/hooks/NullReviewStateOnPageRevisionCreate.js +43 -0
- package/features/hooks/NullReviewStateOnPageRevisionCreate.js.map +1 -0
- package/features/hooks/RequireApprovedReviewOnPagePublish.d.ts +20 -0
- package/features/hooks/RequireApprovedReviewOnPagePublish.js +42 -0
- package/features/hooks/RequireApprovedReviewOnPagePublish.js.map +1 -0
- package/features/hooks/feature.d.ts +9 -0
- package/features/hooks/feature.js +31 -0
- package/features/hooks/feature.js.map +1 -0
- package/features/target/WbPageAccess/WbPageAccess.d.ts +27 -0
- package/features/target/WbPageAccess/WbPageAccess.js +84 -0
- package/features/target/WbPageAccess/WbPageAccess.js.map +1 -0
- package/features/target/WbPageAccess/abstractions.d.ts +39 -0
- package/features/target/WbPageAccess/abstractions.js +5 -0
- package/features/target/WbPageAccess/abstractions.js.map +1 -0
- package/features/target/WbPageAccess/index.d.ts +1 -0
- package/features/target/WbPageAccess/index.js +1 -0
- package/features/target/WbPageDeniedFolders/WbPageDeniedFolders.d.ts +20 -0
- package/features/target/WbPageDeniedFolders/WbPageDeniedFolders.js +55 -0
- package/features/target/WbPageDeniedFolders/WbPageDeniedFolders.js.map +1 -0
- package/features/target/WbPageDeniedFolders/abstractions.d.ts +23 -0
- package/features/target/WbPageDeniedFolders/abstractions.js +5 -0
- package/features/target/WbPageDeniedFolders/abstractions.js.map +1 -0
- package/features/target/WbPageDeniedFolders/index.d.ts +1 -0
- package/features/target/WbPageDeniedFolders/index.js +1 -0
- package/features/target/WbPageFolderExistsService/WbPageFolderExistsService.d.ts +15 -0
- package/features/target/WbPageFolderExistsService/WbPageFolderExistsService.js +27 -0
- package/features/target/WbPageFolderExistsService/WbPageFolderExistsService.js.map +1 -0
- package/features/target/WbPageFolderExistsService/abstractions.d.ts +16 -0
- package/features/target/WbPageFolderExistsService/abstractions.js +5 -0
- package/features/target/WbPageFolderExistsService/abstractions.js.map +1 -0
- package/features/target/WbPageFolderExistsService/index.d.ts +1 -0
- package/features/target/WbPageFolderExistsService/index.js +1 -0
- package/features/target/WbPageReviewNamespace.d.ts +14 -0
- package/features/target/WbPageReviewNamespace.js +15 -0
- package/features/target/WbPageReviewNamespace.js.map +1 -0
- package/features/target/WbPageReviewReadFilter/WbPageReviewReadFilter.d.ts +17 -0
- package/features/target/WbPageReviewReadFilter/WbPageReviewReadFilter.js +53 -0
- package/features/target/WbPageReviewReadFilter/WbPageReviewReadFilter.js.map +1 -0
- package/features/target/WbPageReviewReadFilter/abstractions.d.ts +21 -0
- package/features/target/WbPageReviewReadFilter/abstractions.js +5 -0
- package/features/target/WbPageReviewReadFilter/abstractions.js.map +1 -0
- package/features/target/WbPageReviewReadFilter/index.d.ts +1 -0
- package/features/target/WbPageReviewReadFilter/index.js +1 -0
- package/features/target/WbPageReviewTargetEditor.d.ts +33 -0
- package/features/target/WbPageReviewTargetEditor.js +109 -0
- package/features/target/WbPageReviewTargetEditor.js.map +1 -0
- package/features/target/WbPageReviewTargetFolderChain.d.ts +22 -0
- package/features/target/WbPageReviewTargetFolderChain.js +34 -0
- package/features/target/WbPageReviewTargetFolderChain.js.map +1 -0
- package/features/target/WbPageReviewTargetLink.d.ts +17 -0
- package/features/target/WbPageReviewTargetLink.js +17 -0
- package/features/target/WbPageReviewTargetLink.js.map +1 -0
- package/features/target/WbPageReviewTargetLoader.d.ts +13 -0
- package/features/target/WbPageReviewTargetLoader.js +29 -0
- package/features/target/WbPageReviewTargetLoader.js.map +1 -0
- package/features/target/WbPageReviewTargetReadAccess.d.ts +33 -0
- package/features/target/WbPageReviewTargetReadAccess.js +72 -0
- package/features/target/WbPageReviewTargetReadAccess.js.map +1 -0
- package/features/target/WbPageReviewTargetSync.d.ts +23 -0
- package/features/target/WbPageReviewTargetSync.js +39 -0
- package/features/target/WbPageReviewTargetSync.js.map +1 -0
- package/features/target/WbPageTargetReader/WbPageTargetReader.d.ts +20 -0
- package/features/target/WbPageTargetReader/WbPageTargetReader.js +51 -0
- package/features/target/WbPageTargetReader/WbPageTargetReader.js.map +1 -0
- package/features/target/WbPageTargetReader/abstractions.d.ts +37 -0
- package/features/target/WbPageTargetReader/abstractions.js +5 -0
- package/features/target/WbPageTargetReader/abstractions.js.map +1 -0
- package/features/target/WbPageTargetReader/index.d.ts +1 -0
- package/features/target/WbPageTargetReader/index.js +1 -0
- package/features/target/WbWorkflowModelParser.d.ts +9 -0
- package/features/target/WbWorkflowModelParser.js +18 -0
- package/features/target/WbWorkflowModelParser.js.map +1 -0
- package/features/target/feature.d.ts +5 -0
- package/features/target/feature.js +35 -0
- package/features/target/feature.js.map +1 -0
- package/features/target/isWbPageEditorValue.d.ts +9 -0
- package/features/target/isWbPageEditorValue.js +34 -0
- package/features/target/isWbPageEditorValue.js.map +1 -0
- package/features/target/toWbPageEditorFields.d.ts +32 -0
- package/features/target/toWbPageEditorFields.js +102 -0
- package/features/target/toWbPageEditorFields.js.map +1 -0
- package/features/target/toWbPageProperties.d.ts +10 -0
- package/features/target/toWbPageProperties.js +27 -0
- package/features/target/toWbPageProperties.js.map +1 -0
- package/features/target/toWbPageReviewTarget.d.ts +4 -0
- package/features/target/toWbPageReviewTarget.js +25 -0
- package/features/target/toWbPageReviewTarget.js.map +1 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/ApproveWebsiteBuilderPageReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/ApproveWebsiteBuilderPageReviewStepUseCase.js +35 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/ApproveWebsiteBuilderPageReviewStepUseCase.js.map +1 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/abstractions.d.ts +26 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/abstractions.js +5 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/feature.d.ts +4 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/feature.js +11 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/feature.js.map +1 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/index.d.ts +1 -0
- package/features/wrappers/ApproveWebsiteBuilderPageReviewStep/index.js +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/CancelWebsiteBuilderPageReviewUseCase.d.ts +13 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/CancelWebsiteBuilderPageReviewUseCase.js +37 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/CancelWebsiteBuilderPageReviewUseCase.js.map +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/abstractions.d.ts +30 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/abstractions.js +5 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/abstractions.js.map +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/feature.d.ts +4 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/feature.js +11 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/feature.js.map +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/index.d.ts +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReview/index.js +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/CancelWebsiteBuilderPageReviewsForDeleteUseCase.d.ts +19 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/CancelWebsiteBuilderPageReviewsForDeleteUseCase.js +81 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/CancelWebsiteBuilderPageReviewsForDeleteUseCase.js.map +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/abstractions.d.ts +39 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/abstractions.js +5 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/abstractions.js.map +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/feature.d.ts +4 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/feature.js +11 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/feature.js.map +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/index.d.ts +1 -0
- package/features/wrappers/CancelWebsiteBuilderPageReviewsForDelete/index.js +1 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/DeleteWebsiteBuilderPageWorkflowUseCase.d.ts +25 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/DeleteWebsiteBuilderPageWorkflowUseCase.js +95 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/DeleteWebsiteBuilderPageWorkflowUseCase.js.map +1 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/abstractions.d.ts +32 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/abstractions.js +5 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/abstractions.js.map +1 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/feature.d.ts +4 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/feature.js +11 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/feature.js.map +1 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/index.d.ts +1 -0
- package/features/wrappers/DeleteWebsiteBuilderPageWorkflow/index.js +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/GetWebsiteBuilderPageReviewUseCase.d.ts +13 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/GetWebsiteBuilderPageReviewUseCase.js +40 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/GetWebsiteBuilderPageReviewUseCase.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/abstractions.d.ts +29 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/abstractions.js +5 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/abstractions.js.map +1 -0
- package/features/{PageWorkflows → wrappers/GetWebsiteBuilderPageReview}/feature.d.ts +1 -1
- package/features/wrappers/GetWebsiteBuilderPageReview/feature.js +11 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/feature.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/index.d.ts +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReview/index.js +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/GetWebsiteBuilderPageReviewStepRunUseCase.d.ts +13 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/GetWebsiteBuilderPageReviewStepRunUseCase.js +39 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/GetWebsiteBuilderPageReviewStepRunUseCase.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/abstractions.d.ts +33 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/abstractions.js +5 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/abstractions.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/feature.d.ts +4 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/feature.js +11 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/feature.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/index.d.ts +1 -0
- package/features/wrappers/GetWebsiteBuilderPageReviewStepRun/index.js +1 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/GetWebsiteBuilderPageTargetReviewUseCase.d.ts +19 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/GetWebsiteBuilderPageTargetReviewUseCase.js +72 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/GetWebsiteBuilderPageTargetReviewUseCase.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/abstractions.d.ts +34 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/abstractions.js +5 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/abstractions.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/feature.d.ts +4 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/feature.js +11 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/feature.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/index.d.ts +1 -0
- package/features/wrappers/GetWebsiteBuilderPageTargetReview/index.js +1 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/GetWebsiteBuilderPageWorkflowUseCase.d.ts +13 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/GetWebsiteBuilderPageWorkflowUseCase.js +34 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/GetWebsiteBuilderPageWorkflowUseCase.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/abstractions.d.ts +24 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/abstractions.js +5 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/abstractions.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/feature.d.ts +4 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/feature.js +11 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/feature.js.map +1 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/index.d.ts +1 -0
- package/features/wrappers/GetWebsiteBuilderPageWorkflow/index.js +1 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/InspectWebsiteBuilderPageRoutingUseCase.d.ts +19 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/InspectWebsiteBuilderPageRoutingUseCase.js +51 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/InspectWebsiteBuilderPageRoutingUseCase.js.map +1 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/abstractions.d.ts +34 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/abstractions.js +5 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/abstractions.js.map +1 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/feature.d.ts +4 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/feature.js +11 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/feature.js.map +1 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/index.d.ts +1 -0
- package/features/wrappers/InspectWebsiteBuilderPageRouting/index.js +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/ListWebsiteBuilderPageReviewStepCandidatesUseCase.d.ts +13 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/ListWebsiteBuilderPageReviewStepCandidatesUseCase.js +41 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/ListWebsiteBuilderPageReviewStepCandidatesUseCase.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/abstractions.d.ts +30 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/abstractions.js +5 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/abstractions.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/feature.d.ts +4 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/feature.js +11 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/feature.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/index.d.ts +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviewStepCandidates/index.js +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/ListWebsiteBuilderPageReviewsUseCase.d.ts +15 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/ListWebsiteBuilderPageReviewsUseCase.js +68 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/ListWebsiteBuilderPageReviewsUseCase.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/abstractions.d.ts +43 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/abstractions.js +5 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/abstractions.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/feature.d.ts +4 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/feature.js +11 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/feature.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/index.d.ts +2 -0
- package/features/wrappers/ListWebsiteBuilderPageReviews/index.js +1 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/ListWebsiteBuilderPageStepCandidatesUseCase.d.ts +25 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/ListWebsiteBuilderPageStepCandidatesUseCase.js +93 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/ListWebsiteBuilderPageStepCandidatesUseCase.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/abstractions.d.ts +41 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/abstractions.js +5 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/abstractions.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/feature.d.ts +4 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/feature.js +11 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/feature.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/index.d.ts +1 -0
- package/features/wrappers/ListWebsiteBuilderPageStepCandidates/index.js +1 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/ListWebsiteBuilderPageWorkflowsUseCase.d.ts +13 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/ListWebsiteBuilderPageWorkflowsUseCase.js +37 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/ListWebsiteBuilderPageWorkflowsUseCase.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/abstractions.d.ts +20 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/abstractions.js +5 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/abstractions.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/feature.d.ts +4 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/feature.js +11 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/feature.js.map +1 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/index.d.ts +1 -0
- package/features/wrappers/ListWebsiteBuilderPageWorkflows/index.js +1 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/ReassignWebsiteBuilderPageReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/ReassignWebsiteBuilderPageReviewStepUseCase.js +40 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/ReassignWebsiteBuilderPageReviewStepUseCase.js.map +1 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/abstractions.d.ts +32 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/abstractions.js +5 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/feature.d.ts +4 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/feature.js +11 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/feature.js.map +1 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/index.d.ts +1 -0
- package/features/wrappers/ReassignWebsiteBuilderPageReviewStep/index.js +1 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/RejectWebsiteBuilderPageReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/RejectWebsiteBuilderPageReviewStepUseCase.js +35 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/RejectWebsiteBuilderPageReviewStepUseCase.js.map +1 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/abstractions.d.ts +26 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/abstractions.js +5 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/feature.d.ts +4 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/feature.js +11 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/feature.js.map +1 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/index.d.ts +1 -0
- package/features/wrappers/RejectWebsiteBuilderPageReviewStep/index.js +1 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/RequestWebsiteBuilderPageReviewUseCase.d.ts +23 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/RequestWebsiteBuilderPageReviewUseCase.js +72 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/RequestWebsiteBuilderPageReviewUseCase.js.map +1 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/abstractions.d.ts +41 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/abstractions.js +5 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/abstractions.js.map +1 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/feature.d.ts +4 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/feature.js +11 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/feature.js.map +1 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/index.d.ts +1 -0
- package/features/wrappers/RequestWebsiteBuilderPageReview/index.js +1 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/RestartWebsiteBuilderPageReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/RestartWebsiteBuilderPageReviewStepUseCase.js +39 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/RestartWebsiteBuilderPageReviewStepUseCase.js.map +1 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/abstractions.d.ts +30 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/abstractions.js +5 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/feature.d.ts +4 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/feature.js +11 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/feature.js.map +1 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/index.d.ts +1 -0
- package/features/wrappers/RestartWebsiteBuilderPageReviewStep/index.js +1 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/StartWebsiteBuilderPageReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/StartWebsiteBuilderPageReviewStepUseCase.js +34 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/StartWebsiteBuilderPageReviewStepUseCase.js.map +1 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/abstractions.d.ts +25 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/abstractions.js +5 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/feature.d.ts +4 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/feature.js +11 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/feature.js.map +1 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/index.d.ts +1 -0
- package/features/wrappers/StartWebsiteBuilderPageReviewStep/index.js +1 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/StoreWebsiteBuilderPageWorkflowUseCase.d.ts +17 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/StoreWebsiteBuilderPageWorkflowUseCase.js +57 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/StoreWebsiteBuilderPageWorkflowUseCase.js.map +1 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/abstractions.d.ts +33 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/abstractions.js +5 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/abstractions.js.map +1 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/feature.d.ts +4 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/feature.js +11 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/feature.js.map +1 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/index.d.ts +1 -0
- package/features/wrappers/StoreWebsiteBuilderPageWorkflow/index.js +1 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/TakeOverWebsiteBuilderPageReviewStepUseCase.d.ts +13 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/TakeOverWebsiteBuilderPageReviewStepUseCase.js +35 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/TakeOverWebsiteBuilderPageReviewStepUseCase.js.map +1 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/abstractions.d.ts +27 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/abstractions.js +5 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/abstractions.js.map +1 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/feature.d.ts +4 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/feature.js +11 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/feature.js.map +1 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/index.d.ts +1 -0
- package/features/wrappers/TakeOverWebsiteBuilderPageReviewStep/index.js +1 -0
- package/features/wrappers/WbPageReviewGuardService/WbPageReviewGuardService.d.ts +17 -0
- package/features/wrappers/WbPageReviewGuardService/WbPageReviewGuardService.js +63 -0
- package/features/wrappers/WbPageReviewGuardService/WbPageReviewGuardService.js.map +1 -0
- package/features/wrappers/WbPageReviewGuardService/abstractions.d.ts +37 -0
- package/features/wrappers/WbPageReviewGuardService/abstractions.js +5 -0
- package/features/wrappers/WbPageReviewGuardService/abstractions.js.map +1 -0
- package/features/wrappers/WbPageReviewGuardService/index.d.ts +1 -0
- package/features/wrappers/WbPageReviewGuardService/index.js +1 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/WebsiteBuilderPageFolderExistsUseCase.d.ts +15 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/WebsiteBuilderPageFolderExistsUseCase.js +43 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/WebsiteBuilderPageFolderExistsUseCase.js.map +1 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/abstractions.d.ts +28 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/abstractions.js +5 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/abstractions.js.map +1 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/feature.d.ts +4 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/feature.js +11 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/feature.js.map +1 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/index.d.ts +1 -0
- package/features/wrappers/WebsiteBuilderPageFolderExists/index.js +1 -0
- package/features/wrappers/feature.d.ts +9 -0
- package/features/wrappers/feature.js +53 -0
- package/features/wrappers/feature.js.map +1 -0
- package/features/wrappers/shared/wbWorkflows.d.ts +8 -0
- package/features/wrappers/shared/wbWorkflows.js +9 -0
- package/features/wrappers/shared/wbWorkflows.js.map +1 -0
- package/graphql/WebsiteBuilderWorkflowsSchemaFactory.d.ts +15 -0
- package/graphql/WebsiteBuilderWorkflowsSchemaFactory.js +616 -0
- package/graphql/WebsiteBuilderWorkflowsSchemaFactory.js.map +1 -0
- 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 -1
- package/index.js +1 -19
- package/package.json +22 -16
- package/features/PageWorkflows/decorators/WbWorkflowStateContextProvider.d.ts +0 -13
- package/features/PageWorkflows/decorators/WbWorkflowStateContextProvider.js +0 -27
- package/features/PageWorkflows/decorators/WbWorkflowStateContextProvider.js.map +0 -1
- package/features/PageWorkflows/decorators/WbWorkflowStateFilter.d.ts +0 -13
- package/features/PageWorkflows/decorators/WbWorkflowStateFilter.js +0 -45
- package/features/PageWorkflows/decorators/WbWorkflowStateFilter.js.map +0 -1
- package/features/PageWorkflows/errors.d.ts +0 -9
- package/features/PageWorkflows/errors.js +0 -12
- package/features/PageWorkflows/errors.js.map +0 -1
- package/features/PageWorkflows/feature.js +0 -27
- package/features/PageWorkflows/feature.js.map +0 -1
- package/features/PageWorkflows/handlers/BlockMoveOnActiveWorkflowState.d.ts +0 -11
- package/features/PageWorkflows/handlers/BlockMoveOnActiveWorkflowState.js +0 -31
- package/features/PageWorkflows/handlers/BlockMoveOnActiveWorkflowState.js.map +0 -1
- package/features/PageWorkflows/handlers/ClearPageStateOnWorkflowStateAfterDelete.d.ts +0 -11
- package/features/PageWorkflows/handlers/ClearPageStateOnWorkflowStateAfterDelete.js +0 -26
- package/features/PageWorkflows/handlers/ClearPageStateOnWorkflowStateAfterDelete.js.map +0 -1
- package/features/PageWorkflows/handlers/ClearPageStateOnWorkflowStateCancel.d.ts +0 -11
- package/features/PageWorkflows/handlers/ClearPageStateOnWorkflowStateCancel.js +0 -26
- package/features/PageWorkflows/handlers/ClearPageStateOnWorkflowStateCancel.js.map +0 -1
- package/features/PageWorkflows/handlers/DeleteWorkflowStateOnPageAfterDelete.d.ts +0 -11
- package/features/PageWorkflows/handlers/DeleteWorkflowStateOnPageAfterDelete.js +0 -21
- package/features/PageWorkflows/handlers/DeleteWorkflowStateOnPageAfterDelete.js.map +0 -1
- package/features/PageWorkflows/handlers/UpdatePageOnWorkflowStateAfterCreate.d.ts +0 -11
- package/features/PageWorkflows/handlers/UpdatePageOnWorkflowStateAfterCreate.js +0 -28
- package/features/PageWorkflows/handlers/UpdatePageOnWorkflowStateAfterCreate.js.map +0 -1
- package/features/PageWorkflows/handlers/UpdatePageOnWorkflowStateAfterUpdate.d.ts +0 -11
- package/features/PageWorkflows/handlers/UpdatePageOnWorkflowStateAfterUpdate.js +0 -27
- package/features/PageWorkflows/handlers/UpdatePageOnWorkflowStateAfterUpdate.js.map +0 -1
- package/features/PageWorkflows/handlers/ValidateWorkflowStateOnPageBeforePublish.d.ts +0 -11
- package/features/PageWorkflows/handlers/ValidateWorkflowStateOnPageBeforePublish.js +0 -37
- package/features/PageWorkflows/handlers/ValidateWorkflowStateOnPageBeforePublish.js.map +0 -1
- package/graphql/page.d.ts +0 -2
- package/graphql/page.js +0 -21
- package/graphql/page.js.map +0 -1
- package/index.js.map +0 -1
- package/utils/appName.d.ts +0 -1
- package/utils/appName.js +0 -4
- package/utils/appName.js.map +0 -1
- package/utils/state.d.ts +0 -8
- package/utils/state.js +0 -12
- package/utils/state.js.map +0 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { PageRevisionAfterDeleteEventHandler } from "@webiny/api-website-builder/features/pages/DeletePageRevision/index.js";
|
|
2
|
+
import { Logger } from "@webiny/api-core/features/logger/index.js";
|
|
3
|
+
import { DeleteTargetReviewsUseCase } from "@webiny/api-workflows/features/review/DeleteTargetReviews/index.js";
|
|
4
|
+
import { WB_PAGE_NAMESPACE } from "../../constants.js";
|
|
5
|
+
import { hasErrorSource } from "@webiny/api-workflows/domain/hasErrorSource.js";
|
|
6
|
+
class DeleteReviewsOnPageRevisionDeleteImpl {
|
|
7
|
+
constructor(deleteTargetReviews, logger){
|
|
8
|
+
this.deleteTargetReviews = deleteTargetReviews;
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
}
|
|
11
|
+
async handle(event) {
|
|
12
|
+
const { page } = event.payload;
|
|
13
|
+
try {
|
|
14
|
+
const deleted = await this.deleteTargetReviews.execute({
|
|
15
|
+
model: WB_PAGE_NAMESPACE,
|
|
16
|
+
targetIds: [
|
|
17
|
+
page.entryId
|
|
18
|
+
],
|
|
19
|
+
targetRevisionId: page.id
|
|
20
|
+
});
|
|
21
|
+
if (deleted.isFail()) this.logger.error({
|
|
22
|
+
err: hasErrorSource(deleted.error) ? deleted.error.source : deleted.error,
|
|
23
|
+
model: WB_PAGE_NAMESPACE,
|
|
24
|
+
targetRevisionId: page.id
|
|
25
|
+
}, "Could not delete the reviews of a deleted page revision; they are left orphaned.");
|
|
26
|
+
} catch (error) {
|
|
27
|
+
this.logger.error({
|
|
28
|
+
err: error,
|
|
29
|
+
model: WB_PAGE_NAMESPACE,
|
|
30
|
+
targetRevisionId: page.id
|
|
31
|
+
}, "Could not delete the reviews of a deleted page revision; they are left orphaned.");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const DeleteReviewsOnPageRevisionDelete = PageRevisionAfterDeleteEventHandler.createImplementation({
|
|
36
|
+
implementation: DeleteReviewsOnPageRevisionDeleteImpl,
|
|
37
|
+
dependencies: [
|
|
38
|
+
DeleteTargetReviewsUseCase,
|
|
39
|
+
Logger
|
|
40
|
+
]
|
|
41
|
+
});
|
|
42
|
+
export { DeleteReviewsOnPageRevisionDelete };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=DeleteReviewsOnPageRevisionDelete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/hooks/DeleteReviewsOnPageRevisionDelete.js","sources":["../../../src/features/hooks/DeleteReviewsOnPageRevisionDelete.ts"],"sourcesContent":["import { PageRevisionAfterDeleteEventHandler } from \"@webiny/api-website-builder/features/pages/DeletePageRevision/index.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { DeleteTargetReviewsUseCase } from \"@webiny/api-workflows/features/review/DeleteTargetReviews/index.js\";\nimport { WB_PAGE_NAMESPACE } from \"~/constants.js\";\nimport { hasErrorSource } from \"@webiny/api-workflows/domain/hasErrorSource.js\";\n\n/*\n * Deletes the reviews of a deleted page revision with their assignment records (spec 9.3, R56,\n * R235). Deleting the only revision also publishes the page-delete event, which\n * `DeleteReviewsOnPageDelete` handles for every revision. A failure (a failed result or a throw)\n * is logged, not thrown: the revision is already deleted (R81).\n */\nclass DeleteReviewsOnPageRevisionDeleteImpl\n implements PageRevisionAfterDeleteEventHandler.Interface\n{\n public constructor(\n private deleteTargetReviews: DeleteTargetReviewsUseCase.Interface,\n private logger: Logger.Interface\n ) {}\n\n public async handle(event: PageRevisionAfterDeleteEventHandler.Event): Promise<void> {\n const { page } = event.payload;\n\n try {\n const deleted = await this.deleteTargetReviews.execute({\n model: WB_PAGE_NAMESPACE,\n targetIds: [page.entryId],\n targetRevisionId: page.id\n });\n if (deleted.isFail()) {\n this.logger.error(\n {\n err: hasErrorSource(deleted.error) ? deleted.error.source : deleted.error,\n model: WB_PAGE_NAMESPACE,\n targetRevisionId: page.id\n },\n \"Could not delete the reviews of a deleted page revision; they are left orphaned.\"\n );\n }\n } catch (error) {\n this.logger.error(\n { err: error, model: WB_PAGE_NAMESPACE, targetRevisionId: page.id },\n \"Could not delete the reviews of a deleted page revision; they are left orphaned.\"\n );\n }\n }\n}\n\nexport const DeleteReviewsOnPageRevisionDelete =\n PageRevisionAfterDeleteEventHandler.createImplementation({\n implementation: DeleteReviewsOnPageRevisionDeleteImpl,\n dependencies: [DeleteTargetReviewsUseCase, Logger]\n });\n"],"names":["DeleteReviewsOnPageRevisionDeleteImpl","deleteTargetReviews","logger","event","page","deleted","WB_PAGE_NAMESPACE","hasErrorSource","error","DeleteReviewsOnPageRevisionDelete","PageRevisionAfterDeleteEventHandler","DeleteTargetReviewsUseCase","Logger"],"mappings":";;;;;AAYA,MAAMA;IAGF,YACYC,mBAAyD,EACzDC,MAAwB,CAClC;aAFUD,mBAAmB,GAAnBA;aACAC,MAAM,GAANA;IACT;IAEH,MAAa,OAAOC,KAAgD,EAAiB;QACjF,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAE9B,IAAI;YACA,MAAME,UAAU,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBACnD,OAAOC;gBACP,WAAW;oBAACF,KAAK,OAAO;iBAAC;gBACzB,kBAAkBA,KAAK,EAAE;YAC7B;YACA,IAAIC,QAAQ,MAAM,IACd,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBACI,KAAKE,eAAeF,QAAQ,KAAK,IAAIA,QAAQ,KAAK,CAAC,MAAM,GAAGA,QAAQ,KAAK;gBACzE,OAAOC;gBACP,kBAAkBF,KAAK,EAAE;YAC7B,GACA;QAGZ,EAAE,OAAOI,OAAO;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBAAE,KAAKA;gBAAO,OAAOF;gBAAmB,kBAAkBF,KAAK,EAAE;YAAC,GAClE;QAER;IACJ;AACJ;AAEO,MAAMK,oCACTC,oCAAoC,oBAAoB,CAAC;IACrD,gBAAgBV;IAChB,cAAc;QAACW;QAA4BC;KAAO;AACtD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
2
|
+
import { Logger } from "@webiny/api-core/features/logger/index.js";
|
|
3
|
+
import { UpdateEntrySystemUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js";
|
|
4
|
+
import { PageModelProvider } from "@webiny/api-website-builder/domain/page/abstractions.js";
|
|
5
|
+
import { GraduateVariantUseCase } from "@webiny/api-website-builder/features/experiments/GraduateVariant/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* A graduated variant is a new page revision, so it starts without a review state (spec 4.5,
|
|
8
|
+
* D59). Graduation creates the revision through the CMS directly and the page model publishes no
|
|
9
|
+
* CMS entry events, so no revision-create rule runs. After a successful graduation this clears
|
|
10
|
+
* the revision's `system.workflow` with the same system write the review sync uses (only the
|
|
11
|
+
* system write runs without authorization). The revision and the graduated experiment already
|
|
12
|
+
* exist, so a failed write is logged with the page id, not returned, and the page keeps the
|
|
13
|
+
* copied state.
|
|
14
|
+
*/
|
|
15
|
+
declare class NullReviewStateOnGraduatedVariantDecoratorImpl implements GraduateVariantUseCase.Interface {
|
|
16
|
+
private identityContext;
|
|
17
|
+
private pageModelProvider;
|
|
18
|
+
private updateEntrySystem;
|
|
19
|
+
private logger;
|
|
20
|
+
private decoratee;
|
|
21
|
+
constructor(identityContext: IdentityContext.Interface, pageModelProvider: PageModelProvider.Interface, updateEntrySystem: UpdateEntrySystemUseCase.Interface, logger: Logger.Interface, decoratee: GraduateVariantUseCase.Interface);
|
|
22
|
+
execute(params: GraduateVariantUseCase.Params): GraduateVariantUseCase.Return;
|
|
23
|
+
}
|
|
24
|
+
export declare const NullReviewStateOnGraduatedVariantDecorator: typeof NullReviewStateOnGraduatedVariantDecoratorImpl & {
|
|
25
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-website-builder/features/experiments/GraduateVariant/abstractions/GraduateVariantUseCase").IGraduateVariantUseCase>;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
+
import { Logger } from "@webiny/api-core/features/logger/index.js";
|
|
4
|
+
import { UpdateEntrySystemUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js";
|
|
5
|
+
import { PageModelProvider } from "@webiny/api-website-builder/domain/page/abstractions.js";
|
|
6
|
+
import { GraduateVariantUseCase } from "@webiny/api-website-builder/features/experiments/GraduateVariant/index.js";
|
|
7
|
+
class NullReviewStateOnGraduatedVariantDecoratorImpl {
|
|
8
|
+
constructor(identityContext, pageModelProvider, updateEntrySystem, logger, decoratee){
|
|
9
|
+
this.identityContext = identityContext;
|
|
10
|
+
this.pageModelProvider = pageModelProvider;
|
|
11
|
+
this.updateEntrySystem = updateEntrySystem;
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
this.decoratee = decoratee;
|
|
14
|
+
}
|
|
15
|
+
async execute(params) {
|
|
16
|
+
const result = await this.decoratee.execute(params);
|
|
17
|
+
if (result.isFail()) return result;
|
|
18
|
+
const page = result.value;
|
|
19
|
+
const system = page.system;
|
|
20
|
+
if (!system?.workflow) return result;
|
|
21
|
+
const model = await this.pageModelProvider.get();
|
|
22
|
+
const updated = await this.identityContext.withoutAuthorization(()=>this.updateEntrySystem.execute(model, page.id, {
|
|
23
|
+
workflow: null
|
|
24
|
+
}));
|
|
25
|
+
if (updated.isFail()) {
|
|
26
|
+
this.logger.error({
|
|
27
|
+
err: updated.error,
|
|
28
|
+
pageId: page.id
|
|
29
|
+
}, "Could not clear the review state of a graduated variant revision; it keeps the copied state.");
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
const cleared = {
|
|
33
|
+
...page.system,
|
|
34
|
+
workflow: null
|
|
35
|
+
};
|
|
36
|
+
return Result.ok({
|
|
37
|
+
...page,
|
|
38
|
+
system: cleared
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const NullReviewStateOnGraduatedVariantDecorator = GraduateVariantUseCase.createDecorator({
|
|
43
|
+
decorator: NullReviewStateOnGraduatedVariantDecoratorImpl,
|
|
44
|
+
dependencies: [
|
|
45
|
+
IdentityContext,
|
|
46
|
+
PageModelProvider,
|
|
47
|
+
UpdateEntrySystemUseCase,
|
|
48
|
+
Logger
|
|
49
|
+
]
|
|
50
|
+
});
|
|
51
|
+
export { NullReviewStateOnGraduatedVariantDecorator };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=NullReviewStateOnGraduatedVariantDecorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/hooks/NullReviewStateOnGraduatedVariantDecorator.js","sources":["../../../src/features/hooks/NullReviewStateOnGraduatedVariantDecorator.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { UpdateEntrySystemUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js\";\nimport { PageModelProvider } from \"@webiny/api-website-builder/domain/page/abstractions.js\";\nimport { GraduateVariantUseCase } from \"@webiny/api-website-builder/features/experiments/GraduateVariant/index.js\";\n\n// The part of `system` this decorator reads; the CMS type leaves `system` open for extension.\ninterface PageSystemWithWorkflow {\n workflow?: unknown;\n}\n\n/**\n * A graduated variant is a new page revision, so it starts without a review state (spec 4.5,\n * D59). Graduation creates the revision through the CMS directly and the page model publishes no\n * CMS entry events, so no revision-create rule runs. After a successful graduation this clears\n * the revision's `system.workflow` with the same system write the review sync uses (only the\n * system write runs without authorization). The revision and the graduated experiment already\n * exist, so a failed write is logged with the page id, not returned, and the page keeps the\n * copied state.\n */\nclass NullReviewStateOnGraduatedVariantDecoratorImpl implements GraduateVariantUseCase.Interface {\n public constructor(\n private identityContext: IdentityContext.Interface,\n private pageModelProvider: PageModelProvider.Interface,\n private updateEntrySystem: UpdateEntrySystemUseCase.Interface,\n private logger: Logger.Interface,\n private decoratee: GraduateVariantUseCase.Interface\n ) {}\n\n public async execute(params: GraduateVariantUseCase.Params): GraduateVariantUseCase.Return {\n const result = await this.decoratee.execute(params);\n if (result.isFail()) {\n return result;\n }\n const page = result.value;\n const system: PageSystemWithWorkflow | undefined = page.system;\n if (!system?.workflow) {\n return result;\n }\n\n const model = await this.pageModelProvider.get();\n const updated = await this.identityContext.withoutAuthorization(() => {\n return this.updateEntrySystem.execute(model, page.id, { workflow: null });\n });\n if (updated.isFail()) {\n this.logger.error(\n { err: updated.error, pageId: page.id },\n \"Could not clear the review state of a graduated variant revision; it keeps the copied state.\"\n );\n return result;\n }\n const cleared = { ...page.system, workflow: null };\n return Result.ok({ ...page, system: cleared });\n }\n}\n\nexport const NullReviewStateOnGraduatedVariantDecorator = GraduateVariantUseCase.createDecorator({\n decorator: NullReviewStateOnGraduatedVariantDecoratorImpl,\n dependencies: [IdentityContext, PageModelProvider, UpdateEntrySystemUseCase, Logger]\n});\n"],"names":["NullReviewStateOnGraduatedVariantDecoratorImpl","identityContext","pageModelProvider","updateEntrySystem","logger","decoratee","params","result","page","system","model","updated","cleared","Result","NullReviewStateOnGraduatedVariantDecorator","GraduateVariantUseCase","IdentityContext","PageModelProvider","UpdateEntrySystemUseCase","Logger"],"mappings":";;;;;;AAqBA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,iBAA8C,EAC9CC,iBAAqD,EACrDC,MAAwB,EACxBC,SAA2C,CACrD;aALUJ,eAAe,GAAfA;aACAC,iBAAiB,GAAjBA;aACAC,iBAAiB,GAAjBA;aACAC,MAAM,GAANA;aACAC,SAAS,GAATA;IACT;IAEH,MAAa,QAAQC,MAAqC,EAAiC;QACvF,MAAMC,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACD;QAC5C,IAAIC,OAAO,MAAM,IACb,OAAOA;QAEX,MAAMC,OAAOD,OAAO,KAAK;QACzB,MAAME,SAA6CD,KAAK,MAAM;QAC9D,IAAI,CAACC,QAAQ,UACT,OAAOF;QAGX,MAAMG,QAAQ,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG;QAC9C,MAAMC,UAAU,MAAM,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,IACrD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACD,OAAOF,KAAK,EAAE,EAAE;gBAAE,UAAU;YAAK;QAE3E,IAAIG,QAAQ,MAAM,IAAI;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBAAE,KAAKA,QAAQ,KAAK;gBAAE,QAAQH,KAAK,EAAE;YAAC,GACtC;YAEJ,OAAOD;QACX;QACA,MAAMK,UAAU;YAAE,GAAGJ,KAAK,MAAM;YAAE,UAAU;QAAK;QACjD,OAAOK,OAAO,EAAE,CAAC;YAAE,GAAGL,IAAI;YAAE,QAAQI;QAAQ;IAChD;AACJ;AAEO,MAAME,6CAA6CC,uBAAuB,eAAe,CAAC;IAC7F,WAAWf;IACX,cAAc;QAACgB;QAAiBC;QAAmBC;QAA0BC;KAAO;AACxF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
2
|
+
import { Logger } from "@webiny/api-core/features/logger/index.js";
|
|
3
|
+
import { UpdateEntrySystemUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js";
|
|
4
|
+
import { PageModelProvider } from "@webiny/api-website-builder/domain/page/abstractions.js";
|
|
5
|
+
import { PageAfterCreateRevisionFromEventHandler } from "@webiny/api-website-builder/features/pages/CreatePageRevisionFrom/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* Every new page revision starts without a review state (spec 4.5, D59). The page model publishes
|
|
8
|
+
* no CMS entry events and the CMS copies `system` from the source revision, so after Website
|
|
9
|
+
* Builder creates the revision this clears its `system.workflow` with the same system write the
|
|
10
|
+
* review sync uses (only the system write runs without authorization), and updates the page the
|
|
11
|
+
* use case returns. The revision already exists, so a failed write is logged with the page id,
|
|
12
|
+
* not thrown: the revision keeps the copied state, which stays visible in the log instead of a
|
|
13
|
+
* failed request that a retry would turn into another revision.
|
|
14
|
+
*/
|
|
15
|
+
declare class NullReviewStateOnPageRevisionCreateImpl implements PageAfterCreateRevisionFromEventHandler.Interface {
|
|
16
|
+
private identityContext;
|
|
17
|
+
private pageModelProvider;
|
|
18
|
+
private updateEntrySystem;
|
|
19
|
+
private logger;
|
|
20
|
+
constructor(identityContext: IdentityContext.Interface, pageModelProvider: PageModelProvider.Interface, updateEntrySystem: UpdateEntrySystemUseCase.Interface, logger: Logger.Interface);
|
|
21
|
+
handle(event: PageAfterCreateRevisionFromEventHandler.Event): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare const NullReviewStateOnPageRevisionCreate: typeof NullReviewStateOnPageRevisionCreateImpl & {
|
|
24
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-core/features/eventPublisher").DomainEvent<import("@webiny/api-website-builder/features/pages/CreatePageRevisionFrom/abstractions").PageAfterCreateRevisionFromPayload>>>;
|
|
25
|
+
};
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
2
|
+
import { Logger } from "@webiny/api-core/features/logger/index.js";
|
|
3
|
+
import { UpdateEntrySystemUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js";
|
|
4
|
+
import { PageModelProvider } from "@webiny/api-website-builder/domain/page/abstractions.js";
|
|
5
|
+
import { PageAfterCreateRevisionFromEventHandler } from "@webiny/api-website-builder/features/pages/CreatePageRevisionFrom/index.js";
|
|
6
|
+
class NullReviewStateOnPageRevisionCreateImpl {
|
|
7
|
+
constructor(identityContext, pageModelProvider, updateEntrySystem, logger){
|
|
8
|
+
this.identityContext = identityContext;
|
|
9
|
+
this.pageModelProvider = pageModelProvider;
|
|
10
|
+
this.updateEntrySystem = updateEntrySystem;
|
|
11
|
+
this.logger = logger;
|
|
12
|
+
}
|
|
13
|
+
async handle(event) {
|
|
14
|
+
const { page } = event.payload;
|
|
15
|
+
const system = page.system;
|
|
16
|
+
if (!system?.workflow) return;
|
|
17
|
+
const model = await this.pageModelProvider.get();
|
|
18
|
+
const updated = await this.identityContext.withoutAuthorization(()=>this.updateEntrySystem.execute(model, page.id, {
|
|
19
|
+
workflow: null
|
|
20
|
+
}));
|
|
21
|
+
if (updated.isFail()) return void this.logger.error({
|
|
22
|
+
err: updated.error,
|
|
23
|
+
pageId: page.id
|
|
24
|
+
}, "Could not clear the review state of a new page revision; it keeps the copied state.");
|
|
25
|
+
const cleared = {
|
|
26
|
+
...page.system,
|
|
27
|
+
workflow: null
|
|
28
|
+
};
|
|
29
|
+
page.system = cleared;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const NullReviewStateOnPageRevisionCreate = PageAfterCreateRevisionFromEventHandler.createImplementation({
|
|
33
|
+
implementation: NullReviewStateOnPageRevisionCreateImpl,
|
|
34
|
+
dependencies: [
|
|
35
|
+
IdentityContext,
|
|
36
|
+
PageModelProvider,
|
|
37
|
+
UpdateEntrySystemUseCase,
|
|
38
|
+
Logger
|
|
39
|
+
]
|
|
40
|
+
});
|
|
41
|
+
export { NullReviewStateOnPageRevisionCreate };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=NullReviewStateOnPageRevisionCreate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/hooks/NullReviewStateOnPageRevisionCreate.js","sources":["../../../src/features/hooks/NullReviewStateOnPageRevisionCreate.ts"],"sourcesContent":["import { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { UpdateEntrySystemUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntrySystem/index.js\";\nimport { PageModelProvider } from \"@webiny/api-website-builder/domain/page/abstractions.js\";\nimport { PageAfterCreateRevisionFromEventHandler } from \"@webiny/api-website-builder/features/pages/CreatePageRevisionFrom/index.js\";\n\n// The part of `system` this handler reads; the CMS type leaves `system` open for extension.\ninterface PageSystemWithWorkflow {\n workflow?: unknown;\n}\n\n/**\n * Every new page revision starts without a review state (spec 4.5, D59). The page model publishes\n * no CMS entry events and the CMS copies `system` from the source revision, so after Website\n * Builder creates the revision this clears its `system.workflow` with the same system write the\n * review sync uses (only the system write runs without authorization), and updates the page the\n * use case returns. The revision already exists, so a failed write is logged with the page id,\n * not thrown: the revision keeps the copied state, which stays visible in the log instead of a\n * failed request that a retry would turn into another revision.\n */\nclass NullReviewStateOnPageRevisionCreateImpl\n implements PageAfterCreateRevisionFromEventHandler.Interface\n{\n public constructor(\n private identityContext: IdentityContext.Interface,\n private pageModelProvider: PageModelProvider.Interface,\n private updateEntrySystem: UpdateEntrySystemUseCase.Interface,\n private logger: Logger.Interface\n ) {}\n\n public async handle(event: PageAfterCreateRevisionFromEventHandler.Event): Promise<void> {\n const { page } = event.payload;\n const system: PageSystemWithWorkflow | undefined = page.system;\n if (!system?.workflow) {\n return;\n }\n\n const model = await this.pageModelProvider.get();\n const updated = await this.identityContext.withoutAuthorization(() => {\n return this.updateEntrySystem.execute(model, page.id, { workflow: null });\n });\n if (updated.isFail()) {\n this.logger.error(\n { err: updated.error, pageId: page.id },\n \"Could not clear the review state of a new page revision; it keeps the copied state.\"\n );\n return;\n }\n const cleared = { ...page.system, workflow: null };\n page.system = cleared;\n }\n}\n\nexport const NullReviewStateOnPageRevisionCreate =\n PageAfterCreateRevisionFromEventHandler.createImplementation({\n implementation: NullReviewStateOnPageRevisionCreateImpl,\n dependencies: [IdentityContext, PageModelProvider, UpdateEntrySystemUseCase, Logger]\n });\n"],"names":["NullReviewStateOnPageRevisionCreateImpl","identityContext","pageModelProvider","updateEntrySystem","logger","event","page","system","model","updated","cleared","NullReviewStateOnPageRevisionCreate","PageAfterCreateRevisionFromEventHandler","IdentityContext","PageModelProvider","UpdateEntrySystemUseCase","Logger"],"mappings":";;;;;AAoBA,MAAMA;IAGF,YACYC,eAA0C,EAC1CC,iBAA8C,EAC9CC,iBAAqD,EACrDC,MAAwB,CAClC;aAJUH,eAAe,GAAfA;aACAC,iBAAiB,GAAjBA;aACAC,iBAAiB,GAAjBA;aACAC,MAAM,GAANA;IACT;IAEH,MAAa,OAAOC,KAAoD,EAAiB;QACrF,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAC9B,MAAME,SAA6CD,KAAK,MAAM;QAC9D,IAAI,CAACC,QAAQ,UACT;QAGJ,MAAMC,QAAQ,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG;QAC9C,MAAMC,UAAU,MAAM,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,IACrD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACD,OAAOF,KAAK,EAAE,EAAE;gBAAE,UAAU;YAAK;QAE3E,IAAIG,QAAQ,MAAM,IAAI,YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;YAAE,KAAKA,QAAQ,KAAK;YAAE,QAAQH,KAAK,EAAE;QAAC,GACtC;QAIR,MAAMI,UAAU;YAAE,GAAGJ,KAAK,MAAM;YAAE,UAAU;QAAK;QACjDA,KAAK,MAAM,GAAGI;IAClB;AACJ;AAEO,MAAMC,sCACTC,wCAAwC,oBAAoB,CAAC;IACzD,gBAAgBZ;IAChB,cAAc;QAACa;QAAiBC;QAAmBC;QAA0BC;KAAO;AACxF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PageBeforePublishEventHandler } from "@webiny/api-website-builder/features/pages/PublishPage/index.js";
|
|
2
|
+
import { GetBoundWorkflowUseCase } from "@webiny/api-workflows/features/workflow/GetBoundWorkflow/index.js";
|
|
3
|
+
import { GetActiveTargetReviewUseCase } from "@webiny/api-workflows/features/review/GetActiveTargetReview/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* Publish rule of the `wb.page` adapter (spec 5.1, D79, D121, R53): with a pages workflow, a page
|
|
6
|
+
* revision is published only with its active review approved. Lookup failures block. The CMS
|
|
7
|
+
* adapter's publish rule skips pages (private model, R52). Creating a page revision as published is
|
|
8
|
+
* not a publish and is not blocked (D134 point 2). The throw rejects `PublishPageUseCase` (A26);
|
|
9
|
+
* WB's page resolvers and the scheduler's publish action keep its code and data (R103).
|
|
10
|
+
*/
|
|
11
|
+
declare class RequireApprovedReviewOnPagePublishImpl implements PageBeforePublishEventHandler.Interface {
|
|
12
|
+
private getBoundWorkflow;
|
|
13
|
+
private getActiveTargetReview;
|
|
14
|
+
constructor(getBoundWorkflow: GetBoundWorkflowUseCase.Interface, getActiveTargetReview: GetActiveTargetReviewUseCase.Interface);
|
|
15
|
+
handle(event: PageBeforePublishEventHandler.Event): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare const RequireApprovedReviewOnPagePublish: typeof RequireApprovedReviewOnPagePublishImpl & {
|
|
18
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-core/features/eventPublisher").DomainEvent<import("@webiny/api-website-builder/features/pages/PublishPage/abstractions").PageBeforePublishPayload>>>;
|
|
19
|
+
};
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { PageBeforePublishEventHandler } from "@webiny/api-website-builder/features/pages/PublishPage/index.js";
|
|
2
|
+
import { GetBoundWorkflowUseCase } from "@webiny/api-workflows/features/workflow/GetBoundWorkflow/index.js";
|
|
3
|
+
import { GetActiveTargetReviewUseCase } from "@webiny/api-workflows/features/review/GetActiveTargetReview/index.js";
|
|
4
|
+
import { ReviewPublishBlockedError } from "@webiny/api-workflows/domain/review/errors.js";
|
|
5
|
+
import { WB_PAGE_NAMESPACE } from "../../constants.js";
|
|
6
|
+
class RequireApprovedReviewOnPagePublishImpl {
|
|
7
|
+
constructor(getBoundWorkflow, getActiveTargetReview){
|
|
8
|
+
this.getBoundWorkflow = getBoundWorkflow;
|
|
9
|
+
this.getActiveTargetReview = getActiveTargetReview;
|
|
10
|
+
}
|
|
11
|
+
async handle(event) {
|
|
12
|
+
const { page } = event.payload;
|
|
13
|
+
const bound = await this.getBoundWorkflow.execute({
|
|
14
|
+
model: WB_PAGE_NAMESPACE
|
|
15
|
+
});
|
|
16
|
+
if (bound.isFail()) throw bound.error;
|
|
17
|
+
const workflow = bound.value;
|
|
18
|
+
if (!workflow) return;
|
|
19
|
+
const review = await this.getActiveTargetReview.execute({
|
|
20
|
+
model: WB_PAGE_NAMESPACE,
|
|
21
|
+
targetRevisionId: page.id
|
|
22
|
+
});
|
|
23
|
+
if (review.isFail()) throw review.error;
|
|
24
|
+
if (review.value?.state === "approved") return;
|
|
25
|
+
throw new ReviewPublishBlockedError({
|
|
26
|
+
model: WB_PAGE_NAMESPACE,
|
|
27
|
+
targetRevisionId: page.id,
|
|
28
|
+
workflowId: workflow.id,
|
|
29
|
+
reviewState: review.value?.state ?? null
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const RequireApprovedReviewOnPagePublish = PageBeforePublishEventHandler.createImplementation({
|
|
34
|
+
implementation: RequireApprovedReviewOnPagePublishImpl,
|
|
35
|
+
dependencies: [
|
|
36
|
+
GetBoundWorkflowUseCase,
|
|
37
|
+
GetActiveTargetReviewUseCase
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
export { RequireApprovedReviewOnPagePublish };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=RequireApprovedReviewOnPagePublish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/hooks/RequireApprovedReviewOnPagePublish.js","sources":["../../../src/features/hooks/RequireApprovedReviewOnPagePublish.ts"],"sourcesContent":["import { PageBeforePublishEventHandler } from \"@webiny/api-website-builder/features/pages/PublishPage/index.js\";\nimport { GetBoundWorkflowUseCase } from \"@webiny/api-workflows/features/workflow/GetBoundWorkflow/index.js\";\nimport { GetActiveTargetReviewUseCase } from \"@webiny/api-workflows/features/review/GetActiveTargetReview/index.js\";\nimport { ReviewPublishBlockedError } from \"@webiny/api-workflows/domain/review/errors.js\";\nimport { WB_PAGE_NAMESPACE } from \"~/constants.js\";\n\n/**\n * Publish rule of the `wb.page` adapter (spec 5.1, D79, D121, R53): with a pages workflow, a page\n * revision is published only with its active review approved. Lookup failures block. The CMS\n * adapter's publish rule skips pages (private model, R52). Creating a page revision as published is\n * not a publish and is not blocked (D134 point 2). The throw rejects `PublishPageUseCase` (A26);\n * WB's page resolvers and the scheduler's publish action keep its code and data (R103).\n */\nclass RequireApprovedReviewOnPagePublishImpl implements PageBeforePublishEventHandler.Interface {\n public constructor(\n private getBoundWorkflow: GetBoundWorkflowUseCase.Interface,\n private getActiveTargetReview: GetActiveTargetReviewUseCase.Interface\n ) {}\n\n public async handle(event: PageBeforePublishEventHandler.Event): Promise<void> {\n const { page } = event.payload;\n\n const bound = await this.getBoundWorkflow.execute({ model: WB_PAGE_NAMESPACE });\n if (bound.isFail()) {\n throw bound.error;\n }\n const workflow = bound.value;\n if (!workflow) {\n return;\n }\n\n const review = await this.getActiveTargetReview.execute({\n model: WB_PAGE_NAMESPACE,\n targetRevisionId: page.id\n });\n if (review.isFail()) {\n throw review.error;\n }\n if (review.value?.state === \"approved\") {\n return;\n }\n\n throw new ReviewPublishBlockedError({\n model: WB_PAGE_NAMESPACE,\n targetRevisionId: page.id,\n workflowId: workflow.id,\n reviewState: review.value?.state ?? null\n });\n }\n}\n\nexport const RequireApprovedReviewOnPagePublish =\n PageBeforePublishEventHandler.createImplementation({\n implementation: RequireApprovedReviewOnPagePublishImpl,\n dependencies: [GetBoundWorkflowUseCase, GetActiveTargetReviewUseCase]\n });\n"],"names":["RequireApprovedReviewOnPagePublishImpl","getBoundWorkflow","getActiveTargetReview","event","page","bound","WB_PAGE_NAMESPACE","workflow","review","ReviewPublishBlockedError","RequireApprovedReviewOnPagePublish","PageBeforePublishEventHandler","GetBoundWorkflowUseCase","GetActiveTargetReviewUseCase"],"mappings":";;;;;AAaA,MAAMA;IACF,YACYC,gBAAmD,EACnDC,qBAA6D,CACvE;aAFUD,gBAAgB,GAAhBA;aACAC,qBAAqB,GAArBA;IACT;IAEH,MAAa,OAAOC,KAA0C,EAAiB;QAC3E,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAE9B,MAAME,QAAQ,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAAE,OAAOC;QAAkB;QAC7E,IAAID,MAAM,MAAM,IACZ,MAAMA,MAAM,KAAK;QAErB,MAAME,WAAWF,MAAM,KAAK;QAC5B,IAAI,CAACE,UACD;QAGJ,MAAMC,SAAS,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;YACpD,OAAOF;YACP,kBAAkBF,KAAK,EAAE;QAC7B;QACA,IAAII,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAEtB,IAAIA,OAAO,KAAK,EAAE,UAAU,YACxB;QAGJ,MAAM,IAAIC,0BAA0B;YAChC,OAAOH;YACP,kBAAkBF,KAAK,EAAE;YACzB,YAAYG,SAAS,EAAE;YACvB,aAAaC,OAAO,KAAK,EAAE,SAAS;QACxC;IACJ;AACJ;AAEO,MAAME,qCACTC,8BAA8B,oBAAoB,CAAC;IAC/C,gBAAgBX;IAChB,cAAc;QAACY;QAAyBC;KAA6B;AACzE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `wb.page` adapter rules on the Website Builder page events (R52). The page model publishes no
|
|
3
|
+
* CMS entry events, so every page rule, the save block and the revision-create reset included,
|
|
4
|
+
* listens here.
|
|
5
|
+
*/
|
|
6
|
+
export declare const WbHooksFeature: {
|
|
7
|
+
name: string;
|
|
8
|
+
register(container: import("@webiny/di").Container): void;
|
|
9
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { RequireApprovedReviewOnPagePublish } from "./RequireApprovedReviewOnPagePublish.js";
|
|
3
|
+
import { BlockPageMoveWhileInReview } from "./BlockPageMoveWhileInReview.js";
|
|
4
|
+
import { BlockPageTrashWhileInReview } from "./BlockPageTrashWhileInReview.js";
|
|
5
|
+
import { BlockPageDeleteWhileInReview } from "./BlockPageDeleteWhileInReview.js";
|
|
6
|
+
import { DeleteReviewsOnPageDelete } from "./DeleteReviewsOnPageDelete.js";
|
|
7
|
+
import { BlockPageRevisionDeleteWhileInReview } from "./BlockPageRevisionDeleteWhileInReview.js";
|
|
8
|
+
import { DeleteReviewsOnPageRevisionDelete } from "./DeleteReviewsOnPageRevisionDelete.js";
|
|
9
|
+
import { BlockPageUpdateWhileInReview } from "./BlockPageUpdateWhileInReview.js";
|
|
10
|
+
import { BlockPageFolderChangeWhileInReview } from "./BlockPageFolderChangeWhileInReview.js";
|
|
11
|
+
import { NullReviewStateOnPageRevisionCreate } from "./NullReviewStateOnPageRevisionCreate.js";
|
|
12
|
+
import { NullReviewStateOnGraduatedVariantDecorator } from "./NullReviewStateOnGraduatedVariantDecorator.js";
|
|
13
|
+
const WbHooksFeature = createFeature({
|
|
14
|
+
name: "WebsiteBuilderWorkflows/Hooks",
|
|
15
|
+
register (container) {
|
|
16
|
+
container.register(RequireApprovedReviewOnPagePublish);
|
|
17
|
+
container.register(BlockPageMoveWhileInReview);
|
|
18
|
+
container.register(BlockPageUpdateWhileInReview);
|
|
19
|
+
container.register(BlockPageFolderChangeWhileInReview);
|
|
20
|
+
container.register(NullReviewStateOnPageRevisionCreate);
|
|
21
|
+
container.registerDecorator(NullReviewStateOnGraduatedVariantDecorator);
|
|
22
|
+
container.register(BlockPageTrashWhileInReview);
|
|
23
|
+
container.register(BlockPageDeleteWhileInReview);
|
|
24
|
+
container.register(DeleteReviewsOnPageDelete);
|
|
25
|
+
container.register(BlockPageRevisionDeleteWhileInReview);
|
|
26
|
+
container.register(DeleteReviewsOnPageRevisionDelete);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
export { WbHooksFeature };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/hooks/feature.js","sources":["../../../src/features/hooks/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { RequireApprovedReviewOnPagePublish } from \"./RequireApprovedReviewOnPagePublish.js\";\nimport { BlockPageMoveWhileInReview } from \"./BlockPageMoveWhileInReview.js\";\nimport { BlockPageTrashWhileInReview } from \"./BlockPageTrashWhileInReview.js\";\nimport { BlockPageDeleteWhileInReview } from \"./BlockPageDeleteWhileInReview.js\";\nimport { DeleteReviewsOnPageDelete } from \"./DeleteReviewsOnPageDelete.js\";\nimport { BlockPageRevisionDeleteWhileInReview } from \"./BlockPageRevisionDeleteWhileInReview.js\";\nimport { DeleteReviewsOnPageRevisionDelete } from \"./DeleteReviewsOnPageRevisionDelete.js\";\nimport { BlockPageUpdateWhileInReview } from \"./BlockPageUpdateWhileInReview.js\";\nimport { BlockPageFolderChangeWhileInReview } from \"./BlockPageFolderChangeWhileInReview.js\";\nimport { NullReviewStateOnPageRevisionCreate } from \"./NullReviewStateOnPageRevisionCreate.js\";\nimport { NullReviewStateOnGraduatedVariantDecorator } from \"./NullReviewStateOnGraduatedVariantDecorator.js\";\n\n/**\n * `wb.page` adapter rules on the Website Builder page events (R52). The page model publishes no\n * CMS entry events, so every page rule, the save block and the revision-create reset included,\n * listens here.\n */\nexport const WbHooksFeature = createFeature({\n name: \"WebsiteBuilderWorkflows/Hooks\",\n register(container) {\n container.register(RequireApprovedReviewOnPagePublish);\n container.register(BlockPageMoveWhileInReview);\n // The save block (R54), its folder-change twin (D84) and the new-revision reset (D59).\n container.register(BlockPageUpdateWhileInReview);\n container.register(BlockPageFolderChangeWhileInReview);\n container.register(NullReviewStateOnPageRevisionCreate);\n // A graduated variant is a new revision created through the CMS directly (D59).\n container.registerDecorator(NullReviewStateOnGraduatedVariantDecorator);\n // Trash and delete (D134, R73) and review cleanup after a page delete (R56, R81).\n container.register(BlockPageTrashWhileInReview);\n container.register(BlockPageDeleteWhileInReview);\n container.register(DeleteReviewsOnPageDelete);\n // The page revision delete (R235): the same block and cleanup for one revision.\n container.register(BlockPageRevisionDeleteWhileInReview);\n container.register(DeleteReviewsOnPageRevisionDelete);\n }\n});\n"],"names":["WbHooksFeature","createFeature","container","RequireApprovedReviewOnPagePublish","BlockPageMoveWhileInReview","BlockPageUpdateWhileInReview","BlockPageFolderChangeWhileInReview","NullReviewStateOnPageRevisionCreate","NullReviewStateOnGraduatedVariantDecorator","BlockPageTrashWhileInReview","BlockPageDeleteWhileInReview","DeleteReviewsOnPageDelete","BlockPageRevisionDeleteWhileInReview","DeleteReviewsOnPageRevisionDelete"],"mappings":";;;;;;;;;;;;AAkBO,MAAMA,iBAAiBC,cAAc;IACxC,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QAEnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QAEnBL,UAAU,iBAAiB,CAACM;QAE5BN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QAEnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;IACvB;AACJ"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { WbPermissions } from "@webiny/api-website-builder/features/permissions/abstractions.js";
|
|
2
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
+
import { FolderLevelPermissions } from "@webiny/api-aco/features/flp/FolderLevelPermissions/index.js";
|
|
4
|
+
import type { FolderReadRule } from "@webiny/api-headless-cms-workflows/features/target/FolderReadRule.js";
|
|
5
|
+
import type { WbPageTarget } from "../WbPageTargetReader/abstractions.js";
|
|
6
|
+
import { WbPageAccess as Abstraction } from "./abstractions.js";
|
|
7
|
+
/**
|
|
8
|
+
* Write and delete include read, because WB loads the page through `GetPageByIdUseCase` before it
|
|
9
|
+
* updates or trashes it (R82). Folder-level permissions as the ACO CMS decorators apply them to
|
|
10
|
+
* page entries, inline in each check, as `CmsEntryAccess` does (R78).
|
|
11
|
+
*/
|
|
12
|
+
declare class WbPageAccessImpl implements Abstraction.Interface {
|
|
13
|
+
private permissions;
|
|
14
|
+
private identityContext;
|
|
15
|
+
private folderLevelPermissions;
|
|
16
|
+
constructor(permissions: WbPermissions.Interface, identityContext: IdentityContext.Interface, folderLevelPermissions: FolderLevelPermissions.Interface);
|
|
17
|
+
canWriteAnyPage(): Promise<boolean>;
|
|
18
|
+
canDeleteAnyPage(): Promise<boolean>;
|
|
19
|
+
canRead(target: WbPageTarget, folderRule?: FolderReadRule): Promise<boolean>;
|
|
20
|
+
canReadInFolder(folderId: string | null, folderRule?: FolderReadRule): Promise<boolean>;
|
|
21
|
+
canWrite(target: WbPageTarget): Promise<boolean>;
|
|
22
|
+
canDelete(target: WbPageTarget): Promise<boolean>;
|
|
23
|
+
}
|
|
24
|
+
export declare const WbPageAccess: typeof WbPageAccessImpl & {
|
|
25
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IWbPageAccess>;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { WbPermissions } from "@webiny/api-website-builder/features/permissions/abstractions.js";
|
|
2
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
+
import { FolderLevelPermissions } from "@webiny/api-aco/features/flp/FolderLevelPermissions/index.js";
|
|
4
|
+
import { ROOT_FOLDER } from "@webiny/api-website-builder/constants.js";
|
|
5
|
+
import { WbPageAccess } from "./abstractions.js";
|
|
6
|
+
class WbPageAccessImpl {
|
|
7
|
+
constructor(permissions, identityContext, folderLevelPermissions){
|
|
8
|
+
this.permissions = permissions;
|
|
9
|
+
this.identityContext = identityContext;
|
|
10
|
+
this.folderLevelPermissions = folderLevelPermissions;
|
|
11
|
+
}
|
|
12
|
+
canWriteAnyPage() {
|
|
13
|
+
return this.permissions.canEdit("page");
|
|
14
|
+
}
|
|
15
|
+
canDeleteAnyPage() {
|
|
16
|
+
const identity = this.identityContext.getIdentity();
|
|
17
|
+
return this.permissions.canDelete("page", {
|
|
18
|
+
createdBy: {
|
|
19
|
+
id: identity.id
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async canRead(target, folderRule) {
|
|
24
|
+
if (!await this.permissions.canRead("page")) return false;
|
|
25
|
+
if (!await this.permissions.canAccess("page", target.page)) return false;
|
|
26
|
+
if (!this.folderLevelPermissions.canUseFolderLevelPermissions()) return true;
|
|
27
|
+
const folderId = target.page.location.folderId;
|
|
28
|
+
if (!folderId || folderId === ROOT_FOLDER) return true;
|
|
29
|
+
if (folderRule) return folderRule.canReadFolder(folderId);
|
|
30
|
+
const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);
|
|
31
|
+
return this.folderLevelPermissions.canAccessFolderContent({
|
|
32
|
+
permissions,
|
|
33
|
+
rwd: "r"
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async canReadInFolder(folderId, folderRule) {
|
|
37
|
+
if (!await this.permissions.canRead("page")) return false;
|
|
38
|
+
if (!this.folderLevelPermissions.canUseFolderLevelPermissions()) return true;
|
|
39
|
+
if (!folderId || folderId === ROOT_FOLDER) return true;
|
|
40
|
+
if (folderRule) return folderRule.canReadFolder(folderId);
|
|
41
|
+
const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);
|
|
42
|
+
return this.folderLevelPermissions.canAccessFolderContent({
|
|
43
|
+
permissions,
|
|
44
|
+
rwd: "r"
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async canWrite(target) {
|
|
48
|
+
if (!await this.permissions.canRead("page")) return false;
|
|
49
|
+
if (!await this.permissions.canAccess("page", target.page)) return false;
|
|
50
|
+
if (!await this.permissions.canEdit("page", target.page)) return false;
|
|
51
|
+
if (!this.folderLevelPermissions.canUseFolderLevelPermissions()) return true;
|
|
52
|
+
const folderId = target.page.location.folderId;
|
|
53
|
+
if (!folderId || folderId === ROOT_FOLDER) return true;
|
|
54
|
+
const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);
|
|
55
|
+
return this.folderLevelPermissions.canAccessFolderContent({
|
|
56
|
+
permissions,
|
|
57
|
+
rwd: "w"
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async canDelete(target) {
|
|
61
|
+
if (!await this.permissions.canRead("page")) return false;
|
|
62
|
+
if (!await this.permissions.canAccess("page", target.page)) return false;
|
|
63
|
+
if (!await this.permissions.canDelete("page", target.page)) return false;
|
|
64
|
+
if (!this.folderLevelPermissions.canUseFolderLevelPermissions()) return true;
|
|
65
|
+
const folderId = target.page.location.folderId;
|
|
66
|
+
if (!folderId || folderId === ROOT_FOLDER) return true;
|
|
67
|
+
const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);
|
|
68
|
+
return this.folderLevelPermissions.canAccessFolderContent({
|
|
69
|
+
permissions,
|
|
70
|
+
rwd: "d"
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const WbPageAccess_WbPageAccess = WbPageAccess.createImplementation({
|
|
75
|
+
implementation: WbPageAccessImpl,
|
|
76
|
+
dependencies: [
|
|
77
|
+
WbPermissions,
|
|
78
|
+
IdentityContext,
|
|
79
|
+
FolderLevelPermissions
|
|
80
|
+
]
|
|
81
|
+
});
|
|
82
|
+
export { WbPageAccess_WbPageAccess as WbPageAccess };
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=WbPageAccess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/WbPageAccess/WbPageAccess.js","sources":["../../../../src/features/target/WbPageAccess/WbPageAccess.ts"],"sourcesContent":["import { WbPermissions } from \"@webiny/api-website-builder/features/permissions/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { FolderLevelPermissions } from \"@webiny/api-aco/features/flp/FolderLevelPermissions/index.js\";\nimport { ROOT_FOLDER } from \"@webiny/api-website-builder/constants.js\";\nimport type { FolderReadRule } from \"@webiny/api-headless-cms-workflows/features/target/FolderReadRule.js\";\nimport type { WbPageTarget } from \"../WbPageTargetReader/abstractions.js\";\nimport { WbPageAccess as Abstraction } from \"./abstractions.js\";\n\n/**\n * Write and delete include read, because WB loads the page through `GetPageByIdUseCase` before it\n * updates or trashes it (R82). Folder-level permissions as the ACO CMS decorators apply them to\n * page entries, inline in each check, as `CmsEntryAccess` does (R78).\n */\nclass WbPageAccessImpl implements Abstraction.Interface {\n public constructor(\n private permissions: WbPermissions.Interface,\n private identityContext: IdentityContext.Interface,\n private folderLevelPermissions: FolderLevelPermissions.Interface\n ) {}\n\n public canWriteAnyPage(): Promise<boolean> {\n return this.permissions.canEdit(\"page\");\n }\n\n public canDeleteAnyPage(): Promise<boolean> {\n // Entity-level `canDelete` treats an own-only permission as \"no item, no match\"; passing\n // the current identity as creator makes any delete permission pass.\n const identity = this.identityContext.getIdentity();\n return this.permissions.canDelete(\"page\", { createdBy: { id: identity.id } });\n }\n\n public async canRead(target: WbPageTarget, folderRule?: FolderReadRule): Promise<boolean> {\n if (!(await this.permissions.canRead(\"page\"))) {\n return false;\n }\n if (!(await this.permissions.canAccess(\"page\", target.page))) {\n return false;\n }\n // Folder-level permissions are skipped when FLP is not in use for the identity (e.g. API\n // keys) or the page is in the root folder, as the ACO CMS decorators do.\n if (!this.folderLevelPermissions.canUseFolderLevelPermissions()) {\n return true;\n }\n const folderId = target.page.location.folderId;\n if (!folderId || folderId === ROOT_FOLDER) {\n return true;\n }\n if (folderRule) {\n return folderRule.canReadFolder(folderId);\n }\n const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);\n return this.folderLevelPermissions.canAccessFolderContent({ permissions, rwd: \"r\" });\n }\n\n public async canReadInFolder(\n folderId: string | null,\n folderRule?: FolderReadRule\n ): Promise<boolean> {\n if (!(await this.permissions.canRead(\"page\"))) {\n return false;\n }\n // Folder-level permissions are skipped when FLP is not in use for the identity (e.g. API\n // keys) or for the root folder, as the ACO CMS decorators do.\n if (!this.folderLevelPermissions.canUseFolderLevelPermissions()) {\n return true;\n }\n if (!folderId || folderId === ROOT_FOLDER) {\n return true;\n }\n if (folderRule) {\n return folderRule.canReadFolder(folderId);\n }\n const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);\n return this.folderLevelPermissions.canAccessFolderContent({ permissions, rwd: \"r\" });\n }\n\n public async canWrite(target: WbPageTarget): Promise<boolean> {\n if (!(await this.permissions.canRead(\"page\"))) {\n return false;\n }\n if (!(await this.permissions.canAccess(\"page\", target.page))) {\n return false;\n }\n if (!(await this.permissions.canEdit(\"page\", target.page))) {\n return false;\n }\n // Folder-level permissions are skipped when FLP is not in use for the identity (e.g. API\n // keys) or the page is in the root folder, as the ACO CMS decorators do.\n if (!this.folderLevelPermissions.canUseFolderLevelPermissions()) {\n return true;\n }\n const folderId = target.page.location.folderId;\n if (!folderId || folderId === ROOT_FOLDER) {\n return true;\n }\n const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);\n return this.folderLevelPermissions.canAccessFolderContent({ permissions, rwd: \"w\" });\n }\n\n public async canDelete(target: WbPageTarget): Promise<boolean> {\n if (!(await this.permissions.canRead(\"page\"))) {\n return false;\n }\n if (!(await this.permissions.canAccess(\"page\", target.page))) {\n return false;\n }\n if (!(await this.permissions.canDelete(\"page\", target.page))) {\n return false;\n }\n // Folder-level permissions are skipped when FLP is not in use for the identity (e.g. API\n // keys) or the page is in the root folder, as the ACO CMS decorators do.\n if (!this.folderLevelPermissions.canUseFolderLevelPermissions()) {\n return true;\n }\n const folderId = target.page.location.folderId;\n if (!folderId || folderId === ROOT_FOLDER) {\n return true;\n }\n const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);\n return this.folderLevelPermissions.canAccessFolderContent({ permissions, rwd: \"d\" });\n }\n}\n\nexport const WbPageAccess = Abstraction.createImplementation({\n implementation: WbPageAccessImpl,\n dependencies: [WbPermissions, IdentityContext, FolderLevelPermissions]\n});\n"],"names":["WbPageAccessImpl","permissions","identityContext","folderLevelPermissions","identity","target","folderRule","folderId","ROOT_FOLDER","WbPageAccess","Abstraction","WbPermissions","IdentityContext","FolderLevelPermissions"],"mappings":";;;;;AAaA,MAAMA;IACF,YACYC,WAAoC,EACpCC,eAA0C,EAC1CC,sBAAwD,CAClE;aAHUF,WAAW,GAAXA;aACAC,eAAe,GAAfA;aACAC,sBAAsB,GAAtBA;IACT;IAEI,kBAAoC;QACvC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IACpC;IAEO,mBAAqC;QAGxC,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;QACjD,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ;YAAE,WAAW;gBAAE,IAAIA,SAAS,EAAE;YAAC;QAAE;IAC/E;IAEA,MAAa,QAAQC,MAAoB,EAAEC,UAA2B,EAAoB;QACtF,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SACjC,OAAO;QAEX,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQD,OAAO,IAAI,GACtD,OAAO;QAIX,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,4BAA4B,IACzD,OAAO;QAEX,MAAME,WAAWF,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAC9C,IAAI,CAACE,YAAYA,aAAaC,aAC1B,OAAO;QAEX,IAAIF,YACA,OAAOA,WAAW,aAAa,CAACC;QAEpC,MAAMN,cAAc,MAAM,IAAI,CAAC,sBAAsB,CAAC,yBAAyB,CAACM;QAChF,OAAO,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;YAAEN;YAAa,KAAK;QAAI;IACtF;IAEA,MAAa,gBACTM,QAAuB,EACvBD,UAA2B,EACX;QAChB,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SACjC,OAAO;QAIX,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,4BAA4B,IACzD,OAAO;QAEX,IAAI,CAACC,YAAYA,aAAaC,aAC1B,OAAO;QAEX,IAAIF,YACA,OAAOA,WAAW,aAAa,CAACC;QAEpC,MAAMN,cAAc,MAAM,IAAI,CAAC,sBAAsB,CAAC,yBAAyB,CAACM;QAChF,OAAO,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;YAAEN;YAAa,KAAK;QAAI;IACtF;IAEA,MAAa,SAASI,MAAoB,EAAoB;QAC1D,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SACjC,OAAO;QAEX,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQA,OAAO,IAAI,GACtD,OAAO;QAEX,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQA,OAAO,IAAI,GACpD,OAAO;QAIX,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,4BAA4B,IACzD,OAAO;QAEX,MAAME,WAAWF,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAC9C,IAAI,CAACE,YAAYA,aAAaC,aAC1B,OAAO;QAEX,MAAMP,cAAc,MAAM,IAAI,CAAC,sBAAsB,CAAC,yBAAyB,CAACM;QAChF,OAAO,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;YAAEN;YAAa,KAAK;QAAI;IACtF;IAEA,MAAa,UAAUI,MAAoB,EAAoB;QAC3D,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SACjC,OAAO;QAEX,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQA,OAAO,IAAI,GACtD,OAAO;QAEX,IAAI,CAAE,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQA,OAAO,IAAI,GACtD,OAAO;QAIX,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,4BAA4B,IACzD,OAAO;QAEX,MAAME,WAAWF,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAC9C,IAAI,CAACE,YAAYA,aAAaC,aAC1B,OAAO;QAEX,MAAMP,cAAc,MAAM,IAAI,CAAC,sBAAsB,CAAC,yBAAyB,CAACM;QAChF,OAAO,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;YAAEN;YAAa,KAAK;QAAI;IACtF;AACJ;AAEO,MAAMQ,4BAAeC,aAAAA,oBAAgC,CAAC;IACzD,gBAAgBV;IAChB,cAAc;QAACW;QAAeC;QAAiBC;KAAuB;AAC1E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { FolderReadRule } from "@webiny/api-headless-cms-workflows/features/target/FolderReadRule.js";
|
|
2
|
+
import type { WbPageTarget } from "../WbPageTargetReader/abstractions.js";
|
|
3
|
+
export interface IWbPageAccess {
|
|
4
|
+
/**
|
|
5
|
+
* Entity-level write permission (any page), as WB checks it before loading a page; lets the
|
|
6
|
+
* request wrapper refuse before it reads anything (R75).
|
|
7
|
+
*/
|
|
8
|
+
canWriteAnyPage(): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Entity-level delete permission (any page; an own-only permission passes), checked before
|
|
11
|
+
* anything is read so the cancel-for-delete wrapper reveals nothing (R86).
|
|
12
|
+
*/
|
|
13
|
+
canDeleteAnyPage(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Read access of the current identity (review actions, get review). With `folderRule`, the
|
|
16
|
+
* folder is decided by the rule (folder permissions loaded once for many checks, Q79), so the
|
|
17
|
+
* check reads nothing; without it, the folder's permissions are read for this check.
|
|
18
|
+
*/
|
|
19
|
+
canRead(target: WbPageTarget, folderRule?: FolderReadRule): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Read access of the current identity to pages in a folder, without a page (the routing
|
|
22
|
+
* inspector, R121): `wb.page` read plus folder content read. Root (`null` or `"root"`) or FLP
|
|
23
|
+
* not in use: the page read only. No own-only check without a page (A47).
|
|
24
|
+
*/
|
|
25
|
+
canReadInFolder(folderId: string | null, folderRule?: FolderReadRule): Promise<boolean>;
|
|
26
|
+
/** Write access of the current identity (request a review, D77); includes read (R82). */
|
|
27
|
+
canWrite(target: WbPageTarget): Promise<boolean>;
|
|
28
|
+
/** Delete access of the current identity (trash, delete, cancel-for-delete, D134). */
|
|
29
|
+
canDelete(target: WbPageTarget): Promise<boolean>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Website Builder's own page access for the current identity (R47, A25): `wb.page` permissions
|
|
33
|
+
* (incl. own-only) as `GetPageByIdUseCase`, `UpdatePageUseCase` and `TrashPageUseCase` check them,
|
|
34
|
+
* plus folder-level permissions on the page's folder.
|
|
35
|
+
*/
|
|
36
|
+
export declare const WbPageAccess: import("@webiny/di").Abstraction<IWbPageAccess>;
|
|
37
|
+
export declare namespace WbPageAccess {
|
|
38
|
+
type Interface = IWbPageAccess;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/target/WbPageAccess/abstractions.js","sources":["../../../../src/features/target/WbPageAccess/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { FolderReadRule } from \"@webiny/api-headless-cms-workflows/features/target/FolderReadRule.js\";\nimport type { WbPageTarget } from \"../WbPageTargetReader/abstractions.js\";\n\nexport interface IWbPageAccess {\n /**\n * Entity-level write permission (any page), as WB checks it before loading a page; lets the\n * request wrapper refuse before it reads anything (R75).\n */\n canWriteAnyPage(): Promise<boolean>;\n /**\n * Entity-level delete permission (any page; an own-only permission passes), checked before\n * anything is read so the cancel-for-delete wrapper reveals nothing (R86).\n */\n canDeleteAnyPage(): Promise<boolean>;\n /**\n * Read access of the current identity (review actions, get review). With `folderRule`, the\n * folder is decided by the rule (folder permissions loaded once for many checks, Q79), so the\n * check reads nothing; without it, the folder's permissions are read for this check.\n */\n canRead(target: WbPageTarget, folderRule?: FolderReadRule): Promise<boolean>;\n\n /**\n * Read access of the current identity to pages in a folder, without a page (the routing\n * inspector, R121): `wb.page` read plus folder content read. Root (`null` or `\"root\"`) or FLP\n * not in use: the page read only. No own-only check without a page (A47).\n */\n canReadInFolder(folderId: string | null, folderRule?: FolderReadRule): Promise<boolean>;\n /** Write access of the current identity (request a review, D77); includes read (R82). */\n canWrite(target: WbPageTarget): Promise<boolean>;\n /** Delete access of the current identity (trash, delete, cancel-for-delete, D134). */\n canDelete(target: WbPageTarget): Promise<boolean>;\n}\n\n/**\n * Website Builder's own page access for the current identity (R47, A25): `wb.page` permissions\n * (incl. own-only) as `GetPageByIdUseCase`, `UpdatePageUseCase` and `TrashPageUseCase` check them,\n * plus folder-level permissions on the page's folder.\n */\nexport const WbPageAccess = createAbstraction<IWbPageAccess>(\"WbPageAccess\");\n\nexport namespace WbPageAccess {\n export type Interface = IWbPageAccess;\n}\n"],"names":["WbPageAccess","createAbstraction"],"mappings":";AAuCO,MAAMA,eAAeC,kBAAiC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { WbPageAccess } from "./abstractions.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { WbPageAccess } from "./abstractions.js";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
2
|
+
import { FolderLevelPermissions } from "@webiny/api-aco/features/flp/FolderLevelPermissions/index.js";
|
|
3
|
+
import type { FolderReadRule } from "@webiny/api-headless-cms-workflows/features/target/FolderReadRule.js";
|
|
4
|
+
import { WbPageDeniedFolders as Abstraction } from "./abstractions.js";
|
|
5
|
+
/**
|
|
6
|
+
* Registered per request, so the cache lives for one request. Keyed by identity id, because
|
|
7
|
+
* `withIdentity` can switch the identity mid-request.
|
|
8
|
+
*/
|
|
9
|
+
declare class WbPageDeniedFoldersImpl implements Abstraction.Interface {
|
|
10
|
+
private identityContext;
|
|
11
|
+
private folderLevelPermissions;
|
|
12
|
+
private readonly cache;
|
|
13
|
+
constructor(identityContext: IdentityContext.Interface, folderLevelPermissions: FolderLevelPermissions.Interface);
|
|
14
|
+
listDeniedFolderIds(): Promise<string[]>;
|
|
15
|
+
createFolderReadRule(): Promise<FolderReadRule>;
|
|
16
|
+
}
|
|
17
|
+
export declare const WbPageDeniedFolders: typeof WbPageDeniedFoldersImpl & {
|
|
18
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IWbPageDeniedFolders>;
|
|
19
|
+
};
|
|
20
|
+
export {};
|