@strapi/review-workflows 5.12.0 → 5.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/{chunks/index-DcEF47R4.mjs → assets/balloon.png.js} +3 -1078
- package/dist/admin/assets/balloon.png.js.map +1 -0
- package/dist/admin/{chunks/index-CzdEqFOm.js → assets/balloon.png.mjs} +2 -1113
- package/dist/admin/assets/balloon.png.mjs.map +1 -0
- package/dist/admin/assets/purchase-page-illustration-dark.svg.js +6 -0
- package/dist/admin/assets/purchase-page-illustration-dark.svg.js.map +1 -0
- package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs +4 -0
- package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs.map +1 -0
- package/dist/admin/{chunks/purchase-review-workflows-4n0KXAeo.mjs → assets/purchase-page-illustration-light.svg.js} +3 -197
- package/dist/admin/assets/purchase-page-illustration-light.svg.js.map +1 -0
- package/dist/admin/{chunks/purchase-review-workflows-BDLncDcz.js → assets/purchase-page-illustration-light.svg.mjs} +2 -200
- package/dist/admin/assets/purchase-page-illustration-light.svg.mjs.map +1 -0
- package/dist/admin/components/LimitsModal.js +122 -0
- package/dist/admin/components/LimitsModal.js.map +1 -0
- package/dist/admin/components/LimitsModal.mjs +120 -0
- package/dist/admin/components/LimitsModal.mjs.map +1 -0
- package/dist/admin/constants.js +18 -0
- package/dist/admin/constants.js.map +1 -0
- package/dist/admin/constants.mjs +12 -0
- package/dist/admin/constants.mjs.map +1 -0
- package/dist/admin/index.js +87 -13
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +88 -12
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/modules/hooks.js +8 -0
- package/dist/admin/modules/hooks.js.map +1 -0
- package/dist/admin/modules/hooks.mjs +6 -0
- package/dist/admin/modules/hooks.mjs.map +1 -0
- package/dist/admin/{chunks/router-ChVwf8TN.js → router.js} +3 -3
- package/dist/admin/router.js.map +1 -0
- package/dist/admin/{chunks/router-D-YCUzYy.mjs → router.mjs} +3 -3
- package/dist/admin/router.mjs.map +1 -0
- package/dist/admin/routes/content-manager/model/components/TableColumns.js +44 -0
- package/dist/admin/routes/content-manager/model/components/TableColumns.js.map +1 -0
- package/dist/admin/routes/content-manager/model/components/TableColumns.mjs +41 -0
- package/dist/admin/routes/content-manager/model/components/TableColumns.mjs.map +1 -0
- package/dist/admin/routes/content-manager/model/constants.js +60 -0
- package/dist/admin/routes/content-manager/model/constants.js.map +1 -0
- package/dist/admin/routes/content-manager/model/constants.mjs +58 -0
- package/dist/admin/routes/content-manager/model/constants.mjs.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.js +169 -0
- package/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.js.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.mjs +148 -0
- package/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.mjs.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/Header.js +31 -0
- package/dist/admin/routes/content-manager/model/id/components/Header.js.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/Header.mjs +29 -0
- package/dist/admin/routes/content-manager/model/id/components/Header.mjs.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/Panel.js +39 -0
- package/dist/admin/routes/content-manager/model/id/components/Panel.js.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/Panel.mjs +37 -0
- package/dist/admin/routes/content-manager/model/id/components/Panel.mjs.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/StageSelect.js +329 -0
- package/dist/admin/routes/content-manager/model/id/components/StageSelect.js.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/StageSelect.mjs +308 -0
- package/dist/admin/routes/content-manager/model/id/components/StageSelect.mjs.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/constants.js +8 -0
- package/dist/admin/routes/content-manager/model/id/components/constants.js.map +1 -0
- package/dist/admin/routes/content-manager/model/id/components/constants.mjs +5 -0
- package/dist/admin/routes/content-manager/model/id/components/constants.mjs.map +1 -0
- package/dist/admin/routes/purchase-review-workflows.js +194 -0
- package/dist/admin/routes/purchase-review-workflows.js.map +1 -0
- package/dist/admin/routes/purchase-review-workflows.mjs +192 -0
- package/dist/admin/routes/purchase-review-workflows.mjs.map +1 -0
- package/dist/admin/routes/settings/components/AddStage.js +51 -0
- package/dist/admin/routes/settings/components/AddStage.js.map +1 -0
- package/dist/admin/routes/settings/components/AddStage.mjs +49 -0
- package/dist/admin/routes/settings/components/AddStage.mjs.map +1 -0
- package/dist/admin/routes/settings/components/Layout.js +86 -0
- package/dist/admin/routes/settings/components/Layout.js.map +1 -0
- package/dist/admin/routes/settings/components/Layout.mjs +82 -0
- package/dist/admin/routes/settings/components/Layout.mjs.map +1 -0
- package/dist/admin/routes/settings/components/StageDragPreview.js +40 -0
- package/dist/admin/routes/settings/components/StageDragPreview.js.map +1 -0
- package/dist/admin/routes/settings/components/StageDragPreview.mjs +38 -0
- package/dist/admin/routes/settings/components/StageDragPreview.mjs.map +1 -0
- package/dist/admin/routes/settings/components/Stages.js +593 -0
- package/dist/admin/routes/settings/components/Stages.js.map +1 -0
- package/dist/admin/routes/settings/components/Stages.mjs +572 -0
- package/dist/admin/routes/settings/components/Stages.mjs.map +1 -0
- package/dist/admin/routes/settings/components/WorkflowAttributes.js +203 -0
- package/dist/admin/routes/settings/components/WorkflowAttributes.js.map +1 -0
- package/dist/admin/routes/settings/components/WorkflowAttributes.mjs +201 -0
- package/dist/admin/routes/settings/components/WorkflowAttributes.mjs.map +1 -0
- package/dist/admin/routes/settings/constants.js +8 -0
- package/dist/admin/routes/settings/constants.js.map +1 -0
- package/dist/admin/routes/settings/constants.mjs +6 -0
- package/dist/admin/routes/settings/constants.mjs.map +1 -0
- package/dist/admin/routes/settings/hooks/useDragAndDrop.js +193 -0
- package/dist/admin/routes/settings/hooks/useDragAndDrop.js.map +1 -0
- package/dist/admin/routes/settings/hooks/useDragAndDrop.mjs +170 -0
- package/dist/admin/routes/settings/hooks/useDragAndDrop.mjs.map +1 -0
- package/dist/admin/routes/settings/hooks/useKeyboardDragAndDrop.js +94 -0
- package/dist/admin/routes/settings/hooks/useKeyboardDragAndDrop.js.map +1 -0
- package/dist/admin/routes/settings/hooks/useKeyboardDragAndDrop.mjs +73 -0
- package/dist/admin/routes/settings/hooks/useKeyboardDragAndDrop.mjs.map +1 -0
- package/dist/admin/{chunks/Layout-C4ri_ldC.js → routes/settings/hooks/useReviewWorkflows.js} +6 -121
- package/dist/admin/routes/settings/hooks/useReviewWorkflows.js.map +1 -0
- package/dist/admin/{chunks/Layout-CF497D6H.mjs → routes/settings/hooks/useReviewWorkflows.mjs} +4 -115
- package/dist/admin/routes/settings/hooks/useReviewWorkflows.mjs.map +1 -0
- package/dist/admin/routes/settings/id.js +404 -0
- package/dist/admin/routes/settings/id.js.map +1 -0
- package/dist/admin/routes/settings/id.mjs +382 -0
- package/dist/admin/routes/settings/id.mjs.map +1 -0
- package/dist/admin/{chunks/index-CCx4kT-t.js → routes/settings/index.js} +15 -15
- package/dist/admin/routes/settings/index.js.map +1 -0
- package/dist/admin/{chunks/index-iChY7MsG.mjs → routes/settings/index.mjs} +7 -7
- package/dist/admin/routes/settings/index.mjs.map +1 -0
- package/dist/admin/services/admin.js +23 -0
- package/dist/admin/services/admin.js.map +1 -0
- package/dist/admin/services/admin.mjs +21 -0
- package/dist/admin/services/admin.mjs.map +1 -0
- package/dist/admin/services/api.js +15 -0
- package/dist/admin/services/api.js.map +1 -0
- package/dist/admin/services/api.mjs +13 -0
- package/dist/admin/services/api.mjs.map +1 -0
- package/dist/admin/services/content-manager.js +101 -0
- package/dist/admin/services/content-manager.js.map +1 -0
- package/dist/admin/services/content-manager.mjs +96 -0
- package/dist/admin/services/content-manager.mjs.map +1 -0
- package/dist/admin/services/settings.js +123 -0
- package/dist/admin/services/settings.js.map +1 -0
- package/dist/admin/services/settings.mjs +118 -0
- package/dist/admin/services/settings.mjs.map +1 -0
- package/dist/admin/{chunks/en-BNGiWajd.js → translations/en.json.js} +2 -2
- package/dist/admin/translations/en.json.js.map +1 -0
- package/dist/admin/{chunks/en-BrZXFtVv.mjs → translations/en.json.mjs} +1 -1
- package/dist/admin/translations/en.json.mjs.map +1 -0
- package/dist/admin/{chunks/uk-CbRUr1I7.js → translations/uk.json.js} +2 -2
- package/dist/admin/translations/uk.json.js.map +1 -0
- package/dist/admin/{chunks/uk-DLlzEBUF.mjs → translations/uk.json.mjs} +1 -1
- package/dist/admin/translations/uk.json.mjs.map +1 -0
- package/dist/admin/utils/api.js +22 -0
- package/dist/admin/utils/api.js.map +1 -0
- package/dist/admin/utils/api.mjs +19 -0
- package/dist/admin/utils/api.mjs.map +1 -0
- package/dist/admin/utils/cm-hooks.js +23 -0
- package/dist/admin/utils/cm-hooks.js.map +1 -0
- package/dist/admin/utils/cm-hooks.mjs +21 -0
- package/dist/admin/utils/cm-hooks.mjs.map +1 -0
- package/dist/admin/utils/colors.js +50 -0
- package/dist/admin/utils/colors.js.map +1 -0
- package/dist/admin/utils/colors.mjs +47 -0
- package/dist/admin/utils/colors.mjs.map +1 -0
- package/dist/admin/utils/translations.js +11 -0
- package/dist/admin/utils/translations.js.map +1 -0
- package/dist/admin/utils/translations.mjs +9 -0
- package/dist/admin/utils/translations.mjs.map +1 -0
- package/dist/admin/utils/users.js +17 -0
- package/dist/admin/utils/users.js.map +1 -0
- package/dist/admin/utils/users.mjs +15 -0
- package/dist/admin/utils/users.mjs.map +1 -0
- package/dist/server/bootstrap.js +54 -0
- package/dist/server/bootstrap.js.map +1 -0
- package/dist/server/bootstrap.mjs +52 -0
- package/dist/server/bootstrap.mjs.map +1 -0
- package/dist/server/config/actions.js +47 -0
- package/dist/server/config/actions.js.map +1 -0
- package/dist/server/config/actions.mjs +45 -0
- package/dist/server/config/actions.mjs.map +1 -0
- package/dist/server/constants/default-stages.json.js +23 -0
- package/dist/server/constants/default-stages.json.js.map +1 -0
- package/dist/server/constants/default-stages.json.mjs +21 -0
- package/dist/server/constants/default-stages.json.mjs.map +1 -0
- package/dist/server/constants/default-workflow.json.js +12 -0
- package/dist/server/constants/default-workflow.json.js.map +1 -0
- package/dist/server/constants/default-workflow.json.mjs +7 -0
- package/dist/server/constants/default-workflow.json.mjs.map +1 -0
- package/dist/server/constants/webhook-events.js +12 -0
- package/dist/server/constants/webhook-events.js.map +1 -0
- package/dist/server/constants/webhook-events.mjs +7 -0
- package/dist/server/constants/webhook-events.mjs.map +1 -0
- package/dist/server/constants/workflows.js +53 -0
- package/dist/server/constants/workflows.js.map +1 -0
- package/dist/server/constants/workflows.mjs +42 -0
- package/dist/server/constants/workflows.mjs.map +1 -0
- package/dist/server/content-types/index.js +12 -0
- package/dist/server/content-types/index.js.map +1 -0
- package/dist/server/content-types/index.mjs +10 -0
- package/dist/server/content-types/index.mjs.map +1 -0
- package/dist/server/content-types/workflow/index.js +50 -0
- package/dist/server/content-types/workflow/index.js.map +1 -0
- package/dist/server/content-types/workflow/index.mjs +48 -0
- package/dist/server/content-types/workflow/index.mjs.map +1 -0
- package/dist/server/content-types/workflow-stage/index.js +54 -0
- package/dist/server/content-types/workflow-stage/index.js.map +1 -0
- package/dist/server/content-types/workflow-stage/index.mjs +52 -0
- package/dist/server/content-types/workflow-stage/index.mjs.map +1 -0
- package/dist/server/controllers/assignees.js +57 -0
- package/dist/server/controllers/assignees.js.map +1 -0
- package/dist/server/controllers/assignees.mjs +55 -0
- package/dist/server/controllers/assignees.mjs.map +1 -0
- package/dist/server/controllers/index.js +14 -0
- package/dist/server/controllers/index.js.map +1 -0
- package/dist/server/controllers/index.mjs +12 -0
- package/dist/server/controllers/index.mjs.map +1 -0
- package/dist/server/controllers/stages.js +167 -0
- package/dist/server/controllers/stages.js.map +1 -0
- package/dist/server/controllers/stages.mjs +165 -0
- package/dist/server/controllers/stages.mjs.map +1 -0
- package/dist/server/controllers/workflows.js +136 -0
- package/dist/server/controllers/workflows.js.map +1 -0
- package/dist/server/controllers/workflows.mjs +134 -0
- package/dist/server/controllers/workflows.mjs.map +1 -0
- package/dist/server/destroy.js +6 -0
- package/dist/server/destroy.js.map +1 -0
- package/dist/server/destroy.mjs +4 -0
- package/dist/server/destroy.mjs.map +1 -0
- package/dist/server/index.js +12 -2333
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +7 -2328
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/middlewares/review-workflows.js +42 -0
- package/dist/server/middlewares/review-workflows.js.map +1 -0
- package/dist/server/middlewares/review-workflows.mjs +37 -0
- package/dist/server/middlewares/review-workflows.mjs.map +1 -0
- package/dist/server/migrations/handle-deleted-ct-in-workflows.js +40 -0
- package/dist/server/migrations/handle-deleted-ct-in-workflows.js.map +1 -0
- package/dist/server/migrations/handle-deleted-ct-in-workflows.mjs +38 -0
- package/dist/server/migrations/handle-deleted-ct-in-workflows.mjs.map +1 -0
- package/dist/server/migrations/multiple-workflows.js +41 -0
- package/dist/server/migrations/multiple-workflows.js.map +1 -0
- package/dist/server/migrations/multiple-workflows.mjs +39 -0
- package/dist/server/migrations/multiple-workflows.mjs.map +1 -0
- package/dist/server/migrations/set-stages-default-color.js +22 -0
- package/dist/server/migrations/set-stages-default-color.js.map +1 -0
- package/dist/server/migrations/set-stages-default-color.mjs +20 -0
- package/dist/server/migrations/set-stages-default-color.mjs.map +1 -0
- package/dist/server/migrations/set-stages-roles.js +56 -0
- package/dist/server/migrations/set-stages-roles.js.map +1 -0
- package/dist/server/migrations/set-stages-roles.mjs +54 -0
- package/dist/server/migrations/set-stages-roles.mjs.map +1 -0
- package/dist/server/migrations/set-workflow-default-name.js +29 -0
- package/dist/server/migrations/set-workflow-default-name.js.map +1 -0
- package/dist/server/migrations/set-workflow-default-name.mjs +27 -0
- package/dist/server/migrations/set-workflow-default-name.mjs.map +1 -0
- package/dist/server/migrations/shorten-stage-attribute.js +45 -0
- package/dist/server/migrations/shorten-stage-attribute.js.map +1 -0
- package/dist/server/migrations/shorten-stage-attribute.mjs +43 -0
- package/dist/server/migrations/shorten-stage-attribute.mjs.map +1 -0
- package/dist/server/register.js +116 -0
- package/dist/server/register.js.map +1 -0
- package/dist/server/register.mjs +114 -0
- package/dist/server/register.mjs.map +1 -0
- package/dist/server/routes/index.js +10 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/index.mjs +8 -0
- package/dist/server/routes/index.mjs.map +1 -0
- package/dist/server/routes/review-workflows.js +186 -0
- package/dist/server/routes/review-workflows.js.map +1 -0
- package/dist/server/routes/review-workflows.mjs +184 -0
- package/dist/server/routes/review-workflows.mjs.map +1 -0
- package/dist/server/routes/utils.js +11 -0
- package/dist/server/routes/utils.js.map +1 -0
- package/dist/server/routes/utils.mjs +9 -0
- package/dist/server/routes/utils.mjs.map +1 -0
- package/dist/server/services/assignees.js +68 -0
- package/dist/server/services/assignees.js.map +1 -0
- package/dist/server/services/assignees.mjs +66 -0
- package/dist/server/services/assignees.mjs.map +1 -0
- package/dist/server/services/document-service-middleware.js +130 -0
- package/dist/server/services/document-service-middleware.js.map +1 -0
- package/dist/server/services/document-service-middleware.mjs +128 -0
- package/dist/server/services/document-service-middleware.mjs.map +1 -0
- package/dist/server/services/index.js +24 -0
- package/dist/server/services/index.js.map +1 -0
- package/dist/server/services/index.mjs +22 -0
- package/dist/server/services/index.mjs.map +1 -0
- package/dist/server/services/metrics/index.js +67 -0
- package/dist/server/services/metrics/index.js.map +1 -0
- package/dist/server/services/metrics/index.mjs +55 -0
- package/dist/server/services/metrics/index.mjs.map +1 -0
- package/dist/server/services/metrics/weekly-metrics.js +84 -0
- package/dist/server/services/metrics/weekly-metrics.js.map +1 -0
- package/dist/server/services/metrics/weekly-metrics.mjs +82 -0
- package/dist/server/services/metrics/weekly-metrics.mjs.map +1 -0
- package/dist/server/services/stage-permissions.js +59 -0
- package/dist/server/services/stage-permissions.js.map +1 -0
- package/dist/server/services/stage-permissions.mjs +57 -0
- package/dist/server/services/stage-permissions.mjs.map +1 -0
- package/dist/server/services/stages.js +353 -0
- package/dist/server/services/stages.js.map +1 -0
- package/dist/server/services/stages.mjs +351 -0
- package/dist/server/services/stages.mjs.map +1 -0
- package/dist/server/services/validation.js +69 -0
- package/dist/server/services/validation.js.map +1 -0
- package/dist/server/services/validation.mjs +67 -0
- package/dist/server/services/validation.mjs.map +1 -0
- package/dist/server/services/workflow-content-types.js +90 -0
- package/dist/server/services/workflow-content-types.js.map +1 -0
- package/dist/server/services/workflow-content-types.mjs +88 -0
- package/dist/server/services/workflow-content-types.mjs.map +1 -0
- package/dist/server/services/workflows.js +279 -0
- package/dist/server/services/workflows.js.map +1 -0
- package/dist/server/services/workflows.mjs +277 -0
- package/dist/server/services/workflows.mjs.map +1 -0
- package/dist/server/utils/index.js +16 -0
- package/dist/server/utils/index.js.map +1 -0
- package/dist/server/utils/index.mjs +13 -0
- package/dist/server/utils/index.mjs.map +1 -0
- package/dist/server/utils/review-workflows.js +36 -0
- package/dist/server/utils/review-workflows.js.map +1 -0
- package/dist/server/utils/review-workflows.mjs +30 -0
- package/dist/server/utils/review-workflows.mjs.map +1 -0
- package/dist/server/validation/review-workflows.js +71 -0
- package/dist/server/validation/review-workflows.js.map +1 -0
- package/dist/server/validation/review-workflows.mjs +65 -0
- package/dist/server/validation/review-workflows.mjs.map +1 -0
- package/package.json +5 -5
- package/dist/admin/chunks/Layout-C4ri_ldC.js.map +0 -1
- package/dist/admin/chunks/Layout-CF497D6H.mjs.map +0 -1
- package/dist/admin/chunks/en-BNGiWajd.js.map +0 -1
- package/dist/admin/chunks/en-BrZXFtVv.mjs.map +0 -1
- package/dist/admin/chunks/id-DVOtqJqn.js +0 -1442
- package/dist/admin/chunks/id-DVOtqJqn.js.map +0 -1
- package/dist/admin/chunks/id-QD0V9dME.mjs +0 -1420
- package/dist/admin/chunks/id-QD0V9dME.mjs.map +0 -1
- package/dist/admin/chunks/index-CCx4kT-t.js.map +0 -1
- package/dist/admin/chunks/index-CzdEqFOm.js.map +0 -1
- package/dist/admin/chunks/index-DcEF47R4.mjs.map +0 -1
- package/dist/admin/chunks/index-iChY7MsG.mjs.map +0 -1
- package/dist/admin/chunks/purchase-review-workflows-4n0KXAeo.mjs.map +0 -1
- package/dist/admin/chunks/purchase-review-workflows-BDLncDcz.js.map +0 -1
- package/dist/admin/chunks/router-ChVwf8TN.js.map +0 -1
- package/dist/admin/chunks/router-D-YCUzYy.mjs.map +0 -1
- package/dist/admin/chunks/uk-CbRUr1I7.js.map +0 -1
- package/dist/admin/chunks/uk-DLlzEBUF.mjs.map +0 -1
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { map, get, set, isString } from 'lodash/fp';
|
|
2
|
+
import { errors } from '@strapi/utils';
|
|
3
|
+
import { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows.mjs';
|
|
4
|
+
import { getService } from '../utils/index.mjs';
|
|
5
|
+
import { getWorkflowContentTypeFilter } from '../utils/review-workflows.mjs';
|
|
6
|
+
import workflowsContentTypesFactory from './workflow-content-types.mjs';
|
|
7
|
+
|
|
8
|
+
const processFilters = ({ strapi }, filters = {})=>{
|
|
9
|
+
const processedFilters = {
|
|
10
|
+
...filters
|
|
11
|
+
};
|
|
12
|
+
if (isString(filters.contentTypes)) {
|
|
13
|
+
processedFilters.contentTypes = getWorkflowContentTypeFilter({
|
|
14
|
+
strapi
|
|
15
|
+
}, filters.contentTypes);
|
|
16
|
+
}
|
|
17
|
+
return processedFilters;
|
|
18
|
+
};
|
|
19
|
+
// TODO: How can we improve this? Maybe using traversePopulate?
|
|
20
|
+
const processPopulate = (populate)=>{
|
|
21
|
+
// If it does not exist or it's not an object (like an array) return the default populate
|
|
22
|
+
if (!populate) {
|
|
23
|
+
return WORKFLOW_POPULATE;
|
|
24
|
+
}
|
|
25
|
+
return populate;
|
|
26
|
+
};
|
|
27
|
+
var workflows = (({ strapi })=>{
|
|
28
|
+
const workflowsContentTypes = workflowsContentTypesFactory({
|
|
29
|
+
strapi
|
|
30
|
+
});
|
|
31
|
+
const workflowValidator = getService('validation', {
|
|
32
|
+
strapi
|
|
33
|
+
});
|
|
34
|
+
const metrics = getService('workflow-metrics', {
|
|
35
|
+
strapi
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
/**
|
|
39
|
+
* Returns all the workflows matching the user-defined filters.
|
|
40
|
+
* @param {object} opts - Options for the query.
|
|
41
|
+
* @param {object} opts.filters - Filters object.
|
|
42
|
+
* @returns {Promise<object[]>} - List of workflows that match the user's filters.
|
|
43
|
+
*/ async find (opts = {}) {
|
|
44
|
+
const filters = processFilters({
|
|
45
|
+
strapi
|
|
46
|
+
}, opts.filters);
|
|
47
|
+
const populate = processPopulate(opts.populate);
|
|
48
|
+
const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, {
|
|
49
|
+
...opts,
|
|
50
|
+
filters,
|
|
51
|
+
populate
|
|
52
|
+
});
|
|
53
|
+
return strapi.db.query(WORKFLOW_MODEL_UID).findMany(query);
|
|
54
|
+
},
|
|
55
|
+
/**
|
|
56
|
+
* Returns the workflow with the specified ID.
|
|
57
|
+
* @param {string} id - ID of the requested workflow.
|
|
58
|
+
* @param {object} opts - Options for the query.
|
|
59
|
+
* @returns {Promise<object>} - Workflow object matching the requested ID.
|
|
60
|
+
*/ findById (id, opts = {}) {
|
|
61
|
+
const populate = processPopulate(opts.populate);
|
|
62
|
+
const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, {
|
|
63
|
+
populate
|
|
64
|
+
});
|
|
65
|
+
return strapi.db.query(WORKFLOW_MODEL_UID).findOne({
|
|
66
|
+
...query,
|
|
67
|
+
where: {
|
|
68
|
+
id
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
/**
|
|
73
|
+
* Creates a new workflow.
|
|
74
|
+
* @param {object} opts - Options for creating the new workflow.
|
|
75
|
+
* @returns {Promise<object>} - Workflow object that was just created.
|
|
76
|
+
* @throws {ValidationError} - If the workflow has no stages.
|
|
77
|
+
*/ async create (opts) {
|
|
78
|
+
let createOpts = {
|
|
79
|
+
...opts,
|
|
80
|
+
populate: WORKFLOW_POPULATE
|
|
81
|
+
};
|
|
82
|
+
workflowValidator.validateWorkflowStages(opts.data.stages);
|
|
83
|
+
await workflowValidator.validateWorkflowCount(1);
|
|
84
|
+
return strapi.db.transaction(async ()=>{
|
|
85
|
+
// Create stages
|
|
86
|
+
const stages = await getService('stages', {
|
|
87
|
+
strapi
|
|
88
|
+
}).createMany(opts.data.stages);
|
|
89
|
+
const mapIds = map(get('id'));
|
|
90
|
+
createOpts = set('data.stages', mapIds(stages), createOpts);
|
|
91
|
+
if (opts.data.stageRequiredToPublishName) {
|
|
92
|
+
const stageRequiredToPublish = stages.find((stage)=>stage.name === opts.data.stageRequiredToPublishName);
|
|
93
|
+
if (!stageRequiredToPublish) {
|
|
94
|
+
throw new errors.ApplicationError('Stage required to publish does not exist');
|
|
95
|
+
}
|
|
96
|
+
createOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, createOpts);
|
|
97
|
+
}
|
|
98
|
+
// Update (un)assigned Content Types
|
|
99
|
+
if (opts.data.contentTypes) {
|
|
100
|
+
await workflowsContentTypes.migrate({
|
|
101
|
+
destContentTypes: opts.data.contentTypes,
|
|
102
|
+
stageId: stages[0].id
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Create Workflow
|
|
106
|
+
const createdWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).create(strapi.get('query-params').transform(WORKFLOW_MODEL_UID, createOpts));
|
|
107
|
+
metrics.sendDidCreateWorkflow(createdWorkflow.id, !!opts.data.stageRequiredToPublishName);
|
|
108
|
+
if (opts.data.stageRequiredToPublishName) {
|
|
109
|
+
await strapi.plugin('content-releases').service('release-action').validateActionsByContentTypes(opts.data.contentTypes);
|
|
110
|
+
}
|
|
111
|
+
return createdWorkflow;
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
/**
|
|
115
|
+
* Updates an existing workflow.
|
|
116
|
+
* @param {object} workflow - The existing workflow to update.
|
|
117
|
+
* @param {object} opts - Options for updating the workflow.
|
|
118
|
+
* @returns {Promise<object>} - Workflow object that was just updated.
|
|
119
|
+
* @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.
|
|
120
|
+
*/ async update (workflow, opts) {
|
|
121
|
+
const stageService = getService('stages', {
|
|
122
|
+
strapi
|
|
123
|
+
});
|
|
124
|
+
let updateOpts = {
|
|
125
|
+
...opts,
|
|
126
|
+
populate: {
|
|
127
|
+
...WORKFLOW_POPULATE
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
let updatedStages = [];
|
|
131
|
+
let updatedStageIds;
|
|
132
|
+
await workflowValidator.validateWorkflowCount();
|
|
133
|
+
return strapi.db.transaction(async ()=>{
|
|
134
|
+
// Update stages
|
|
135
|
+
if (opts.data.stages) {
|
|
136
|
+
workflowValidator.validateWorkflowStages(opts.data.stages);
|
|
137
|
+
opts.data.stages.forEach((stage)=>this.assertStageBelongsToWorkflow(stage.id, workflow));
|
|
138
|
+
updatedStages = await stageService.replaceStages(workflow.stages, opts.data.stages, workflow.contentTypes);
|
|
139
|
+
updatedStageIds = updatedStages.map((stage)=>stage.id);
|
|
140
|
+
updateOpts = set('data.stages', updatedStageIds, updateOpts);
|
|
141
|
+
}
|
|
142
|
+
if (opts.data.stageRequiredToPublishName !== undefined) {
|
|
143
|
+
const stages = updatedStages ?? workflow.stages;
|
|
144
|
+
if (opts.data.stageRequiredToPublishName === null) {
|
|
145
|
+
updateOpts = set('data.stageRequiredToPublish', null, updateOpts);
|
|
146
|
+
} else {
|
|
147
|
+
const stageRequiredToPublish = stages.find((stage)=>stage.name === opts.data.stageRequiredToPublishName);
|
|
148
|
+
if (!stageRequiredToPublish) {
|
|
149
|
+
throw new errors.ApplicationError('Stage required to publish does not exist');
|
|
150
|
+
}
|
|
151
|
+
updateOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, updateOpts);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Update (un)assigned Content Types
|
|
155
|
+
if (opts.data.contentTypes) {
|
|
156
|
+
await workflowsContentTypes.migrate({
|
|
157
|
+
srcContentTypes: workflow.contentTypes,
|
|
158
|
+
destContentTypes: opts.data.contentTypes,
|
|
159
|
+
stageId: updatedStageIds ? updatedStageIds[0] : workflow.stages[0].id
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
metrics.sendDidEditWorkflow(workflow.id, !!opts.data.stageRequiredToPublishName);
|
|
163
|
+
const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, updateOpts);
|
|
164
|
+
// Update Workflow
|
|
165
|
+
const updatedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).update({
|
|
166
|
+
...query,
|
|
167
|
+
where: {
|
|
168
|
+
id: workflow.id
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
await strapi.plugin('content-releases').service('release-action').validateActionsByContentTypes([
|
|
172
|
+
...workflow.contentTypes,
|
|
173
|
+
...opts.data.contentTypes || []
|
|
174
|
+
]);
|
|
175
|
+
return updatedWorkflow;
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
/**
|
|
179
|
+
* Deletes an existing workflow.
|
|
180
|
+
* Also deletes all the workflow stages and migrate all assigned the content types.
|
|
181
|
+
* @param {*} workflow
|
|
182
|
+
* @param {*} opts
|
|
183
|
+
* @returns
|
|
184
|
+
*/ async delete (workflow, opts) {
|
|
185
|
+
const stageService = getService('stages', {
|
|
186
|
+
strapi
|
|
187
|
+
});
|
|
188
|
+
const workflowCount = await this.count();
|
|
189
|
+
if (workflowCount <= 1) {
|
|
190
|
+
throw new errors.ApplicationError('Can not delete the last workflow');
|
|
191
|
+
}
|
|
192
|
+
return strapi.db.transaction(async ()=>{
|
|
193
|
+
// Delete stages
|
|
194
|
+
await stageService.deleteMany(workflow.stages);
|
|
195
|
+
// Unassign all content types, this will migrate the content types to null
|
|
196
|
+
await workflowsContentTypes.migrate({
|
|
197
|
+
srcContentTypes: workflow.contentTypes,
|
|
198
|
+
destContentTypes: []
|
|
199
|
+
});
|
|
200
|
+
const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, opts);
|
|
201
|
+
// Delete Workflow
|
|
202
|
+
const deletedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).delete({
|
|
203
|
+
...query,
|
|
204
|
+
where: {
|
|
205
|
+
id: workflow.id
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
await strapi.plugin('content-releases').service('release-action').validateActionsByContentTypes(workflow.contentTypes);
|
|
209
|
+
return deletedWorkflow;
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
/**
|
|
213
|
+
* Returns the total count of workflows.
|
|
214
|
+
* @returns {Promise<number>} - Total count of workflows.
|
|
215
|
+
*/ count () {
|
|
216
|
+
return strapi.db.query(WORKFLOW_MODEL_UID).count();
|
|
217
|
+
},
|
|
218
|
+
/**
|
|
219
|
+
* Finds the assigned workflow for a given content type ID.
|
|
220
|
+
* @param {string} uid - Content type ID to find the assigned workflow for.
|
|
221
|
+
* @param {object} opts - Options for the query.
|
|
222
|
+
* @returns {Promise<object|null>} - Assigned workflow object if found, or null.
|
|
223
|
+
*/ async getAssignedWorkflow (uid, opts = {}) {
|
|
224
|
+
const workflows = await this._getAssignedWorkflows(uid, opts);
|
|
225
|
+
return workflows.length > 0 ? workflows[0] : null;
|
|
226
|
+
},
|
|
227
|
+
/**
|
|
228
|
+
* Finds all the assigned workflows for a given content type ID.
|
|
229
|
+
* Normally, there should only be one workflow assigned to a content type.
|
|
230
|
+
* However, edge cases can occur where a content type is assigned to multiple workflows.
|
|
231
|
+
* @param {string} uid - Content type ID to find the assigned workflows for.
|
|
232
|
+
* @param {object} opts - Options for the query.
|
|
233
|
+
* @returns {Promise<object[]>} - List of assigned workflow objects.
|
|
234
|
+
*/ async _getAssignedWorkflows (uid, opts = {}) {
|
|
235
|
+
return this.find({
|
|
236
|
+
...opts,
|
|
237
|
+
filters: {
|
|
238
|
+
contentTypes: getWorkflowContentTypeFilter({
|
|
239
|
+
strapi
|
|
240
|
+
}, uid)
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
},
|
|
244
|
+
/**
|
|
245
|
+
* Asserts that a content type has an assigned workflow.
|
|
246
|
+
* @param {string} uid - Content type ID to verify the assignment of.
|
|
247
|
+
* @returns {Promise<object>} - Workflow object associated with the content type ID.
|
|
248
|
+
* @throws {ApplicationError} - If no assigned workflow is found for the content type ID.
|
|
249
|
+
*/ async assertContentTypeBelongsToWorkflow (uid) {
|
|
250
|
+
const workflow = await this.getAssignedWorkflow(uid, {
|
|
251
|
+
populate: 'stages'
|
|
252
|
+
});
|
|
253
|
+
if (!workflow) {
|
|
254
|
+
throw new errors.ApplicationError(`Review workflows is not activated on Content Type ${uid}.`);
|
|
255
|
+
}
|
|
256
|
+
return workflow;
|
|
257
|
+
},
|
|
258
|
+
/**
|
|
259
|
+
* Asserts that a stage belongs to a given workflow.
|
|
260
|
+
* @param {string} stageId - ID of stage to check.
|
|
261
|
+
* @param {object} workflow - Workflow object to check against.
|
|
262
|
+
* @returns
|
|
263
|
+
* @throws {ApplicationError} - If the stage does not belong to the specified workflow.
|
|
264
|
+
*/ assertStageBelongsToWorkflow (stageId, workflow) {
|
|
265
|
+
if (!stageId) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const belongs = workflow.stages.some((stage)=>stage.id === stageId);
|
|
269
|
+
if (!belongs) {
|
|
270
|
+
throw new errors.ApplicationError(`Stage does not belong to workflow "${workflow.name}"`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
export { workflows as default };
|
|
277
|
+
//# sourceMappingURL=workflows.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.mjs","sources":["../../../server/src/services/workflows.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { set, isString, map, get } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\nimport { getService } from '../utils';\nimport { getWorkflowContentTypeFilter } from '../utils/review-workflows';\nimport workflowsContentTypesFactory from './workflow-content-types';\n\nconst processFilters = ({ strapi }: { strapi: Core.Strapi }, filters: any = {}) => {\n const processedFilters = { ...filters };\n\n if (isString(filters.contentTypes)) {\n processedFilters.contentTypes = getWorkflowContentTypeFilter({ strapi }, filters.contentTypes);\n }\n\n return processedFilters;\n};\n\n// TODO: How can we improve this? Maybe using traversePopulate?\nconst processPopulate = (populate: any) => {\n // If it does not exist or it's not an object (like an array) return the default populate\n if (!populate) {\n return WORKFLOW_POPULATE;\n }\n\n return populate;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const workflowsContentTypes = workflowsContentTypesFactory({ strapi });\n const workflowValidator = getService('validation', { strapi });\n const metrics = getService('workflow-metrics', { strapi });\n\n return {\n /**\n * Returns all the workflows matching the user-defined filters.\n * @param {object} opts - Options for the query.\n * @param {object} opts.filters - Filters object.\n * @returns {Promise<object[]>} - List of workflows that match the user's filters.\n */\n async find(opts: any = {}) {\n const filters = processFilters({ strapi }, opts.filters);\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, {\n ...opts,\n filters,\n populate,\n });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findMany(query);\n },\n\n /**\n * Returns the workflow with the specified ID.\n * @param {string} id - ID of the requested workflow.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object>} - Workflow object matching the requested ID.\n */\n findById(id: any, opts: { populate?: any } = {}) {\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, { populate });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findOne({\n ...query,\n where: { id },\n });\n },\n\n /**\n * Creates a new workflow.\n * @param {object} opts - Options for creating the new workflow.\n * @returns {Promise<object>} - Workflow object that was just created.\n * @throws {ValidationError} - If the workflow has no stages.\n */\n async create(opts: { data: any }) {\n let createOpts = { ...opts, populate: WORKFLOW_POPULATE };\n\n workflowValidator.validateWorkflowStages(opts.data.stages);\n await workflowValidator.validateWorkflowCount(1);\n\n return strapi.db.transaction(async () => {\n // Create stages\n const stages = await getService('stages', { strapi }).createMany(opts.data.stages);\n const mapIds = map(get('id'));\n\n createOpts = set('data.stages', mapIds(stages), createOpts);\n\n if (opts.data.stageRequiredToPublishName) {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n createOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, createOpts);\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n await workflowsContentTypes.migrate({\n destContentTypes: opts.data.contentTypes,\n stageId: stages[0].id,\n });\n }\n\n // Create Workflow\n const createdWorkflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .create(strapi.get('query-params').transform(WORKFLOW_MODEL_UID, createOpts));\n\n metrics.sendDidCreateWorkflow(createdWorkflow.id, !!opts.data.stageRequiredToPublishName);\n\n if (opts.data.stageRequiredToPublishName) {\n await strapi\n .plugin('content-releases')\n .service('release-action')\n .validateActionsByContentTypes(opts.data.contentTypes);\n }\n\n return createdWorkflow;\n });\n },\n\n /**\n * Updates an existing workflow.\n * @param {object} workflow - The existing workflow to update.\n * @param {object} opts - Options for updating the workflow.\n * @returns {Promise<object>} - Workflow object that was just updated.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n */\n async update(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };\n let updatedStages: any = [];\n let updatedStageIds: any;\n\n await workflowValidator.validateWorkflowCount();\n\n return strapi.db.transaction(async () => {\n // Update stages\n if (opts.data.stages) {\n workflowValidator.validateWorkflowStages(opts.data.stages);\n opts.data.stages.forEach((stage: any) =>\n this.assertStageBelongsToWorkflow(stage.id, workflow)\n );\n\n updatedStages = await stageService.replaceStages(\n workflow.stages,\n opts.data.stages,\n workflow.contentTypes\n );\n updatedStageIds = updatedStages.map((stage: any) => stage.id);\n\n updateOpts = set('data.stages', updatedStageIds, updateOpts);\n }\n\n if (opts.data.stageRequiredToPublishName !== undefined) {\n const stages = updatedStages ?? workflow.stages;\n\n if (opts.data.stageRequiredToPublishName === null) {\n updateOpts = set('data.stageRequiredToPublish', null, updateOpts);\n } else {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n updateOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, updateOpts);\n }\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: opts.data.contentTypes,\n stageId: updatedStageIds ? updatedStageIds[0] : workflow.stages[0].id,\n });\n }\n\n metrics.sendDidEditWorkflow(workflow.id, !!opts.data.stageRequiredToPublishName);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, updateOpts);\n\n // Update Workflow\n const updatedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).update({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n .validateActionsByContentTypes([\n ...workflow.contentTypes,\n ...(opts.data.contentTypes || []),\n ]);\n\n return updatedWorkflow;\n });\n },\n\n /**\n * Deletes an existing workflow.\n * Also deletes all the workflow stages and migrate all assigned the content types.\n * @param {*} workflow\n * @param {*} opts\n * @returns\n */\n async delete(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n\n const workflowCount = await this.count();\n\n if (workflowCount <= 1) {\n throw new errors.ApplicationError('Can not delete the last workflow');\n }\n\n return strapi.db.transaction(async () => {\n // Delete stages\n await stageService.deleteMany(workflow.stages);\n\n // Unassign all content types, this will migrate the content types to null\n await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: [],\n });\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, opts);\n\n // Delete Workflow\n const deletedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).delete({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n .validateActionsByContentTypes(workflow.contentTypes);\n\n return deletedWorkflow;\n });\n },\n /**\n * Returns the total count of workflows.\n * @returns {Promise<number>} - Total count of workflows.\n */\n count() {\n return strapi.db.query(WORKFLOW_MODEL_UID).count();\n },\n\n /**\n * Finds the assigned workflow for a given content type ID.\n * @param {string} uid - Content type ID to find the assigned workflow for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object|null>} - Assigned workflow object if found, or null.\n */\n async getAssignedWorkflow(uid: any, opts: any = {}) {\n const workflows = await this._getAssignedWorkflows(uid, opts);\n\n return workflows.length > 0 ? workflows[0] : null;\n },\n\n /**\n * Finds all the assigned workflows for a given content type ID.\n * Normally, there should only be one workflow assigned to a content type.\n * However, edge cases can occur where a content type is assigned to multiple workflows.\n * @param {string} uid - Content type ID to find the assigned workflows for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object[]>} - List of assigned workflow objects.\n */\n async _getAssignedWorkflows(uid: any, opts = {}) {\n return this.find({\n ...opts,\n filters: { contentTypes: getWorkflowContentTypeFilter({ strapi }, uid) },\n });\n },\n\n /**\n * Asserts that a content type has an assigned workflow.\n * @param {string} uid - Content type ID to verify the assignment of.\n * @returns {Promise<object>} - Workflow object associated with the content type ID.\n * @throws {ApplicationError} - If no assigned workflow is found for the content type ID.\n */\n async assertContentTypeBelongsToWorkflow(uid: any) {\n const workflow = await this.getAssignedWorkflow(uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n throw new errors.ApplicationError(\n `Review workflows is not activated on Content Type ${uid}.`\n );\n }\n\n return workflow;\n },\n\n /**\n * Asserts that a stage belongs to a given workflow.\n * @param {string} stageId - ID of stage to check.\n * @param {object} workflow - Workflow object to check against.\n * @returns\n * @throws {ApplicationError} - If the stage does not belong to the specified workflow.\n */\n assertStageBelongsToWorkflow(stageId: any, workflow: any) {\n if (!stageId) {\n return;\n }\n\n const belongs = workflow.stages.some((stage: any) => stage.id === stageId);\n if (!belongs) {\n throw new errors.ApplicationError(`Stage does not belong to workflow \"${workflow.name}\"`);\n }\n },\n };\n};\n"],"names":["processFilters","strapi","filters","processedFilters","isString","contentTypes","getWorkflowContentTypeFilter","processPopulate","populate","WORKFLOW_POPULATE","workflowsContentTypes","workflowsContentTypesFactory","workflowValidator","getService","metrics","find","opts","query","get","transform","WORKFLOW_MODEL_UID","db","findMany","findById","id","findOne","where","create","createOpts","validateWorkflowStages","data","stages","validateWorkflowCount","transaction","createMany","mapIds","map","set","stageRequiredToPublishName","stageRequiredToPublish","stage","name","errors","ApplicationError","migrate","destContentTypes","stageId","createdWorkflow","sendDidCreateWorkflow","plugin","service","validateActionsByContentTypes","update","workflow","stageService","updateOpts","updatedStages","updatedStageIds","forEach","assertStageBelongsToWorkflow","replaceStages","undefined","srcContentTypes","sendDidEditWorkflow","updatedWorkflow","delete","workflowCount","count","deleteMany","deletedWorkflow","getAssignedWorkflow","uid","workflows","_getAssignedWorkflows","length","assertContentTypeBelongsToWorkflow","belongs","some"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getAdminService = (name, { strapi } = {
|
|
4
|
+
strapi: global.strapi
|
|
5
|
+
})=>{
|
|
6
|
+
return strapi.service(`admin::${name}`);
|
|
7
|
+
};
|
|
8
|
+
const getService = (name, { strapi } = {
|
|
9
|
+
strapi: global.strapi
|
|
10
|
+
})=>{
|
|
11
|
+
return strapi.plugin('review-workflows').service(name);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
exports.getAdminService = getAdminService;
|
|
15
|
+
exports.getService = getService;
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../server/src/utils/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport const getAdminService = (\n name: string,\n { strapi }: { strapi: Core.Strapi } = { strapi: global.strapi }\n) => {\n return strapi.service(`admin::${name}`);\n};\n\nexport const getService = (name: string, { strapi } = { strapi: global.strapi }) => {\n return strapi.plugin('review-workflows').service(name);\n};\n\nexport default {\n getAdminService,\n getService,\n};\n"],"names":["getAdminService","name","strapi","global","service","getService","plugin"],"mappings":";;MAEaA,eAAkB,GAAA,CAC7BC,MACA,EAAEC,MAAM,EAA2B,GAAG;AAAEA,IAAAA,MAAAA,EAAQC,OAAOD;AAAO,CAAC,GAAA;AAE/D,IAAA,OAAOA,OAAOE,OAAO,CAAC,CAAC,OAAO,EAAEH,KAAK,CAAC,CAAA;AACxC;MAEaI,UAAa,GAAA,CAACJ,MAAc,EAAEC,MAAM,EAAE,GAAG;AAAEA,IAAAA,MAAAA,EAAQC,OAAOD;AAAO,CAAC,GAAA;AAC7E,IAAA,OAAOA,MAAOI,CAAAA,MAAM,CAAC,kBAAA,CAAA,CAAoBF,OAAO,CAACH,IAAAA,CAAAA;AACnD;;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const getAdminService = (name, { strapi } = {
|
|
2
|
+
strapi: global.strapi
|
|
3
|
+
})=>{
|
|
4
|
+
return strapi.service(`admin::${name}`);
|
|
5
|
+
};
|
|
6
|
+
const getService = (name, { strapi } = {
|
|
7
|
+
strapi: global.strapi
|
|
8
|
+
})=>{
|
|
9
|
+
return strapi.plugin('review-workflows').service(name);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { getAdminService, getService };
|
|
13
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../server/src/utils/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport const getAdminService = (\n name: string,\n { strapi }: { strapi: Core.Strapi } = { strapi: global.strapi }\n) => {\n return strapi.service(`admin::${name}`);\n};\n\nexport const getService = (name: string, { strapi } = { strapi: global.strapi }) => {\n return strapi.plugin('review-workflows').service(name);\n};\n\nexport default {\n getAdminService,\n getService,\n};\n"],"names":["getAdminService","name","strapi","global","service","getService","plugin"],"mappings":"MAEaA,eAAkB,GAAA,CAC7BC,MACA,EAAEC,MAAM,EAA2B,GAAG;AAAEA,IAAAA,MAAAA,EAAQC,OAAOD;AAAO,CAAC,GAAA;AAE/D,IAAA,OAAOA,OAAOE,OAAO,CAAC,CAAC,OAAO,EAAEH,KAAK,CAAC,CAAA;AACxC;MAEaI,UAAa,GAAA,CAACJ,MAAc,EAAEC,MAAM,EAAE,GAAG;AAAEA,IAAAA,MAAAA,EAAQC,OAAOD;AAAO,CAAC,GAAA;AAC7E,IAAA,OAAOA,MAAOI,CAAAA,MAAM,CAAC,kBAAA,CAAA,CAAoBF,OAAO,CAACH,IAAAA,CAAAA;AACnD;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fp = require('lodash/fp');
|
|
4
|
+
var workflows = require('../constants/workflows.js');
|
|
5
|
+
|
|
6
|
+
const getVisibleContentTypesUID = fp.pipe([
|
|
7
|
+
// Pick only content-types visible in the content-manager and option is not false
|
|
8
|
+
fp.pickBy((value)=>fp.getOr(true, 'pluginOptions.content-manager.visible', value) && !fp.getOr(false, 'options.noStageAttribute', value)),
|
|
9
|
+
// Get UIDs
|
|
10
|
+
fp.keys
|
|
11
|
+
]);
|
|
12
|
+
const hasStageAttribute = fp.has([
|
|
13
|
+
'attributes',
|
|
14
|
+
workflows.ENTITY_STAGE_ATTRIBUTE
|
|
15
|
+
]);
|
|
16
|
+
const getWorkflowContentTypeFilter = ({ strapi }, contentType)=>{
|
|
17
|
+
if (strapi.db.dialect.supportsOperator('$jsonSupersetOf')) {
|
|
18
|
+
return {
|
|
19
|
+
$jsonSupersetOf: JSON.stringify([
|
|
20
|
+
contentType
|
|
21
|
+
])
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
$contains: `"${contentType}"`
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
const clampMaxWorkflows = fp.clamp(1, workflows.MAX_WORKFLOWS);
|
|
29
|
+
const clampMaxStagesPerWorkflow = fp.clamp(1, workflows.MAX_STAGES_PER_WORKFLOW);
|
|
30
|
+
|
|
31
|
+
exports.clampMaxStagesPerWorkflow = clampMaxStagesPerWorkflow;
|
|
32
|
+
exports.clampMaxWorkflows = clampMaxWorkflows;
|
|
33
|
+
exports.getVisibleContentTypesUID = getVisibleContentTypesUID;
|
|
34
|
+
exports.getWorkflowContentTypeFilter = getWorkflowContentTypeFilter;
|
|
35
|
+
exports.hasStageAttribute = hasStageAttribute;
|
|
36
|
+
//# sourceMappingURL=review-workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-workflows.js","sources":["../../../server/src/utils/review-workflows.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { getOr, keys, pickBy, pipe, has, clamp } from 'lodash/fp';\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from '../constants/workflows';\n\nexport const getVisibleContentTypesUID = pipe([\n // Pick only content-types visible in the content-manager and option is not false\n pickBy(\n (value) =>\n getOr(true, 'pluginOptions.content-manager.visible', value) &&\n !getOr(false, 'options.noStageAttribute', value)\n ),\n // Get UIDs\n keys,\n]);\n\nexport const hasStageAttribute = has(['attributes', ENTITY_STAGE_ATTRIBUTE]);\n\nexport const getWorkflowContentTypeFilter = (\n { strapi }: { strapi: Core.Strapi },\n contentType: any\n) => {\n if (strapi.db.dialect.supportsOperator('$jsonSupersetOf')) {\n return { $jsonSupersetOf: JSON.stringify([contentType]) };\n }\n return { $contains: `\"${contentType}\"` };\n};\n\nexport const clampMaxWorkflows = clamp(1, MAX_WORKFLOWS);\nexport const clampMaxStagesPerWorkflow = clamp(1, MAX_STAGES_PER_WORKFLOW);\n\nexport default {\n clampMaxWorkflows,\n clampMaxStagesPerWorkflow,\n getVisibleContentTypesUID,\n hasStageAttribute,\n getWorkflowContentTypeFilter,\n};\n"],"names":["getVisibleContentTypesUID","pipe","pickBy","value","getOr","keys","hasStageAttribute","has","ENTITY_STAGE_ATTRIBUTE","getWorkflowContentTypeFilter","strapi","contentType","db","dialect","supportsOperator","$jsonSupersetOf","JSON","stringify","$contains","clampMaxWorkflows","clamp","MAX_WORKFLOWS","clampMaxStagesPerWorkflow","MAX_STAGES_PER_WORKFLOW"],"mappings":";;;;;AAQO,MAAMA,4BAA4BC,OAAK,CAAA;;IAE5CC,SACE,CAAA,CAACC,QACCC,QAAM,CAAA,IAAA,EAAM,yCAAyCD,KACrD,CAAA,IAAA,CAACC,QAAM,CAAA,KAAA,EAAO,0BAA4BD,EAAAA,KAAAA,CAAAA,CAAAA;;AAG9CE,IAAAA;CACD;AAEM,MAAMC,oBAAoBC,MAAI,CAAA;AAAC,IAAA,YAAA;AAAcC,IAAAA;CAAuB;MAE9DC,4BAA+B,GAAA,CAC1C,EAAEC,MAAM,EAA2B,EACnCC,WAAAA,GAAAA;AAEA,IAAA,IAAID,OAAOE,EAAE,CAACC,OAAO,CAACC,gBAAgB,CAAC,iBAAoB,CAAA,EAAA;QACzD,OAAO;YAAEC,eAAiBC,EAAAA,IAAAA,CAAKC,SAAS,CAAC;AAACN,gBAAAA;AAAY,aAAA;AAAE,SAAA;AAC1D;IACA,OAAO;AAAEO,QAAAA,SAAAA,EAAW,CAAC,CAAC,EAAEP,WAAAA,CAAY,CAAC;AAAE,KAAA;AACzC;AAEaQ,MAAAA,iBAAAA,GAAoBC,QAAM,CAAA,CAAA,EAAGC,uBAAe;AAC5CC,MAAAA,yBAAAA,GAA4BF,QAAM,CAAA,CAAA,EAAGG,iCAAyB;;;;;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { pipe, pickBy, getOr, keys, has, clamp } from 'lodash/fp';
|
|
2
|
+
import { ENTITY_STAGE_ATTRIBUTE, MAX_WORKFLOWS, MAX_STAGES_PER_WORKFLOW } from '../constants/workflows.mjs';
|
|
3
|
+
|
|
4
|
+
const getVisibleContentTypesUID = pipe([
|
|
5
|
+
// Pick only content-types visible in the content-manager and option is not false
|
|
6
|
+
pickBy((value)=>getOr(true, 'pluginOptions.content-manager.visible', value) && !getOr(false, 'options.noStageAttribute', value)),
|
|
7
|
+
// Get UIDs
|
|
8
|
+
keys
|
|
9
|
+
]);
|
|
10
|
+
const hasStageAttribute = has([
|
|
11
|
+
'attributes',
|
|
12
|
+
ENTITY_STAGE_ATTRIBUTE
|
|
13
|
+
]);
|
|
14
|
+
const getWorkflowContentTypeFilter = ({ strapi }, contentType)=>{
|
|
15
|
+
if (strapi.db.dialect.supportsOperator('$jsonSupersetOf')) {
|
|
16
|
+
return {
|
|
17
|
+
$jsonSupersetOf: JSON.stringify([
|
|
18
|
+
contentType
|
|
19
|
+
])
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
$contains: `"${contentType}"`
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const clampMaxWorkflows = clamp(1, MAX_WORKFLOWS);
|
|
27
|
+
const clampMaxStagesPerWorkflow = clamp(1, MAX_STAGES_PER_WORKFLOW);
|
|
28
|
+
|
|
29
|
+
export { clampMaxStagesPerWorkflow, clampMaxWorkflows, getVisibleContentTypesUID, getWorkflowContentTypeFilter, hasStageAttribute };
|
|
30
|
+
//# sourceMappingURL=review-workflows.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-workflows.mjs","sources":["../../../server/src/utils/review-workflows.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { getOr, keys, pickBy, pipe, has, clamp } from 'lodash/fp';\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from '../constants/workflows';\n\nexport const getVisibleContentTypesUID = pipe([\n // Pick only content-types visible in the content-manager and option is not false\n pickBy(\n (value) =>\n getOr(true, 'pluginOptions.content-manager.visible', value) &&\n !getOr(false, 'options.noStageAttribute', value)\n ),\n // Get UIDs\n keys,\n]);\n\nexport const hasStageAttribute = has(['attributes', ENTITY_STAGE_ATTRIBUTE]);\n\nexport const getWorkflowContentTypeFilter = (\n { strapi }: { strapi: Core.Strapi },\n contentType: any\n) => {\n if (strapi.db.dialect.supportsOperator('$jsonSupersetOf')) {\n return { $jsonSupersetOf: JSON.stringify([contentType]) };\n }\n return { $contains: `\"${contentType}\"` };\n};\n\nexport const clampMaxWorkflows = clamp(1, MAX_WORKFLOWS);\nexport const clampMaxStagesPerWorkflow = clamp(1, MAX_STAGES_PER_WORKFLOW);\n\nexport default {\n clampMaxWorkflows,\n clampMaxStagesPerWorkflow,\n getVisibleContentTypesUID,\n hasStageAttribute,\n getWorkflowContentTypeFilter,\n};\n"],"names":["getVisibleContentTypesUID","pipe","pickBy","value","getOr","keys","hasStageAttribute","has","ENTITY_STAGE_ATTRIBUTE","getWorkflowContentTypeFilter","strapi","contentType","db","dialect","supportsOperator","$jsonSupersetOf","JSON","stringify","$contains","clampMaxWorkflows","clamp","MAX_WORKFLOWS","clampMaxStagesPerWorkflow","MAX_STAGES_PER_WORKFLOW"],"mappings":";;;AAQO,MAAMA,4BAA4BC,IAAK,CAAA;;IAE5CC,MACE,CAAA,CAACC,QACCC,KAAM,CAAA,IAAA,EAAM,yCAAyCD,KACrD,CAAA,IAAA,CAACC,KAAM,CAAA,KAAA,EAAO,0BAA4BD,EAAAA,KAAAA,CAAAA,CAAAA;;AAG9CE,IAAAA;CACD;AAEM,MAAMC,oBAAoBC,GAAI,CAAA;AAAC,IAAA,YAAA;AAAcC,IAAAA;CAAuB;MAE9DC,4BAA+B,GAAA,CAC1C,EAAEC,MAAM,EAA2B,EACnCC,WAAAA,GAAAA;AAEA,IAAA,IAAID,OAAOE,EAAE,CAACC,OAAO,CAACC,gBAAgB,CAAC,iBAAoB,CAAA,EAAA;QACzD,OAAO;YAAEC,eAAiBC,EAAAA,IAAAA,CAAKC,SAAS,CAAC;AAACN,gBAAAA;AAAY,aAAA;AAAE,SAAA;AAC1D;IACA,OAAO;AAAEO,QAAAA,SAAAA,EAAW,CAAC,CAAC,EAAEP,WAAAA,CAAY,CAAC;AAAE,KAAA;AACzC;AAEaQ,MAAAA,iBAAAA,GAAoBC,KAAM,CAAA,CAAA,EAAGC,aAAe;AAC5CC,MAAAA,yBAAAA,GAA4BF,KAAM,CAAA,CAAA,EAAGG,uBAAyB;;;;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@strapi/utils');
|
|
4
|
+
var reviewWorkflows = require('../utils/review-workflows.js');
|
|
5
|
+
var workflows = require('../constants/workflows.js');
|
|
6
|
+
|
|
7
|
+
const stageObject = utils.yup.object().shape({
|
|
8
|
+
id: utils.yup.number().integer().min(1),
|
|
9
|
+
name: utils.yup.string().max(255).required(),
|
|
10
|
+
color: utils.yup.string().matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
|
|
11
|
+
permissions: utils.yup.array().of(utils.yup.object().shape({
|
|
12
|
+
role: utils.yup.number().integer().min(1).required(),
|
|
13
|
+
action: utils.yup.string().oneOf([
|
|
14
|
+
workflows.STAGE_TRANSITION_UID
|
|
15
|
+
]).required(),
|
|
16
|
+
actionParameters: utils.yup.object().shape({
|
|
17
|
+
from: utils.yup.number().integer().min(1).required(),
|
|
18
|
+
to: utils.yup.number().integer().min(1)
|
|
19
|
+
})
|
|
20
|
+
}))
|
|
21
|
+
});
|
|
22
|
+
const validateUpdateStageOnEntitySchema = utils.yup.object().shape({
|
|
23
|
+
id: utils.yup.number().integer().min(1).required()
|
|
24
|
+
}).required();
|
|
25
|
+
const validateContentTypes = utils.yup.array().of(utils.yup.string().test({
|
|
26
|
+
name: 'content-type-exists',
|
|
27
|
+
message: (value)=>`Content type ${value.originalValue} does not exist`,
|
|
28
|
+
test (uid) {
|
|
29
|
+
// Warning; we use the strapi global - to avoid that, it would need to refactor how
|
|
30
|
+
// we generate validation function by using a factory with the strapi instance as parameter.
|
|
31
|
+
return !!strapi.getModel(uid);
|
|
32
|
+
}
|
|
33
|
+
}).test({
|
|
34
|
+
name: 'content-type-review-workflow-enabled',
|
|
35
|
+
message: (value)=>`Content type ${value.originalValue} does not have review workflow enabled`,
|
|
36
|
+
test (uid) {
|
|
37
|
+
const model = strapi.getModel(uid);
|
|
38
|
+
// It's not a valid content type if it doesn't have the stage attribute
|
|
39
|
+
return reviewWorkflows.hasStageAttribute(model);
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
const validateWorkflowCreateSchema = utils.yup.object().shape({
|
|
43
|
+
name: utils.yup.string().max(255).min(1, 'Workflow name can not be empty').required(),
|
|
44
|
+
stages: utils.yup.array().of(stageObject)// @ts-expect-error - add unique property into the yup namespace typing
|
|
45
|
+
.uniqueProperty('name', 'Stage name must be unique').min(1, 'Can not create a workflow without stages').max(200, 'Can not have more than 200 stages').required('Can not create a workflow without stages'),
|
|
46
|
+
contentTypes: validateContentTypes,
|
|
47
|
+
stageRequiredToPublishName: utils.yup.string().min(1).nullable()
|
|
48
|
+
});
|
|
49
|
+
const validateWorkflowUpdateSchema = utils.yup.object().shape({
|
|
50
|
+
name: utils.yup.string().max(255).min(1, 'Workflow name can not be empty'),
|
|
51
|
+
stages: utils.yup.array().of(stageObject)// @ts-expect-error - add unique property into the yup namespace typing
|
|
52
|
+
.uniqueProperty('name', 'Stage name must be unique').min(1, 'Can not update a workflow without stages').max(200, 'Can not have more than 200 stages'),
|
|
53
|
+
contentTypes: validateContentTypes,
|
|
54
|
+
stageRequiredToPublishName: utils.yup.string().min(1).nullable()
|
|
55
|
+
});
|
|
56
|
+
const validateUpdateAssigneeOnEntitySchema = utils.yup.object().shape({
|
|
57
|
+
id: utils.yup.number().integer().min(1).nullable()
|
|
58
|
+
}).required();
|
|
59
|
+
const validateLocaleSchema = utils.yup.string().nullable();
|
|
60
|
+
const validateWorkflowCreate = utils.validateYupSchema(validateWorkflowCreateSchema);
|
|
61
|
+
const validateUpdateStageOnEntity = utils.validateYupSchema(validateUpdateStageOnEntitySchema);
|
|
62
|
+
const validateUpdateAssigneeOnEntity = utils.validateYupSchema(validateUpdateAssigneeOnEntitySchema);
|
|
63
|
+
const validateWorkflowUpdate = utils.validateYupSchema(validateWorkflowUpdateSchema);
|
|
64
|
+
const validateLocale = utils.validateYupSchema(validateLocaleSchema);
|
|
65
|
+
|
|
66
|
+
exports.validateLocale = validateLocale;
|
|
67
|
+
exports.validateUpdateAssigneeOnEntity = validateUpdateAssigneeOnEntity;
|
|
68
|
+
exports.validateUpdateStageOnEntity = validateUpdateStageOnEntity;
|
|
69
|
+
exports.validateWorkflowCreate = validateWorkflowCreate;
|
|
70
|
+
exports.validateWorkflowUpdate = validateWorkflowUpdate;
|
|
71
|
+
//# sourceMappingURL=review-workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-workflows.js","sources":["../../../server/src/validation/review-workflows.ts"],"sourcesContent":["/* eslint-disable func-names */\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { hasStageAttribute } from '../utils/review-workflows';\nimport { STAGE_TRANSITION_UID } from '../constants/workflows';\n\nconst stageObject = yup.object().shape({\n id: yup.number().integer().min(1),\n name: yup.string().max(255).required(),\n color: yup.string().matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i), // hex color\n permissions: yup.array().of(\n yup.object().shape({\n role: yup.number().integer().min(1).required(),\n action: yup.string().oneOf([STAGE_TRANSITION_UID]).required(),\n actionParameters: yup.object().shape({\n from: yup.number().integer().min(1).required(),\n to: yup.number().integer().min(1),\n }),\n })\n ),\n});\n\nconst validateUpdateStageOnEntitySchema = yup\n .object()\n .shape({\n id: yup.number().integer().min(1).required(),\n })\n .required();\n\nconst validateContentTypes = yup.array().of(\n yup\n .string()\n .test({\n name: 'content-type-exists',\n message: (value) => `Content type ${value.originalValue} does not exist`,\n test(uid: any) {\n // Warning; we use the strapi global - to avoid that, it would need to refactor how\n // we generate validation function by using a factory with the strapi instance as parameter.\n return !!strapi.getModel(uid);\n },\n })\n .test({\n name: 'content-type-review-workflow-enabled',\n message: (value) =>\n `Content type ${value.originalValue} does not have review workflow enabled`,\n test(uid: any) {\n const model = strapi.getModel(uid);\n\n // It's not a valid content type if it doesn't have the stage attribute\n return hasStageAttribute(model);\n },\n })\n);\n\nconst validateWorkflowCreateSchema = yup.object().shape({\n name: yup.string().max(255).min(1, 'Workflow name can not be empty').required(),\n stages: yup\n .array()\n .of(stageObject)\n // @ts-expect-error - add unique property into the yup namespace typing\n .uniqueProperty('name', 'Stage name must be unique')\n .min(1, 'Can not create a workflow without stages')\n .max(200, 'Can not have more than 200 stages')\n .required('Can not create a workflow without stages'),\n contentTypes: validateContentTypes,\n stageRequiredToPublishName: yup.string().min(1).nullable(),\n});\n\nconst validateWorkflowUpdateSchema = yup.object().shape({\n name: yup.string().max(255).min(1, 'Workflow name can not be empty'),\n stages: yup\n .array()\n .of(stageObject)\n // @ts-expect-error - add unique property into the yup namespace typing\n .uniqueProperty('name', 'Stage name must be unique')\n .min(1, 'Can not update a workflow without stages')\n .max(200, 'Can not have more than 200 stages'),\n contentTypes: validateContentTypes,\n stageRequiredToPublishName: yup.string().min(1).nullable(),\n});\n\nconst validateUpdateAssigneeOnEntitySchema = yup\n .object()\n .shape({\n id: yup.number().integer().min(1).nullable(),\n })\n .required();\n\nconst validateLocaleSchema = yup.string().nullable();\n\nexport const validateWorkflowCreate = validateYupSchema(validateWorkflowCreateSchema);\nexport const validateUpdateStageOnEntity = validateYupSchema(validateUpdateStageOnEntitySchema);\nexport const validateUpdateAssigneeOnEntity = validateYupSchema(\n validateUpdateAssigneeOnEntitySchema\n);\nexport const validateWorkflowUpdate = validateYupSchema(validateWorkflowUpdateSchema);\nexport const validateLocale = validateYupSchema(validateLocaleSchema);\n\nexport default {\n validateWorkflowCreate,\n validateUpdateStageOnEntity,\n validateUpdateAssigneeOnEntity,\n validateWorkflowUpdate,\n validateLocale,\n};\n"],"names":["stageObject","yup","object","shape","id","number","integer","min","name","string","max","required","color","matches","permissions","array","of","role","action","oneOf","STAGE_TRANSITION_UID","actionParameters","from","to","validateUpdateStageOnEntitySchema","validateContentTypes","test","message","value","originalValue","uid","strapi","getModel","model","hasStageAttribute","validateWorkflowCreateSchema","stages","uniqueProperty","contentTypes","stageRequiredToPublishName","nullable","validateWorkflowUpdateSchema","validateUpdateAssigneeOnEntitySchema","validateLocaleSchema","validateWorkflowCreate","validateYupSchema","validateUpdateStageOnEntity","validateUpdateAssigneeOnEntity","validateWorkflowUpdate","validateLocale"],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { yup, validateYupSchema } from '@strapi/utils';
|
|
2
|
+
import { hasStageAttribute } from '../utils/review-workflows.mjs';
|
|
3
|
+
import { STAGE_TRANSITION_UID } from '../constants/workflows.mjs';
|
|
4
|
+
|
|
5
|
+
const stageObject = yup.object().shape({
|
|
6
|
+
id: yup.number().integer().min(1),
|
|
7
|
+
name: yup.string().max(255).required(),
|
|
8
|
+
color: yup.string().matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
|
|
9
|
+
permissions: yup.array().of(yup.object().shape({
|
|
10
|
+
role: yup.number().integer().min(1).required(),
|
|
11
|
+
action: yup.string().oneOf([
|
|
12
|
+
STAGE_TRANSITION_UID
|
|
13
|
+
]).required(),
|
|
14
|
+
actionParameters: yup.object().shape({
|
|
15
|
+
from: yup.number().integer().min(1).required(),
|
|
16
|
+
to: yup.number().integer().min(1)
|
|
17
|
+
})
|
|
18
|
+
}))
|
|
19
|
+
});
|
|
20
|
+
const validateUpdateStageOnEntitySchema = yup.object().shape({
|
|
21
|
+
id: yup.number().integer().min(1).required()
|
|
22
|
+
}).required();
|
|
23
|
+
const validateContentTypes = yup.array().of(yup.string().test({
|
|
24
|
+
name: 'content-type-exists',
|
|
25
|
+
message: (value)=>`Content type ${value.originalValue} does not exist`,
|
|
26
|
+
test (uid) {
|
|
27
|
+
// Warning; we use the strapi global - to avoid that, it would need to refactor how
|
|
28
|
+
// we generate validation function by using a factory with the strapi instance as parameter.
|
|
29
|
+
return !!strapi.getModel(uid);
|
|
30
|
+
}
|
|
31
|
+
}).test({
|
|
32
|
+
name: 'content-type-review-workflow-enabled',
|
|
33
|
+
message: (value)=>`Content type ${value.originalValue} does not have review workflow enabled`,
|
|
34
|
+
test (uid) {
|
|
35
|
+
const model = strapi.getModel(uid);
|
|
36
|
+
// It's not a valid content type if it doesn't have the stage attribute
|
|
37
|
+
return hasStageAttribute(model);
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
const validateWorkflowCreateSchema = yup.object().shape({
|
|
41
|
+
name: yup.string().max(255).min(1, 'Workflow name can not be empty').required(),
|
|
42
|
+
stages: yup.array().of(stageObject)// @ts-expect-error - add unique property into the yup namespace typing
|
|
43
|
+
.uniqueProperty('name', 'Stage name must be unique').min(1, 'Can not create a workflow without stages').max(200, 'Can not have more than 200 stages').required('Can not create a workflow without stages'),
|
|
44
|
+
contentTypes: validateContentTypes,
|
|
45
|
+
stageRequiredToPublishName: yup.string().min(1).nullable()
|
|
46
|
+
});
|
|
47
|
+
const validateWorkflowUpdateSchema = yup.object().shape({
|
|
48
|
+
name: yup.string().max(255).min(1, 'Workflow name can not be empty'),
|
|
49
|
+
stages: yup.array().of(stageObject)// @ts-expect-error - add unique property into the yup namespace typing
|
|
50
|
+
.uniqueProperty('name', 'Stage name must be unique').min(1, 'Can not update a workflow without stages').max(200, 'Can not have more than 200 stages'),
|
|
51
|
+
contentTypes: validateContentTypes,
|
|
52
|
+
stageRequiredToPublishName: yup.string().min(1).nullable()
|
|
53
|
+
});
|
|
54
|
+
const validateUpdateAssigneeOnEntitySchema = yup.object().shape({
|
|
55
|
+
id: yup.number().integer().min(1).nullable()
|
|
56
|
+
}).required();
|
|
57
|
+
const validateLocaleSchema = yup.string().nullable();
|
|
58
|
+
const validateWorkflowCreate = validateYupSchema(validateWorkflowCreateSchema);
|
|
59
|
+
const validateUpdateStageOnEntity = validateYupSchema(validateUpdateStageOnEntitySchema);
|
|
60
|
+
const validateUpdateAssigneeOnEntity = validateYupSchema(validateUpdateAssigneeOnEntitySchema);
|
|
61
|
+
const validateWorkflowUpdate = validateYupSchema(validateWorkflowUpdateSchema);
|
|
62
|
+
const validateLocale = validateYupSchema(validateLocaleSchema);
|
|
63
|
+
|
|
64
|
+
export { validateLocale, validateUpdateAssigneeOnEntity, validateUpdateStageOnEntity, validateWorkflowCreate, validateWorkflowUpdate };
|
|
65
|
+
//# sourceMappingURL=review-workflows.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-workflows.mjs","sources":["../../../server/src/validation/review-workflows.ts"],"sourcesContent":["/* eslint-disable func-names */\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { hasStageAttribute } from '../utils/review-workflows';\nimport { STAGE_TRANSITION_UID } from '../constants/workflows';\n\nconst stageObject = yup.object().shape({\n id: yup.number().integer().min(1),\n name: yup.string().max(255).required(),\n color: yup.string().matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i), // hex color\n permissions: yup.array().of(\n yup.object().shape({\n role: yup.number().integer().min(1).required(),\n action: yup.string().oneOf([STAGE_TRANSITION_UID]).required(),\n actionParameters: yup.object().shape({\n from: yup.number().integer().min(1).required(),\n to: yup.number().integer().min(1),\n }),\n })\n ),\n});\n\nconst validateUpdateStageOnEntitySchema = yup\n .object()\n .shape({\n id: yup.number().integer().min(1).required(),\n })\n .required();\n\nconst validateContentTypes = yup.array().of(\n yup\n .string()\n .test({\n name: 'content-type-exists',\n message: (value) => `Content type ${value.originalValue} does not exist`,\n test(uid: any) {\n // Warning; we use the strapi global - to avoid that, it would need to refactor how\n // we generate validation function by using a factory with the strapi instance as parameter.\n return !!strapi.getModel(uid);\n },\n })\n .test({\n name: 'content-type-review-workflow-enabled',\n message: (value) =>\n `Content type ${value.originalValue} does not have review workflow enabled`,\n test(uid: any) {\n const model = strapi.getModel(uid);\n\n // It's not a valid content type if it doesn't have the stage attribute\n return hasStageAttribute(model);\n },\n })\n);\n\nconst validateWorkflowCreateSchema = yup.object().shape({\n name: yup.string().max(255).min(1, 'Workflow name can not be empty').required(),\n stages: yup\n .array()\n .of(stageObject)\n // @ts-expect-error - add unique property into the yup namespace typing\n .uniqueProperty('name', 'Stage name must be unique')\n .min(1, 'Can not create a workflow without stages')\n .max(200, 'Can not have more than 200 stages')\n .required('Can not create a workflow without stages'),\n contentTypes: validateContentTypes,\n stageRequiredToPublishName: yup.string().min(1).nullable(),\n});\n\nconst validateWorkflowUpdateSchema = yup.object().shape({\n name: yup.string().max(255).min(1, 'Workflow name can not be empty'),\n stages: yup\n .array()\n .of(stageObject)\n // @ts-expect-error - add unique property into the yup namespace typing\n .uniqueProperty('name', 'Stage name must be unique')\n .min(1, 'Can not update a workflow without stages')\n .max(200, 'Can not have more than 200 stages'),\n contentTypes: validateContentTypes,\n stageRequiredToPublishName: yup.string().min(1).nullable(),\n});\n\nconst validateUpdateAssigneeOnEntitySchema = yup\n .object()\n .shape({\n id: yup.number().integer().min(1).nullable(),\n })\n .required();\n\nconst validateLocaleSchema = yup.string().nullable();\n\nexport const validateWorkflowCreate = validateYupSchema(validateWorkflowCreateSchema);\nexport const validateUpdateStageOnEntity = validateYupSchema(validateUpdateStageOnEntitySchema);\nexport const validateUpdateAssigneeOnEntity = validateYupSchema(\n validateUpdateAssigneeOnEntitySchema\n);\nexport const validateWorkflowUpdate = validateYupSchema(validateWorkflowUpdateSchema);\nexport const validateLocale = validateYupSchema(validateLocaleSchema);\n\nexport default {\n validateWorkflowCreate,\n validateUpdateStageOnEntity,\n validateUpdateAssigneeOnEntity,\n validateWorkflowUpdate,\n validateLocale,\n};\n"],"names":["stageObject","yup","object","shape","id","number","integer","min","name","string","max","required","color","matches","permissions","array","of","role","action","oneOf","STAGE_TRANSITION_UID","actionParameters","from","to","validateUpdateStageOnEntitySchema","validateContentTypes","test","message","value","originalValue","uid","strapi","getModel","model","hasStageAttribute","validateWorkflowCreateSchema","stages","uniqueProperty","contentTypes","stageRequiredToPublishName","nullable","validateWorkflowUpdateSchema","validateUpdateAssigneeOnEntitySchema","validateLocaleSchema","validateWorkflowCreate","validateYupSchema","validateUpdateStageOnEntity","validateUpdateAssigneeOnEntity","validateWorkflowUpdate","validateLocale"],"mappings":"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"}
|