@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,17 @@
1
+ import type { CmsModel } from "@webiny/api-headless-cms/types/index.js";
2
+ export interface ICmsEntryReviewNamespace {
3
+ /**
4
+ * The review namespace of this model's entries (e.g. "cms.article", "wb.page"), or `null`
5
+ * when this implementation does not own the model.
6
+ */
7
+ resolve(model: CmsModel): string | null;
8
+ }
9
+ /**
10
+ * Maps a CMS model to the review namespace of its entries, for the single CMS entry handlers that
11
+ * also cover apps built on CMS entries (D59, R51). Resolved `multiple`; the last registered
12
+ * non-null answer wins. A model with no namespace is skipped by every handler.
13
+ */
14
+ export declare const CmsEntryReviewNamespace: import("@webiny/di").Abstraction<ICmsEntryReviewNamespace>;
15
+ export declare namespace CmsEntryReviewNamespace {
16
+ type Interface = ICmsEntryReviewNamespace;
17
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const CmsEntryReviewNamespace = createAbstraction("CmsEntryReviewNamespace");
3
+ export { CmsEntryReviewNamespace };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/target/CmsEntryReviewNamespace/abstractions.js","sources":["../../../../src/features/target/CmsEntryReviewNamespace/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\n\nexport interface ICmsEntryReviewNamespace {\n /**\n * The review namespace of this model's entries (e.g. \"cms.article\", \"wb.page\"), or `null`\n * when this implementation does not own the model.\n */\n resolve(model: CmsModel): string | null;\n}\n\n/**\n * Maps a CMS model to the review namespace of its entries, for the single CMS entry handlers that\n * also cover apps built on CMS entries (D59, R51). Resolved `multiple`; the last registered\n * non-null answer wins. A model with no namespace is skipped by every handler.\n */\nexport const CmsEntryReviewNamespace =\n createAbstraction<ICmsEntryReviewNamespace>(\"CmsEntryReviewNamespace\");\n\nexport namespace CmsEntryReviewNamespace {\n export type Interface = ICmsEntryReviewNamespace;\n}\n"],"names":["CmsEntryReviewNamespace","createAbstraction"],"mappings":";AAgBO,MAAMA,0BACTC,kBAA4C"}
@@ -0,0 +1 @@
1
+ export { CmsEntryReviewNamespace } from "./abstractions.js";
@@ -0,0 +1 @@
1
+ export { CmsEntryReviewNamespace } from "./abstractions.js";
@@ -0,0 +1,20 @@
1
+ import type { CmsModel } from "@webiny/api-headless-cms/types/index.js";
2
+ import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
3
+ import { ListGroupsUseCase } from "@webiny/api-headless-cms/features/contentModelGroup/ListGroups/index.js";
4
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
5
+ import { ListReviewedModelsUseCase } from "@webiny/api-workflows/features/review/ListReviewedModels/index.js";
6
+ import { CmsEntryDeniedFolders } from "../CmsEntryDeniedFolders/index.js";
7
+ import { CmsEntryReviewReadFilter as Abstraction } from "./abstractions.js";
8
+ declare class CmsEntryReviewReadFilterImpl implements Abstraction.Interface {
9
+ private accessControl;
10
+ private listGroups;
11
+ private identityContext;
12
+ private deniedFolders;
13
+ private listReviewedModels;
14
+ constructor(accessControl: AccessControl.Interface, listGroups: ListGroupsUseCase.Interface, identityContext: IdentityContext.Interface, deniedFolders: CmsEntryDeniedFolders.Interface, listReviewedModels: ListReviewedModelsUseCase.Interface);
15
+ build(models: CmsModel[]): Abstraction.Return;
16
+ }
17
+ export declare const CmsEntryReviewReadFilter: typeof CmsEntryReviewReadFilterImpl & {
18
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICmsEntryReviewReadFilter>;
19
+ };
20
+ export {};
@@ -0,0 +1,80 @@
1
+ import { Result } from "@webiny/feature/api";
2
+ import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
3
+ import { ListGroupsUseCase } from "@webiny/api-headless-cms/features/contentModelGroup/ListGroups/index.js";
4
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
5
+ import { ReviewPersistenceError } from "@webiny/api-workflows/domain/review/errors.js";
6
+ import { ListReviewedModelsUseCase } from "@webiny/api-workflows/features/review/ListReviewedModels/index.js";
7
+ import { toCmsNamespace } from "../../../utils/appName.js";
8
+ import { UNREADABLE_CODES } from "../CmsEntryAccess/index.js";
9
+ import { CmsEntryDeniedFolders } from "../CmsEntryDeniedFolders/index.js";
10
+ import { CmsEntryReviewReadFilter } from "./abstractions.js";
11
+ class CmsEntryReviewReadFilterImpl {
12
+ constructor(accessControl, listGroups, identityContext, deniedFolders, listReviewedModels){
13
+ this.accessControl = accessControl;
14
+ this.listGroups = listGroups;
15
+ this.identityContext = identityContext;
16
+ this.deniedFolders = deniedFolders;
17
+ this.listReviewedModels = listReviewedModels;
18
+ }
19
+ async build(models) {
20
+ const identity = this.identityContext.getIdentity();
21
+ const filter = {
22
+ models: [],
23
+ ownOnlyModels: [],
24
+ authorId: identity.id,
25
+ deniedFolderIds: []
26
+ };
27
+ if (0 === models.length) return Result.ok(filter);
28
+ const groups = await this.listGroups.execute();
29
+ let readableGroups = [];
30
+ if (groups.isOk()) readableGroups = groups.value;
31
+ else if (!UNREADABLE_CODES.includes(groups.error.code)) return Result.fail(new ReviewPersistenceError(groups.error));
32
+ const readable = [];
33
+ for (const model of models){
34
+ const group = readableGroups.find((item)=>item.slug === model.group);
35
+ if (!group || !await this.accessControl.canAccessGroup({
36
+ group
37
+ })) continue;
38
+ if (!await this.accessControl.canAccessModel({
39
+ model
40
+ })) continue;
41
+ if (!await this.accessControl.canAccessEntry({
42
+ model,
43
+ rwd: "r"
44
+ })) continue;
45
+ const namespace = toCmsNamespace(model.modelId);
46
+ if (await this.accessControl.canAccessOnlyOwnedEntries({
47
+ model
48
+ })) filter.ownOnlyModels.push(namespace);
49
+ else filter.models.push(namespace);
50
+ readable.push(model);
51
+ }
52
+ if (0 === readable.length) return Result.ok(filter);
53
+ const reviewedModels = await this.listReviewedModels.execute();
54
+ if (reviewedModels.isFail()) return Result.fail(reviewedModels.error);
55
+ const reviewedModelIds = readable.filter((model)=>{
56
+ const namespace = toCmsNamespace(model.modelId);
57
+ return reviewedModels.value.includes(namespace);
58
+ }).map((model)=>model.modelId);
59
+ if (0 === reviewedModelIds.length) return Result.ok(filter);
60
+ try {
61
+ filter.deniedFolderIds = await this.deniedFolders.listDeniedFolderIds(reviewedModelIds);
62
+ } catch (error) {
63
+ return Result.fail(new ReviewPersistenceError(error instanceof Error ? error : new Error(String(error))));
64
+ }
65
+ return Result.ok(filter);
66
+ }
67
+ }
68
+ const CmsEntryReviewReadFilter_CmsEntryReviewReadFilter = CmsEntryReviewReadFilter.createImplementation({
69
+ implementation: CmsEntryReviewReadFilterImpl,
70
+ dependencies: [
71
+ AccessControl,
72
+ ListGroupsUseCase,
73
+ IdentityContext,
74
+ CmsEntryDeniedFolders,
75
+ ListReviewedModelsUseCase
76
+ ]
77
+ });
78
+ export { CmsEntryReviewReadFilter_CmsEntryReviewReadFilter as CmsEntryReviewReadFilter };
79
+
80
+ //# sourceMappingURL=CmsEntryReviewReadFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/target/CmsEntryReviewReadFilter/CmsEntryReviewReadFilter.js","sources":["../../../../src/features/target/CmsEntryReviewReadFilter/CmsEntryReviewReadFilter.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport type { CmsGroup, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { AccessControl } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { ListGroupsUseCase } from \"@webiny/api-headless-cms/features/contentModelGroup/ListGroups/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport type { ReviewListReadFilter } from \"@webiny/api-workflows/domain/review/types.js\";\nimport { ReviewPersistenceError } from \"@webiny/api-workflows/domain/review/errors.js\";\nimport { ListReviewedModelsUseCase } from \"@webiny/api-workflows/features/review/ListReviewedModels/index.js\";\nimport { toCmsNamespace } from \"~/utils/appName.js\";\nimport { UNREADABLE_CODES } from \"../CmsEntryAccess/index.js\";\nimport { CmsEntryDeniedFolders } from \"../CmsEntryDeniedFolders/index.js\";\nimport { CmsEntryReviewReadFilter as Abstraction } from \"./abstractions.js\";\n\nclass CmsEntryReviewReadFilterImpl implements Abstraction.Interface {\n public constructor(\n private accessControl: AccessControl.Interface,\n private listGroups: ListGroupsUseCase.Interface,\n private identityContext: IdentityContext.Interface,\n private deniedFolders: CmsEntryDeniedFolders.Interface,\n private listReviewedModels: ListReviewedModelsUseCase.Interface\n ) {}\n\n public async build(models: CmsModel[]): Abstraction.Return {\n const identity = this.identityContext.getIdentity();\n const filter: ReviewListReadFilter = {\n models: [],\n ownOnlyModels: [],\n authorId: identity.id,\n deniedFolderIds: []\n };\n if (models.length === 0) {\n return Result.ok(filter);\n }\n\n // The groups the identity can read, once; a model is found in it by its group's slug, as\n // `CmsModelGroupService` does. No group read at all leaves every model unreadable.\n const groups = await this.listGroups.execute();\n let readableGroups: CmsGroup[] = [];\n if (groups.isOk()) {\n readableGroups = groups.value;\n } else if (!UNREADABLE_CODES.includes(groups.error.code)) {\n return Result.fail(new ReviewPersistenceError(groups.error));\n }\n\n const readable: CmsModel[] = [];\n for (const model of models) {\n // In memory: the access control loads the identity's permissions once per request.\n const group = readableGroups.find(item => item.slug === model.group);\n // oxlint-disable-next-line no-await-in-loop -- in memory: the access control loads the permissions once per request.\n if (!group || !(await this.accessControl.canAccessGroup({ group }))) {\n continue;\n }\n // oxlint-disable-next-line no-await-in-loop -- in memory: the access control loads the permissions once per request.\n if (!(await this.accessControl.canAccessModel({ model }))) {\n continue;\n }\n // oxlint-disable-next-line no-await-in-loop -- in memory: the access control loads the permissions once per request.\n if (!(await this.accessControl.canAccessEntry({ model, rwd: \"r\" }))) {\n continue;\n }\n const namespace = toCmsNamespace(model.modelId);\n // oxlint-disable-next-line no-await-in-loop -- in memory: the access control loads the permissions once per request.\n if (await this.accessControl.canAccessOnlyOwnedEntries({ model })) {\n filter.ownOnlyModels.push(namespace);\n } else {\n filter.models.push(namespace);\n }\n readable.push(model);\n }\n if (readable.length === 0) {\n return Result.ok(filter);\n }\n\n // Folder rules only for the readable models with active reviews: no row of another\n // model can match the filter, so its folders need no read (one query for the namespaces).\n const reviewedModels = await this.listReviewedModels.execute();\n if (reviewedModels.isFail()) {\n return Result.fail(reviewedModels.error);\n }\n const reviewedModelIds = readable\n .filter(model => {\n const namespace = toCmsNamespace(model.modelId);\n return reviewedModels.value.includes(namespace);\n })\n .map(model => model.modelId);\n if (reviewedModelIds.length === 0) {\n return Result.ok(filter);\n }\n\n try {\n filter.deniedFolderIds = await this.deniedFolders.listDeniedFolderIds(reviewedModelIds);\n } catch (error) {\n return Result.fail(\n new ReviewPersistenceError(\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n return Result.ok(filter);\n }\n}\n\nexport const CmsEntryReviewReadFilter = Abstraction.createImplementation({\n implementation: CmsEntryReviewReadFilterImpl,\n dependencies: [\n AccessControl,\n ListGroupsUseCase,\n IdentityContext,\n CmsEntryDeniedFolders,\n ListReviewedModelsUseCase\n ]\n});\n"],"names":["CmsEntryReviewReadFilterImpl","accessControl","listGroups","identityContext","deniedFolders","listReviewedModels","models","identity","filter","Result","groups","readableGroups","UNREADABLE_CODES","ReviewPersistenceError","readable","model","group","item","namespace","toCmsNamespace","reviewedModels","reviewedModelIds","error","Error","String","CmsEntryReviewReadFilter","Abstraction","AccessControl","ListGroupsUseCase","IdentityContext","CmsEntryDeniedFolders","ListReviewedModelsUseCase"],"mappings":";;;;;;;;;;AAaA,MAAMA;IACF,YACYC,aAAsC,EACtCC,UAAuC,EACvCC,eAA0C,EAC1CC,aAA8C,EAC9CC,kBAAuD,CACjE;aALUJ,aAAa,GAAbA;aACAC,UAAU,GAAVA;aACAC,eAAe,GAAfA;aACAC,aAAa,GAAbA;aACAC,kBAAkB,GAAlBA;IACT;IAEH,MAAa,MAAMC,MAAkB,EAAsB;QACvD,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;QACjD,MAAMC,SAA+B;YACjC,QAAQ,EAAE;YACV,eAAe,EAAE;YACjB,UAAUD,SAAS,EAAE;YACrB,iBAAiB,EAAE;QACvB;QACA,IAAID,AAAkB,MAAlBA,OAAO,MAAM,EACb,OAAOG,OAAO,EAAE,CAACD;QAKrB,MAAME,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO;QAC5C,IAAIC,iBAA6B,EAAE;QACnC,IAAID,OAAO,IAAI,IACXC,iBAAiBD,OAAO,KAAK;aAC1B,IAAI,CAACE,iBAAiB,QAAQ,CAACF,OAAO,KAAK,CAAC,IAAI,GACnD,OAAOD,OAAO,IAAI,CAAC,IAAII,uBAAuBH,OAAO,KAAK;QAG9D,MAAMI,WAAuB,EAAE;QAC/B,KAAK,MAAMC,SAAST,OAAQ;YAExB,MAAMU,QAAQL,eAAe,IAAI,CAACM,CAAAA,OAAQA,KAAK,IAAI,KAAKF,MAAM,KAAK;YAEnE,IAAI,CAACC,SAAS,CAAE,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;gBAAEA;YAAM,IAC5D;YAGJ,IAAI,CAAE,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;gBAAED;YAAM,IAClD;YAGJ,IAAI,CAAE,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;gBAAEA;gBAAO,KAAK;YAAI,IAC5D;YAEJ,MAAMG,YAAYC,eAAeJ,MAAM,OAAO;YAE9C,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;gBAAEA;YAAM,IAC3DP,OAAO,aAAa,CAAC,IAAI,CAACU;iBAE1BV,OAAO,MAAM,CAAC,IAAI,CAACU;YAEvBJ,SAAS,IAAI,CAACC;QAClB;QACA,IAAID,AAAoB,MAApBA,SAAS,MAAM,EACf,OAAOL,OAAO,EAAE,CAACD;QAKrB,MAAMY,iBAAiB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO;QAC5D,IAAIA,eAAe,MAAM,IACrB,OAAOX,OAAO,IAAI,CAACW,eAAe,KAAK;QAE3C,MAAMC,mBAAmBP,SACpB,MAAM,CAACC,CAAAA;YACJ,MAAMG,YAAYC,eAAeJ,MAAM,OAAO;YAC9C,OAAOK,eAAe,KAAK,CAAC,QAAQ,CAACF;QACzC,GACC,GAAG,CAACH,CAAAA,QAASA,MAAM,OAAO;QAC/B,IAAIM,AAA4B,MAA5BA,iBAAiB,MAAM,EACvB,OAAOZ,OAAO,EAAE,CAACD;QAGrB,IAAI;YACAA,OAAO,eAAe,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAACa;QAC1E,EAAE,OAAOC,OAAO;YACZ,OAAOb,OAAO,IAAI,CACd,IAAII,uBACAS,iBAAiBC,QAAQD,QAAQ,IAAIC,MAAMC,OAAOF;QAG9D;QACA,OAAOb,OAAO,EAAE,CAACD;IACrB;AACJ;AAEO,MAAMiB,oDAA2BC,yBAAAA,oBAAgC,CAAC;IACrE,gBAAgB1B;IAChB,cAAc;QACV2B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -0,0 +1,24 @@
1
+ import { type Result } from "@webiny/feature/api";
2
+ import type { CmsModel } from "@webiny/api-headless-cms/types/index.js";
3
+ import type { ReviewListReadFilter } from "@webiny/api-workflows/domain/review/types.js";
4
+ import type { ReviewPersistenceError } from "@webiny/api-workflows/domain/review/errors.js";
5
+ export interface ICmsEntryReviewReadFilter {
6
+ /**
7
+ * The review list read filter (Q77) of the current identity over these models. A failed group
8
+ * or folder permission read is a persistence error (R87).
9
+ */
10
+ build(models: CmsModel[]): Promise<Result<ReviewListReadFilter, ReviewPersistenceError>>;
11
+ }
12
+ /**
13
+ * What the CMS entry list would show the current identity, as a review list filter: a model is
14
+ * readable with group read, model read and entry read (`CmsEntryAccess`); an own-only entry
15
+ * permission makes it own-only, as `ListEntriesUseCase` filters by `createdBy`; folders come from
16
+ * `CmsEntryDeniedFolders`, only for readable models with active reviews
17
+ * (`ListReviewedModelsUseCase`). Evaluated once per call, in memory over the cached
18
+ * permissions.
19
+ */
20
+ export declare const CmsEntryReviewReadFilter: import("@webiny/di").Abstraction<ICmsEntryReviewReadFilter>;
21
+ export declare namespace CmsEntryReviewReadFilter {
22
+ type Interface = ICmsEntryReviewReadFilter;
23
+ type Return = Promise<Result<ReviewListReadFilter, ReviewPersistenceError>>;
24
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const CmsEntryReviewReadFilter = createAbstraction("CmsEntryReviewReadFilter");
3
+ export { CmsEntryReviewReadFilter };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/target/CmsEntryReviewReadFilter/abstractions.js","sources":["../../../../src/features/target/CmsEntryReviewReadFilter/abstractions.ts"],"sourcesContent":["import { createAbstraction, type Result } from \"@webiny/feature/api\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { ReviewListReadFilter } from \"@webiny/api-workflows/domain/review/types.js\";\nimport type { ReviewPersistenceError } from \"@webiny/api-workflows/domain/review/errors.js\";\n\nexport interface ICmsEntryReviewReadFilter {\n /**\n * The review list read filter (Q77) of the current identity over these models. A failed group\n * or folder permission read is a persistence error (R87).\n */\n build(models: CmsModel[]): Promise<Result<ReviewListReadFilter, ReviewPersistenceError>>;\n}\n\n/**\n * What the CMS entry list would show the current identity, as a review list filter: a model is\n * readable with group read, model read and entry read (`CmsEntryAccess`); an own-only entry\n * permission makes it own-only, as `ListEntriesUseCase` filters by `createdBy`; folders come from\n * `CmsEntryDeniedFolders`, only for readable models with active reviews\n * (`ListReviewedModelsUseCase`). Evaluated once per call, in memory over the cached\n * permissions.\n */\nexport const CmsEntryReviewReadFilter = createAbstraction<ICmsEntryReviewReadFilter>(\n \"CmsEntryReviewReadFilter\"\n);\n\nexport namespace CmsEntryReviewReadFilter {\n export type Interface = ICmsEntryReviewReadFilter;\n export type Return = Promise<Result<ReviewListReadFilter, ReviewPersistenceError>>;\n}\n"],"names":["CmsEntryReviewReadFilter","createAbstraction"],"mappings":";AAqBO,MAAMA,2BAA2BC,kBACpC"}
@@ -0,0 +1 @@
1
+ export { CmsEntryReviewReadFilter } from "./abstractions.js";
@@ -0,0 +1 @@
1
+ export { CmsEntryReviewReadFilter } from "./abstractions.js";
@@ -0,0 +1,28 @@
1
+ import { Result } from "@webiny/feature/api";
2
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
3
+ import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js";
4
+ import { ReviewTargetEditor } from "@webiny/api-workflows/features/review/ReviewTargetEditor/index.js";
5
+ import type { ReviewTargetContent, ReviewTargetEditorReadParams, ReviewTargetEditorUpdateParams, ReviewTargetEditorUpdateResult } from "@webiny/api-workflows/features/review/ReviewTargetEditor/abstractions.js";
6
+ import { ReviewTargetEditorError } from "@webiny/api-workflows/domain/review/errors.js";
7
+ import { CmsEntryTargetReader } from "./CmsEntryTargetReader/index.js";
8
+ /**
9
+ * The `cms.<modelId>` editor of the AI step's built-in tools (spec 9.3, R172). `read` returns the
10
+ * whole revision; `update` writes top-level and nested object fields of the five writable types by
11
+ * dotted path, atomically, through the CMS entry update (so field validators run). The model and
12
+ * group are read as the request identity through `CmsEntryTargetReader`. The save-block
13
+ * bypass is the tool's business (R173): this class neither reads nor sets it. Throws become failed
14
+ * Results with a text safe to show the model (R87).
15
+ */
16
+ declare class CmsEntryReviewTargetEditorImpl implements ReviewTargetEditor.Interface {
17
+ private targets;
18
+ private updateEntry;
19
+ private logger;
20
+ constructor(targets: CmsEntryTargetReader.Interface, updateEntry: UpdateEntryUseCase.Interface, logger: Logger.Interface);
21
+ canEdit(model: string): boolean;
22
+ read(params: ReviewTargetEditorReadParams): Promise<Result<ReviewTargetContent, ReviewTargetEditorError>>;
23
+ update(params: ReviewTargetEditorUpdateParams): Promise<Result<ReviewTargetEditorUpdateResult, ReviewTargetEditorError>>;
24
+ }
25
+ export declare const CmsEntryReviewTargetEditor: typeof CmsEntryReviewTargetEditorImpl & {
26
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-workflows/features/review/ReviewTargetEditor/abstractions.js").IReviewTargetEditor>;
27
+ };
28
+ export {};
@@ -0,0 +1,128 @@
1
+ import { Result } from "@webiny/feature/api";
2
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
3
+ import { getEntryTitle } from "@webiny/api-headless-cms/utils/getEntryTitle.js";
4
+ import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js";
5
+ import { ReviewTargetEditor } from "@webiny/api-workflows/features/review/ReviewTargetEditor/index.js";
6
+ import { ReviewTargetEditorError } from "@webiny/api-workflows/domain/review/errors.js";
7
+ import { isCmsNamespace } from "../../utils/appName.js";
8
+ import { CmsEntryTargetReader } from "./CmsEntryTargetReader/index.js";
9
+ import { toEditorFields } from "./toEditorFields.js";
10
+ import { describeEditorFieldValue, isEditorFieldValue } from "./isEditorFieldValue.js";
11
+ import { toEntryValuesPatch } from "./toEntryValuesPatch.js";
12
+ import { GENERIC_VALIDATION_MESSAGE, getModelSafeValidationMessage } from "./getModelSafeValidationMessage.js";
13
+ import { hasErrorSource } from "@webiny/api-workflows/domain/hasErrorSource.js";
14
+ class CmsEntryReviewTargetEditorImpl {
15
+ constructor(targets, updateEntry, logger){
16
+ this.targets = targets;
17
+ this.updateEntry = updateEntry;
18
+ this.logger = logger;
19
+ }
20
+ canEdit(model) {
21
+ return isCmsNamespace(model);
22
+ }
23
+ async read(params) {
24
+ try {
25
+ const target = await this.targets.read({
26
+ model: params.model,
27
+ targetRevisionId: params.targetRevisionId
28
+ });
29
+ if (!target || target.entry.entryId !== params.targetId) return Result.fail(new ReviewTargetEditorError("The target was not found."));
30
+ return Result.ok({
31
+ title: getEntryTitle(target.model, target.entry),
32
+ fields: toEditorFields(target.model, target.entry.values)
33
+ });
34
+ } catch (error) {
35
+ this.logger.error({
36
+ err: error,
37
+ model: params.model,
38
+ targetId: params.targetId
39
+ }, "Could not read the target for the AI editor.");
40
+ return Result.fail(new ReviewTargetEditorError("The target could not be read."));
41
+ }
42
+ }
43
+ async update(params) {
44
+ const paths = Object.keys(params.values);
45
+ if (0 === paths.length) return Result.fail(new ReviewTargetEditorError("No fields were given."));
46
+ let target;
47
+ let patch;
48
+ try {
49
+ const read = await this.targets.read({
50
+ model: params.model,
51
+ targetRevisionId: params.targetRevisionId
52
+ });
53
+ if (!read || read.entry.entryId !== params.targetId) return Result.fail(new ReviewTargetEditorError("The target was not found."));
54
+ target = read;
55
+ const fields = new Map();
56
+ for (const field of toEditorFields(target.model, target.entry.values))fields.set(field.path, field);
57
+ const problems = [];
58
+ for (const path of paths){
59
+ const field = fields.get(path);
60
+ if (field) if (field.writable) {
61
+ if (!isEditorFieldValue(field.type, params.values[path])) problems.push(`The field "${path}" expects ${describeEditorFieldValue(field.type)}.`);
62
+ } else problems.push(`The field "${path}" is read-only.`);
63
+ else problems.push(`Unknown field "${path}". Use the paths returned by readTarget.`);
64
+ }
65
+ if (problems.length > 0) return Result.fail(new ReviewTargetEditorError(problems.join(" ")));
66
+ patch = toEntryValuesPatch(target.entry.values, params.values);
67
+ } catch (error) {
68
+ this.logger.error({
69
+ err: error,
70
+ model: params.model,
71
+ targetId: params.targetId
72
+ }, "Could not read the target for the AI editor.");
73
+ return Result.fail(new ReviewTargetEditorError("The target could not be read."));
74
+ }
75
+ try {
76
+ const result = await this.updateEntry.execute(target.model, params.targetRevisionId, {
77
+ values: patch
78
+ });
79
+ if (result.isFail()) {
80
+ if ("Cms/Entry/ValidationError" === result.error.code) {
81
+ const invalid = [];
82
+ for (const item of result.error.data ?? []){
83
+ const itemPath = [
84
+ ...item.parents,
85
+ item.fieldId
86
+ ];
87
+ const safe = getModelSafeValidationMessage(target.model, itemPath, item.error);
88
+ if (null === safe) this.logger.error({
89
+ err: hasErrorSource(item.error) ? item.error.source : item.error,
90
+ model: params.model,
91
+ targetId: params.targetId,
92
+ path: itemPath.join(".")
93
+ }, "A field validator failed while the AI editor updated the target.");
94
+ invalid.push(`${itemPath.join(".")}: ${safe ?? GENERIC_VALIDATION_MESSAGE}`);
95
+ }
96
+ return Result.fail(new ReviewTargetEditorError(invalid.length > 0 ? `Validation failed: ${invalid.join(" ")}` : "Validation failed."));
97
+ }
98
+ this.logger.error({
99
+ err: hasErrorSource(result.error) ? result.error.source : result.error,
100
+ model: params.model,
101
+ targetId: params.targetId
102
+ }, "Could not update the target from the AI editor.");
103
+ return Result.fail(new ReviewTargetEditorError("The target could not be updated."));
104
+ }
105
+ } catch (error) {
106
+ this.logger.error({
107
+ err: error,
108
+ model: params.model,
109
+ targetId: params.targetId
110
+ }, "Could not update the target from the AI editor.");
111
+ return Result.fail(new ReviewTargetEditorError("The target could not be updated."));
112
+ }
113
+ return Result.ok({
114
+ applied: paths
115
+ });
116
+ }
117
+ }
118
+ const CmsEntryReviewTargetEditor = ReviewTargetEditor.createImplementation({
119
+ implementation: CmsEntryReviewTargetEditorImpl,
120
+ dependencies: [
121
+ CmsEntryTargetReader,
122
+ UpdateEntryUseCase,
123
+ Logger
124
+ ]
125
+ });
126
+ export { CmsEntryReviewTargetEditor };
127
+
128
+ //# sourceMappingURL=CmsEntryReviewTargetEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/target/CmsEntryReviewTargetEditor.js","sources":["../../../src/features/target/CmsEntryReviewTargetEditor.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { getEntryTitle } from \"@webiny/api-headless-cms/utils/getEntryTitle.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js\";\nimport { ReviewTargetEditor } from \"@webiny/api-workflows/features/review/ReviewTargetEditor/index.js\";\nimport type {\n ReviewTargetContent,\n ReviewTargetEditorField,\n ReviewTargetEditorReadParams,\n ReviewTargetEditorUpdateParams,\n ReviewTargetEditorUpdateResult\n} from \"@webiny/api-workflows/features/review/ReviewTargetEditor/abstractions.js\";\nimport { ReviewTargetEditorError } from \"@webiny/api-workflows/domain/review/errors.js\";\nimport { isCmsNamespace } from \"~/utils/appName.js\";\nimport { CmsEntryTargetReader } from \"./CmsEntryTargetReader/index.js\";\nimport { toEditorFields } from \"./toEditorFields.js\";\nimport { describeEditorFieldValue, isEditorFieldValue } from \"./isEditorFieldValue.js\";\nimport { toEntryValuesPatch } from \"./toEntryValuesPatch.js\";\nimport {\n GENERIC_VALIDATION_MESSAGE,\n getModelSafeValidationMessage\n} from \"./getModelSafeValidationMessage.js\";\nimport { hasErrorSource } from \"@webiny/api-workflows/domain/hasErrorSource.js\";\n\n/**\n * The `cms.<modelId>` editor of the AI step's built-in tools (spec 9.3, R172). `read` returns the\n * whole revision; `update` writes top-level and nested object fields of the five writable types by\n * dotted path, atomically, through the CMS entry update (so field validators run). The model and\n * group are read as the request identity through `CmsEntryTargetReader`. The save-block\n * bypass is the tool's business (R173): this class neither reads nor sets it. Throws become failed\n * Results with a text safe to show the model (R87).\n */\nclass CmsEntryReviewTargetEditorImpl implements ReviewTargetEditor.Interface {\n public constructor(\n private targets: CmsEntryTargetReader.Interface,\n private updateEntry: UpdateEntryUseCase.Interface,\n private logger: Logger.Interface\n ) {}\n\n public canEdit(model: string): boolean {\n return isCmsNamespace(model);\n }\n\n public async read(\n params: ReviewTargetEditorReadParams\n ): Promise<Result<ReviewTargetContent, ReviewTargetEditorError>> {\n try {\n const target = await this.targets.read({\n model: params.model,\n targetRevisionId: params.targetRevisionId\n });\n if (!target || target.entry.entryId !== params.targetId) {\n return Result.fail(new ReviewTargetEditorError(\"The target was not found.\"));\n }\n\n // Inside the try: a malformed model makes these throw, and that must be a failed\n // Result, never a rejection (R87).\n return Result.ok({\n title: getEntryTitle(target.model, target.entry),\n fields: toEditorFields(target.model, target.entry.values)\n });\n } catch (error) {\n this.logger.error(\n { err: error, model: params.model, targetId: params.targetId },\n \"Could not read the target for the AI editor.\"\n );\n return Result.fail(new ReviewTargetEditorError(\"The target could not be read.\"));\n }\n }\n\n public async update(\n params: ReviewTargetEditorUpdateParams\n ): Promise<Result<ReviewTargetEditorUpdateResult, ReviewTargetEditorError>> {\n const paths = Object.keys(params.values);\n if (paths.length === 0) {\n return Result.fail(new ReviewTargetEditorError(\"No fields were given.\"));\n }\n\n let target: CmsEntryTargetReader.Target;\n let patch: Record<string, unknown>;\n try {\n const read = await this.targets.read({\n model: params.model,\n targetRevisionId: params.targetRevisionId\n });\n if (!read || read.entry.entryId !== params.targetId) {\n return Result.fail(new ReviewTargetEditorError(\"The target was not found.\"));\n }\n target = read;\n\n // A Map, so a key such as \"__proto__\" is just an unknown path.\n const fields = new Map<string, ReviewTargetEditorField>();\n for (const field of toEditorFields(target.model, target.entry.values)) {\n fields.set(field.path, field);\n }\n const problems: string[] = [];\n for (const path of paths) {\n const field = fields.get(path);\n if (!field) {\n problems.push(`Unknown field \"${path}\". Use the paths returned by readTarget.`);\n } else if (!field.writable) {\n problems.push(`The field \"${path}\" is read-only.`);\n } else if (!isEditorFieldValue(field.type, params.values[path])) {\n problems.push(\n `The field \"${path}\" expects ${describeEditorFieldValue(field.type)}.`\n );\n }\n }\n if (problems.length > 0) {\n return Result.fail(new ReviewTargetEditorError(problems.join(\" \")));\n }\n\n patch = toEntryValuesPatch(target.entry.values, params.values);\n } catch (error) {\n this.logger.error(\n { err: error, model: params.model, targetId: params.targetId },\n \"Could not read the target for the AI editor.\"\n );\n return Result.fail(new ReviewTargetEditorError(\"The target could not be read.\"));\n }\n\n try {\n const result = await this.updateEntry.execute(target.model, params.targetRevisionId, {\n values: patch\n });\n if (result.isFail()) {\n if (result.error.code === \"Cms/Entry/ValidationError\") {\n const invalid: string[] = [];\n for (const item of result.error.data ?? []) {\n const itemPath: string[] = [...item.parents, item.fieldId];\n const safe = getModelSafeValidationMessage(\n target.model,\n itemPath,\n item.error\n );\n if (safe === null) {\n // A validator that threw, or one nobody registered: raw text, never\n // shown to the model.\n this.logger.error(\n {\n err: hasErrorSource(item.error)\n ? item.error.source\n : item.error,\n model: params.model,\n targetId: params.targetId,\n path: itemPath.join(\".\")\n },\n \"A field validator failed while the AI editor updated the target.\"\n );\n }\n invalid.push(\n `${itemPath.join(\".\")}: ${safe ?? GENERIC_VALIDATION_MESSAGE}`\n );\n }\n return Result.fail(\n new ReviewTargetEditorError(\n invalid.length > 0\n ? `Validation failed: ${invalid.join(\" \")}`\n : \"Validation failed.\"\n )\n );\n }\n this.logger.error(\n {\n err: hasErrorSource(result.error) ? result.error.source : result.error,\n model: params.model,\n targetId: params.targetId\n },\n \"Could not update the target from the AI editor.\"\n );\n return Result.fail(new ReviewTargetEditorError(\"The target could not be updated.\"));\n }\n } catch (error) {\n this.logger.error(\n { err: error, model: params.model, targetId: params.targetId },\n \"Could not update the target from the AI editor.\"\n );\n return Result.fail(new ReviewTargetEditorError(\"The target could not be updated.\"));\n }\n\n return Result.ok({ applied: paths });\n }\n}\n\nexport const CmsEntryReviewTargetEditor = ReviewTargetEditor.createImplementation({\n implementation: CmsEntryReviewTargetEditorImpl,\n dependencies: [CmsEntryTargetReader, UpdateEntryUseCase, Logger]\n});\n"],"names":["CmsEntryReviewTargetEditorImpl","targets","updateEntry","logger","model","isCmsNamespace","params","target","Result","ReviewTargetEditorError","getEntryTitle","toEditorFields","error","paths","Object","patch","read","fields","Map","field","problems","path","isEditorFieldValue","describeEditorFieldValue","toEntryValuesPatch","result","invalid","item","itemPath","safe","getModelSafeValidationMessage","hasErrorSource","GENERIC_VALIDATION_MESSAGE","CmsEntryReviewTargetEditor","ReviewTargetEditor","CmsEntryTargetReader","UpdateEntryUseCase","Logger"],"mappings":";;;;;;;;;;;;;AAgCA,MAAMA;IACF,YACYC,OAAuC,EACvCC,WAAyC,EACzCC,MAAwB,CAClC;aAHUF,OAAO,GAAPA;aACAC,WAAW,GAAXA;aACAC,MAAM,GAANA;IACT;IAEI,QAAQC,KAAa,EAAW;QACnC,OAAOC,eAAeD;IAC1B;IAEA,MAAa,KACTE,MAAoC,EACyB;QAC7D,IAAI;YACA,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBACnC,OAAOD,OAAO,KAAK;gBACnB,kBAAkBA,OAAO,gBAAgB;YAC7C;YACA,IAAI,CAACC,UAAUA,OAAO,KAAK,CAAC,OAAO,KAAKD,OAAO,QAAQ,EACnD,OAAOE,OAAO,IAAI,CAAC,IAAIC,wBAAwB;YAKnD,OAAOD,OAAO,EAAE,CAAC;gBACb,OAAOE,cAAcH,OAAO,KAAK,EAAEA,OAAO,KAAK;gBAC/C,QAAQI,eAAeJ,OAAO,KAAK,EAAEA,OAAO,KAAK,CAAC,MAAM;YAC5D;QACJ,EAAE,OAAOK,OAAO;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBAAE,KAAKA;gBAAO,OAAON,OAAO,KAAK;gBAAE,UAAUA,OAAO,QAAQ;YAAC,GAC7D;YAEJ,OAAOE,OAAO,IAAI,CAAC,IAAIC,wBAAwB;QACnD;IACJ;IAEA,MAAa,OACTH,MAAsC,EACkC;QACxE,MAAMO,QAAQC,OAAO,IAAI,CAACR,OAAO,MAAM;QACvC,IAAIO,AAAiB,MAAjBA,MAAM,MAAM,EACZ,OAAOL,OAAO,IAAI,CAAC,IAAIC,wBAAwB;QAGnD,IAAIF;QACJ,IAAIQ;QACJ,IAAI;YACA,MAAMC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjC,OAAOV,OAAO,KAAK;gBACnB,kBAAkBA,OAAO,gBAAgB;YAC7C;YACA,IAAI,CAACU,QAAQA,KAAK,KAAK,CAAC,OAAO,KAAKV,OAAO,QAAQ,EAC/C,OAAOE,OAAO,IAAI,CAAC,IAAIC,wBAAwB;YAEnDF,SAASS;YAGT,MAAMC,SAAS,IAAIC;YACnB,KAAK,MAAMC,SAASR,eAAeJ,OAAO,KAAK,EAAEA,OAAO,KAAK,CAAC,MAAM,EAChEU,OAAO,GAAG,CAACE,MAAM,IAAI,EAAEA;YAE3B,MAAMC,WAAqB,EAAE;YAC7B,KAAK,MAAMC,QAAQR,MAAO;gBACtB,MAAMM,QAAQF,OAAO,GAAG,CAACI;gBACzB,IAAKF,OAEE,IAAKA,MAAM,QAAQ,EAEnB;oBAAA,IAAI,CAACG,mBAAmBH,MAAM,IAAI,EAAEb,OAAO,MAAM,CAACe,KAAK,GAC1DD,SAAS,IAAI,CACT,CAAC,WAAW,EAAEC,KAAK,UAAU,EAAEE,yBAAyBJ,MAAM,IAAI,EAAE,CAAC,CAAC;gBAE9E,OALIC,SAAS,IAAI,CAAC,CAAC,WAAW,EAAEC,KAAK,eAAe,CAAC;qBAFjDD,SAAS,IAAI,CAAC,CAAC,eAAe,EAAEC,KAAK,wCAAwC,CAAC;YAQtF;YACA,IAAID,SAAS,MAAM,GAAG,GAClB,OAAOZ,OAAO,IAAI,CAAC,IAAIC,wBAAwBW,SAAS,IAAI,CAAC;YAGjEL,QAAQS,mBAAmBjB,OAAO,KAAK,CAAC,MAAM,EAAED,OAAO,MAAM;QACjE,EAAE,OAAOM,OAAO;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBAAE,KAAKA;gBAAO,OAAON,OAAO,KAAK;gBAAE,UAAUA,OAAO,QAAQ;YAAC,GAC7D;YAEJ,OAAOE,OAAO,IAAI,CAAC,IAAIC,wBAAwB;QACnD;QAEA,IAAI;YACA,MAAMgB,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAClB,OAAO,KAAK,EAAED,OAAO,gBAAgB,EAAE;gBACjF,QAAQS;YACZ;YACA,IAAIU,OAAO,MAAM,IAAI;gBACjB,IAAIA,AAAsB,gCAAtBA,OAAO,KAAK,CAAC,IAAI,EAAkC;oBACnD,MAAMC,UAAoB,EAAE;oBAC5B,KAAK,MAAMC,QAAQF,OAAO,KAAK,CAAC,IAAI,IAAI,EAAE,CAAE;wBACxC,MAAMG,WAAqB;+BAAID,KAAK,OAAO;4BAAEA,KAAK,OAAO;yBAAC;wBAC1D,MAAME,OAAOC,8BACTvB,OAAO,KAAK,EACZqB,UACAD,KAAK,KAAK;wBAEd,IAAIE,AAAS,SAATA,MAGA,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;4BACI,KAAKE,eAAeJ,KAAK,KAAK,IACxBA,KAAK,KAAK,CAAC,MAAM,GACjBA,KAAK,KAAK;4BAChB,OAAOrB,OAAO,KAAK;4BACnB,UAAUA,OAAO,QAAQ;4BACzB,MAAMsB,SAAS,IAAI,CAAC;wBACxB,GACA;wBAGRF,QAAQ,IAAI,CACR,GAAGE,SAAS,IAAI,CAAC,KAAK,EAAE,EAAEC,QAAQG,4BAA4B;oBAEtE;oBACA,OAAOxB,OAAO,IAAI,CACd,IAAIC,wBACAiB,QAAQ,MAAM,GAAG,IACX,CAAC,mBAAmB,EAAEA,QAAQ,IAAI,CAAC,MAAM,GACzC;gBAGlB;gBACA,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;oBACI,KAAKK,eAAeN,OAAO,KAAK,IAAIA,OAAO,KAAK,CAAC,MAAM,GAAGA,OAAO,KAAK;oBACtE,OAAOnB,OAAO,KAAK;oBACnB,UAAUA,OAAO,QAAQ;gBAC7B,GACA;gBAEJ,OAAOE,OAAO,IAAI,CAAC,IAAIC,wBAAwB;YACnD;QACJ,EAAE,OAAOG,OAAO;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBAAE,KAAKA;gBAAO,OAAON,OAAO,KAAK;gBAAE,UAAUA,OAAO,QAAQ;YAAC,GAC7D;YAEJ,OAAOE,OAAO,IAAI,CAAC,IAAIC,wBAAwB;QACnD;QAEA,OAAOD,OAAO,EAAE,CAAC;YAAE,SAASK;QAAM;IACtC;AACJ;AAEO,MAAMoB,6BAA6BC,mBAAmB,oBAAoB,CAAC;IAC9E,gBAAgBlC;IAChB,cAAc;QAACmC;QAAsBC;QAAoBC;KAAO;AACpE"}
@@ -0,0 +1,22 @@
1
+ import { ReviewTargetFolderChain } from "@webiny/api-workflows/features/review/ReviewTargetFolderChain/index.js";
2
+ import { GetFolderRepository } from "@webiny/api-aco/features/folder/GetFolder/abstractions.js";
3
+ import { GetAncestorsUseCase } from "@webiny/api-aco/features/folder/GetAncestors/index.js";
4
+ /**
5
+ * The folder of a `cms.<modelId>` target and its ancestors, nearest first, for the routing rules'
6
+ * folder condition (spec 6, R113, R114). Read through ACO's repository, which applies no
7
+ * folder-level permissions (the folder model is private with `authorization: false`): routing
8
+ * matches the folder tree, not what the requester may see. Read at step reach, so a moved parent
9
+ * counts. A missing folder, a folder of another type and a failed read throw; the engine falls
10
+ * through to the pool (R116).
11
+ */
12
+ declare class CmsEntryReviewTargetFolderChainImpl implements ReviewTargetFolderChain.Interface {
13
+ private getFolder;
14
+ private getAncestors;
15
+ constructor(getFolder: GetFolderRepository.Interface, getAncestors: GetAncestorsUseCase.Interface);
16
+ canHandle(model: string): boolean;
17
+ listFolderChainIds(params: ReviewTargetFolderChain.Params): Promise<string[]>;
18
+ }
19
+ export declare const CmsEntryReviewTargetFolderChain: typeof CmsEntryReviewTargetFolderChainImpl & {
20
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-workflows/features/review/ReviewTargetFolderChain/abstractions").IReviewTargetFolderChain>;
21
+ };
22
+ export {};
@@ -0,0 +1,37 @@
1
+ import { ReviewTargetFolderChain } from "@webiny/api-workflows/features/review/ReviewTargetFolderChain/index.js";
2
+ import { GetFolderRepository } from "@webiny/api-aco/features/folder/GetFolder/abstractions.js";
3
+ import { GetAncestorsUseCase } from "@webiny/api-aco/features/folder/GetAncestors/index.js";
4
+ import { getModelIdFromAppName, isCmsNamespace } from "../../utils/appName.js";
5
+ import { toCmsFolderType } from "../../utils/folderType.js";
6
+ class CmsEntryReviewTargetFolderChainImpl {
7
+ constructor(getFolder, getAncestors){
8
+ this.getFolder = getFolder;
9
+ this.getAncestors = getAncestors;
10
+ }
11
+ canHandle(model) {
12
+ return isCmsNamespace(model);
13
+ }
14
+ async listFolderChainIds(params) {
15
+ const modelId = getModelIdFromAppName(params.model);
16
+ if (!modelId) throw new Error(`"${params.model}" is not a CMS namespace.`);
17
+ if (!params.folderId || params.folderId.includes("#")) throw new Error(`"${params.folderId}" is not a valid folder id.`);
18
+ const folder = await this.getFolder.execute(params.folderId);
19
+ if (folder.isFail()) throw folder.error;
20
+ if (folder.value.type !== toCmsFolderType(modelId)) throw new Error(`Folder "${params.folderId}" is not a folder of "${params.model}".`);
21
+ const ancestors = await this.getAncestors.execute({
22
+ folder: folder.value
23
+ });
24
+ if (ancestors.isFail()) throw ancestors.error;
25
+ return ancestors.value.map((item)=>item.id);
26
+ }
27
+ }
28
+ const CmsEntryReviewTargetFolderChain = ReviewTargetFolderChain.createImplementation({
29
+ implementation: CmsEntryReviewTargetFolderChainImpl,
30
+ dependencies: [
31
+ GetFolderRepository,
32
+ GetAncestorsUseCase
33
+ ]
34
+ });
35
+ export { CmsEntryReviewTargetFolderChain };
36
+
37
+ //# sourceMappingURL=CmsEntryReviewTargetFolderChain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/target/CmsEntryReviewTargetFolderChain.js","sources":["../../../src/features/target/CmsEntryReviewTargetFolderChain.ts"],"sourcesContent":["import { ReviewTargetFolderChain } from \"@webiny/api-workflows/features/review/ReviewTargetFolderChain/index.js\";\nimport { GetFolderRepository } from \"@webiny/api-aco/features/folder/GetFolder/abstractions.js\";\nimport { GetAncestorsUseCase } from \"@webiny/api-aco/features/folder/GetAncestors/index.js\";\nimport { getModelIdFromAppName, isCmsNamespace } from \"~/utils/appName.js\";\nimport { toCmsFolderType } from \"~/utils/folderType.js\";\n\n/**\n * The folder of a `cms.<modelId>` target and its ancestors, nearest first, for the routing rules'\n * folder condition (spec 6, R113, R114). Read through ACO's repository, which applies no\n * folder-level permissions (the folder model is private with `authorization: false`): routing\n * matches the folder tree, not what the requester may see. Read at step reach, so a moved parent\n * counts. A missing folder, a folder of another type and a failed read throw; the engine falls\n * through to the pool (R116).\n */\nclass CmsEntryReviewTargetFolderChainImpl implements ReviewTargetFolderChain.Interface {\n public constructor(\n private getFolder: GetFolderRepository.Interface,\n private getAncestors: GetAncestorsUseCase.Interface\n ) {}\n\n public canHandle(model: string): boolean {\n return isCmsNamespace(model);\n }\n\n public async listFolderChainIds(params: ReviewTargetFolderChain.Params): Promise<string[]> {\n const modelId = getModelIdFromAppName(params.model);\n if (!modelId) {\n throw new Error(`\"${params.model}\" is not a CMS namespace.`);\n }\n\n if (!params.folderId || params.folderId.includes(\"#\")) {\n throw new Error(`\"${params.folderId}\" is not a valid folder id.`);\n }\n\n const folder = await this.getFolder.execute(params.folderId);\n if (folder.isFail()) {\n throw folder.error;\n }\n if (folder.value.type !== toCmsFolderType(modelId)) {\n throw new Error(`Folder \"${params.folderId}\" is not a folder of \"${params.model}\".`);\n }\n\n const ancestors = await this.getAncestors.execute({ folder: folder.value });\n if (ancestors.isFail()) {\n throw ancestors.error;\n }\n return ancestors.value.map(item => item.id);\n }\n}\n\nexport const CmsEntryReviewTargetFolderChain = ReviewTargetFolderChain.createImplementation({\n implementation: CmsEntryReviewTargetFolderChainImpl,\n dependencies: [GetFolderRepository, GetAncestorsUseCase]\n});\n"],"names":["CmsEntryReviewTargetFolderChainImpl","getFolder","getAncestors","model","isCmsNamespace","params","modelId","getModelIdFromAppName","Error","folder","toCmsFolderType","ancestors","item","CmsEntryReviewTargetFolderChain","ReviewTargetFolderChain","GetFolderRepository","GetAncestorsUseCase"],"mappings":";;;;;AAcA,MAAMA;IACF,YACYC,SAAwC,EACxCC,YAA2C,CACrD;aAFUD,SAAS,GAATA;aACAC,YAAY,GAAZA;IACT;IAEI,UAAUC,KAAa,EAAW;QACrC,OAAOC,eAAeD;IAC1B;IAEA,MAAa,mBAAmBE,MAAsC,EAAqB;QACvF,MAAMC,UAAUC,sBAAsBF,OAAO,KAAK;QAClD,IAAI,CAACC,SACD,MAAM,IAAIE,MAAM,CAAC,CAAC,EAAEH,OAAO,KAAK,CAAC,yBAAyB,CAAC;QAG/D,IAAI,CAACA,OAAO,QAAQ,IAAIA,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAC7C,MAAM,IAAIG,MAAM,CAAC,CAAC,EAAEH,OAAO,QAAQ,CAAC,2BAA2B,CAAC;QAGpE,MAAMI,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACJ,OAAO,QAAQ;QAC3D,IAAII,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAEtB,IAAIA,OAAO,KAAK,CAAC,IAAI,KAAKC,gBAAgBJ,UACtC,MAAM,IAAIE,MAAM,CAAC,QAAQ,EAAEH,OAAO,QAAQ,CAAC,sBAAsB,EAAEA,OAAO,KAAK,CAAC,EAAE,CAAC;QAGvF,MAAMM,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YAAE,QAAQF,OAAO,KAAK;QAAC;QACzE,IAAIE,UAAU,MAAM,IAChB,MAAMA,UAAU,KAAK;QAEzB,OAAOA,UAAU,KAAK,CAAC,GAAG,CAACC,CAAAA,OAAQA,KAAK,EAAE;IAC9C;AACJ;AAEO,MAAMC,kCAAkCC,wBAAwB,oBAAoB,CAAC;IACxF,gBAAgBd;IAChB,cAAc;QAACe;QAAqBC;KAAoB;AAC5D"}
@@ -0,0 +1,17 @@
1
+ import { ReviewTargetLink } from "@webiny/api-workflows/features/notifications/ReviewTargetLink/index.js";
2
+ /**
3
+ * The `cms.<modelId>` admin link of a review's content (R195, D133). It mirrors the admin route
4
+ * `Cms/ContentEntries/List` in `packages/app-headless-cms/src/routes.ts`
5
+ * (`/cms/content-entries/:modelId`); the open entry is its `id` query parameter. That file lives
6
+ * in a client package the API cannot import, so a route change there must be mirrored here. The
7
+ * revision id carries a `#`, which `encodeURIComponent` turns into `%23` so the browser does not
8
+ * read it as a fragment. The path has no host and no tenant: `ReviewTargetLinkService` adds both.
9
+ */
10
+ declare class CmsEntryReviewTargetLinkImpl implements ReviewTargetLink.Interface {
11
+ canLink(model: string): boolean;
12
+ getPath(params: ReviewTargetLink.Params): string;
13
+ }
14
+ export declare const CmsEntryReviewTargetLink: typeof CmsEntryReviewTargetLinkImpl & {
15
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-workflows/features/notifications/ReviewTargetLink/abstractions").IReviewTargetLink>;
16
+ };
17
+ export {};
@@ -0,0 +1,18 @@
1
+ import { ReviewTargetLink } from "@webiny/api-workflows/features/notifications/ReviewTargetLink/index.js";
2
+ import { getModelIdFromAppName, isCmsNamespace } from "../../utils/appName.js";
3
+ class CmsEntryReviewTargetLinkImpl {
4
+ canLink(model) {
5
+ return isCmsNamespace(model);
6
+ }
7
+ getPath(params) {
8
+ const modelId = getModelIdFromAppName(params.model) ?? params.model;
9
+ return `/cms/content-entries/${encodeURIComponent(modelId)}?id=${encodeURIComponent(params.targetRevisionId)}`;
10
+ }
11
+ }
12
+ const CmsEntryReviewTargetLink = ReviewTargetLink.createImplementation({
13
+ implementation: CmsEntryReviewTargetLinkImpl,
14
+ dependencies: []
15
+ });
16
+ export { CmsEntryReviewTargetLink };
17
+
18
+ //# sourceMappingURL=CmsEntryReviewTargetLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/target/CmsEntryReviewTargetLink.js","sources":["../../../src/features/target/CmsEntryReviewTargetLink.ts"],"sourcesContent":["import { ReviewTargetLink } from \"@webiny/api-workflows/features/notifications/ReviewTargetLink/index.js\";\nimport { getModelIdFromAppName, isCmsNamespace } from \"~/utils/appName.js\";\n\n/**\n * The `cms.<modelId>` admin link of a review's content (R195, D133). It mirrors the admin route\n * `Cms/ContentEntries/List` in `packages/app-headless-cms/src/routes.ts`\n * (`/cms/content-entries/:modelId`); the open entry is its `id` query parameter. That file lives\n * in a client package the API cannot import, so a route change there must be mirrored here. The\n * revision id carries a `#`, which `encodeURIComponent` turns into `%23` so the browser does not\n * read it as a fragment. The path has no host and no tenant: `ReviewTargetLinkService` adds both.\n */\nclass CmsEntryReviewTargetLinkImpl implements ReviewTargetLink.Interface {\n public canLink(model: string): boolean {\n return isCmsNamespace(model);\n }\n\n public getPath(params: ReviewTargetLink.Params): string {\n // `canLink` guarantees a `cms.<modelId>` namespace; the fallback only keeps this a string.\n const modelId = getModelIdFromAppName(params.model) ?? params.model;\n return `/cms/content-entries/${encodeURIComponent(modelId)}?id=${encodeURIComponent(params.targetRevisionId)}`;\n }\n}\n\nexport const CmsEntryReviewTargetLink = ReviewTargetLink.createImplementation({\n implementation: CmsEntryReviewTargetLinkImpl,\n dependencies: []\n});\n"],"names":["CmsEntryReviewTargetLinkImpl","model","isCmsNamespace","params","modelId","getModelIdFromAppName","encodeURIComponent","CmsEntryReviewTargetLink","ReviewTargetLink"],"mappings":";;AAWA,MAAMA;IACK,QAAQC,KAAa,EAAW;QACnC,OAAOC,eAAeD;IAC1B;IAEO,QAAQE,MAA+B,EAAU;QAEpD,MAAMC,UAAUC,sBAAsBF,OAAO,KAAK,KAAKA,OAAO,KAAK;QACnE,OAAO,CAAC,qBAAqB,EAAEG,mBAAmBF,SAAS,IAAI,EAAEE,mBAAmBH,OAAO,gBAAgB,GAAG;IAClH;AACJ;AAEO,MAAMI,2BAA2BC,iBAAiB,oBAAoB,CAAC;IAC1E,gBAAgBR;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,16 @@
1
+ import { ReviewTargetLoader } from "@webiny/api-workflows/features/review/ReviewTargetLoader/index.js";
2
+ import { CmsEntryTargetReader } from "./CmsEntryTargetReader/index.js";
3
+ /**
4
+ * Loads `cms.<modelId>` targets for `RequestReviewUseCase` (spec 9.3). Runs as the requester,
5
+ * whose write access the request wrapper has checked (D77).
6
+ */
7
+ declare class CmsEntryReviewTargetLoaderImpl implements ReviewTargetLoader.Interface {
8
+ private targets;
9
+ constructor(targets: CmsEntryTargetReader.Interface);
10
+ canLoad(model: string): boolean;
11
+ load(params: ReviewTargetLoader.LoadParams): Promise<ReviewTargetLoader.Target | null>;
12
+ }
13
+ export declare const CmsEntryReviewTargetLoader: typeof CmsEntryReviewTargetLoaderImpl & {
14
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-workflows/features/review/ReviewTargetLoader/abstractions.js").IReviewTargetLoader>;
15
+ };
16
+ export {};
@@ -0,0 +1,29 @@
1
+ import { ReviewTargetLoader } from "@webiny/api-workflows/features/review/ReviewTargetLoader/index.js";
2
+ import { isCmsNamespace } from "../../utils/appName.js";
3
+ import { CmsEntryTargetReader } from "./CmsEntryTargetReader/index.js";
4
+ import { toCmsReviewTarget } from "./toCmsReviewTarget.js";
5
+ class CmsEntryReviewTargetLoaderImpl {
6
+ constructor(targets){
7
+ this.targets = targets;
8
+ }
9
+ canLoad(model) {
10
+ return isCmsNamespace(model);
11
+ }
12
+ async load(params) {
13
+ const target = await this.targets.read({
14
+ model: params.model,
15
+ targetRevisionId: params.targetRevisionId
16
+ });
17
+ if (!target || target.entry.entryId !== params.targetId) return null;
18
+ return toCmsReviewTarget(target);
19
+ }
20
+ }
21
+ const CmsEntryReviewTargetLoader = ReviewTargetLoader.createImplementation({
22
+ implementation: CmsEntryReviewTargetLoaderImpl,
23
+ dependencies: [
24
+ CmsEntryTargetReader
25
+ ]
26
+ });
27
+ export { CmsEntryReviewTargetLoader };
28
+
29
+ //# sourceMappingURL=CmsEntryReviewTargetLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/target/CmsEntryReviewTargetLoader.js","sources":["../../../src/features/target/CmsEntryReviewTargetLoader.ts"],"sourcesContent":["import { ReviewTargetLoader } from \"@webiny/api-workflows/features/review/ReviewTargetLoader/index.js\";\nimport { isCmsNamespace } from \"~/utils/appName.js\";\nimport { CmsEntryTargetReader } from \"./CmsEntryTargetReader/index.js\";\nimport { toCmsReviewTarget } from \"./toCmsReviewTarget.js\";\n\n/**\n * Loads `cms.<modelId>` targets for `RequestReviewUseCase` (spec 9.3). Runs as the requester,\n * whose write access the request wrapper has checked (D77).\n */\nclass CmsEntryReviewTargetLoaderImpl implements ReviewTargetLoader.Interface {\n public constructor(private targets: CmsEntryTargetReader.Interface) {}\n\n public canLoad(model: string): boolean {\n return isCmsNamespace(model);\n }\n\n public async load(\n params: ReviewTargetLoader.LoadParams\n ): Promise<ReviewTargetLoader.Target | null> {\n const target = await this.targets.read({\n model: params.model,\n targetRevisionId: params.targetRevisionId\n });\n if (!target || target.entry.entryId !== params.targetId) {\n return null;\n }\n return toCmsReviewTarget(target);\n }\n}\n\nexport const CmsEntryReviewTargetLoader = ReviewTargetLoader.createImplementation({\n implementation: CmsEntryReviewTargetLoaderImpl,\n dependencies: [CmsEntryTargetReader]\n});\n"],"names":["CmsEntryReviewTargetLoaderImpl","targets","model","isCmsNamespace","params","target","toCmsReviewTarget","CmsEntryReviewTargetLoader","ReviewTargetLoader","CmsEntryTargetReader"],"mappings":";;;;AASA,MAAMA;IACF,YAA2BC,OAAuC,CAAE;aAAzCA,OAAO,GAAPA;IAA0C;IAE9D,QAAQC,KAAa,EAAW;QACnC,OAAOC,eAAeD;IAC1B;IAEA,MAAa,KACTE,MAAqC,EACI;QACzC,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,OAAOD,OAAO,KAAK;YACnB,kBAAkBA,OAAO,gBAAgB;QAC7C;QACA,IAAI,CAACC,UAAUA,OAAO,KAAK,CAAC,OAAO,KAAKD,OAAO,QAAQ,EACnD,OAAO;QAEX,OAAOE,kBAAkBD;IAC7B;AACJ;AAEO,MAAME,6BAA6BC,mBAAmB,oBAAoB,CAAC;IAC9E,gBAAgBR;IAChB,cAAc;QAACS;KAAqB;AACxC"}
@@ -0,0 +1,41 @@
1
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
2
+ import { ReviewTargetReadAccess } from "@webiny/api-workflows/features/review/ReviewTargetReadAccess/index.js";
3
+ import { CandidateReadAccess } from "@webiny/api-workflows/features/identity/CandidateReadAccess/index.js";
4
+ import { CmsEntryTargetReader } from "./CmsEntryTargetReader/index.js";
5
+ import { CmsEntryAccess } from "./CmsEntryAccess/index.js";
6
+ import { CmsModelGroupService } from "./CmsModelGroupService/index.js";
7
+ import { CandidateFolderReadRules } from "./CandidateFolderReadRules/index.js";
8
+ /**
9
+ * `filterReadableUsers` for `cms.*` targets (D61, D133, R48, R121). The model, group, revision and
10
+ * the folder's permission record are read once per call, as the current identity, so nothing is
11
+ * read as the other users (A19) and nothing is read per user (Q79); only the CMS access check
12
+ * (group read, model read, entry and folder access, R72) runs as each user, through
13
+ * `CandidateReadAccess` (R67), which wraps it in `withIdentity` and `withAuthorization`.
14
+ *
15
+ * Contract: this class does not widen access itself, and the CMS model cache is filled
16
+ * per tenant after access filtering. A whole AI step run executes inside `withoutAuthorization`
17
+ * (R161), so the model and group reads of the AI editor happen there; the access checks here
18
+ * apply after the cache and run as the candidate user through `CandidateReadAccess`, the only
19
+ * place that changes identity for the check. Any failure, including a throwing target or model
20
+ * read, leaves the users out (fail closed, R50).
21
+ */
22
+ declare class CmsEntryReviewTargetReadAccessImpl implements ReviewTargetReadAccess.Interface {
23
+ private targets;
24
+ private access;
25
+ private candidates;
26
+ private getModel;
27
+ private modelGroups;
28
+ private folderRules;
29
+ constructor(targets: CmsEntryTargetReader.Interface, access: CmsEntryAccess.Interface, candidates: CandidateReadAccess.Interface, getModel: GetModelUseCase.Interface, modelGroups: CmsModelGroupService.Interface, folderRules: CandidateFolderReadRules.Interface);
30
+ canHandle(model: string): boolean;
31
+ filterReadableUsers(params: ReviewTargetReadAccess.UsersParams): Promise<string[]>;
32
+ /**
33
+ * The target revision (or, for a folder without a revision, the model and group, R121) as the
34
+ * current identity; `null` when there is nothing anyone can read.
35
+ */
36
+ private readSubject;
37
+ }
38
+ export declare const CmsEntryReviewTargetReadAccess: typeof CmsEntryReviewTargetReadAccessImpl & {
39
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-workflows/features/review/ReviewTargetReadAccess/abstractions.js").IReviewTargetReadAccess>;
40
+ };
41
+ export {};