@strapi/review-workflows 5.41.0 → 5.42.0
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/routes/settings/components/Stages.js +26 -14
- package/dist/admin/routes/settings/components/Stages.js.map +1 -1
- package/dist/admin/routes/settings/components/Stages.mjs +26 -14
- package/dist/admin/routes/settings/components/Stages.mjs.map +1 -1
- package/dist/admin/routes/settings/id.js +21 -6
- package/dist/admin/routes/settings/id.js.map +1 -1
- package/dist/admin/routes/settings/id.mjs +21 -6
- package/dist/admin/routes/settings/id.mjs.map +1 -1
- package/dist/admin/src/routes/settings/components/Stages.d.ts +1 -1
- package/dist/server/controllers/stages.js +18 -3
- package/dist/server/controllers/stages.js.map +1 -1
- package/dist/server/controllers/stages.mjs +18 -3
- package/dist/server/controllers/stages.mjs.map +1 -1
- package/dist/server/controllers/workflows.js +15 -8
- package/dist/server/controllers/workflows.js.map +1 -1
- package/dist/server/controllers/workflows.mjs +16 -9
- package/dist/server/controllers/workflows.mjs.map +1 -1
- package/dist/server/migrations/setup-stage-transfer-to-roles.js +70 -0
- package/dist/server/migrations/setup-stage-transfer-to-roles.js.map +1 -0
- package/dist/server/migrations/setup-stage-transfer-to-roles.mjs +68 -0
- package/dist/server/migrations/setup-stage-transfer-to-roles.mjs.map +1 -0
- package/dist/server/register.js +2 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +2 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/stage-permissions.js +72 -3
- package/dist/server/services/stage-permissions.js.map +1 -1
- package/dist/server/services/stage-permissions.mjs +73 -4
- package/dist/server/services/stage-permissions.mjs.map +1 -1
- package/dist/server/services/stages.js +72 -39
- package/dist/server/services/stages.js.map +1 -1
- package/dist/server/services/stages.mjs +72 -39
- package/dist/server/services/stages.mjs.map +1 -1
- package/dist/server/src/controllers/stages.d.ts +1 -1
- package/dist/server/src/controllers/stages.d.ts.map +1 -1
- package/dist/server/src/controllers/workflows.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +35 -4
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/migrations/setup-stage-transfer-to-roles.d.ts +6 -0
- package/dist/server/src/migrations/setup-stage-transfer-to-roles.d.ts.map +1 -0
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +35 -4
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/stage-permissions.d.ts +39 -4
- package/dist/server/src/services/stage-permissions.d.ts.map +1 -1
- package/dist/server/src/services/stages.d.ts.map +1 -1
- package/dist/server/src/validation/review-workflows.d.ts.map +1 -1
- package/dist/server/validation/review-workflows.js +20 -10
- package/dist/server/validation/review-workflows.js.map +1 -1
- package/dist/server/validation/review-workflows.mjs +20 -10
- package/dist/server/validation/review-workflows.mjs.map +1 -1
- package/dist/shared/contracts/review-workflows.d.ts +4 -2
- package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var workflows = require('../constants/workflows.js');
|
|
4
|
+
var index = require('../utils/index.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Migrate review workflow stages to have "to" RBAC permissions for all roles.
|
|
8
|
+
*/ async function migrateReviewWorkflowStagesTransferToRoles({ oldContentTypes, contentTypes }) {
|
|
9
|
+
const hadToPermissions = !!oldContentTypes?.[workflows.STAGE_MODEL_UID]?.attributes?.toPermissions;
|
|
10
|
+
const hasToPermissions = !!contentTypes?.[workflows.STAGE_MODEL_UID]?.attributes?.toPermissions;
|
|
11
|
+
// If the stage content type did not have toPermissions in the previous version
|
|
12
|
+
// then we set the "to" permissions of every stage to be every current role in the app.
|
|
13
|
+
// This ensures consistent behaviour when upgrading to a strapi version with review workflows "to" RBAC.
|
|
14
|
+
if (!hadToPermissions && hasToPermissions) {
|
|
15
|
+
const roleUID = 'admin::role';
|
|
16
|
+
strapi.log.info(`Migrating all existing review workflow stages to have "to" RBAC permissions for all ${roleUID}.`);
|
|
17
|
+
const stagePermissionsService = index.getService('stage-permissions');
|
|
18
|
+
const stages = await strapi.db.query(workflows.STAGE_MODEL_UID).findMany();
|
|
19
|
+
const roles = await strapi.db.query(roleUID).findMany();
|
|
20
|
+
// Collect the permissions to add and group them by stage id.
|
|
21
|
+
const groupedPermissions = {};
|
|
22
|
+
roles.map((role)=>role.id).forEach((roleId)=>{
|
|
23
|
+
stages.map((stage)=>stage.id).forEach((stageId)=>{
|
|
24
|
+
if (!groupedPermissions[stageId]) {
|
|
25
|
+
groupedPermissions[stageId] = [];
|
|
26
|
+
}
|
|
27
|
+
groupedPermissions[stageId].push({
|
|
28
|
+
roleId,
|
|
29
|
+
toStage: stageId,
|
|
30
|
+
action: workflows.STAGE_TRANSITION_UID
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
for (const [stageId, permissions] of Object.entries(groupedPermissions)){
|
|
35
|
+
const numericalStageId = Number(stageId);
|
|
36
|
+
if (Number.isNaN(numericalStageId)) {
|
|
37
|
+
strapi.log.warn(`Unable to apply ${roleUID} "to" migration for ${workflows.STAGE_MODEL_UID} with id ${stageId}. The stage does not have a numerical id.`);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Register the "to" permissions for this stage
|
|
41
|
+
const stageToPermissions = await stagePermissionsService.registerManyTo(permissions);
|
|
42
|
+
// Read existing permissions so we don't overwrite "from" permissions
|
|
43
|
+
const existingStage = await strapi.db.query(workflows.STAGE_MODEL_UID).findOne({
|
|
44
|
+
where: {
|
|
45
|
+
id: numericalStageId
|
|
46
|
+
},
|
|
47
|
+
populate: {
|
|
48
|
+
permissions: true
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
const existingPermissionIds = (existingStage?.permissions || []).map((p)=>p.id);
|
|
52
|
+
const newPermissionIds = stageToPermissions.flat().map((permission)=>permission.id);
|
|
53
|
+
// Update the stage with merged permissions (existing "from" + new "to")
|
|
54
|
+
await strapi.db.query(workflows.STAGE_MODEL_UID).update({
|
|
55
|
+
where: {
|
|
56
|
+
id: numericalStageId
|
|
57
|
+
},
|
|
58
|
+
data: {
|
|
59
|
+
permissions: [
|
|
60
|
+
...existingPermissionIds,
|
|
61
|
+
...newPermissionIds
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = migrateReviewWorkflowStagesTransferToRoles;
|
|
70
|
+
//# sourceMappingURL=setup-stage-transfer-to-roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-stage-transfer-to-roles.js","sources":["../../../server/src/migrations/setup-stage-transfer-to-roles.ts"],"sourcesContent":["import { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\nimport { getService } from '../utils';\n\n/**\n * Migrate review workflow stages to have \"to\" RBAC permissions for all roles.\n */\nasync function migrateReviewWorkflowStagesTransferToRoles({ oldContentTypes, contentTypes }: any) {\n const hadToPermissions = !!oldContentTypes?.[STAGE_MODEL_UID]?.attributes?.toPermissions;\n const hasToPermissions = !!contentTypes?.[STAGE_MODEL_UID]?.attributes?.toPermissions;\n\n // If the stage content type did not have toPermissions in the previous version\n // then we set the \"to\" permissions of every stage to be every current role in the app.\n // This ensures consistent behaviour when upgrading to a strapi version with review workflows \"to\" RBAC.\n if (!hadToPermissions && hasToPermissions) {\n const roleUID = 'admin::role';\n strapi.log.info(\n `Migrating all existing review workflow stages to have \"to\" RBAC permissions for all ${roleUID}.`\n );\n\n const stagePermissionsService = getService('stage-permissions');\n\n const stages = await strapi.db.query(STAGE_MODEL_UID).findMany();\n const roles = await strapi.db.query(roleUID).findMany();\n\n // Collect the permissions to add and group them by stage id.\n const groupedPermissions = {} as Record<\n number,\n { roleId: number; toStage: number; action: string }[]\n >;\n roles\n .map((role) => role.id)\n .forEach((roleId) => {\n stages\n .map((stage) => stage.id)\n .forEach((stageId) => {\n if (!groupedPermissions[stageId]) {\n groupedPermissions[stageId] = [];\n }\n\n groupedPermissions[stageId].push({\n roleId,\n toStage: stageId,\n action: STAGE_TRANSITION_UID,\n });\n });\n });\n\n for (const [stageId, permissions] of Object.entries(groupedPermissions)) {\n const numericalStageId = Number(stageId);\n\n if (Number.isNaN(numericalStageId)) {\n strapi.log.warn(\n `Unable to apply ${roleUID} \"to\" migration for ${STAGE_MODEL_UID} with id ${stageId}. The stage does not have a numerical id.`\n );\n continue;\n }\n\n // Register the \"to\" permissions for this stage\n const stageToPermissions = await stagePermissionsService.registerManyTo(permissions);\n\n // Read existing permissions so we don't overwrite \"from\" permissions\n const existingStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: numericalStageId },\n populate: { permissions: true },\n });\n\n const existingPermissionIds = (existingStage?.permissions || []).map(\n (p: { id: number }) => p.id\n );\n const newPermissionIds = stageToPermissions\n .flat()\n .map((permission: { id: number }) => permission.id);\n\n // Update the stage with merged permissions (existing \"from\" + new \"to\")\n await strapi.db.query(STAGE_MODEL_UID).update({\n where: { id: numericalStageId },\n data: {\n permissions: [...existingPermissionIds, ...newPermissionIds],\n },\n });\n }\n }\n}\n\nexport default migrateReviewWorkflowStagesTransferToRoles;\n"],"names":["migrateReviewWorkflowStagesTransferToRoles","oldContentTypes","contentTypes","hadToPermissions","STAGE_MODEL_UID","attributes","toPermissions","hasToPermissions","roleUID","strapi","log","info","stagePermissionsService","getService","stages","db","query","findMany","roles","groupedPermissions","map","role","id","forEach","roleId","stage","stageId","push","toStage","action","STAGE_TRANSITION_UID","permissions","Object","entries","numericalStageId","Number","isNaN","warn","stageToPermissions","registerManyTo","existingStage","findOne","where","populate","existingPermissionIds","p","newPermissionIds","flat","permission","update","data"],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { STAGE_MODEL_UID, STAGE_TRANSITION_UID } from '../constants/workflows.mjs';
|
|
2
|
+
import { getService } from '../utils/index.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Migrate review workflow stages to have "to" RBAC permissions for all roles.
|
|
6
|
+
*/ async function migrateReviewWorkflowStagesTransferToRoles({ oldContentTypes, contentTypes }) {
|
|
7
|
+
const hadToPermissions = !!oldContentTypes?.[STAGE_MODEL_UID]?.attributes?.toPermissions;
|
|
8
|
+
const hasToPermissions = !!contentTypes?.[STAGE_MODEL_UID]?.attributes?.toPermissions;
|
|
9
|
+
// If the stage content type did not have toPermissions in the previous version
|
|
10
|
+
// then we set the "to" permissions of every stage to be every current role in the app.
|
|
11
|
+
// This ensures consistent behaviour when upgrading to a strapi version with review workflows "to" RBAC.
|
|
12
|
+
if (!hadToPermissions && hasToPermissions) {
|
|
13
|
+
const roleUID = 'admin::role';
|
|
14
|
+
strapi.log.info(`Migrating all existing review workflow stages to have "to" RBAC permissions for all ${roleUID}.`);
|
|
15
|
+
const stagePermissionsService = getService('stage-permissions');
|
|
16
|
+
const stages = await strapi.db.query(STAGE_MODEL_UID).findMany();
|
|
17
|
+
const roles = await strapi.db.query(roleUID).findMany();
|
|
18
|
+
// Collect the permissions to add and group them by stage id.
|
|
19
|
+
const groupedPermissions = {};
|
|
20
|
+
roles.map((role)=>role.id).forEach((roleId)=>{
|
|
21
|
+
stages.map((stage)=>stage.id).forEach((stageId)=>{
|
|
22
|
+
if (!groupedPermissions[stageId]) {
|
|
23
|
+
groupedPermissions[stageId] = [];
|
|
24
|
+
}
|
|
25
|
+
groupedPermissions[stageId].push({
|
|
26
|
+
roleId,
|
|
27
|
+
toStage: stageId,
|
|
28
|
+
action: STAGE_TRANSITION_UID
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
for (const [stageId, permissions] of Object.entries(groupedPermissions)){
|
|
33
|
+
const numericalStageId = Number(stageId);
|
|
34
|
+
if (Number.isNaN(numericalStageId)) {
|
|
35
|
+
strapi.log.warn(`Unable to apply ${roleUID} "to" migration for ${STAGE_MODEL_UID} with id ${stageId}. The stage does not have a numerical id.`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Register the "to" permissions for this stage
|
|
39
|
+
const stageToPermissions = await stagePermissionsService.registerManyTo(permissions);
|
|
40
|
+
// Read existing permissions so we don't overwrite "from" permissions
|
|
41
|
+
const existingStage = await strapi.db.query(STAGE_MODEL_UID).findOne({
|
|
42
|
+
where: {
|
|
43
|
+
id: numericalStageId
|
|
44
|
+
},
|
|
45
|
+
populate: {
|
|
46
|
+
permissions: true
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
const existingPermissionIds = (existingStage?.permissions || []).map((p)=>p.id);
|
|
50
|
+
const newPermissionIds = stageToPermissions.flat().map((permission)=>permission.id);
|
|
51
|
+
// Update the stage with merged permissions (existing "from" + new "to")
|
|
52
|
+
await strapi.db.query(STAGE_MODEL_UID).update({
|
|
53
|
+
where: {
|
|
54
|
+
id: numericalStageId
|
|
55
|
+
},
|
|
56
|
+
data: {
|
|
57
|
+
permissions: [
|
|
58
|
+
...existingPermissionIds,
|
|
59
|
+
...newPermissionIds
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export { migrateReviewWorkflowStagesTransferToRoles as default };
|
|
68
|
+
//# sourceMappingURL=setup-stage-transfer-to-roles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-stage-transfer-to-roles.mjs","sources":["../../../server/src/migrations/setup-stage-transfer-to-roles.ts"],"sourcesContent":["import { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\nimport { getService } from '../utils';\n\n/**\n * Migrate review workflow stages to have \"to\" RBAC permissions for all roles.\n */\nasync function migrateReviewWorkflowStagesTransferToRoles({ oldContentTypes, contentTypes }: any) {\n const hadToPermissions = !!oldContentTypes?.[STAGE_MODEL_UID]?.attributes?.toPermissions;\n const hasToPermissions = !!contentTypes?.[STAGE_MODEL_UID]?.attributes?.toPermissions;\n\n // If the stage content type did not have toPermissions in the previous version\n // then we set the \"to\" permissions of every stage to be every current role in the app.\n // This ensures consistent behaviour when upgrading to a strapi version with review workflows \"to\" RBAC.\n if (!hadToPermissions && hasToPermissions) {\n const roleUID = 'admin::role';\n strapi.log.info(\n `Migrating all existing review workflow stages to have \"to\" RBAC permissions for all ${roleUID}.`\n );\n\n const stagePermissionsService = getService('stage-permissions');\n\n const stages = await strapi.db.query(STAGE_MODEL_UID).findMany();\n const roles = await strapi.db.query(roleUID).findMany();\n\n // Collect the permissions to add and group them by stage id.\n const groupedPermissions = {} as Record<\n number,\n { roleId: number; toStage: number; action: string }[]\n >;\n roles\n .map((role) => role.id)\n .forEach((roleId) => {\n stages\n .map((stage) => stage.id)\n .forEach((stageId) => {\n if (!groupedPermissions[stageId]) {\n groupedPermissions[stageId] = [];\n }\n\n groupedPermissions[stageId].push({\n roleId,\n toStage: stageId,\n action: STAGE_TRANSITION_UID,\n });\n });\n });\n\n for (const [stageId, permissions] of Object.entries(groupedPermissions)) {\n const numericalStageId = Number(stageId);\n\n if (Number.isNaN(numericalStageId)) {\n strapi.log.warn(\n `Unable to apply ${roleUID} \"to\" migration for ${STAGE_MODEL_UID} with id ${stageId}. The stage does not have a numerical id.`\n );\n continue;\n }\n\n // Register the \"to\" permissions for this stage\n const stageToPermissions = await stagePermissionsService.registerManyTo(permissions);\n\n // Read existing permissions so we don't overwrite \"from\" permissions\n const existingStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: numericalStageId },\n populate: { permissions: true },\n });\n\n const existingPermissionIds = (existingStage?.permissions || []).map(\n (p: { id: number }) => p.id\n );\n const newPermissionIds = stageToPermissions\n .flat()\n .map((permission: { id: number }) => permission.id);\n\n // Update the stage with merged permissions (existing \"from\" + new \"to\")\n await strapi.db.query(STAGE_MODEL_UID).update({\n where: { id: numericalStageId },\n data: {\n permissions: [...existingPermissionIds, ...newPermissionIds],\n },\n });\n }\n }\n}\n\nexport default migrateReviewWorkflowStagesTransferToRoles;\n"],"names":["migrateReviewWorkflowStagesTransferToRoles","oldContentTypes","contentTypes","hadToPermissions","STAGE_MODEL_UID","attributes","toPermissions","hasToPermissions","roleUID","strapi","log","info","stagePermissionsService","getService","stages","db","query","findMany","roles","groupedPermissions","map","role","id","forEach","roleId","stage","stageId","push","toStage","action","STAGE_TRANSITION_UID","permissions","Object","entries","numericalStageId","Number","isNaN","warn","stageToPermissions","registerManyTo","existingStage","findOne","where","populate","existingPermissionIds","p","newPermissionIds","flat","permission","update","data"],"mappings":"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"}
|
package/dist/server/register.js
CHANGED
|
@@ -5,6 +5,7 @@ var index = require('./utils/index.js');
|
|
|
5
5
|
var shortenStageAttribute = require('./migrations/shorten-stage-attribute.js');
|
|
6
6
|
var setStagesDefaultColor = require('./migrations/set-stages-default-color.js');
|
|
7
7
|
var setStagesRoles = require('./migrations/set-stages-roles.js');
|
|
8
|
+
var setupStageTransferToRoles = require('./migrations/setup-stage-transfer-to-roles.js');
|
|
8
9
|
var setWorkflowDefaultName = require('./migrations/set-workflow-default-name.js');
|
|
9
10
|
var multipleWorkflows = require('./migrations/multiple-workflows.js');
|
|
10
11
|
var handleDeletedCtInWorkflows = require('./migrations/handle-deleted-ct-in-workflows.js');
|
|
@@ -94,7 +95,7 @@ var register = (async ({ strapi })=>{
|
|
|
94
95
|
strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({
|
|
95
96
|
strapi
|
|
96
97
|
}));
|
|
97
|
-
strapi.hook('strapi::content-types.afterSync').register(setStagesDefaultColor).register(setStagesRoles).register(setWorkflowDefaultName).register(multipleWorkflows).register(handleDeletedCtInWorkflows);
|
|
98
|
+
strapi.hook('strapi::content-types.afterSync').register(setStagesDefaultColor).register(setStagesRoles).register(setupStageTransferToRoles).register(setWorkflowDefaultName).register(multipleWorkflows).register(handleDeletedCtInWorkflows);
|
|
98
99
|
// Middlewares
|
|
99
100
|
reviewWorkflows.default.contentTypeMiddleware(strapi);
|
|
100
101
|
// Schema customization
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe, map } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateStageAttribute from './migrations/shorten-stage-attribute';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\n\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n ENTITY_ASSIGNEE_ATTRIBUTE,\n STAGE_MODEL_UID,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n Object.assign(contentType.attributes, {\n [attributeName]: {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n useJoinTable: true, // We want a join table to persist data when downgrading to CE\n type: 'relation',\n relation: 'oneToOne',\n target,\n },\n });\n\n return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n for (const contentTypeUID of contentTypeToExtend) {\n strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n // Set Stage attribute\n setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n // Set Assignee attribute\n setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n });\n }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n * It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the stage join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the assignee join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const enabledRWContentTypes = pipe([\n getVisibleContentTypesUID,\n filter((uid: UID.ContentType) => hasStageAttribute(contentTypes[uid])),\n ])(contentTypes);\n\n // Remove previously created join tables and persist the new ones\n const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n await persistTables(stageJoinTablesToPersist);\n\n // Remove previously created join tables and persist the new ones\n const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n await persistTables(assigneeJoinTablesToPersist);\n };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Data Migrations\n strapi.hook('strapi::content-types.beforeSync').register(migrateStageAttribute);\n strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n strapi\n .hook('strapi::content-types.afterSync')\n .register(migrateReviewWorkflowStagesColor)\n .register(migrateReviewWorkflowStagesRoles)\n .register(migrateReviewWorkflowName)\n .register(migrateWorkflowsContentTypes)\n .register(migrateDeletedCTInWorkflows);\n\n // Middlewares\n reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n // Schema customization\n extendReviewWorkflowContentTypes({ strapi });\n\n // License limits\n const reviewWorkflowsOptions = defaultsDeep(\n {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n },\n strapi.ee.features.get('review-workflows')\n );\n const workflowsValidationService = getService('validation', { strapi });\n workflowsValidationService.register(reviewWorkflowsOptions);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","pipe","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateStageAttribute","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","ee","features","workflowsValidationService","getService"],"mappings":"
|
|
1
|
+
{"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe, map } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateStageAttribute from './migrations/shorten-stage-attribute';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\n\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n ENTITY_ASSIGNEE_ATTRIBUTE,\n STAGE_MODEL_UID,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n Object.assign(contentType.attributes, {\n [attributeName]: {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n useJoinTable: true, // We want a join table to persist data when downgrading to CE\n type: 'relation',\n relation: 'oneToOne',\n target,\n },\n });\n\n return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n for (const contentTypeUID of contentTypeToExtend) {\n strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n // Set Stage attribute\n setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n // Set Assignee attribute\n setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n });\n }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n * It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the stage join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the assignee join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const enabledRWContentTypes = pipe([\n getVisibleContentTypesUID,\n filter((uid: UID.ContentType) => hasStageAttribute(contentTypes[uid])),\n ])(contentTypes);\n\n // Remove previously created join tables and persist the new ones\n const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n await persistTables(stageJoinTablesToPersist);\n\n // Remove previously created join tables and persist the new ones\n const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n await persistTables(assigneeJoinTablesToPersist);\n };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Data Migrations\n strapi.hook('strapi::content-types.beforeSync').register(migrateStageAttribute);\n strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n strapi\n .hook('strapi::content-types.afterSync')\n .register(migrateReviewWorkflowStagesColor)\n .register(migrateReviewWorkflowStagesRoles)\n .register(migrateReviewWorkflowStagesTransferToRoles)\n .register(migrateReviewWorkflowName)\n .register(migrateWorkflowsContentTypes)\n .register(migrateDeletedCTInWorkflows);\n\n // Middlewares\n reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n // Schema customization\n extendReviewWorkflowContentTypes({ strapi });\n\n // License limits\n const reviewWorkflowsOptions = defaultsDeep(\n {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n },\n strapi.ee.features.get('review-workflows')\n );\n const workflowsValidationService = getService('validation', { strapi });\n workflowsValidationService.register(reviewWorkflowsOptions);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","pipe","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateStageAttribute","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowStagesTransferToRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","ee","features","workflowsValidationService","getService"],"mappings":"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"}
|
package/dist/server/register.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import { getService, getAdminService } from './utils/index.mjs';
|
|
|
3
3
|
import migrateStageAttribute from './migrations/shorten-stage-attribute.mjs';
|
|
4
4
|
import migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color.mjs';
|
|
5
5
|
import migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles.mjs';
|
|
6
|
+
import migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles.mjs';
|
|
6
7
|
import migrateReviewWorkflowName from './migrations/set-workflow-default-name.mjs';
|
|
7
8
|
import migrateWorkflowsContentTypes from './migrations/multiple-workflows.mjs';
|
|
8
9
|
import migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows.mjs';
|
|
@@ -92,7 +93,7 @@ var register = (async ({ strapi })=>{
|
|
|
92
93
|
strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({
|
|
93
94
|
strapi
|
|
94
95
|
}));
|
|
95
|
-
strapi.hook('strapi::content-types.afterSync').register(migrateReviewWorkflowStagesColor).register(migrateReviewWorkflowStagesRoles).register(migrateReviewWorkflowName).register(migrateWorkflowsContentTypes).register(migrateDeletedCTInWorkflows);
|
|
96
|
+
strapi.hook('strapi::content-types.afterSync').register(migrateReviewWorkflowStagesColor).register(migrateReviewWorkflowStagesRoles).register(migrateReviewWorkflowStagesTransferToRoles).register(migrateReviewWorkflowName).register(migrateWorkflowsContentTypes).register(migrateDeletedCTInWorkflows);
|
|
96
97
|
// Middlewares
|
|
97
98
|
reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);
|
|
98
99
|
// Schema customization
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe, map } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateStageAttribute from './migrations/shorten-stage-attribute';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\n\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n ENTITY_ASSIGNEE_ATTRIBUTE,\n STAGE_MODEL_UID,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n Object.assign(contentType.attributes, {\n [attributeName]: {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n useJoinTable: true, // We want a join table to persist data when downgrading to CE\n type: 'relation',\n relation: 'oneToOne',\n target,\n },\n });\n\n return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n for (const contentTypeUID of contentTypeToExtend) {\n strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n // Set Stage attribute\n setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n // Set Assignee attribute\n setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n });\n }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n * It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the stage join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the assignee join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const enabledRWContentTypes = pipe([\n getVisibleContentTypesUID,\n filter((uid: UID.ContentType) => hasStageAttribute(contentTypes[uid])),\n ])(contentTypes);\n\n // Remove previously created join tables and persist the new ones\n const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n await persistTables(stageJoinTablesToPersist);\n\n // Remove previously created join tables and persist the new ones\n const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n await persistTables(assigneeJoinTablesToPersist);\n };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Data Migrations\n strapi.hook('strapi::content-types.beforeSync').register(migrateStageAttribute);\n strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n strapi\n .hook('strapi::content-types.afterSync')\n .register(migrateReviewWorkflowStagesColor)\n .register(migrateReviewWorkflowStagesRoles)\n .register(migrateReviewWorkflowName)\n .register(migrateWorkflowsContentTypes)\n .register(migrateDeletedCTInWorkflows);\n\n // Middlewares\n reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n // Schema customization\n extendReviewWorkflowContentTypes({ strapi });\n\n // License limits\n const reviewWorkflowsOptions = defaultsDeep(\n {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n },\n strapi.ee.features.get('review-workflows')\n );\n const workflowsValidationService = getService('validation', { strapi });\n workflowsValidationService.register(reviewWorkflowsOptions);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","pipe","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateStageAttribute","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","ee","features","workflowsValidationService","getService"],"mappings":"
|
|
1
|
+
{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe, map } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateStageAttribute from './migrations/shorten-stage-attribute';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\n\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n ENTITY_ASSIGNEE_ATTRIBUTE,\n STAGE_MODEL_UID,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n Object.assign(contentType.attributes, {\n [attributeName]: {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n useJoinTable: true, // We want a join table to persist data when downgrading to CE\n type: 'relation',\n relation: 'oneToOne',\n target,\n },\n });\n\n return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n for (const contentTypeUID of contentTypeToExtend) {\n strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n // Set Stage attribute\n setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n // Set Assignee attribute\n setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n });\n }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n * It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the stage join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the assignee join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const enabledRWContentTypes = pipe([\n getVisibleContentTypesUID,\n filter((uid: UID.ContentType) => hasStageAttribute(contentTypes[uid])),\n ])(contentTypes);\n\n // Remove previously created join tables and persist the new ones\n const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n await persistTables(stageJoinTablesToPersist);\n\n // Remove previously created join tables and persist the new ones\n const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n await persistTables(assigneeJoinTablesToPersist);\n };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Data Migrations\n strapi.hook('strapi::content-types.beforeSync').register(migrateStageAttribute);\n strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n strapi\n .hook('strapi::content-types.afterSync')\n .register(migrateReviewWorkflowStagesColor)\n .register(migrateReviewWorkflowStagesRoles)\n .register(migrateReviewWorkflowStagesTransferToRoles)\n .register(migrateReviewWorkflowName)\n .register(migrateWorkflowsContentTypes)\n .register(migrateDeletedCTInWorkflows);\n\n // Middlewares\n reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n // Schema customization\n extendReviewWorkflowContentTypes({ strapi });\n\n // License limits\n const reviewWorkflowsOptions = defaultsDeep(\n {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n },\n strapi.ee.features.get('review-workflows')\n );\n const workflowsValidationService = getService('validation', { strapi });\n workflowsValidationService.register(reviewWorkflowsOptions);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","pipe","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateStageAttribute","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowStagesTransferToRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","ee","features","workflowsValidationService","getService"],"mappings":"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"}
|
|
@@ -12,6 +12,13 @@ const validActions = [
|
|
|
12
12
|
var stagePermissions = (({ strapi })=>{
|
|
13
13
|
const roleService = index.getAdminService('role');
|
|
14
14
|
const permissionService = index.getAdminService('permission');
|
|
15
|
+
const getUserRoles = ()=>{
|
|
16
|
+
const requestState = strapi.requestContext.get()?.state;
|
|
17
|
+
if (!requestState) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return requestState.user?.roles ?? null;
|
|
21
|
+
};
|
|
15
22
|
return {
|
|
16
23
|
async register ({ roleId, action, fromStage }) {
|
|
17
24
|
if (!validActions.includes(action)) {
|
|
@@ -31,6 +38,23 @@ var stagePermissions = (({ strapi })=>{
|
|
|
31
38
|
async registerMany (permissions) {
|
|
32
39
|
return utils.async.map(permissions, this.register);
|
|
33
40
|
},
|
|
41
|
+
async registerTo ({ roleId, action, toStage }) {
|
|
42
|
+
if (!validActions.includes(action)) {
|
|
43
|
+
throw new ApplicationError(`Invalid action ${action}`);
|
|
44
|
+
}
|
|
45
|
+
const permissions = await roleService.addPermissions(roleId, [
|
|
46
|
+
{
|
|
47
|
+
action,
|
|
48
|
+
actionParameters: {
|
|
49
|
+
to: toStage
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
]);
|
|
53
|
+
return permissions;
|
|
54
|
+
},
|
|
55
|
+
async registerManyTo (permissions) {
|
|
56
|
+
return utils.async.map(permissions, this.registerTo);
|
|
57
|
+
},
|
|
34
58
|
async unregister (permissions) {
|
|
35
59
|
const permissionIds = permissions.map(fp.prop('id'));
|
|
36
60
|
await permissionService.deleteByIds(permissionIds);
|
|
@@ -40,9 +64,11 @@ var stagePermissions = (({ strapi })=>{
|
|
|
40
64
|
if (!requestState) {
|
|
41
65
|
return false;
|
|
42
66
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
67
|
+
const userRoles = getUserRoles();
|
|
68
|
+
if (!userRoles) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
if (userRoles.some((role)=>role.code === 'strapi-super-admin')) {
|
|
46
72
|
return true;
|
|
47
73
|
}
|
|
48
74
|
return requestState.userAbility.can({
|
|
@@ -51,6 +77,49 @@ var stagePermissions = (({ strapi })=>{
|
|
|
51
77
|
from: fromStage
|
|
52
78
|
}
|
|
53
79
|
});
|
|
80
|
+
},
|
|
81
|
+
async canTransitionToStage (toStageId) {
|
|
82
|
+
const userRoles = getUserRoles();
|
|
83
|
+
if (!userRoles) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (userRoles.some((role)=>role.code === 'strapi-super-admin')) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
const targetStage = await strapi.db.query(workflows.STAGE_MODEL_UID).findOne({
|
|
90
|
+
where: {
|
|
91
|
+
id: toStageId
|
|
92
|
+
},
|
|
93
|
+
populate: {
|
|
94
|
+
permissions: {
|
|
95
|
+
populate: [
|
|
96
|
+
'role'
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
if (!targetStage) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return this.canTransitionToStageWithPermissions(targetStage);
|
|
105
|
+
},
|
|
106
|
+
/**
|
|
107
|
+
* Check if the current user can transition to a stage using pre-loaded permissions.
|
|
108
|
+
* The stage must already have its permissions populated with roles.
|
|
109
|
+
*/ canTransitionToStageWithPermissions (stage) {
|
|
110
|
+
const userRoles = getUserRoles();
|
|
111
|
+
if (!userRoles) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (userRoles.some((role)=>role.code === 'strapi-super-admin')) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
const toPermissions = (stage.permissions || []).filter((p)=>p.actionParameters?.to);
|
|
118
|
+
const userRoleIds = new Set(userRoles.map((role)=>role.id));
|
|
119
|
+
return toPermissions.some((p)=>{
|
|
120
|
+
const roleId = typeof p.role === 'object' ? p.role?.id : p.role;
|
|
121
|
+
return roleId !== undefined && userRoleIds.has(roleId);
|
|
122
|
+
});
|
|
54
123
|
}
|
|
55
124
|
};
|
|
56
125
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage-permissions.js","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { prop } from 'lodash/fp';\nimport { async, errors } from '@strapi/utils';\nimport {
|
|
1
|
+
{"version":3,"file":"stage-permissions.js","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { prop } from 'lodash/fp';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = [STAGE_TRANSITION_UID];\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map(prop('id'));\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","includes","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","prop","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","id","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","Set","undefined","has"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { prop } from 'lodash/fp';
|
|
2
2
|
import { errors, async } from '@strapi/utils';
|
|
3
3
|
import { getAdminService } from '../utils/index.mjs';
|
|
4
|
-
import { STAGE_TRANSITION_UID } from '../constants/workflows.mjs';
|
|
4
|
+
import { STAGE_MODEL_UID, STAGE_TRANSITION_UID } from '../constants/workflows.mjs';
|
|
5
5
|
|
|
6
6
|
const { ApplicationError } = errors;
|
|
7
7
|
const validActions = [
|
|
@@ -10,6 +10,13 @@ const validActions = [
|
|
|
10
10
|
var stagePermissions = (({ strapi })=>{
|
|
11
11
|
const roleService = getAdminService('role');
|
|
12
12
|
const permissionService = getAdminService('permission');
|
|
13
|
+
const getUserRoles = ()=>{
|
|
14
|
+
const requestState = strapi.requestContext.get()?.state;
|
|
15
|
+
if (!requestState) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return requestState.user?.roles ?? null;
|
|
19
|
+
};
|
|
13
20
|
return {
|
|
14
21
|
async register ({ roleId, action, fromStage }) {
|
|
15
22
|
if (!validActions.includes(action)) {
|
|
@@ -29,6 +36,23 @@ var stagePermissions = (({ strapi })=>{
|
|
|
29
36
|
async registerMany (permissions) {
|
|
30
37
|
return async.map(permissions, this.register);
|
|
31
38
|
},
|
|
39
|
+
async registerTo ({ roleId, action, toStage }) {
|
|
40
|
+
if (!validActions.includes(action)) {
|
|
41
|
+
throw new ApplicationError(`Invalid action ${action}`);
|
|
42
|
+
}
|
|
43
|
+
const permissions = await roleService.addPermissions(roleId, [
|
|
44
|
+
{
|
|
45
|
+
action,
|
|
46
|
+
actionParameters: {
|
|
47
|
+
to: toStage
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
]);
|
|
51
|
+
return permissions;
|
|
52
|
+
},
|
|
53
|
+
async registerManyTo (permissions) {
|
|
54
|
+
return async.map(permissions, this.registerTo);
|
|
55
|
+
},
|
|
32
56
|
async unregister (permissions) {
|
|
33
57
|
const permissionIds = permissions.map(prop('id'));
|
|
34
58
|
await permissionService.deleteByIds(permissionIds);
|
|
@@ -38,9 +62,11 @@ var stagePermissions = (({ strapi })=>{
|
|
|
38
62
|
if (!requestState) {
|
|
39
63
|
return false;
|
|
40
64
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
65
|
+
const userRoles = getUserRoles();
|
|
66
|
+
if (!userRoles) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (userRoles.some((role)=>role.code === 'strapi-super-admin')) {
|
|
44
70
|
return true;
|
|
45
71
|
}
|
|
46
72
|
return requestState.userAbility.can({
|
|
@@ -49,6 +75,49 @@ var stagePermissions = (({ strapi })=>{
|
|
|
49
75
|
from: fromStage
|
|
50
76
|
}
|
|
51
77
|
});
|
|
78
|
+
},
|
|
79
|
+
async canTransitionToStage (toStageId) {
|
|
80
|
+
const userRoles = getUserRoles();
|
|
81
|
+
if (!userRoles) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
if (userRoles.some((role)=>role.code === 'strapi-super-admin')) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({
|
|
88
|
+
where: {
|
|
89
|
+
id: toStageId
|
|
90
|
+
},
|
|
91
|
+
populate: {
|
|
92
|
+
permissions: {
|
|
93
|
+
populate: [
|
|
94
|
+
'role'
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
if (!targetStage) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return this.canTransitionToStageWithPermissions(targetStage);
|
|
103
|
+
},
|
|
104
|
+
/**
|
|
105
|
+
* Check if the current user can transition to a stage using pre-loaded permissions.
|
|
106
|
+
* The stage must already have its permissions populated with roles.
|
|
107
|
+
*/ canTransitionToStageWithPermissions (stage) {
|
|
108
|
+
const userRoles = getUserRoles();
|
|
109
|
+
if (!userRoles) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
if (userRoles.some((role)=>role.code === 'strapi-super-admin')) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
const toPermissions = (stage.permissions || []).filter((p)=>p.actionParameters?.to);
|
|
116
|
+
const userRoleIds = new Set(userRoles.map((role)=>role.id));
|
|
117
|
+
return toPermissions.some((p)=>{
|
|
118
|
+
const roleId = typeof p.role === 'object' ? p.role?.id : p.role;
|
|
119
|
+
return roleId !== undefined && userRoleIds.has(roleId);
|
|
120
|
+
});
|
|
52
121
|
}
|
|
53
122
|
};
|
|
54
123
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage-permissions.mjs","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { prop } from 'lodash/fp';\nimport { async, errors } from '@strapi/utils';\nimport {
|
|
1
|
+
{"version":3,"file":"stage-permissions.mjs","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { prop } from 'lodash/fp';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = [STAGE_TRANSITION_UID];\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map(prop('id'));\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","includes","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","prop","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","id","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","Set","undefined","has"],"mappings":"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"}
|