@webiny/api-headless-cms-workflows 0.0.0-unstable.c27f4d8a31 → 0.0.0-unstable.d0f34a8194

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.
Files changed (500) hide show
  1. package/CmsWorkflowsFeature.d.ts +4 -0
  2. package/CmsWorkflowsFeature.js +28 -0
  3. package/CmsWorkflowsFeature.js.map +1 -0
  4. package/domain/errors.d.ts +27 -0
  5. package/domain/errors.js +14 -0
  6. package/domain/errors.js.map +1 -0
  7. package/features/Workflows/feature.d.ts +4 -1
  8. package/features/Workflows/feature.js +8 -5
  9. package/features/Workflows/feature.js.map +1 -1
  10. package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeCreate.d.ts +18 -6
  11. package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeCreate.js +36 -24
  12. package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeCreate.js.map +1 -1
  13. package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeUpdate.d.ts +23 -0
  14. package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeUpdate.js +44 -0
  15. package/features/Workflows/handlers/DisallowUnpublishableModelsOnBeforeUpdate.js.map +1 -0
  16. package/features/Workflows/index.js +0 -2
  17. package/features/hooks/BlockDeleteMultipleWhileInReview.d.ts +22 -0
  18. package/features/hooks/BlockDeleteMultipleWhileInReview.js +64 -0
  19. package/features/hooks/BlockDeleteMultipleWhileInReview.js.map +1 -0
  20. package/features/hooks/BlockDeleteWhileInReview.d.ts +18 -0
  21. package/features/hooks/BlockDeleteWhileInReview.js +45 -0
  22. package/features/hooks/BlockDeleteWhileInReview.js.map +1 -0
  23. package/features/hooks/BlockFolderChangeWhileInReview.d.ts +21 -0
  24. package/features/hooks/BlockFolderChangeWhileInReview.js +44 -0
  25. package/features/hooks/BlockFolderChangeWhileInReview.js.map +1 -0
  26. package/features/hooks/BlockMoveWhileInReview.d.ts +19 -0
  27. package/features/hooks/BlockMoveWhileInReview.js +46 -0
  28. package/features/hooks/BlockMoveWhileInReview.js.map +1 -0
  29. package/features/hooks/BlockRevisionDeleteWhileInReview.d.ts +17 -0
  30. package/features/hooks/BlockRevisionDeleteWhileInReview.js +46 -0
  31. package/features/hooks/BlockRevisionDeleteWhileInReview.js.map +1 -0
  32. package/features/hooks/BlockUpdateWhileInReview.d.ts +25 -0
  33. package/features/hooks/BlockUpdateWhileInReview.js +43 -0
  34. package/features/hooks/BlockUpdateWhileInReview.js.map +1 -0
  35. package/features/hooks/DeleteModelBoundToWorkflowDecorator.d.ts +22 -0
  36. package/features/hooks/DeleteModelBoundToWorkflowDecorator.js +52 -0
  37. package/features/hooks/DeleteModelBoundToWorkflowDecorator.js.map +1 -0
  38. package/features/hooks/DeleteModelTaskBoundToWorkflowDecorator.d.ts +27 -0
  39. package/features/hooks/DeleteModelTaskBoundToWorkflowDecorator.js +64 -0
  40. package/features/hooks/DeleteModelTaskBoundToWorkflowDecorator.js.map +1 -0
  41. package/features/hooks/DeleteReviewsOnEntriesDeleteMultiple.d.ts +19 -0
  42. package/features/hooks/DeleteReviewsOnEntriesDeleteMultiple.js +47 -0
  43. package/features/hooks/DeleteReviewsOnEntriesDeleteMultiple.js.map +1 -0
  44. package/features/hooks/DeleteReviewsOnEntryDelete.d.ts +19 -0
  45. package/features/hooks/DeleteReviewsOnEntryDelete.js +46 -0
  46. package/features/hooks/DeleteReviewsOnEntryDelete.js.map +1 -0
  47. package/features/hooks/DeleteReviewsOnRevisionDelete.d.ts +18 -0
  48. package/features/hooks/DeleteReviewsOnRevisionDelete.js +46 -0
  49. package/features/hooks/DeleteReviewsOnRevisionDelete.js.map +1 -0
  50. package/features/hooks/FullyDeleteModelBoundToWorkflowDecorator.d.ts +28 -0
  51. package/features/hooks/FullyDeleteModelBoundToWorkflowDecorator.js +63 -0
  52. package/features/hooks/FullyDeleteModelBoundToWorkflowDecorator.js.map +1 -0
  53. package/features/hooks/NullReviewStateOnRevisionCreate.d.ts +15 -0
  54. package/features/hooks/NullReviewStateOnRevisionCreate.js +17 -0
  55. package/features/hooks/NullReviewStateOnRevisionCreate.js.map +1 -0
  56. package/features/hooks/RequireApprovedReviewOnPublish.d.ts +22 -0
  57. package/features/hooks/RequireApprovedReviewOnPublish.js +43 -0
  58. package/features/hooks/RequireApprovedReviewOnPublish.js.map +1 -0
  59. package/features/hooks/RequireApprovedReviewOnRepublish.d.ts +23 -0
  60. package/features/hooks/RequireApprovedReviewOnRepublish.js +49 -0
  61. package/features/hooks/RequireApprovedReviewOnRepublish.js.map +1 -0
  62. package/features/hooks/feature.d.ts +8 -0
  63. package/features/hooks/feature.js +39 -0
  64. package/features/hooks/feature.js.map +1 -0
  65. package/features/target/CandidateFolderReadRules/CandidateFolderReadRules.d.ts +18 -0
  66. package/features/target/CandidateFolderReadRules/CandidateFolderReadRules.js +97 -0
  67. package/features/target/CandidateFolderReadRules/CandidateFolderReadRules.js.map +1 -0
  68. package/features/target/CandidateFolderReadRules/abstractions.d.ts +35 -0
  69. package/features/target/CandidateFolderReadRules/abstractions.js +5 -0
  70. package/features/target/CandidateFolderReadRules/abstractions.js.map +1 -0
  71. package/features/target/CandidateFolderReadRules/index.d.ts +1 -0
  72. package/features/target/CandidateFolderReadRules/index.js +1 -0
  73. package/features/target/CmsEntryAccess/CmsEntryAccess.d.ts +32 -0
  74. package/features/target/CmsEntryAccess/CmsEntryAccess.js +141 -0
  75. package/features/target/CmsEntryAccess/CmsEntryAccess.js.map +1 -0
  76. package/features/target/CmsEntryAccess/abstractions.d.ts +48 -0
  77. package/features/target/CmsEntryAccess/abstractions.js +5 -0
  78. package/features/target/CmsEntryAccess/abstractions.js.map +1 -0
  79. package/features/target/CmsEntryAccess/index.d.ts +2 -0
  80. package/features/target/CmsEntryAccess/index.js +2 -0
  81. package/features/target/CmsEntryAccess/unreadableCodes.d.ts +1 -0
  82. package/features/target/CmsEntryAccess/unreadableCodes.js +9 -0
  83. package/features/target/CmsEntryAccess/unreadableCodes.js.map +1 -0
  84. package/features/target/CmsEntryDeniedFolders/CmsEntryDeniedFolders.d.ts +21 -0
  85. package/features/target/CmsEntryDeniedFolders/CmsEntryDeniedFolders.js +66 -0
  86. package/features/target/CmsEntryDeniedFolders/CmsEntryDeniedFolders.js.map +1 -0
  87. package/features/target/CmsEntryDeniedFolders/abstractions.d.ts +23 -0
  88. package/features/target/CmsEntryDeniedFolders/abstractions.js +5 -0
  89. package/features/target/CmsEntryDeniedFolders/abstractions.js.map +1 -0
  90. package/features/target/CmsEntryDeniedFolders/index.d.ts +1 -0
  91. package/features/target/CmsEntryDeniedFolders/index.js +1 -0
  92. package/features/target/CmsEntryFolderExistsService/CmsEntryFolderExistsService.d.ts +18 -0
  93. package/features/target/CmsEntryFolderExistsService/CmsEntryFolderExistsService.js +43 -0
  94. package/features/target/CmsEntryFolderExistsService/CmsEntryFolderExistsService.js.map +1 -0
  95. package/features/target/CmsEntryFolderExistsService/abstractions.d.ts +23 -0
  96. package/features/target/CmsEntryFolderExistsService/abstractions.js +5 -0
  97. package/features/target/CmsEntryFolderExistsService/abstractions.js.map +1 -0
  98. package/features/target/CmsEntryFolderExistsService/index.d.ts +1 -0
  99. package/features/target/CmsEntryFolderExistsService/index.js +1 -0
  100. package/features/target/CmsEntryReviewNamespace/CmsModelReviewNamespace.d.ts +10 -0
  101. package/features/target/CmsEntryReviewNamespace/CmsModelReviewNamespace.js +14 -0
  102. package/features/target/CmsEntryReviewNamespace/CmsModelReviewNamespace.js.map +1 -0
  103. package/features/target/CmsEntryReviewNamespace/abstractions.d.ts +17 -0
  104. package/features/target/CmsEntryReviewNamespace/abstractions.js +5 -0
  105. package/features/target/CmsEntryReviewNamespace/abstractions.js.map +1 -0
  106. package/features/target/CmsEntryReviewNamespace/index.d.ts +1 -0
  107. package/features/target/CmsEntryReviewNamespace/index.js +1 -0
  108. package/features/target/CmsEntryReviewReadFilter/CmsEntryReviewReadFilter.d.ts +20 -0
  109. package/features/target/CmsEntryReviewReadFilter/CmsEntryReviewReadFilter.js +80 -0
  110. package/features/target/CmsEntryReviewReadFilter/CmsEntryReviewReadFilter.js.map +1 -0
  111. package/features/target/CmsEntryReviewReadFilter/abstractions.d.ts +24 -0
  112. package/features/target/CmsEntryReviewReadFilter/abstractions.js +5 -0
  113. package/features/target/CmsEntryReviewReadFilter/abstractions.js.map +1 -0
  114. package/features/target/CmsEntryReviewReadFilter/index.d.ts +1 -0
  115. package/features/target/CmsEntryReviewReadFilter/index.js +1 -0
  116. package/features/target/CmsEntryReviewTargetEditor.d.ts +28 -0
  117. package/features/target/CmsEntryReviewTargetEditor.js +128 -0
  118. package/features/target/CmsEntryReviewTargetEditor.js.map +1 -0
  119. package/features/target/CmsEntryReviewTargetFolderChain.d.ts +22 -0
  120. package/features/target/CmsEntryReviewTargetFolderChain.js +37 -0
  121. package/features/target/CmsEntryReviewTargetFolderChain.js.map +1 -0
  122. package/features/target/CmsEntryReviewTargetLink.d.ts +17 -0
  123. package/features/target/CmsEntryReviewTargetLink.js +18 -0
  124. package/features/target/CmsEntryReviewTargetLink.js.map +1 -0
  125. package/features/target/CmsEntryReviewTargetLoader.d.ts +16 -0
  126. package/features/target/CmsEntryReviewTargetLoader.js +29 -0
  127. package/features/target/CmsEntryReviewTargetLoader.js.map +1 -0
  128. package/features/target/CmsEntryReviewTargetReadAccess.d.ts +41 -0
  129. package/features/target/CmsEntryReviewTargetReadAccess.js +91 -0
  130. package/features/target/CmsEntryReviewTargetReadAccess.js.map +1 -0
  131. package/features/target/CmsEntryReviewTargetSync.d.ts +23 -0
  132. package/features/target/CmsEntryReviewTargetSync.js +42 -0
  133. package/features/target/CmsEntryReviewTargetSync.js.map +1 -0
  134. package/features/target/CmsEntryTargetReader/CmsEntryTargetReader.d.ts +27 -0
  135. package/features/target/CmsEntryTargetReader/CmsEntryTargetReader.js +81 -0
  136. package/features/target/CmsEntryTargetReader/CmsEntryTargetReader.js.map +1 -0
  137. package/features/target/CmsEntryTargetReader/abstractions.d.ts +40 -0
  138. package/features/target/CmsEntryTargetReader/abstractions.js +5 -0
  139. package/features/target/CmsEntryTargetReader/abstractions.js.map +1 -0
  140. package/features/target/CmsEntryTargetReader/index.d.ts +1 -0
  141. package/features/target/CmsEntryTargetReader/index.js +1 -0
  142. package/features/target/CmsModelGroupService/CmsModelGroupService.d.ts +12 -0
  143. package/features/target/CmsModelGroupService/CmsModelGroupService.js +25 -0
  144. package/features/target/CmsModelGroupService/CmsModelGroupService.js.map +1 -0
  145. package/features/target/CmsModelGroupService/abstractions.d.ts +24 -0
  146. package/features/target/CmsModelGroupService/abstractions.js +5 -0
  147. package/features/target/CmsModelGroupService/abstractions.js.map +1 -0
  148. package/features/target/CmsModelGroupService/index.d.ts +1 -0
  149. package/features/target/CmsModelGroupService/index.js +1 -0
  150. package/features/target/CmsWorkflowModelParser.d.ts +9 -0
  151. package/features/target/CmsWorkflowModelParser.js +18 -0
  152. package/features/target/CmsWorkflowModelParser.js.map +1 -0
  153. package/features/target/FolderReadRule.d.ts +9 -0
  154. package/features/target/FolderReadRule.js +0 -0
  155. package/features/target/WorkflowEntrySystemField.d.ts +13 -0
  156. package/features/target/WorkflowEntrySystemField.js +35 -0
  157. package/features/target/WorkflowEntrySystemField.js.map +1 -0
  158. package/features/target/feature.d.ts +5 -0
  159. package/features/target/feature.js +41 -0
  160. package/features/target/feature.js.map +1 -0
  161. package/features/target/getModelSafeValidationMessage.d.ts +11 -0
  162. package/features/target/getModelSafeValidationMessage.js +28 -0
  163. package/features/target/getModelSafeValidationMessage.js.map +1 -0
  164. package/features/target/isEditorFieldValue.d.ts +9 -0
  165. package/features/target/isEditorFieldValue.js +30 -0
  166. package/features/target/isEditorFieldValue.js.map +1 -0
  167. package/features/target/toCmsReviewTarget.d.ts +4 -0
  168. package/features/target/toCmsReviewTarget.js +26 -0
  169. package/features/target/toCmsReviewTarget.js.map +1 -0
  170. package/features/target/toEditorFields.d.ts +9 -0
  171. package/features/target/toEditorFields.js +48 -0
  172. package/features/target/toEditorFields.js.map +1 -0
  173. package/features/target/toEntryValuesPatch.d.ts +9 -0
  174. package/features/target/toEntryValuesPatch.js +31 -0
  175. package/features/target/toEntryValuesPatch.js.map +1 -0
  176. package/features/wrappers/ApproveCmsEntryReviewStep/ApproveCmsEntryReviewStepUseCase.d.ts +13 -0
  177. package/features/wrappers/ApproveCmsEntryReviewStep/ApproveCmsEntryReviewStepUseCase.js +35 -0
  178. package/features/wrappers/ApproveCmsEntryReviewStep/ApproveCmsEntryReviewStepUseCase.js.map +1 -0
  179. package/features/wrappers/ApproveCmsEntryReviewStep/abstractions.d.ts +26 -0
  180. package/features/wrappers/ApproveCmsEntryReviewStep/abstractions.js +5 -0
  181. package/features/wrappers/ApproveCmsEntryReviewStep/abstractions.js.map +1 -0
  182. package/features/wrappers/ApproveCmsEntryReviewStep/feature.d.ts +4 -0
  183. package/features/wrappers/ApproveCmsEntryReviewStep/feature.js +11 -0
  184. package/features/wrappers/ApproveCmsEntryReviewStep/feature.js.map +1 -0
  185. package/features/wrappers/ApproveCmsEntryReviewStep/index.d.ts +1 -0
  186. package/features/wrappers/ApproveCmsEntryReviewStep/index.js +1 -0
  187. package/features/wrappers/CancelCmsEntryReview/CancelCmsEntryReviewUseCase.d.ts +13 -0
  188. package/features/wrappers/CancelCmsEntryReview/CancelCmsEntryReviewUseCase.js +37 -0
  189. package/features/wrappers/CancelCmsEntryReview/CancelCmsEntryReviewUseCase.js.map +1 -0
  190. package/features/wrappers/CancelCmsEntryReview/abstractions.d.ts +30 -0
  191. package/features/wrappers/CancelCmsEntryReview/abstractions.js +5 -0
  192. package/features/wrappers/CancelCmsEntryReview/abstractions.js.map +1 -0
  193. package/features/wrappers/CancelCmsEntryReview/feature.d.ts +4 -0
  194. package/features/wrappers/CancelCmsEntryReview/feature.js +11 -0
  195. package/features/wrappers/CancelCmsEntryReview/feature.js.map +1 -0
  196. package/features/wrappers/CancelCmsEntryReview/index.d.ts +1 -0
  197. package/features/wrappers/CancelCmsEntryReview/index.js +1 -0
  198. package/features/wrappers/CancelCmsEntryReviewsForDelete/CancelCmsEntryReviewsForDeleteUseCase.d.ts +19 -0
  199. package/features/wrappers/CancelCmsEntryReviewsForDelete/CancelCmsEntryReviewsForDeleteUseCase.js +85 -0
  200. package/features/wrappers/CancelCmsEntryReviewsForDelete/CancelCmsEntryReviewsForDeleteUseCase.js.map +1 -0
  201. package/features/wrappers/CancelCmsEntryReviewsForDelete/abstractions.d.ts +41 -0
  202. package/features/wrappers/CancelCmsEntryReviewsForDelete/abstractions.js +5 -0
  203. package/features/wrappers/CancelCmsEntryReviewsForDelete/abstractions.js.map +1 -0
  204. package/features/wrappers/CancelCmsEntryReviewsForDelete/feature.d.ts +4 -0
  205. package/features/wrappers/CancelCmsEntryReviewsForDelete/feature.js +11 -0
  206. package/features/wrappers/CancelCmsEntryReviewsForDelete/feature.js.map +1 -0
  207. package/features/wrappers/CancelCmsEntryReviewsForDelete/index.d.ts +1 -0
  208. package/features/wrappers/CancelCmsEntryReviewsForDelete/index.js +1 -0
  209. package/features/wrappers/CmsEntryFolderExists/CmsEntryFolderExistsUseCase.d.ts +15 -0
  210. package/features/wrappers/CmsEntryFolderExists/CmsEntryFolderExistsUseCase.js +46 -0
  211. package/features/wrappers/CmsEntryFolderExists/CmsEntryFolderExistsUseCase.js.map +1 -0
  212. package/features/wrappers/CmsEntryFolderExists/abstractions.d.ts +29 -0
  213. package/features/wrappers/CmsEntryFolderExists/abstractions.js +5 -0
  214. package/features/wrappers/CmsEntryFolderExists/abstractions.js.map +1 -0
  215. package/features/wrappers/CmsEntryFolderExists/feature.d.ts +4 -0
  216. package/features/wrappers/CmsEntryFolderExists/feature.js +11 -0
  217. package/features/wrappers/CmsEntryFolderExists/feature.js.map +1 -0
  218. package/features/wrappers/CmsEntryFolderExists/index.d.ts +1 -0
  219. package/features/wrappers/CmsEntryFolderExists/index.js +1 -0
  220. package/features/wrappers/CmsEntryReviewGuardService/CmsEntryReviewGuardService.d.ts +17 -0
  221. package/features/wrappers/CmsEntryReviewGuardService/CmsEntryReviewGuardService.js +63 -0
  222. package/features/wrappers/CmsEntryReviewGuardService/CmsEntryReviewGuardService.js.map +1 -0
  223. package/features/wrappers/CmsEntryReviewGuardService/abstractions.d.ts +37 -0
  224. package/features/wrappers/CmsEntryReviewGuardService/abstractions.js +5 -0
  225. package/features/wrappers/CmsEntryReviewGuardService/abstractions.js.map +1 -0
  226. package/features/wrappers/CmsEntryReviewGuardService/index.d.ts +1 -0
  227. package/features/wrappers/CmsEntryReviewGuardService/index.js +1 -0
  228. package/features/wrappers/DeleteCmsEntryWorkflow/DeleteCmsEntryWorkflowUseCase.d.ts +25 -0
  229. package/features/wrappers/DeleteCmsEntryWorkflow/DeleteCmsEntryWorkflowUseCase.js +98 -0
  230. package/features/wrappers/DeleteCmsEntryWorkflow/DeleteCmsEntryWorkflowUseCase.js.map +1 -0
  231. package/features/wrappers/DeleteCmsEntryWorkflow/abstractions.d.ts +32 -0
  232. package/features/wrappers/DeleteCmsEntryWorkflow/abstractions.js +5 -0
  233. package/features/wrappers/DeleteCmsEntryWorkflow/abstractions.js.map +1 -0
  234. package/features/wrappers/DeleteCmsEntryWorkflow/feature.d.ts +4 -0
  235. package/features/wrappers/DeleteCmsEntryWorkflow/feature.js +11 -0
  236. package/features/wrappers/DeleteCmsEntryWorkflow/feature.js.map +1 -0
  237. package/features/wrappers/DeleteCmsEntryWorkflow/index.d.ts +1 -0
  238. package/features/wrappers/DeleteCmsEntryWorkflow/index.js +1 -0
  239. package/features/wrappers/GetCmsEntryReview/GetCmsEntryReviewUseCase.d.ts +13 -0
  240. package/features/wrappers/GetCmsEntryReview/GetCmsEntryReviewUseCase.js +40 -0
  241. package/features/wrappers/GetCmsEntryReview/GetCmsEntryReviewUseCase.js.map +1 -0
  242. package/features/wrappers/GetCmsEntryReview/abstractions.d.ts +28 -0
  243. package/features/wrappers/GetCmsEntryReview/abstractions.js +5 -0
  244. package/features/wrappers/GetCmsEntryReview/abstractions.js.map +1 -0
  245. package/features/wrappers/GetCmsEntryReview/feature.d.ts +4 -0
  246. package/features/wrappers/GetCmsEntryReview/feature.js +11 -0
  247. package/features/wrappers/GetCmsEntryReview/feature.js.map +1 -0
  248. package/features/wrappers/GetCmsEntryReview/index.d.ts +1 -0
  249. package/features/wrappers/GetCmsEntryReview/index.js +1 -0
  250. package/features/wrappers/GetCmsEntryReviewStepRun/GetCmsEntryReviewStepRunUseCase.d.ts +13 -0
  251. package/features/wrappers/GetCmsEntryReviewStepRun/GetCmsEntryReviewStepRunUseCase.js +39 -0
  252. package/features/wrappers/GetCmsEntryReviewStepRun/GetCmsEntryReviewStepRunUseCase.js.map +1 -0
  253. package/features/wrappers/GetCmsEntryReviewStepRun/abstractions.d.ts +33 -0
  254. package/features/wrappers/GetCmsEntryReviewStepRun/abstractions.js +5 -0
  255. package/features/wrappers/GetCmsEntryReviewStepRun/abstractions.js.map +1 -0
  256. package/features/wrappers/GetCmsEntryReviewStepRun/feature.d.ts +4 -0
  257. package/features/wrappers/GetCmsEntryReviewStepRun/feature.js +11 -0
  258. package/features/wrappers/GetCmsEntryReviewStepRun/feature.js.map +1 -0
  259. package/features/wrappers/GetCmsEntryReviewStepRun/index.d.ts +1 -0
  260. package/features/wrappers/GetCmsEntryReviewStepRun/index.js +1 -0
  261. package/features/wrappers/GetCmsEntryTargetReview/GetCmsEntryTargetReviewUseCase.d.ts +19 -0
  262. package/features/wrappers/GetCmsEntryTargetReview/GetCmsEntryTargetReviewUseCase.js +76 -0
  263. package/features/wrappers/GetCmsEntryTargetReview/GetCmsEntryTargetReviewUseCase.js.map +1 -0
  264. package/features/wrappers/GetCmsEntryTargetReview/abstractions.d.ts +36 -0
  265. package/features/wrappers/GetCmsEntryTargetReview/abstractions.js +5 -0
  266. package/features/wrappers/GetCmsEntryTargetReview/abstractions.js.map +1 -0
  267. package/features/wrappers/GetCmsEntryTargetReview/feature.d.ts +4 -0
  268. package/features/wrappers/GetCmsEntryTargetReview/feature.js +11 -0
  269. package/features/wrappers/GetCmsEntryTargetReview/feature.js.map +1 -0
  270. package/features/wrappers/GetCmsEntryTargetReview/index.d.ts +1 -0
  271. package/features/wrappers/GetCmsEntryTargetReview/index.js +1 -0
  272. package/features/wrappers/GetCmsEntryWorkflow/GetCmsEntryWorkflowUseCase.d.ts +13 -0
  273. package/features/wrappers/GetCmsEntryWorkflow/GetCmsEntryWorkflowUseCase.js +34 -0
  274. package/features/wrappers/GetCmsEntryWorkflow/GetCmsEntryWorkflowUseCase.js.map +1 -0
  275. package/features/wrappers/GetCmsEntryWorkflow/abstractions.d.ts +24 -0
  276. package/features/wrappers/GetCmsEntryWorkflow/abstractions.js +5 -0
  277. package/features/wrappers/GetCmsEntryWorkflow/abstractions.js.map +1 -0
  278. package/features/wrappers/GetCmsEntryWorkflow/feature.d.ts +4 -0
  279. package/features/wrappers/GetCmsEntryWorkflow/feature.js +11 -0
  280. package/features/wrappers/GetCmsEntryWorkflow/feature.js.map +1 -0
  281. package/features/wrappers/GetCmsEntryWorkflow/index.d.ts +1 -0
  282. package/features/wrappers/GetCmsEntryWorkflow/index.js +1 -0
  283. package/features/wrappers/InspectCmsEntryRouting/InspectCmsEntryRoutingUseCase.d.ts +19 -0
  284. package/features/wrappers/InspectCmsEntryRouting/InspectCmsEntryRoutingUseCase.js +54 -0
  285. package/features/wrappers/InspectCmsEntryRouting/InspectCmsEntryRoutingUseCase.js.map +1 -0
  286. package/features/wrappers/InspectCmsEntryRouting/abstractions.d.ts +37 -0
  287. package/features/wrappers/InspectCmsEntryRouting/abstractions.js +5 -0
  288. package/features/wrappers/InspectCmsEntryRouting/abstractions.js.map +1 -0
  289. package/features/wrappers/InspectCmsEntryRouting/feature.d.ts +4 -0
  290. package/features/wrappers/InspectCmsEntryRouting/feature.js +11 -0
  291. package/features/wrappers/InspectCmsEntryRouting/feature.js.map +1 -0
  292. package/features/wrappers/InspectCmsEntryRouting/index.d.ts +1 -0
  293. package/features/wrappers/InspectCmsEntryRouting/index.js +1 -0
  294. package/features/wrappers/ListCmsEntryBlockingReviews/ListCmsEntryBlockingReviewsUseCase.d.ts +25 -0
  295. package/features/wrappers/ListCmsEntryBlockingReviews/ListCmsEntryBlockingReviewsUseCase.js +109 -0
  296. package/features/wrappers/ListCmsEntryBlockingReviews/ListCmsEntryBlockingReviewsUseCase.js.map +1 -0
  297. package/features/wrappers/ListCmsEntryBlockingReviews/abstractions.d.ts +36 -0
  298. package/features/wrappers/ListCmsEntryBlockingReviews/abstractions.js +6 -0
  299. package/features/wrappers/ListCmsEntryBlockingReviews/abstractions.js.map +1 -0
  300. package/features/wrappers/ListCmsEntryBlockingReviews/feature.d.ts +4 -0
  301. package/features/wrappers/ListCmsEntryBlockingReviews/feature.js +11 -0
  302. package/features/wrappers/ListCmsEntryBlockingReviews/feature.js.map +1 -0
  303. package/features/wrappers/ListCmsEntryBlockingReviews/index.d.ts +1 -0
  304. package/features/wrappers/ListCmsEntryBlockingReviews/index.js +1 -0
  305. package/features/wrappers/ListCmsEntryReviewStepCandidates/ListCmsEntryReviewStepCandidatesUseCase.d.ts +13 -0
  306. package/features/wrappers/ListCmsEntryReviewStepCandidates/ListCmsEntryReviewStepCandidatesUseCase.js +41 -0
  307. package/features/wrappers/ListCmsEntryReviewStepCandidates/ListCmsEntryReviewStepCandidatesUseCase.js.map +1 -0
  308. package/features/wrappers/ListCmsEntryReviewStepCandidates/abstractions.d.ts +30 -0
  309. package/features/wrappers/ListCmsEntryReviewStepCandidates/abstractions.js +5 -0
  310. package/features/wrappers/ListCmsEntryReviewStepCandidates/abstractions.js.map +1 -0
  311. package/features/wrappers/ListCmsEntryReviewStepCandidates/feature.d.ts +4 -0
  312. package/features/wrappers/ListCmsEntryReviewStepCandidates/feature.js +11 -0
  313. package/features/wrappers/ListCmsEntryReviewStepCandidates/feature.js.map +1 -0
  314. package/features/wrappers/ListCmsEntryReviewStepCandidates/index.d.ts +1 -0
  315. package/features/wrappers/ListCmsEntryReviewStepCandidates/index.js +1 -0
  316. package/features/wrappers/ListCmsEntryReviews/ListCmsEntryReviewsUseCase.d.ts +17 -0
  317. package/features/wrappers/ListCmsEntryReviews/ListCmsEntryReviewsUseCase.js +85 -0
  318. package/features/wrappers/ListCmsEntryReviews/ListCmsEntryReviewsUseCase.js.map +1 -0
  319. package/features/wrappers/ListCmsEntryReviews/abstractions.d.ts +50 -0
  320. package/features/wrappers/ListCmsEntryReviews/abstractions.js +5 -0
  321. package/features/wrappers/ListCmsEntryReviews/abstractions.js.map +1 -0
  322. package/features/wrappers/ListCmsEntryReviews/feature.d.ts +4 -0
  323. package/features/wrappers/ListCmsEntryReviews/feature.js +11 -0
  324. package/features/wrappers/ListCmsEntryReviews/feature.js.map +1 -0
  325. package/features/wrappers/ListCmsEntryReviews/index.d.ts +1 -0
  326. package/features/wrappers/ListCmsEntryReviews/index.js +1 -0
  327. package/features/wrappers/ListCmsEntryStepCandidates/ListCmsEntryStepCandidatesUseCase.d.ts +25 -0
  328. package/features/wrappers/ListCmsEntryStepCandidates/ListCmsEntryStepCandidatesUseCase.js +83 -0
  329. package/features/wrappers/ListCmsEntryStepCandidates/ListCmsEntryStepCandidatesUseCase.js.map +1 -0
  330. package/features/wrappers/ListCmsEntryStepCandidates/abstractions.d.ts +41 -0
  331. package/features/wrappers/ListCmsEntryStepCandidates/abstractions.js +5 -0
  332. package/features/wrappers/ListCmsEntryStepCandidates/abstractions.js.map +1 -0
  333. package/features/wrappers/ListCmsEntryStepCandidates/feature.d.ts +4 -0
  334. package/features/wrappers/ListCmsEntryStepCandidates/feature.js +11 -0
  335. package/features/wrappers/ListCmsEntryStepCandidates/feature.js.map +1 -0
  336. package/features/wrappers/ListCmsEntryStepCandidates/index.d.ts +1 -0
  337. package/features/wrappers/ListCmsEntryStepCandidates/index.js +1 -0
  338. package/features/wrappers/ListCmsEntryWorkflowModels/ListCmsEntryWorkflowModelsUseCase.d.ts +17 -0
  339. package/features/wrappers/ListCmsEntryWorkflowModels/ListCmsEntryWorkflowModelsUseCase.js +106 -0
  340. package/features/wrappers/ListCmsEntryWorkflowModels/ListCmsEntryWorkflowModelsUseCase.js.map +1 -0
  341. package/features/wrappers/ListCmsEntryWorkflowModels/abstractions.d.ts +58 -0
  342. package/features/wrappers/ListCmsEntryWorkflowModels/abstractions.js +5 -0
  343. package/features/wrappers/ListCmsEntryWorkflowModels/abstractions.js.map +1 -0
  344. package/features/wrappers/ListCmsEntryWorkflowModels/feature.d.ts +4 -0
  345. package/features/wrappers/ListCmsEntryWorkflowModels/feature.js +11 -0
  346. package/features/wrappers/ListCmsEntryWorkflowModels/feature.js.map +1 -0
  347. package/features/wrappers/ListCmsEntryWorkflowModels/index.d.ts +2 -0
  348. package/features/wrappers/ListCmsEntryWorkflowModels/index.js +1 -0
  349. package/features/wrappers/ListCmsEntryWorkflowModels/modelListCursor.d.ts +8 -0
  350. package/features/wrappers/ListCmsEntryWorkflowModels/modelListCursor.js +20 -0
  351. package/features/wrappers/ListCmsEntryWorkflowModels/modelListCursor.js.map +1 -0
  352. package/features/wrappers/ListCmsEntryWorkflows/ListCmsEntryWorkflowsUseCase.d.ts +17 -0
  353. package/features/wrappers/ListCmsEntryWorkflows/ListCmsEntryWorkflowsUseCase.js +43 -0
  354. package/features/wrappers/ListCmsEntryWorkflows/ListCmsEntryWorkflowsUseCase.js.map +1 -0
  355. package/features/wrappers/ListCmsEntryWorkflows/abstractions.d.ts +24 -0
  356. package/features/wrappers/ListCmsEntryWorkflows/abstractions.js +5 -0
  357. package/features/wrappers/ListCmsEntryWorkflows/abstractions.js.map +1 -0
  358. package/features/wrappers/ListCmsEntryWorkflows/feature.d.ts +4 -0
  359. package/features/wrappers/ListCmsEntryWorkflows/feature.js +11 -0
  360. package/features/wrappers/ListCmsEntryWorkflows/feature.js.map +1 -0
  361. package/features/wrappers/ListCmsEntryWorkflows/index.d.ts +1 -0
  362. package/features/wrappers/ListCmsEntryWorkflows/index.js +1 -0
  363. package/features/wrappers/ReassignCmsEntryReviewStep/ReassignCmsEntryReviewStepUseCase.d.ts +13 -0
  364. package/features/wrappers/ReassignCmsEntryReviewStep/ReassignCmsEntryReviewStepUseCase.js +40 -0
  365. package/features/wrappers/ReassignCmsEntryReviewStep/ReassignCmsEntryReviewStepUseCase.js.map +1 -0
  366. package/features/wrappers/ReassignCmsEntryReviewStep/abstractions.d.ts +32 -0
  367. package/features/wrappers/ReassignCmsEntryReviewStep/abstractions.js +5 -0
  368. package/features/wrappers/ReassignCmsEntryReviewStep/abstractions.js.map +1 -0
  369. package/features/wrappers/ReassignCmsEntryReviewStep/feature.d.ts +4 -0
  370. package/features/wrappers/ReassignCmsEntryReviewStep/feature.js +11 -0
  371. package/features/wrappers/ReassignCmsEntryReviewStep/feature.js.map +1 -0
  372. package/features/wrappers/ReassignCmsEntryReviewStep/index.d.ts +1 -0
  373. package/features/wrappers/ReassignCmsEntryReviewStep/index.js +1 -0
  374. package/features/wrappers/RejectCmsEntryReviewStep/RejectCmsEntryReviewStepUseCase.d.ts +13 -0
  375. package/features/wrappers/RejectCmsEntryReviewStep/RejectCmsEntryReviewStepUseCase.js +35 -0
  376. package/features/wrappers/RejectCmsEntryReviewStep/RejectCmsEntryReviewStepUseCase.js.map +1 -0
  377. package/features/wrappers/RejectCmsEntryReviewStep/abstractions.d.ts +26 -0
  378. package/features/wrappers/RejectCmsEntryReviewStep/abstractions.js +5 -0
  379. package/features/wrappers/RejectCmsEntryReviewStep/abstractions.js.map +1 -0
  380. package/features/wrappers/RejectCmsEntryReviewStep/feature.d.ts +4 -0
  381. package/features/wrappers/RejectCmsEntryReviewStep/feature.js +11 -0
  382. package/features/wrappers/RejectCmsEntryReviewStep/feature.js.map +1 -0
  383. package/features/wrappers/RejectCmsEntryReviewStep/index.d.ts +1 -0
  384. package/features/wrappers/RejectCmsEntryReviewStep/index.js +1 -0
  385. package/features/wrappers/RequestCmsEntryReview/RequestCmsEntryReviewUseCase.d.ts +21 -0
  386. package/features/wrappers/RequestCmsEntryReview/RequestCmsEntryReviewUseCase.js +63 -0
  387. package/features/wrappers/RequestCmsEntryReview/RequestCmsEntryReviewUseCase.js.map +1 -0
  388. package/features/wrappers/RequestCmsEntryReview/abstractions.d.ts +38 -0
  389. package/features/wrappers/RequestCmsEntryReview/abstractions.js +5 -0
  390. package/features/wrappers/RequestCmsEntryReview/abstractions.js.map +1 -0
  391. package/features/wrappers/RequestCmsEntryReview/feature.d.ts +4 -0
  392. package/features/wrappers/RequestCmsEntryReview/feature.js +11 -0
  393. package/features/wrappers/RequestCmsEntryReview/feature.js.map +1 -0
  394. package/features/wrappers/RequestCmsEntryReview/index.d.ts +1 -0
  395. package/features/wrappers/RequestCmsEntryReview/index.js +1 -0
  396. package/features/wrappers/RestartCmsEntryReviewStep/RestartCmsEntryReviewStepUseCase.d.ts +13 -0
  397. package/features/wrappers/RestartCmsEntryReviewStep/RestartCmsEntryReviewStepUseCase.js +39 -0
  398. package/features/wrappers/RestartCmsEntryReviewStep/RestartCmsEntryReviewStepUseCase.js.map +1 -0
  399. package/features/wrappers/RestartCmsEntryReviewStep/abstractions.d.ts +30 -0
  400. package/features/wrappers/RestartCmsEntryReviewStep/abstractions.js +5 -0
  401. package/features/wrappers/RestartCmsEntryReviewStep/abstractions.js.map +1 -0
  402. package/features/wrappers/RestartCmsEntryReviewStep/feature.d.ts +4 -0
  403. package/features/wrappers/RestartCmsEntryReviewStep/feature.js +11 -0
  404. package/features/wrappers/RestartCmsEntryReviewStep/feature.js.map +1 -0
  405. package/features/wrappers/RestartCmsEntryReviewStep/index.d.ts +1 -0
  406. package/features/wrappers/RestartCmsEntryReviewStep/index.js +1 -0
  407. package/features/wrappers/StartCmsEntryReviewStep/StartCmsEntryReviewStepUseCase.d.ts +13 -0
  408. package/features/wrappers/StartCmsEntryReviewStep/StartCmsEntryReviewStepUseCase.js +34 -0
  409. package/features/wrappers/StartCmsEntryReviewStep/StartCmsEntryReviewStepUseCase.js.map +1 -0
  410. package/features/wrappers/StartCmsEntryReviewStep/abstractions.d.ts +25 -0
  411. package/features/wrappers/StartCmsEntryReviewStep/abstractions.js +5 -0
  412. package/features/wrappers/StartCmsEntryReviewStep/abstractions.js.map +1 -0
  413. package/features/wrappers/StartCmsEntryReviewStep/feature.d.ts +4 -0
  414. package/features/wrappers/StartCmsEntryReviewStep/feature.js +11 -0
  415. package/features/wrappers/StartCmsEntryReviewStep/feature.js.map +1 -0
  416. package/features/wrappers/StartCmsEntryReviewStep/index.d.ts +1 -0
  417. package/features/wrappers/StartCmsEntryReviewStep/index.js +1 -0
  418. package/features/wrappers/StoreCmsEntryWorkflow/StoreCmsEntryWorkflowUseCase.d.ts +17 -0
  419. package/features/wrappers/StoreCmsEntryWorkflow/StoreCmsEntryWorkflowUseCase.js +57 -0
  420. package/features/wrappers/StoreCmsEntryWorkflow/StoreCmsEntryWorkflowUseCase.js.map +1 -0
  421. package/features/wrappers/StoreCmsEntryWorkflow/abstractions.d.ts +32 -0
  422. package/features/wrappers/StoreCmsEntryWorkflow/abstractions.js +5 -0
  423. package/features/wrappers/StoreCmsEntryWorkflow/abstractions.js.map +1 -0
  424. package/features/wrappers/StoreCmsEntryWorkflow/feature.d.ts +4 -0
  425. package/features/wrappers/StoreCmsEntryWorkflow/feature.js +11 -0
  426. package/features/wrappers/StoreCmsEntryWorkflow/feature.js.map +1 -0
  427. package/features/wrappers/StoreCmsEntryWorkflow/index.d.ts +1 -0
  428. package/features/wrappers/StoreCmsEntryWorkflow/index.js +1 -0
  429. package/features/wrappers/TakeOverCmsEntryReviewStep/TakeOverCmsEntryReviewStepUseCase.d.ts +13 -0
  430. package/features/wrappers/TakeOverCmsEntryReviewStep/TakeOverCmsEntryReviewStepUseCase.js +35 -0
  431. package/features/wrappers/TakeOverCmsEntryReviewStep/TakeOverCmsEntryReviewStepUseCase.js.map +1 -0
  432. package/features/wrappers/TakeOverCmsEntryReviewStep/abstractions.d.ts +27 -0
  433. package/features/wrappers/TakeOverCmsEntryReviewStep/abstractions.js +5 -0
  434. package/features/wrappers/TakeOverCmsEntryReviewStep/abstractions.js.map +1 -0
  435. package/features/wrappers/TakeOverCmsEntryReviewStep/feature.d.ts +4 -0
  436. package/features/wrappers/TakeOverCmsEntryReviewStep/feature.js +11 -0
  437. package/features/wrappers/TakeOverCmsEntryReviewStep/feature.js.map +1 -0
  438. package/features/wrappers/TakeOverCmsEntryReviewStep/index.d.ts +1 -0
  439. package/features/wrappers/TakeOverCmsEntryReviewStep/index.js +1 -0
  440. package/features/wrappers/feature.d.ts +9 -0
  441. package/features/wrappers/feature.js +57 -0
  442. package/features/wrappers/feature.js.map +1 -0
  443. package/features/wrappers/shared/cmsWorkflows.d.ts +6 -0
  444. package/features/wrappers/shared/cmsWorkflows.js +8 -0
  445. package/features/wrappers/shared/cmsWorkflows.js.map +1 -0
  446. package/graphql/CmsWorkflowsSchemaFactory.d.ts +14 -0
  447. package/graphql/CmsWorkflowsSchemaFactory.js +695 -0
  448. package/graphql/CmsWorkflowsSchemaFactory.js.map +1 -0
  449. package/graphql/entrySystemSchema.d.ts +6 -0
  450. package/graphql/entrySystemSchema.js +19 -0
  451. package/graphql/entrySystemSchema.js.map +1 -0
  452. package/graphql/isValidRevisionId.d.ts +6 -0
  453. package/graphql/isValidRevisionId.js +9 -0
  454. package/graphql/isValidRevisionId.js.map +1 -0
  455. package/index.d.ts +2 -1
  456. package/index.js +1 -20
  457. package/package.json +31 -18
  458. package/types.d.ts +24 -0
  459. package/types.js +0 -0
  460. package/utils/appName.d.ts +9 -5
  461. package/utils/appName.js +8 -11
  462. package/utils/appName.js.map +1 -1
  463. package/utils/folderType.d.ts +4 -0
  464. package/utils/folderType.js +9 -0
  465. package/utils/folderType.js.map +1 -0
  466. package/utils/isBindableModel.d.ts +9 -0
  467. package/utils/isBindableModel.js +8 -0
  468. package/utils/isBindableModel.js.map +1 -0
  469. package/features/EntryWorkflows/feature.d.ts +0 -1
  470. package/features/EntryWorkflows/feature.js +0 -20
  471. package/features/EntryWorkflows/feature.js.map +0 -1
  472. package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateAfterDelete.d.ts +0 -13
  473. package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateAfterDelete.js +0 -35
  474. package/features/EntryWorkflows/handlers/ClearEntryStateOnWorkflowStateAfterDelete.js.map +0 -1
  475. package/features/EntryWorkflows/handlers/DeleteWorkflowStateOnEntryAfterDelete.d.ts +0 -11
  476. package/features/EntryWorkflows/handlers/DeleteWorkflowStateOnEntryAfterDelete.js +0 -29
  477. package/features/EntryWorkflows/handlers/DeleteWorkflowStateOnEntryAfterDelete.js.map +0 -1
  478. package/features/EntryWorkflows/handlers/DeleteWorkflowsOnModelAfterDelete.d.ts +0 -13
  479. package/features/EntryWorkflows/handlers/DeleteWorkflowsOnModelAfterDelete.js +0 -45
  480. package/features/EntryWorkflows/handlers/DeleteWorkflowsOnModelAfterDelete.js.map +0 -1
  481. package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterCreate.d.ts +0 -13
  482. package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterCreate.js +0 -37
  483. package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterCreate.js.map +0 -1
  484. package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterUpdate.d.ts +0 -13
  485. package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterUpdate.js +0 -37
  486. package/features/EntryWorkflows/handlers/UpdateEntryOnWorkflowStateAfterUpdate.js.map +0 -1
  487. package/features/EntryWorkflows/handlers/ValidateWorkflowStateOnEntryBeforePublish.d.ts +0 -11
  488. package/features/EntryWorkflows/handlers/ValidateWorkflowStateOnEntryBeforePublish.js +0 -51
  489. package/features/EntryWorkflows/handlers/ValidateWorkflowStateOnEntryBeforePublish.js.map +0 -1
  490. package/features/EntryWorkflows/index.d.ts +0 -1
  491. package/features/EntryWorkflows/index.js +0 -3
  492. package/features/EntryWorkflows/index.js.map +0 -1
  493. package/features/Workflows/index.js.map +0 -1
  494. package/index.js.map +0 -1
  495. package/utils/modelAllowed.d.ts +0 -2
  496. package/utils/modelAllowed.js +0 -13
  497. package/utils/modelAllowed.js.map +0 -1
  498. package/utils/state.d.ts +0 -3
  499. package/utils/state.js +0 -11
  500. package/utils/state.js.map +0 -1
@@ -0,0 +1,46 @@
1
+ import { EntryRevisionAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntryRevision/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 { getCmsNamespace } from "../../utils/appName.js";
5
+ import { hasErrorSource } from "@webiny/api-workflows/domain/hasErrorSource.js";
6
+ class DeleteReviewsOnRevisionDeleteImpl {
7
+ constructor(deleteTargetReviews, logger){
8
+ this.deleteTargetReviews = deleteTargetReviews;
9
+ this.logger = logger;
10
+ }
11
+ async handle(event) {
12
+ const { model, entry } = event.payload;
13
+ const namespace = getCmsNamespace(model);
14
+ if (!namespace) return;
15
+ try {
16
+ const deleted = await this.deleteTargetReviews.execute({
17
+ model: namespace,
18
+ targetIds: [
19
+ entry.entryId
20
+ ],
21
+ targetRevisionId: entry.id
22
+ });
23
+ if (deleted.isFail()) this.logger.error({
24
+ err: hasErrorSource(deleted.error) ? deleted.error.source : deleted.error,
25
+ model: namespace,
26
+ targetRevisionId: entry.id
27
+ }, "Could not delete the reviews of a deleted revision; they are left orphaned.");
28
+ } catch (error) {
29
+ this.logger.error({
30
+ err: error,
31
+ model: namespace,
32
+ targetRevisionId: entry.id
33
+ }, "Could not delete the reviews of a deleted revision; they are left orphaned.");
34
+ }
35
+ }
36
+ }
37
+ const DeleteReviewsOnRevisionDelete = EntryRevisionAfterDeleteEventHandler.createImplementation({
38
+ implementation: DeleteReviewsOnRevisionDeleteImpl,
39
+ dependencies: [
40
+ DeleteTargetReviewsUseCase,
41
+ Logger
42
+ ]
43
+ });
44
+ export { DeleteReviewsOnRevisionDelete };
45
+
46
+ //# sourceMappingURL=DeleteReviewsOnRevisionDelete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/hooks/DeleteReviewsOnRevisionDelete.js","sources":["../../../src/features/hooks/DeleteReviewsOnRevisionDelete.ts"],"sourcesContent":["import { EntryRevisionAfterDeleteEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntryRevision/index.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { DeleteTargetReviewsUseCase } from \"@webiny/api-workflows/features/review/DeleteTargetReviews/index.js\";\nimport { getCmsNamespace } from \"~/utils/appName.js\";\nimport { hasErrorSource } from \"@webiny/api-workflows/domain/hasErrorSource.js\";\n\n/**\n * Deletes the reviews of a deleted CMS revision with their assignment records (spec 9.3, R56).\n * Deleting the last revision deletes the entry, which `DeleteReviewsOnEntryDelete` handles.\n * Failures, failed results and throws alike, are logged, never thrown (R81).\n */\nclass DeleteReviewsOnRevisionDeleteImpl implements EntryRevisionAfterDeleteEventHandler.Interface {\n public constructor(\n private deleteTargetReviews: DeleteTargetReviewsUseCase.Interface,\n private logger: Logger.Interface\n ) {}\n\n public async handle(event: EntryRevisionAfterDeleteEventHandler.Event): Promise<void> {\n const { model, entry } = event.payload;\n const namespace = getCmsNamespace(model);\n if (!namespace) {\n return;\n }\n\n try {\n const deleted = await this.deleteTargetReviews.execute({\n model: namespace,\n targetIds: [entry.entryId],\n targetRevisionId: entry.id\n });\n if (deleted.isFail()) {\n this.logger.error(\n {\n err: hasErrorSource(deleted.error) ? deleted.error.source : deleted.error,\n model: namespace,\n targetRevisionId: entry.id\n },\n \"Could not delete the reviews of a deleted revision; they are left orphaned.\"\n );\n }\n } catch (error) {\n this.logger.error(\n { err: error, model: namespace, targetRevisionId: entry.id },\n \"Could not delete the reviews of a deleted revision; they are left orphaned.\"\n );\n }\n }\n}\n\nexport const DeleteReviewsOnRevisionDelete =\n EntryRevisionAfterDeleteEventHandler.createImplementation({\n implementation: DeleteReviewsOnRevisionDeleteImpl,\n dependencies: [DeleteTargetReviewsUseCase, Logger]\n });\n"],"names":["DeleteReviewsOnRevisionDeleteImpl","deleteTargetReviews","logger","event","model","entry","namespace","getCmsNamespace","deleted","hasErrorSource","error","DeleteReviewsOnRevisionDelete","EntryRevisionAfterDeleteEventHandler","DeleteTargetReviewsUseCase","Logger"],"mappings":";;;;;AAWA,MAAMA;IACF,YACYC,mBAAyD,EACzDC,MAAwB,CAClC;aAFUD,mBAAmB,GAAnBA;aACAC,MAAM,GAANA;IACT;IAEH,MAAa,OAAOC,KAAiD,EAAiB;QAClF,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,MAAM,OAAO;QACtC,MAAMG,YAAYC,gBAAgBH;QAClC,IAAI,CAACE,WACD;QAGJ,IAAI;YACA,MAAME,UAAU,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBACnD,OAAOF;gBACP,WAAW;oBAACD,MAAM,OAAO;iBAAC;gBAC1B,kBAAkBA,MAAM,EAAE;YAC9B;YACA,IAAIG,QAAQ,MAAM,IACd,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBACI,KAAKC,eAAeD,QAAQ,KAAK,IAAIA,QAAQ,KAAK,CAAC,MAAM,GAAGA,QAAQ,KAAK;gBACzE,OAAOF;gBACP,kBAAkBD,MAAM,EAAE;YAC9B,GACA;QAGZ,EAAE,OAAOK,OAAO;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBAAE,KAAKA;gBAAO,OAAOJ;gBAAW,kBAAkBD,MAAM,EAAE;YAAC,GAC3D;QAER;IACJ;AACJ;AAEO,MAAMM,gCACTC,qCAAqC,oBAAoB,CAAC;IACtD,gBAAgBZ;IAChB,cAAc;QAACa;QAA4BC;KAAO;AACtD"}
@@ -0,0 +1,28 @@
1
+ import { DeleteModelOperations } from "@webiny/api-headless-cms-tasks/graphql/deleteModel/abstractions.js";
2
+ import type { IDeleteCmsModelTask, IStoreValue } from "@webiny/api-headless-cms-tasks/features/DeleteModelTask/types.js";
3
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
4
+ import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
5
+ import { ListWorkflowsUseCase } from "@webiny/api-workflows/features/workflow/ListWorkflows/index.js";
6
+ /**
7
+ * Refuses to start the "fully delete model" background task for a model bound to a workflow
8
+ * (D134 point 4, R64). The task deletes every entry and folder before it calls
9
+ * `DeleteModelUseCase`, so the use-case decorator alone would fire after the content is gone.
10
+ * `fullyDeleteModel` reports errors by throwing (its GraphQL resolver maps them), so this throws
11
+ * too. The other operations pass through.
12
+ */
13
+ declare class FullyDeleteModelBoundToWorkflowDecoratorImpl implements DeleteModelOperations.Interface {
14
+ private getModel;
15
+ private accessControl;
16
+ private listWorkflows;
17
+ private decoratee;
18
+ constructor(getModel: GetModelUseCase.Interface, accessControl: AccessControl.Interface, listWorkflows: ListWorkflowsUseCase.Interface, decoratee: DeleteModelOperations.Interface);
19
+ listModelsBeingDeleted(): Promise<IStoreValue[]>;
20
+ isModelBeingDeleted(modelId: string): Promise<boolean>;
21
+ fullyDeleteModel(modelId: string): Promise<IDeleteCmsModelTask>;
22
+ cancelFullyDeleteModel(modelId: string): Promise<IDeleteCmsModelTask>;
23
+ getDeleteModelProgress(modelId: string): Promise<IDeleteCmsModelTask>;
24
+ }
25
+ export declare const FullyDeleteModelBoundToWorkflowDecorator: typeof FullyDeleteModelBoundToWorkflowDecoratorImpl & {
26
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-headless-cms-tasks/graphql/deleteModel/abstractions.js").IDeleteModelOperations>;
27
+ };
28
+ export {};
@@ -0,0 +1,63 @@
1
+ import { DeleteModelOperations } from "@webiny/api-headless-cms-tasks/graphql/deleteModel/abstractions.js";
2
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
3
+ import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
4
+ import { ListWorkflowsUseCase } from "@webiny/api-workflows/features/workflow/ListWorkflows/index.js";
5
+ import { ModelBoundToWorkflowError } from "../../domain/errors.js";
6
+ import { toCmsNamespace } from "../../utils/appName.js";
7
+ const BOUND_WORKFLOWS_LIMIT = 10;
8
+ class FullyDeleteModelBoundToWorkflowDecoratorImpl {
9
+ constructor(getModel, accessControl, listWorkflows, decoratee){
10
+ this.getModel = getModel;
11
+ this.accessControl = accessControl;
12
+ this.listWorkflows = listWorkflows;
13
+ this.decoratee = decoratee;
14
+ }
15
+ listModelsBeingDeleted() {
16
+ return this.decoratee.listModelsBeingDeleted();
17
+ }
18
+ isModelBeingDeleted(modelId) {
19
+ return this.decoratee.isModelBeingDeleted(modelId);
20
+ }
21
+ async fullyDeleteModel(modelId) {
22
+ const model = await this.getModel.execute(modelId);
23
+ if (model.isFail()) return this.decoratee.fullyDeleteModel(modelId);
24
+ if (!await this.accessControl.canAccessModel({
25
+ model: model.value,
26
+ rwd: "d"
27
+ })) return this.decoratee.fullyDeleteModel(modelId);
28
+ const workflows = await this.listWorkflows.execute({
29
+ where: {
30
+ models_in: [
31
+ toCmsNamespace(modelId)
32
+ ]
33
+ },
34
+ limit: BOUND_WORKFLOWS_LIMIT
35
+ });
36
+ if (workflows.isFail()) throw workflows.error;
37
+ if (workflows.value.items.length > 0) throw new ModelBoundToWorkflowError({
38
+ modelId,
39
+ workflows: workflows.value.items.map((workflow)=>({
40
+ id: workflow.id,
41
+ name: workflow.name
42
+ }))
43
+ });
44
+ return this.decoratee.fullyDeleteModel(modelId);
45
+ }
46
+ cancelFullyDeleteModel(modelId) {
47
+ return this.decoratee.cancelFullyDeleteModel(modelId);
48
+ }
49
+ getDeleteModelProgress(modelId) {
50
+ return this.decoratee.getDeleteModelProgress(modelId);
51
+ }
52
+ }
53
+ const FullyDeleteModelBoundToWorkflowDecorator = DeleteModelOperations.createDecorator({
54
+ decorator: FullyDeleteModelBoundToWorkflowDecoratorImpl,
55
+ dependencies: [
56
+ GetModelUseCase,
57
+ AccessControl,
58
+ ListWorkflowsUseCase
59
+ ]
60
+ });
61
+ export { FullyDeleteModelBoundToWorkflowDecorator };
62
+
63
+ //# sourceMappingURL=FullyDeleteModelBoundToWorkflowDecorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/hooks/FullyDeleteModelBoundToWorkflowDecorator.js","sources":["../../../src/features/hooks/FullyDeleteModelBoundToWorkflowDecorator.ts"],"sourcesContent":["import { DeleteModelOperations } from \"@webiny/api-headless-cms-tasks/graphql/deleteModel/abstractions.js\";\nimport type {\n IDeleteCmsModelTask,\n IStoreValue\n} from \"@webiny/api-headless-cms-tasks/features/DeleteModelTask/types.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { AccessControl } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { ListWorkflowsUseCase } from \"@webiny/api-workflows/features/workflow/ListWorkflows/index.js\";\nimport { ModelBoundToWorkflowError } from \"~/domain/errors.js\";\nimport { toCmsNamespace } from \"~/utils/appName.js\";\n\n/** v1 binds one workflow per model (D15); a few extra cover the accepted save race (D41). */\nconst BOUND_WORKFLOWS_LIMIT = 10;\n\n/**\n * Refuses to start the \"fully delete model\" background task for a model bound to a workflow\n * (D134 point 4, R64). The task deletes every entry and folder before it calls\n * `DeleteModelUseCase`, so the use-case decorator alone would fire after the content is gone.\n * `fullyDeleteModel` reports errors by throwing (its GraphQL resolver maps them), so this throws\n * too. The other operations pass through.\n */\nclass FullyDeleteModelBoundToWorkflowDecoratorImpl implements DeleteModelOperations.Interface {\n public constructor(\n private getModel: GetModelUseCase.Interface,\n private accessControl: AccessControl.Interface,\n private listWorkflows: ListWorkflowsUseCase.Interface,\n private decoratee: DeleteModelOperations.Interface\n ) {}\n\n public listModelsBeingDeleted(): Promise<IStoreValue[]> {\n return this.decoratee.listModelsBeingDeleted();\n }\n\n public isModelBeingDeleted(modelId: string): Promise<boolean> {\n return this.decoratee.isModelBeingDeleted(modelId);\n }\n\n public async fullyDeleteModel(modelId: string): Promise<IDeleteCmsModelTask> {\n // A caller who cannot read and delete the model gets the CMS's own error from the decorated\n // chain, never the bound workflows' ids and names (R64).\n const model = await this.getModel.execute(modelId);\n if (model.isFail()) {\n return this.decoratee.fullyDeleteModel(modelId);\n }\n if (!(await this.accessControl.canAccessModel({ model: model.value, rwd: \"d\" }))) {\n return this.decoratee.fullyDeleteModel(modelId);\n }\n\n const workflows = await this.listWorkflows.execute({\n where: { models_in: [toCmsNamespace(modelId)] },\n limit: BOUND_WORKFLOWS_LIMIT\n });\n if (workflows.isFail()) {\n throw workflows.error;\n }\n if (workflows.value.items.length > 0) {\n throw new ModelBoundToWorkflowError({\n modelId,\n workflows: workflows.value.items.map(workflow => {\n return { id: workflow.id, name: workflow.name };\n })\n });\n }\n return this.decoratee.fullyDeleteModel(modelId);\n }\n\n public cancelFullyDeleteModel(modelId: string): Promise<IDeleteCmsModelTask> {\n return this.decoratee.cancelFullyDeleteModel(modelId);\n }\n\n public getDeleteModelProgress(modelId: string): Promise<IDeleteCmsModelTask> {\n return this.decoratee.getDeleteModelProgress(modelId);\n }\n}\n\nexport const FullyDeleteModelBoundToWorkflowDecorator = DeleteModelOperations.createDecorator({\n decorator: FullyDeleteModelBoundToWorkflowDecoratorImpl,\n dependencies: [GetModelUseCase, AccessControl, ListWorkflowsUseCase]\n});\n"],"names":["BOUND_WORKFLOWS_LIMIT","FullyDeleteModelBoundToWorkflowDecoratorImpl","getModel","accessControl","listWorkflows","decoratee","modelId","model","workflows","toCmsNamespace","ModelBoundToWorkflowError","workflow","FullyDeleteModelBoundToWorkflowDecorator","DeleteModelOperations","GetModelUseCase","AccessControl","ListWorkflowsUseCase"],"mappings":";;;;;;AAYA,MAAMA,wBAAwB;AAS9B,MAAMC;IACF,YACYC,QAAmC,EACnCC,aAAsC,EACtCC,aAA6C,EAC7CC,SAA0C,CACpD;aAJUH,QAAQ,GAARA;aACAC,aAAa,GAAbA;aACAC,aAAa,GAAbA;aACAC,SAAS,GAATA;IACT;IAEI,yBAAiD;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB;IAChD;IAEO,oBAAoBC,OAAe,EAAoB;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAACA;IAC9C;IAEA,MAAa,iBAAiBA,OAAe,EAAgC;QAGzE,MAAMC,QAAQ,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACD;QAC1C,IAAIC,MAAM,MAAM,IACZ,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAACD;QAE3C,IAAI,CAAE,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAE,OAAOC,MAAM,KAAK;YAAE,KAAK;QAAI,IACzE,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAACD;QAG3C,MAAME,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAC/C,OAAO;gBAAE,WAAW;oBAACC,eAAeH;iBAAS;YAAC;YAC9C,OAAON;QACX;QACA,IAAIQ,UAAU,MAAM,IAChB,MAAMA,UAAU,KAAK;QAEzB,IAAIA,UAAU,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAC/B,MAAM,IAAIE,0BAA0B;YAChCJ;YACA,WAAWE,UAAU,KAAK,CAAC,KAAK,CAAC,GAAG,CAACG,CAAAA,WAC1B;oBAAE,IAAIA,SAAS,EAAE;oBAAE,MAAMA,SAAS,IAAI;gBAAC;QAEtD;QAEJ,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAACL;IAC3C;IAEO,uBAAuBA,OAAe,EAAgC;QACzE,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAACA;IACjD;IAEO,uBAAuBA,OAAe,EAAgC;QACzE,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAACA;IACjD;AACJ;AAEO,MAAMM,2CAA2CC,sBAAsB,eAAe,CAAC;IAC1F,WAAWZ;IACX,cAAc;QAACa;QAAiBC;QAAeC;KAAqB;AACxE"}
@@ -0,0 +1,15 @@
1
+ import { EntryRevisionBeforeCreateEventHandler } from "@webiny/api-headless-cms/features/contentEntry/CreateEntryRevisionFrom/index.js";
2
+ /**
3
+ * Every new revision starts without a review state (spec 4.5, D59). Covers CMS entries; CMS
4
+ * copies `original.system` otherwise. Website Builder pages publish no CMS entry events, so their
5
+ * adapter clears the state on its own page events. Mutates the entry the use case persists next.
6
+ * A new revision created with `status: "published"` on a bound model needs no review, on purpose:
7
+ * data transfer from other systems (D134 point 2, R83). No handler guards the status here.
8
+ */
9
+ declare class NullReviewStateOnRevisionCreateImpl implements EntryRevisionBeforeCreateEventHandler.Interface {
10
+ handle(event: EntryRevisionBeforeCreateEventHandler.Event): Promise<void>;
11
+ }
12
+ export declare const NullReviewStateOnRevisionCreate: typeof NullReviewStateOnRevisionCreateImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/CreateEntryRevisionFrom/events").EntryRevisionBeforeCreateEvent>>;
14
+ };
15
+ export {};
@@ -0,0 +1,17 @@
1
+ import { EntryRevisionBeforeCreateEventHandler } from "@webiny/api-headless-cms/features/contentEntry/CreateEntryRevisionFrom/index.js";
2
+ class NullReviewStateOnRevisionCreateImpl {
3
+ async handle(event) {
4
+ const { entry } = event.payload;
5
+ entry.system = {
6
+ ...entry.system,
7
+ workflow: null
8
+ };
9
+ }
10
+ }
11
+ const NullReviewStateOnRevisionCreate = EntryRevisionBeforeCreateEventHandler.createImplementation({
12
+ implementation: NullReviewStateOnRevisionCreateImpl,
13
+ dependencies: []
14
+ });
15
+ export { NullReviewStateOnRevisionCreate };
16
+
17
+ //# sourceMappingURL=NullReviewStateOnRevisionCreate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/hooks/NullReviewStateOnRevisionCreate.js","sources":["../../../src/features/hooks/NullReviewStateOnRevisionCreate.ts"],"sourcesContent":["import { EntryRevisionBeforeCreateEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntryRevisionFrom/index.js\";\n\n/**\n * Every new revision starts without a review state (spec 4.5, D59). Covers CMS entries; CMS\n * copies `original.system` otherwise. Website Builder pages publish no CMS entry events, so their\n * adapter clears the state on its own page events. Mutates the entry the use case persists next.\n * A new revision created with `status: \"published\"` on a bound model needs no review, on purpose:\n * data transfer from other systems (D134 point 2, R83). No handler guards the status here.\n */\nclass NullReviewStateOnRevisionCreateImpl\n implements EntryRevisionBeforeCreateEventHandler.Interface\n{\n public async handle(event: EntryRevisionBeforeCreateEventHandler.Event): Promise<void> {\n const { entry } = event.payload;\n entry.system = { ...entry.system, workflow: null };\n }\n}\n\nexport const NullReviewStateOnRevisionCreate =\n EntryRevisionBeforeCreateEventHandler.createImplementation({\n implementation: NullReviewStateOnRevisionCreateImpl,\n dependencies: []\n });\n"],"names":["NullReviewStateOnRevisionCreateImpl","event","entry","NullReviewStateOnRevisionCreate","EntryRevisionBeforeCreateEventHandler"],"mappings":";AASA,MAAMA;IAGF,MAAa,OAAOC,KAAkD,EAAiB;QACnF,MAAM,EAAEC,KAAK,EAAE,GAAGD,MAAM,OAAO;QAC/BC,MAAM,MAAM,GAAG;YAAE,GAAGA,MAAM,MAAM;YAAE,UAAU;QAAK;IACrD;AACJ;AAEO,MAAMC,kCACTC,sCAAsC,oBAAoB,CAAC;IACvD,gBAAgBJ;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,22 @@
1
+ import { EntryBeforePublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry/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 `cms.*` adapter (spec 5.1, D79, D121, R53). On a model bound to a workflow a
6
+ * revision is published only with its active review approved; an approved revision that was
7
+ * unpublished can be published again because approved reviews stay active (D23). Lookup failures
8
+ * block (fail closed). `system.workflow` is not trusted: the update input can set it. Private
9
+ * models (Website Builder pages, R52) are left to their app (`RequireApprovedReviewOnPagePublish`).
10
+ * Only the publish actions are guarded (this and `RequireApprovedReviewOnRepublish`): creating
11
+ * content as published stays allowed for data transfer (D134 point 2, R83).
12
+ */
13
+ declare class RequireApprovedReviewOnPublishImpl implements EntryBeforePublishEventHandler.Interface {
14
+ private getBoundWorkflow;
15
+ private getActiveTargetReview;
16
+ constructor(getBoundWorkflow: GetBoundWorkflowUseCase.Interface, getActiveTargetReview: GetActiveTargetReviewUseCase.Interface);
17
+ handle(event: EntryBeforePublishEventHandler.Event): Promise<void>;
18
+ }
19
+ export declare const RequireApprovedReviewOnPublish: typeof RequireApprovedReviewOnPublishImpl & {
20
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/PublishEntry/events").EntryBeforePublishEvent>>;
21
+ };
22
+ export {};
@@ -0,0 +1,43 @@
1
+ import { EntryBeforePublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry/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 { getCmsNamespace } from "../../utils/appName.js";
6
+ class RequireApprovedReviewOnPublishImpl {
7
+ constructor(getBoundWorkflow, getActiveTargetReview){
8
+ this.getBoundWorkflow = getBoundWorkflow;
9
+ this.getActiveTargetReview = getActiveTargetReview;
10
+ }
11
+ async handle(event) {
12
+ const { model, original } = event.payload;
13
+ const namespace = getCmsNamespace(model);
14
+ if (!namespace) return;
15
+ const bound = await this.getBoundWorkflow.execute({
16
+ model: namespace
17
+ });
18
+ if (bound.isFail()) throw bound.error;
19
+ if (!bound.value) return;
20
+ const review = await this.getActiveTargetReview.execute({
21
+ model: namespace,
22
+ targetRevisionId: original.id
23
+ });
24
+ if (review.isFail()) throw review.error;
25
+ if (review.value?.state === "approved") return;
26
+ throw new ReviewPublishBlockedError({
27
+ model: namespace,
28
+ targetRevisionId: original.id,
29
+ workflowId: bound.value.id,
30
+ reviewState: review.value?.state ?? null
31
+ });
32
+ }
33
+ }
34
+ const RequireApprovedReviewOnPublish = EntryBeforePublishEventHandler.createImplementation({
35
+ implementation: RequireApprovedReviewOnPublishImpl,
36
+ dependencies: [
37
+ GetBoundWorkflowUseCase,
38
+ GetActiveTargetReviewUseCase
39
+ ]
40
+ });
41
+ export { RequireApprovedReviewOnPublish };
42
+
43
+ //# sourceMappingURL=RequireApprovedReviewOnPublish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/hooks/RequireApprovedReviewOnPublish.js","sources":["../../../src/features/hooks/RequireApprovedReviewOnPublish.ts"],"sourcesContent":["import { EntryBeforePublishEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/PublishEntry/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 { getCmsNamespace } from \"~/utils/appName.js\";\n\n/**\n * Publish rule of the `cms.*` adapter (spec 5.1, D79, D121, R53). On a model bound to a workflow a\n * revision is published only with its active review approved; an approved revision that was\n * unpublished can be published again because approved reviews stay active (D23). Lookup failures\n * block (fail closed). `system.workflow` is not trusted: the update input can set it. Private\n * models (Website Builder pages, R52) are left to their app (`RequireApprovedReviewOnPagePublish`).\n * Only the publish actions are guarded (this and `RequireApprovedReviewOnRepublish`): creating\n * content as published stays allowed for data transfer (D134 point 2, R83).\n */\nclass RequireApprovedReviewOnPublishImpl implements EntryBeforePublishEventHandler.Interface {\n public constructor(\n private getBoundWorkflow: GetBoundWorkflowUseCase.Interface,\n private getActiveTargetReview: GetActiveTargetReviewUseCase.Interface\n ) {}\n\n public async handle(event: EntryBeforePublishEventHandler.Event): Promise<void> {\n const { model, original } = event.payload;\n const namespace = getCmsNamespace(model);\n if (!namespace) {\n return;\n }\n\n const bound = await this.getBoundWorkflow.execute({ model: namespace });\n if (bound.isFail()) {\n throw bound.error;\n }\n if (!bound.value) {\n return;\n }\n\n const review = await this.getActiveTargetReview.execute({\n model: namespace,\n targetRevisionId: original.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: namespace,\n targetRevisionId: original.id,\n workflowId: bound.value.id,\n reviewState: review.value?.state ?? null\n });\n }\n}\n\nexport const RequireApprovedReviewOnPublish = EntryBeforePublishEventHandler.createImplementation({\n implementation: RequireApprovedReviewOnPublishImpl,\n dependencies: [GetBoundWorkflowUseCase, GetActiveTargetReviewUseCase]\n});\n"],"names":["RequireApprovedReviewOnPublishImpl","getBoundWorkflow","getActiveTargetReview","event","model","original","namespace","getCmsNamespace","bound","review","ReviewPublishBlockedError","RequireApprovedReviewOnPublish","EntryBeforePublishEventHandler","GetBoundWorkflowUseCase","GetActiveTargetReviewUseCase"],"mappings":";;;;;AAeA,MAAMA;IACF,YACYC,gBAAmD,EACnDC,qBAA6D,CACvE;aAFUD,gBAAgB,GAAhBA;aACAC,qBAAqB,GAArBA;IACT;IAEH,MAAa,OAAOC,KAA2C,EAAiB;QAC5E,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGF,MAAM,OAAO;QACzC,MAAMG,YAAYC,gBAAgBH;QAClC,IAAI,CAACE,WACD;QAGJ,MAAME,QAAQ,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAAE,OAAOF;QAAU;QACrE,IAAIE,MAAM,MAAM,IACZ,MAAMA,MAAM,KAAK;QAErB,IAAI,CAACA,MAAM,KAAK,EACZ;QAGJ,MAAMC,SAAS,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;YACpD,OAAOH;YACP,kBAAkBD,SAAS,EAAE;QACjC;QACA,IAAII,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAEtB,IAAIA,OAAO,KAAK,EAAE,UAAU,YACxB;QAGJ,MAAM,IAAIC,0BAA0B;YAChC,OAAOJ;YACP,kBAAkBD,SAAS,EAAE;YAC7B,YAAYG,MAAM,KAAK,CAAC,EAAE;YAC1B,aAAaC,OAAO,KAAK,EAAE,SAAS;QACxC;IACJ;AACJ;AAEO,MAAME,iCAAiCC,+BAA+B,oBAAoB,CAAC;IAC9F,gBAAgBZ;IAChB,cAAc;QAACa;QAAyBC;KAA6B;AACzE"}
@@ -0,0 +1,23 @@
1
+ import { EntryBeforeRepublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/RepublishEntry/index.js";
2
+ import { GetRevisionByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetRevisionById/index.js";
3
+ import { GetBoundWorkflowUseCase } from "@webiny/api-workflows/features/workflow/GetBoundWorkflow/index.js";
4
+ import { GetActiveTargetReviewUseCase } from "@webiny/api-workflows/features/review/GetActiveTargetReview/index.js";
5
+ /**
6
+ * Publish rule for `republish<Model>(revision)` (D79, R53). `RepublishEntryUseCase` takes any
7
+ * revision and publishes `EntryBeforeRepublish`, not `EntryBeforePublish`, so without this rule an
8
+ * unapproved draft of a bound model could be published. The payload's `status` is already set to
9
+ * published, so the stored revision is read as the caller: one that is already published is only
10
+ * refreshed and allowed; any other needs an approved review, as for publish. Private models are left to their
11
+ * app (R52); unbound models never look up reviews; failed lookups block (fail closed).
12
+ */
13
+ declare class RequireApprovedReviewOnRepublishImpl implements EntryBeforeRepublishEventHandler.Interface {
14
+ private getRevisionById;
15
+ private getBoundWorkflow;
16
+ private getActiveTargetReview;
17
+ constructor(getRevisionById: GetRevisionByIdUseCase.Interface, getBoundWorkflow: GetBoundWorkflowUseCase.Interface, getActiveTargetReview: GetActiveTargetReviewUseCase.Interface);
18
+ handle(event: EntryBeforeRepublishEventHandler.Event): Promise<void>;
19
+ }
20
+ export declare const RequireApprovedReviewOnRepublish: typeof RequireApprovedReviewOnRepublishImpl & {
21
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/RepublishEntry/events").EntryBeforeRepublishEvent>>;
22
+ };
23
+ export {};
@@ -0,0 +1,49 @@
1
+ import { EntryBeforeRepublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/RepublishEntry/index.js";
2
+ import { GetRevisionByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetRevisionById/index.js";
3
+ import { GetBoundWorkflowUseCase } from "@webiny/api-workflows/features/workflow/GetBoundWorkflow/index.js";
4
+ import { GetActiveTargetReviewUseCase } from "@webiny/api-workflows/features/review/GetActiveTargetReview/index.js";
5
+ import { ReviewPublishBlockedError } from "@webiny/api-workflows/domain/review/errors.js";
6
+ import { getCmsNamespace } from "../../utils/appName.js";
7
+ class RequireApprovedReviewOnRepublishImpl {
8
+ constructor(getRevisionById, getBoundWorkflow, getActiveTargetReview){
9
+ this.getRevisionById = getRevisionById;
10
+ this.getBoundWorkflow = getBoundWorkflow;
11
+ this.getActiveTargetReview = getActiveTargetReview;
12
+ }
13
+ async handle(event) {
14
+ const { model, entry } = event.payload;
15
+ const namespace = getCmsNamespace(model);
16
+ if (!namespace) return;
17
+ const bound = await this.getBoundWorkflow.execute({
18
+ model: namespace
19
+ });
20
+ if (bound.isFail()) throw bound.error;
21
+ if (!bound.value) return;
22
+ const stored = await this.getRevisionById.execute(model, entry.id);
23
+ if (stored.isFail()) throw stored.error;
24
+ if ("published" === stored.value.status) return;
25
+ const review = await this.getActiveTargetReview.execute({
26
+ model: namespace,
27
+ targetRevisionId: entry.id
28
+ });
29
+ if (review.isFail()) throw review.error;
30
+ if (review.value?.state === "approved") return;
31
+ throw new ReviewPublishBlockedError({
32
+ model: namespace,
33
+ targetRevisionId: entry.id,
34
+ workflowId: bound.value.id,
35
+ reviewState: review.value?.state ?? null
36
+ });
37
+ }
38
+ }
39
+ const RequireApprovedReviewOnRepublish = EntryBeforeRepublishEventHandler.createImplementation({
40
+ implementation: RequireApprovedReviewOnRepublishImpl,
41
+ dependencies: [
42
+ GetRevisionByIdUseCase,
43
+ GetBoundWorkflowUseCase,
44
+ GetActiveTargetReviewUseCase
45
+ ]
46
+ });
47
+ export { RequireApprovedReviewOnRepublish };
48
+
49
+ //# sourceMappingURL=RequireApprovedReviewOnRepublish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/hooks/RequireApprovedReviewOnRepublish.js","sources":["../../../src/features/hooks/RequireApprovedReviewOnRepublish.ts"],"sourcesContent":["import { EntryBeforeRepublishEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/RepublishEntry/index.js\";\nimport { GetRevisionByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetRevisionById/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 { getCmsNamespace } from \"~/utils/appName.js\";\n\n/**\n * Publish rule for `republish<Model>(revision)` (D79, R53). `RepublishEntryUseCase` takes any\n * revision and publishes `EntryBeforeRepublish`, not `EntryBeforePublish`, so without this rule an\n * unapproved draft of a bound model could be published. The payload's `status` is already set to\n * published, so the stored revision is read as the caller: one that is already published is only\n * refreshed and allowed; any other needs an approved review, as for publish. Private models are left to their\n * app (R52); unbound models never look up reviews; failed lookups block (fail closed).\n */\nclass RequireApprovedReviewOnRepublishImpl implements EntryBeforeRepublishEventHandler.Interface {\n public constructor(\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private getBoundWorkflow: GetBoundWorkflowUseCase.Interface,\n private getActiveTargetReview: GetActiveTargetReviewUseCase.Interface\n ) {}\n\n public async handle(event: EntryBeforeRepublishEventHandler.Event): Promise<void> {\n const { model, entry } = event.payload;\n const namespace = getCmsNamespace(model);\n if (!namespace) {\n return;\n }\n\n const bound = await this.getBoundWorkflow.execute({ model: namespace });\n if (bound.isFail()) {\n throw bound.error;\n }\n if (!bound.value) {\n return;\n }\n\n const stored = await this.getRevisionById.execute(model, entry.id);\n if (stored.isFail()) {\n throw stored.error;\n }\n if (stored.value.status === \"published\") {\n return;\n }\n\n const review = await this.getActiveTargetReview.execute({\n model: namespace,\n targetRevisionId: entry.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: namespace,\n targetRevisionId: entry.id,\n workflowId: bound.value.id,\n reviewState: review.value?.state ?? null\n });\n }\n}\n\nexport const RequireApprovedReviewOnRepublish =\n EntryBeforeRepublishEventHandler.createImplementation({\n implementation: RequireApprovedReviewOnRepublishImpl,\n dependencies: [\n GetRevisionByIdUseCase,\n GetBoundWorkflowUseCase,\n GetActiveTargetReviewUseCase\n ]\n });\n"],"names":["RequireApprovedReviewOnRepublishImpl","getRevisionById","getBoundWorkflow","getActiveTargetReview","event","model","entry","namespace","getCmsNamespace","bound","stored","review","ReviewPublishBlockedError","RequireApprovedReviewOnRepublish","EntryBeforeRepublishEventHandler","GetRevisionByIdUseCase","GetBoundWorkflowUseCase","GetActiveTargetReviewUseCase"],"mappings":";;;;;;AAeA,MAAMA;IACF,YACYC,eAAiD,EACjDC,gBAAmD,EACnDC,qBAA6D,CACvE;aAHUF,eAAe,GAAfA;aACAC,gBAAgB,GAAhBA;aACAC,qBAAqB,GAArBA;IACT;IAEH,MAAa,OAAOC,KAA6C,EAAiB;QAC9E,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,MAAM,OAAO;QACtC,MAAMG,YAAYC,gBAAgBH;QAClC,IAAI,CAACE,WACD;QAGJ,MAAME,QAAQ,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAAE,OAAOF;QAAU;QACrE,IAAIE,MAAM,MAAM,IACZ,MAAMA,MAAM,KAAK;QAErB,IAAI,CAACA,MAAM,KAAK,EACZ;QAGJ,MAAMC,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACL,OAAOC,MAAM,EAAE;QACjE,IAAII,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAEtB,IAAIA,AAAwB,gBAAxBA,OAAO,KAAK,CAAC,MAAM,EACnB;QAGJ,MAAMC,SAAS,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;YACpD,OAAOJ;YACP,kBAAkBD,MAAM,EAAE;QAC9B;QACA,IAAIK,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAEtB,IAAIA,OAAO,KAAK,EAAE,UAAU,YACxB;QAGJ,MAAM,IAAIC,0BAA0B;YAChC,OAAOL;YACP,kBAAkBD,MAAM,EAAE;YAC1B,YAAYG,MAAM,KAAK,CAAC,EAAE;YAC1B,aAAaE,OAAO,KAAK,EAAE,SAAS;QACxC;IACJ;AACJ;AAEO,MAAME,mCACTC,iCAAiC,oBAAoB,CAAC;IAClD,gBAAgBd;IAChB,cAAc;QACVe;QACAC;QACAC;KACH;AACL"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Workflow handlers on CMS events (spec 9.2). The single handlers cover every CMS model with a
3
+ * review namespace (R51); the `cms.*` adapter rules act on public CMS models only (R52).
4
+ */
5
+ export declare const CmsHooksFeature: {
6
+ name: string;
7
+ register(container: import("@webiny/di").Container): void;
8
+ };
@@ -0,0 +1,39 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { NullReviewStateOnRevisionCreate } from "./NullReviewStateOnRevisionCreate.js";
3
+ import { BlockUpdateWhileInReview } from "./BlockUpdateWhileInReview.js";
4
+ import { RequireApprovedReviewOnPublish } from "./RequireApprovedReviewOnPublish.js";
5
+ import { RequireApprovedReviewOnRepublish } from "./RequireApprovedReviewOnRepublish.js";
6
+ import { BlockMoveWhileInReview } from "./BlockMoveWhileInReview.js";
7
+ import { BlockFolderChangeWhileInReview } from "./BlockFolderChangeWhileInReview.js";
8
+ import { BlockDeleteWhileInReview } from "./BlockDeleteWhileInReview.js";
9
+ import { BlockRevisionDeleteWhileInReview } from "./BlockRevisionDeleteWhileInReview.js";
10
+ import { BlockDeleteMultipleWhileInReview } from "./BlockDeleteMultipleWhileInReview.js";
11
+ import { DeleteReviewsOnEntryDelete } from "./DeleteReviewsOnEntryDelete.js";
12
+ import { DeleteReviewsOnRevisionDelete } from "./DeleteReviewsOnRevisionDelete.js";
13
+ import { DeleteReviewsOnEntriesDeleteMultiple } from "./DeleteReviewsOnEntriesDeleteMultiple.js";
14
+ import { DeleteModelBoundToWorkflowDecorator } from "./DeleteModelBoundToWorkflowDecorator.js";
15
+ import { FullyDeleteModelBoundToWorkflowDecorator } from "./FullyDeleteModelBoundToWorkflowDecorator.js";
16
+ import { DeleteModelTaskBoundToWorkflowDecorator } from "./DeleteModelTaskBoundToWorkflowDecorator.js";
17
+ const CmsHooksFeature = createFeature({
18
+ name: "CmsWorkflows/Hooks",
19
+ register (container) {
20
+ container.register(NullReviewStateOnRevisionCreate);
21
+ container.register(BlockUpdateWhileInReview);
22
+ container.register(RequireApprovedReviewOnPublish);
23
+ container.register(RequireApprovedReviewOnRepublish);
24
+ container.register(BlockMoveWhileInReview);
25
+ container.register(BlockFolderChangeWhileInReview);
26
+ container.register(BlockDeleteWhileInReview);
27
+ container.register(BlockRevisionDeleteWhileInReview);
28
+ container.register(BlockDeleteMultipleWhileInReview);
29
+ container.register(DeleteReviewsOnEntryDelete);
30
+ container.register(DeleteReviewsOnRevisionDelete);
31
+ container.register(DeleteReviewsOnEntriesDeleteMultiple);
32
+ container.registerDecorator(DeleteModelBoundToWorkflowDecorator);
33
+ container.registerDecorator(FullyDeleteModelBoundToWorkflowDecorator);
34
+ container.registerDecorator(DeleteModelTaskBoundToWorkflowDecorator);
35
+ }
36
+ });
37
+ export { CmsHooksFeature };
38
+
39
+ //# 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 { NullReviewStateOnRevisionCreate } from \"./NullReviewStateOnRevisionCreate.js\";\nimport { BlockUpdateWhileInReview } from \"./BlockUpdateWhileInReview.js\";\nimport { RequireApprovedReviewOnPublish } from \"./RequireApprovedReviewOnPublish.js\";\nimport { RequireApprovedReviewOnRepublish } from \"./RequireApprovedReviewOnRepublish.js\";\nimport { BlockMoveWhileInReview } from \"./BlockMoveWhileInReview.js\";\nimport { BlockFolderChangeWhileInReview } from \"./BlockFolderChangeWhileInReview.js\";\nimport { BlockDeleteWhileInReview } from \"./BlockDeleteWhileInReview.js\";\nimport { BlockRevisionDeleteWhileInReview } from \"./BlockRevisionDeleteWhileInReview.js\";\nimport { BlockDeleteMultipleWhileInReview } from \"./BlockDeleteMultipleWhileInReview.js\";\nimport { DeleteReviewsOnEntryDelete } from \"./DeleteReviewsOnEntryDelete.js\";\nimport { DeleteReviewsOnRevisionDelete } from \"./DeleteReviewsOnRevisionDelete.js\";\nimport { DeleteReviewsOnEntriesDeleteMultiple } from \"./DeleteReviewsOnEntriesDeleteMultiple.js\";\nimport { DeleteModelBoundToWorkflowDecorator } from \"./DeleteModelBoundToWorkflowDecorator.js\";\nimport { FullyDeleteModelBoundToWorkflowDecorator } from \"./FullyDeleteModelBoundToWorkflowDecorator.js\";\nimport { DeleteModelTaskBoundToWorkflowDecorator } from \"./DeleteModelTaskBoundToWorkflowDecorator.js\";\n\n/**\n * Workflow handlers on CMS events (spec 9.2). The single handlers cover every CMS model with a\n * review namespace (R51); the `cms.*` adapter rules act on public CMS models only (R52).\n */\nexport const CmsHooksFeature = createFeature({\n name: \"CmsWorkflows/Hooks\",\n register(container) {\n // Single handlers for every CMS model with a review namespace (R51); Website Builder pages\n // publish no CMS entry events and have their own handlers.\n container.register(NullReviewStateOnRevisionCreate);\n container.register(BlockUpdateWhileInReview);\n\n // `cms.*` adapter rules (public CMS models only, R52)\n container.register(RequireApprovedReviewOnPublish);\n container.register(RequireApprovedReviewOnRepublish);\n container.register(BlockMoveWhileInReview);\n container.register(BlockFolderChangeWhileInReview);\n\n // Trash and delete (D134, R73) and review cleanup after a permanent delete (R56, R81)\n container.register(BlockDeleteWhileInReview);\n container.register(BlockRevisionDeleteWhileInReview);\n container.register(BlockDeleteMultipleWhileInReview);\n container.register(DeleteReviewsOnEntryDelete);\n container.register(DeleteReviewsOnRevisionDelete);\n container.register(DeleteReviewsOnEntriesDeleteMultiple);\n\n // Model delete blocks (D64, D134 point 4); the use-case decorator runs before the CMS's\n // own DeleteModel decorators, the operations decorator before the task is triggered, and\n // the task handler decorator on every run, also one started through `triggerTask`.\n container.registerDecorator(DeleteModelBoundToWorkflowDecorator);\n container.registerDecorator(FullyDeleteModelBoundToWorkflowDecorator);\n container.registerDecorator(DeleteModelTaskBoundToWorkflowDecorator);\n }\n});\n"],"names":["CmsHooksFeature","createFeature","container","NullReviewStateOnRevisionCreate","BlockUpdateWhileInReview","RequireApprovedReviewOnPublish","RequireApprovedReviewOnRepublish","BlockMoveWhileInReview","BlockFolderChangeWhileInReview","BlockDeleteWhileInReview","BlockRevisionDeleteWhileInReview","BlockDeleteMultipleWhileInReview","DeleteReviewsOnEntryDelete","DeleteReviewsOnRevisionDelete","DeleteReviewsOnEntriesDeleteMultiple","DeleteModelBoundToWorkflowDecorator","FullyDeleteModelBoundToWorkflowDecorator","DeleteModelTaskBoundToWorkflowDecorator"],"mappings":";;;;;;;;;;;;;;;;AAqBO,MAAMA,kBAAkBC,cAAc;IACzC,MAAM;IACN,UAASC,SAAS;QAGdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QAGnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QAGnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;QAKnBZ,UAAU,iBAAiB,CAACa;QAC5Bb,UAAU,iBAAiB,CAACc;QAC5Bd,UAAU,iBAAiB,CAACe;IAChC;AACJ"}
@@ -0,0 +1,18 @@
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 { GetFlpUseCase } from "@webiny/api-aco/features/flp/GetFlp/index.js";
4
+ import { ReviewTeamLoader } from "@webiny/api-workflows/features/identity/ReviewTeamLoader/index.js";
5
+ import type { FolderReadRule } from "../FolderReadRule.js";
6
+ import { CandidateFolderReadRules as Abstraction } from "./abstractions.js";
7
+ declare class CandidateFolderReadRulesImpl implements Abstraction.Interface {
8
+ private identityContext;
9
+ private folderLevelPermissions;
10
+ private teamLoader;
11
+ private getFlp?;
12
+ constructor(identityContext: IdentityContext.Interface, folderLevelPermissions: FolderLevelPermissions.Interface, teamLoader: ReviewTeamLoader.Interface, getFlp?: GetFlpUseCase.Interface | undefined);
13
+ create(params: Abstraction.Params): FolderReadRule;
14
+ }
15
+ export declare const CandidateFolderReadRules: typeof CandidateFolderReadRulesImpl & {
16
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICandidateFolderReadRules>;
17
+ };
18
+ export {};
@@ -0,0 +1,97 @@
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 { GetDefaultPermissions } from "@webiny/api-aco/features/flp/FolderLevelPermissions/useCases/index.js";
4
+ import { GetFlpUseCase } from "@webiny/api-aco/features/flp/GetFlp/index.js";
5
+ import { ReviewTeamLoader } from "@webiny/api-workflows/features/identity/ReviewTeamLoader/index.js";
6
+ import { CandidateFolderReadRules } from "./abstractions.js";
7
+ const TEAM_TARGET_PREFIX = "team:";
8
+ class CandidateFolderReadRulesImpl {
9
+ constructor(identityContext, folderLevelPermissions, teamLoader, getFlp){
10
+ this.identityContext = identityContext;
11
+ this.folderLevelPermissions = folderLevelPermissions;
12
+ this.teamLoader = teamLoader;
13
+ this.getFlp = getFlp;
14
+ }
15
+ create(params) {
16
+ const usersById = new Map(params.users.map((user)=>[
17
+ user.id,
18
+ user
19
+ ]));
20
+ let stored = null;
21
+ let teamSlugs = null;
22
+ const loadStored = ()=>{
23
+ if (!stored && this.getFlp) stored = this.getFlp.execute(params.folderId).then((flp)=>flp?.permissions ?? []);
24
+ return stored ?? Promise.resolve([]);
25
+ };
26
+ const loadTeamSlugs = ()=>{
27
+ if (!teamSlugs) {
28
+ const teamIds = params.users.flatMap((user)=>user.teams ?? []);
29
+ teamSlugs = this.teamLoader.load(teamIds).then((loaded)=>{
30
+ const teams = loaded.isOk() ? loaded.value : [];
31
+ return new Map(teams.map((team)=>[
32
+ team.id,
33
+ team.slug
34
+ ]));
35
+ });
36
+ }
37
+ return teamSlugs;
38
+ };
39
+ return {
40
+ canReadFolder: async (folderId)=>{
41
+ if (folderId !== params.folderId) return false;
42
+ if (!this.getFlp) {
43
+ const permissions = await this.folderLevelPermissions.getFolderLevelPermissions(folderId);
44
+ return this.folderLevelPermissions.canAccessFolderContent({
45
+ permissions,
46
+ rwd: "r"
47
+ });
48
+ }
49
+ const stored = await loadStored();
50
+ let withDefaults;
51
+ if (this.folderLevelPermissions.canUseTeams()) {
52
+ const identity = this.identityContext.getIdentity();
53
+ const permissions = [
54
+ ...stored
55
+ ];
56
+ const hasTeamGrants = stored.some((permission)=>permission.target.startsWith(TEAM_TARGET_PREFIX));
57
+ const teamIds = usersById.get(identity.id)?.teams ?? [];
58
+ if (hasTeamGrants && teamIds.length > 0) {
59
+ const slugs = await loadTeamSlugs();
60
+ for (const teamId of teamIds){
61
+ const slug = slugs.get(teamId);
62
+ const teamPermission = stored.find((permission)=>permission.target === `${TEAM_TARGET_PREFIX}${slug}`);
63
+ if (slug && teamPermission) permissions.push({
64
+ target: `admin:${identity.id}`,
65
+ level: teamPermission.level,
66
+ inheritedFrom: `${TEAM_TARGET_PREFIX}${slug}`
67
+ });
68
+ }
69
+ }
70
+ const defaults = new GetDefaultPermissions(this.identityContext);
71
+ withDefaults = await defaults.execute(permissions);
72
+ } else withDefaults = await this.folderLevelPermissions.getDefaultPermissions(stored);
73
+ return this.folderLevelPermissions.canAccessFolderContent({
74
+ permissions: withDefaults,
75
+ rwd: "r"
76
+ });
77
+ }
78
+ };
79
+ }
80
+ }
81
+ const CandidateFolderReadRules_CandidateFolderReadRules = CandidateFolderReadRules.createImplementation({
82
+ implementation: CandidateFolderReadRulesImpl,
83
+ dependencies: [
84
+ IdentityContext,
85
+ FolderLevelPermissions,
86
+ ReviewTeamLoader,
87
+ [
88
+ GetFlpUseCase,
89
+ {
90
+ optional: true
91
+ }
92
+ ]
93
+ ]
94
+ });
95
+ export { CandidateFolderReadRules_CandidateFolderReadRules as CandidateFolderReadRules };
96
+
97
+ //# sourceMappingURL=CandidateFolderReadRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/target/CandidateFolderReadRules/CandidateFolderReadRules.js","sources":["../../../../src/features/target/CandidateFolderReadRules/CandidateFolderReadRules.ts"],"sourcesContent":["import { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { FolderLevelPermissions } from \"@webiny/api-aco/features/flp/FolderLevelPermissions/index.js\";\nimport { GetDefaultPermissions } from \"@webiny/api-aco/features/flp/FolderLevelPermissions/useCases/index.js\";\nimport { GetFlpUseCase } from \"@webiny/api-aco/features/flp/GetFlp/index.js\";\nimport type { FolderPermission } from \"@webiny/api-aco/types.js\";\nimport { ReviewTeamLoader } from \"@webiny/api-workflows/features/identity/ReviewTeamLoader/index.js\";\nimport type { FolderReadRule } from \"../FolderReadRule.js\";\nimport { CandidateFolderReadRules as Abstraction } from \"./abstractions.js\";\n\nconst TEAM_TARGET_PREFIX = \"team:\";\n\nclass CandidateFolderReadRulesImpl implements Abstraction.Interface {\n public constructor(\n private identityContext: IdentityContext.Interface,\n private folderLevelPermissions: FolderLevelPermissions.Interface,\n private teamLoader: ReviewTeamLoader.Interface,\n // Registered with ACO's folder-level permissions; absent with the no-op ones.\n private getFlp?: GetFlpUseCase.Interface\n ) {}\n\n public create(params: Abstraction.Params): FolderReadRule {\n const usersById = new Map(params.users.map(user => [user.id, user]));\n // Read once, on the first check, and shared by every candidate of the rule.\n let stored: Promise<FolderPermission[]> | null = null;\n let teamSlugs: Promise<Map<string, string>> | null = null;\n\n const loadStored = (): Promise<FolderPermission[]> => {\n if (!stored && this.getFlp) {\n stored = this.getFlp.execute(params.folderId).then(flp => flp?.permissions ?? []);\n }\n return stored ?? Promise.resolve([]);\n };\n const loadTeamSlugs = (): Promise<Map<string, string>> => {\n if (!teamSlugs) {\n const teamIds = params.users.flatMap(user => user.teams ?? []);\n teamSlugs = this.teamLoader.load(teamIds).then(loaded => {\n // A failed lookup grants no team permission, as `ListUserTeamsUseCase` does.\n const teams = loaded.isOk() ? loaded.value : [];\n return new Map(teams.map(team => [team.id, team.slug]));\n });\n }\n return teamSlugs;\n };\n\n return {\n canReadFolder: async (folderId: string): Promise<boolean> => {\n if (folderId !== params.folderId) {\n return false;\n }\n if (!this.getFlp) {\n // No stored folder permissions to read once: the folder rules decide alone.\n const permissions =\n await this.folderLevelPermissions.getFolderLevelPermissions(folderId);\n return this.folderLevelPermissions.canAccessFolderContent({\n permissions,\n rwd: \"r\"\n });\n }\n const stored = await loadStored();\n let withDefaults: FolderPermission[];\n if (this.folderLevelPermissions.canUseTeams()) {\n /*\n * A copy of `GetDefaultPermissionsWithTeams` (@webiny/api-aco,\n * packages/api-aco/src/features/flp/FolderLevelPermissions/useCases/\n * GetDefaultPermissions/GetDefaultPermissionsWithTeams.ts): each team of the\n * candidate with a `team:<slug>` permission on the folder grants the candidate\n * that level, then ACO's `GetDefaultPermissions` applies the defaults.\n * Copied because ACO loads the current identity's teams once per call, and\n * each candidate is a separate call; here the teams of all candidates are\n * loaded once. Keep it in step with that file.\n */\n const identity = this.identityContext.getIdentity();\n const permissions = [...stored];\n const hasTeamGrants = stored.some(permission => {\n return permission.target.startsWith(TEAM_TARGET_PREFIX);\n });\n const teamIds = usersById.get(identity.id)?.teams ?? [];\n if (hasTeamGrants && teamIds.length > 0) {\n const slugs = await loadTeamSlugs();\n for (const teamId of teamIds) {\n const slug = slugs.get(teamId);\n const teamPermission = stored.find(permission => {\n return permission.target === `${TEAM_TARGET_PREFIX}${slug}`;\n });\n if (slug && teamPermission) {\n permissions.push({\n target: `admin:${identity.id}`,\n level: teamPermission.level,\n inheritedFrom: `${TEAM_TARGET_PREFIX}${slug}`\n });\n }\n }\n }\n const defaults = new GetDefaultPermissions(this.identityContext);\n withDefaults = await defaults.execute(permissions);\n } else {\n withDefaults = await this.folderLevelPermissions.getDefaultPermissions(stored);\n }\n // In memory: the candidate's own permissions are already loaded for the check.\n return this.folderLevelPermissions.canAccessFolderContent({\n permissions: withDefaults,\n rwd: \"r\"\n });\n }\n };\n }\n}\n\nexport const CandidateFolderReadRules = Abstraction.createImplementation({\n implementation: CandidateFolderReadRulesImpl,\n dependencies: [\n IdentityContext,\n FolderLevelPermissions,\n ReviewTeamLoader,\n [GetFlpUseCase, { optional: true }]\n ]\n});\n"],"names":["TEAM_TARGET_PREFIX","CandidateFolderReadRulesImpl","identityContext","folderLevelPermissions","teamLoader","getFlp","params","usersById","Map","user","stored","teamSlugs","loadStored","flp","Promise","loadTeamSlugs","teamIds","loaded","teams","team","folderId","permissions","withDefaults","identity","hasTeamGrants","permission","slugs","teamId","slug","teamPermission","defaults","GetDefaultPermissions","CandidateFolderReadRules","Abstraction","IdentityContext","FolderLevelPermissions","ReviewTeamLoader","GetFlpUseCase"],"mappings":";;;;;;AASA,MAAMA,qBAAqB;AAE3B,MAAMC;IACF,YACYC,eAA0C,EAC1CC,sBAAwD,EACxDC,UAAsC,EAEtCC,MAAgC,CAC1C;aALUH,eAAe,GAAfA;aACAC,sBAAsB,GAAtBA;aACAC,UAAU,GAAVA;aAEAC,MAAM,GAANA;IACT;IAEI,OAAOC,MAA0B,EAAkB;QACtD,MAAMC,YAAY,IAAIC,IAAIF,OAAO,KAAK,CAAC,GAAG,CAACG,CAAAA,OAAQ;gBAACA,KAAK,EAAE;gBAAEA;aAAK;QAElE,IAAIC,SAA6C;QACjD,IAAIC,YAAiD;QAErD,MAAMC,aAAa;YACf,IAAI,CAACF,UAAU,IAAI,CAAC,MAAM,EACtBA,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,CAACJ,OAAO,QAAQ,EAAE,IAAI,CAACO,CAAAA,MAAOA,KAAK,eAAe,EAAE;YAEpF,OAAOH,UAAUI,QAAQ,OAAO,CAAC,EAAE;QACvC;QACA,MAAMC,gBAAgB;YAClB,IAAI,CAACJ,WAAW;gBACZ,MAAMK,UAAUV,OAAO,KAAK,CAAC,OAAO,CAACG,CAAAA,OAAQA,KAAK,KAAK,IAAI,EAAE;gBAC7DE,YAAY,IAAI,CAAC,UAAU,CAAC,IAAI,CAACK,SAAS,IAAI,CAACC,CAAAA;oBAE3C,MAAMC,QAAQD,OAAO,IAAI,KAAKA,OAAO,KAAK,GAAG,EAAE;oBAC/C,OAAO,IAAIT,IAAIU,MAAM,GAAG,CAACC,CAAAA,OAAQ;4BAACA,KAAK,EAAE;4BAAEA,KAAK,IAAI;yBAAC;gBACzD;YACJ;YACA,OAAOR;QACX;QAEA,OAAO;YACH,eAAe,OAAOS;gBAClB,IAAIA,aAAad,OAAO,QAAQ,EAC5B,OAAO;gBAEX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAEd,MAAMe,cACF,MAAM,IAAI,CAAC,sBAAsB,CAAC,yBAAyB,CAACD;oBAChE,OAAO,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;wBACtDC;wBACA,KAAK;oBACT;gBACJ;gBACA,MAAMX,SAAS,MAAME;gBACrB,IAAIU;gBACJ,IAAI,IAAI,CAAC,sBAAsB,CAAC,WAAW,IAAI;oBAW3C,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;oBACjD,MAAMF,cAAc;2BAAIX;qBAAO;oBAC/B,MAAMc,gBAAgBd,OAAO,IAAI,CAACe,CAAAA,aACvBA,WAAW,MAAM,CAAC,UAAU,CAACzB;oBAExC,MAAMgB,UAAUT,UAAU,GAAG,CAACgB,SAAS,EAAE,GAAG,SAAS,EAAE;oBACvD,IAAIC,iBAAiBR,QAAQ,MAAM,GAAG,GAAG;wBACrC,MAAMU,QAAQ,MAAMX;wBACpB,KAAK,MAAMY,UAAUX,QAAS;4BAC1B,MAAMY,OAAOF,MAAM,GAAG,CAACC;4BACvB,MAAME,iBAAiBnB,OAAO,IAAI,CAACe,CAAAA,aACxBA,WAAW,MAAM,KAAK,GAAGzB,qBAAqB4B,MAAM;4BAE/D,IAAIA,QAAQC,gBACRR,YAAY,IAAI,CAAC;gCACb,QAAQ,CAAC,MAAM,EAAEE,SAAS,EAAE,EAAE;gCAC9B,OAAOM,eAAe,KAAK;gCAC3B,eAAe,GAAG7B,qBAAqB4B,MAAM;4BACjD;wBAER;oBACJ;oBACA,MAAME,WAAW,IAAIC,sBAAsB,IAAI,CAAC,eAAe;oBAC/DT,eAAe,MAAMQ,SAAS,OAAO,CAACT;gBAC1C,OACIC,eAAe,MAAM,IAAI,CAAC,sBAAsB,CAAC,qBAAqB,CAACZ;gBAG3E,OAAO,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;oBACtD,aAAaY;oBACb,KAAK;gBACT;YACJ;QACJ;IACJ;AACJ;AAEO,MAAMU,oDAA2BC,yBAAAA,oBAAgC,CAAC;IACrE,gBAAgBhC;IAChB,cAAc;QACViC;QACAC;QACAC;QACA;YAACC;YAAe;gBAAE,UAAU;YAAK;SAAE;KACtC;AACL"}
@@ -0,0 +1,35 @@
1
+ import type { FolderReadRule } from "../FolderReadRule.js";
2
+ /** A candidate, as the engine listed it (`AdminUser` fits). */
3
+ export interface CandidateFolderUser {
4
+ id: string;
5
+ /** Team ids, as stored on the admin user. */
6
+ teams?: string[];
7
+ }
8
+ export interface CandidateFolderReadRuleParams {
9
+ /** The folder the candidates are checked for; never the root folder. */
10
+ folderId: string;
11
+ /** Every candidate the rule is run for, with their teams, so no user is read per check. */
12
+ users: CandidateFolderUser[];
13
+ }
14
+ export interface ICandidateFolderReadRules {
15
+ /**
16
+ * A folder rule run as each candidate, inside `CandidateReadAccess`. The folder's permission
17
+ * record is read once, on first use, and the candidates' teams once (only with teams on and
18
+ * a team grant on the folder); each candidate's access is then evaluated in memory as
19
+ * `FolderLevelPermissions.getFolderLevelPermissions` and `canAccessFolderContent` evaluate it
20
+ * for that user: the team grants of the user's teams, then the defaults (full access is
21
+ * owner, a folder without permissions is public). Another folder answers `false`.
22
+ */
23
+ create(params: CandidateFolderReadRuleParams): FolderReadRule;
24
+ }
25
+ /**
26
+ * Folder content read for routing candidates (R48, Q79): one folder permission read per routing
27
+ * evaluation instead of one per candidate, and no team lookup per candidate. Shared by the CMS and
28
+ * Website Builder adapters, which check folders by id.
29
+ */
30
+ export declare const CandidateFolderReadRules: import("@webiny/di").Abstraction<ICandidateFolderReadRules>;
31
+ export declare namespace CandidateFolderReadRules {
32
+ type Interface = ICandidateFolderReadRules;
33
+ type User = CandidateFolderUser;
34
+ type Params = CandidateFolderReadRuleParams;
35
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const CandidateFolderReadRules = createAbstraction("CandidateFolderReadRules");
3
+ export { CandidateFolderReadRules };
4
+
5
+ //# sourceMappingURL=abstractions.js.map