@strapi/review-workflows 5.50.0 → 5.50.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/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/routes/content-manager/model/components/AssigneeFilter.js +1 -1
- package/dist/admin/routes/content-manager/model/components/AssigneeFilter.js.map +1 -1
- package/dist/admin/routes/content-manager/model/components/AssigneeFilter.mjs +1 -1
- package/dist/admin/routes/content-manager/model/components/AssigneeFilter.mjs.map +1 -1
- package/dist/admin/routes/content-manager/model/components/StageFilter.js.map +1 -1
- package/dist/admin/routes/content-manager/model/components/StageFilter.mjs.map +1 -1
- package/dist/admin/routes/settings/components/Stages.js +4 -3
- package/dist/admin/routes/settings/components/Stages.js.map +1 -1
- package/dist/admin/routes/settings/components/Stages.mjs +4 -3
- package/dist/admin/routes/settings/components/Stages.mjs.map +1 -1
- package/dist/admin/routes/settings/components/WorkflowAttributes.js +2 -2
- package/dist/admin/routes/settings/components/WorkflowAttributes.js.map +1 -1
- package/dist/admin/routes/settings/components/WorkflowAttributes.mjs +2 -2
- package/dist/admin/routes/settings/components/WorkflowAttributes.mjs.map +1 -1
- package/dist/admin/src/routes/content-manager/model/constants.d.ts +2 -2
- package/dist/admin/src/routes/settings/components/Stages.d.ts +1 -1
- package/dist/admin/src/services/admin.d.ts +1 -1
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/content-manager.d.ts +8 -8
- package/dist/admin/src/services/settings.d.ts +1392 -1392
- package/dist/admin/src/utils/api.d.ts +2 -2
- package/dist/admin/src/utils/cm-hooks.d.ts +2 -2
- package/dist/admin/translations/ko.json.js +41 -0
- package/dist/admin/translations/ko.json.js.map +1 -0
- package/dist/admin/translations/ko.json.mjs +39 -0
- package/dist/admin/translations/ko.json.mjs.map +1 -0
- package/dist/admin/translations/pl.json.js +34 -1
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +34 -1
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/utils/api.js.map +1 -1
- package/dist/admin/utils/api.mjs.map +1 -1
- package/dist/server/bootstrap.js +4 -4
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +4 -4
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/constants/workflows.js +1 -1
- package/dist/server/constants/workflows.js.map +1 -1
- package/dist/server/constants/workflows.mjs +1 -1
- package/dist/server/constants/workflows.mjs.map +1 -1
- package/dist/server/controllers/stages.js.map +1 -1
- package/dist/server/controllers/stages.mjs.map +1 -1
- package/dist/server/controllers/workflows.js.map +1 -1
- package/dist/server/controllers/workflows.mjs.map +1 -1
- package/dist/server/destroy.js +1 -1
- package/dist/server/destroy.js.map +1 -1
- package/dist/server/destroy.mjs +1 -1
- package/dist/server/destroy.mjs.map +1 -1
- package/dist/server/register.js +0 -2
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +0 -2
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/assignees.js.map +1 -1
- package/dist/server/services/assignees.mjs.map +1 -1
- package/dist/server/services/document-service-middleware.js +3 -3
- package/dist/server/services/document-service-middleware.js.map +1 -1
- package/dist/server/services/document-service-middleware.mjs +3 -3
- package/dist/server/services/document-service-middleware.mjs.map +1 -1
- package/dist/server/services/stages.js.map +1 -1
- package/dist/server/services/stages.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +4 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/constants/workflows.d.ts +1 -1
- package/dist/server/src/destroy.d.ts +1 -4
- package/dist/server/src/destroy.d.ts.map +1 -1
- package/dist/server/src/homepage/index.d.ts +3 -3
- package/dist/server/src/homepage/routes/index.d.ts +1 -1
- package/dist/server/src/homepage/services/index.d.ts +1 -1
- package/dist/server/src/index.d.ts +18 -18
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +1 -1
- package/dist/server/src/services/assignees.d.ts +2 -2
- package/dist/server/src/services/assignees.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +13 -13
- package/dist/server/src/services/stages.d.ts +1 -1
- package/dist/server/src/services/stages.d.ts.map +1 -1
- package/package.json +20 -9
- package/dist/server/migrations/shorten-stage-attribute.js +0 -49
- package/dist/server/migrations/shorten-stage-attribute.js.map +0 -1
- package/dist/server/migrations/shorten-stage-attribute.mjs +0 -43
- package/dist/server/migrations/shorten-stage-attribute.mjs.map +0 -1
- package/dist/server/src/migrations/shorten-stage-attribute.d.ts +0 -6
- package/dist/server/src/migrations/shorten-stage-attribute.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.js","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { update, map, property } from 'lodash/fp';\n\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { validateWorkflowCreate, validateWorkflowUpdate } from '../validation/review-workflows';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\n\n/**\n *\n * @param { Core.Strapi } strapi - Strapi instance\n * @param userAbility\n * @return { PermissionChecker }\n */\nfunction getWorkflowsPermissionChecker({ strapi }: { strapi: Core.Strapi }, userAbility: unknown) {\n return strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model: WORKFLOW_MODEL_UID });\n}\n\n/**\n * Transforms workflow to an admin UI format.\n * Some attributes (like permissions) are presented in a different format in the admin UI.\n *\n * Permissions stored on each stage are split into two arrays:\n * - `fromPermissions`: entries with `actionParameters.from` (controls who can move\n * content out of the stage)\n * - `toPermissions`: entries with `actionParameters.to` (controls who can move\n * content into the stage)\n *\n * Role objects are also flattened to their numeric id.\n */\n\n/**\n * Shape of a permission row as returned by the DB populate.\n */\ninterface PopulatedPermission {\n action: string;\n subject?: string | null;\n role: number | { id: number };\n actionParameters?: { from?: number; to?: number };\n}\n\ninterface PopulatedStage {\n permissions?: PopulatedPermission[];\n [key: string]: unknown;\n}\n\nfunction formatWorkflowToAdmin(workflow: { stages?: PopulatedStage[]; [key: string]: unknown }) {\n if (!workflow) return;\n if (!workflow.stages) return workflow;\n\n const transformRoleToId = ({\n actionParameters: _,\n role,\n ...rest\n }: PopulatedPermission): StagePermission => ({\n ...rest,\n role: typeof role === 'object' ? role.id : role,\n });\n\n const transformStages = map((stage: PopulatedStage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map(transformRoleToId);\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map(transformRoleToId);\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return update('stages', transformStages, workflow);\n}\n\nexport default {\n /**\n * Create a new workflow\n */\n async create(ctx: Context) {\n const { body, query } = ctx.request;\n const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.create(query);\n\n const workflowBody = await validateWorkflowCreate(body.data);\n\n const workflowService = getService('workflows');\n const createdWorkflow = await workflowService\n .create({\n data: await sanitizeCreateInput(workflowBody),\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n ctx.created({\n data: await sanitizeOutput(createdWorkflow),\n });\n },\n\n /**\n * Update a workflow\n */\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { body, query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.update(query);\n const workflowBody = await validateWorkflowUpdate(body.data);\n\n // Find if workflow exists\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound();\n }\n\n // Sanitize input data\n const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow);\n const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);\n\n // Update workflow\n const updatedWorkflow = await workflowService\n .update(workflow, {\n data: dataToUpdate,\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n // Send sanitized response\n ctx.body = {\n data: await sanitizeOutput(updatedWorkflow),\n };\n },\n\n /**\n * Delete a workflow\n */\n async delete(ctx: Context) {\n const { id } = ctx.params;\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.delete(query);\n\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound(\"Workflow doesn't exist\");\n }\n\n const deletedWorkflow = await workflowService\n .delete(workflow, { populate })\n .then(formatWorkflowToAdmin);\n\n ctx.body = {\n data: await sanitizeOutput(deletedWorkflow),\n };\n },\n\n /**\n * List all workflows\n */\n async find(ctx: Context) {\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate, filters, sort } = await sanitizedQuery.read(query);\n\n const [workflows, workflowCount] = await Promise.all([\n workflowService.find({ populate, filters, sort }).then(map(formatWorkflowToAdmin)),\n workflowService.count(),\n ]);\n\n ctx.body = {\n data: await async.map(workflows, sanitizeOutput),\n meta: {\n workflowCount,\n },\n };\n },\n};\n"],"names":["getWorkflowsPermissionChecker","strapi","userAbility","plugin","service","create","model","WORKFLOW_MODEL_UID","formatWorkflowToAdmin","workflow","stages","transformRoleToId","actionParameters","_","role","rest","id","transformStages","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","toPermissions","to","update","ctx","body","query","request","sanitizeCreateInput","sanitizeOutput","sanitizedQuery","state","populate","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","params","sanitizeUpdateInput","validateWorkflowUpdate","findById","WORKFLOW_POPULATE","notFound","getPermittedFieldToUpdate","dataToUpdate","updatedWorkflow","delete","deletedWorkflow","find","filters","sort","read","workflows","workflowCount","Promise","all","count","async","meta"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workflows.js","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { update, map } from 'lodash/fp';\n\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { validateWorkflowCreate, validateWorkflowUpdate } from '../validation/review-workflows';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\n\n/**\n *\n * @param { Core.Strapi } strapi - Strapi instance\n * @param userAbility\n * @return { PermissionChecker }\n */\nfunction getWorkflowsPermissionChecker({ strapi }: { strapi: Core.Strapi }, userAbility: unknown) {\n return strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model: WORKFLOW_MODEL_UID });\n}\n\n/**\n * Transforms workflow to an admin UI format.\n * Some attributes (like permissions) are presented in a different format in the admin UI.\n *\n * Permissions stored on each stage are split into two arrays:\n * - `fromPermissions`: entries with `actionParameters.from` (controls who can move\n * content out of the stage)\n * - `toPermissions`: entries with `actionParameters.to` (controls who can move\n * content into the stage)\n *\n * Role objects are also flattened to their numeric id.\n */\n\n/**\n * Shape of a permission row as returned by the DB populate.\n */\ninterface PopulatedPermission {\n action: string;\n subject?: string | null;\n role: number | { id: number };\n actionParameters?: { from?: number; to?: number };\n}\n\ninterface PopulatedStage {\n permissions?: PopulatedPermission[];\n [key: string]: unknown;\n}\n\nfunction formatWorkflowToAdmin(workflow: { stages?: PopulatedStage[]; [key: string]: unknown }) {\n if (!workflow) return;\n if (!workflow.stages) return workflow;\n\n const transformRoleToId = ({\n actionParameters: _,\n role,\n ...rest\n }: PopulatedPermission): StagePermission => ({\n ...rest,\n role: typeof role === 'object' ? role.id : role,\n });\n\n const transformStages = map((stage: PopulatedStage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map(transformRoleToId);\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map(transformRoleToId);\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return update('stages', transformStages, workflow);\n}\n\nexport default {\n /**\n * Create a new workflow\n */\n async create(ctx: Context) {\n const { body, query } = ctx.request;\n const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.create(query);\n\n const workflowBody = await validateWorkflowCreate(body.data);\n\n const workflowService = getService('workflows');\n const createdWorkflow = await workflowService\n .create({\n data: await sanitizeCreateInput(workflowBody),\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n ctx.created({\n data: await sanitizeOutput(createdWorkflow),\n });\n },\n\n /**\n * Update a workflow\n */\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { body, query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.update(query);\n const workflowBody = await validateWorkflowUpdate(body.data);\n\n // Find if workflow exists\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound();\n }\n\n // Sanitize input data\n const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow);\n const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);\n\n // Update workflow\n const updatedWorkflow = await workflowService\n .update(workflow, {\n data: dataToUpdate,\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n // Send sanitized response\n ctx.body = {\n data: await sanitizeOutput(updatedWorkflow),\n };\n },\n\n /**\n * Delete a workflow\n */\n async delete(ctx: Context) {\n const { id } = ctx.params;\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.delete(query);\n\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound(\"Workflow doesn't exist\");\n }\n\n const deletedWorkflow = await workflowService\n .delete(workflow, { populate })\n .then(formatWorkflowToAdmin);\n\n ctx.body = {\n data: await sanitizeOutput(deletedWorkflow),\n };\n },\n\n /**\n * List all workflows\n */\n async find(ctx: Context) {\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate, filters, sort } = await sanitizedQuery.read(query);\n\n const [workflows, workflowCount] = await Promise.all([\n workflowService.find({ populate, filters, sort }).then(map(formatWorkflowToAdmin)),\n workflowService.count(),\n ]);\n\n ctx.body = {\n data: await async.map(workflows, sanitizeOutput),\n meta: {\n workflowCount,\n },\n };\n },\n};\n"],"names":["getWorkflowsPermissionChecker","strapi","userAbility","plugin","service","create","model","WORKFLOW_MODEL_UID","formatWorkflowToAdmin","workflow","stages","transformRoleToId","actionParameters","_","role","rest","id","transformStages","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","toPermissions","to","update","ctx","body","query","request","sanitizeCreateInput","sanitizeOutput","sanitizedQuery","state","populate","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","params","sanitizeUpdateInput","validateWorkflowUpdate","findById","WORKFLOW_POPULATE","notFound","getPermittedFieldToUpdate","dataToUpdate","updatedWorkflow","delete","deletedWorkflow","find","filters","sort","read","workflows","workflowCount","Promise","all","count","async","meta"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.mjs","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { update, map, property } from 'lodash/fp';\n\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { validateWorkflowCreate, validateWorkflowUpdate } from '../validation/review-workflows';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\n\n/**\n *\n * @param { Core.Strapi } strapi - Strapi instance\n * @param userAbility\n * @return { PermissionChecker }\n */\nfunction getWorkflowsPermissionChecker({ strapi }: { strapi: Core.Strapi }, userAbility: unknown) {\n return strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model: WORKFLOW_MODEL_UID });\n}\n\n/**\n * Transforms workflow to an admin UI format.\n * Some attributes (like permissions) are presented in a different format in the admin UI.\n *\n * Permissions stored on each stage are split into two arrays:\n * - `fromPermissions`: entries with `actionParameters.from` (controls who can move\n * content out of the stage)\n * - `toPermissions`: entries with `actionParameters.to` (controls who can move\n * content into the stage)\n *\n * Role objects are also flattened to their numeric id.\n */\n\n/**\n * Shape of a permission row as returned by the DB populate.\n */\ninterface PopulatedPermission {\n action: string;\n subject?: string | null;\n role: number | { id: number };\n actionParameters?: { from?: number; to?: number };\n}\n\ninterface PopulatedStage {\n permissions?: PopulatedPermission[];\n [key: string]: unknown;\n}\n\nfunction formatWorkflowToAdmin(workflow: { stages?: PopulatedStage[]; [key: string]: unknown }) {\n if (!workflow) return;\n if (!workflow.stages) return workflow;\n\n const transformRoleToId = ({\n actionParameters: _,\n role,\n ...rest\n }: PopulatedPermission): StagePermission => ({\n ...rest,\n role: typeof role === 'object' ? role.id : role,\n });\n\n const transformStages = map((stage: PopulatedStage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map(transformRoleToId);\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map(transformRoleToId);\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return update('stages', transformStages, workflow);\n}\n\nexport default {\n /**\n * Create a new workflow\n */\n async create(ctx: Context) {\n const { body, query } = ctx.request;\n const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.create(query);\n\n const workflowBody = await validateWorkflowCreate(body.data);\n\n const workflowService = getService('workflows');\n const createdWorkflow = await workflowService\n .create({\n data: await sanitizeCreateInput(workflowBody),\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n ctx.created({\n data: await sanitizeOutput(createdWorkflow),\n });\n },\n\n /**\n * Update a workflow\n */\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { body, query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.update(query);\n const workflowBody = await validateWorkflowUpdate(body.data);\n\n // Find if workflow exists\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound();\n }\n\n // Sanitize input data\n const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow);\n const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);\n\n // Update workflow\n const updatedWorkflow = await workflowService\n .update(workflow, {\n data: dataToUpdate,\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n // Send sanitized response\n ctx.body = {\n data: await sanitizeOutput(updatedWorkflow),\n };\n },\n\n /**\n * Delete a workflow\n */\n async delete(ctx: Context) {\n const { id } = ctx.params;\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.delete(query);\n\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound(\"Workflow doesn't exist\");\n }\n\n const deletedWorkflow = await workflowService\n .delete(workflow, { populate })\n .then(formatWorkflowToAdmin);\n\n ctx.body = {\n data: await sanitizeOutput(deletedWorkflow),\n };\n },\n\n /**\n * List all workflows\n */\n async find(ctx: Context) {\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate, filters, sort } = await sanitizedQuery.read(query);\n\n const [workflows, workflowCount] = await Promise.all([\n workflowService.find({ populate, filters, sort }).then(map(formatWorkflowToAdmin)),\n workflowService.count(),\n ]);\n\n ctx.body = {\n data: await async.map(workflows, sanitizeOutput),\n meta: {\n workflowCount,\n },\n };\n },\n};\n"],"names":["getWorkflowsPermissionChecker","strapi","userAbility","plugin","service","create","model","WORKFLOW_MODEL_UID","formatWorkflowToAdmin","workflow","stages","transformRoleToId","actionParameters","_","role","rest","id","transformStages","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","toPermissions","to","update","ctx","body","query","request","sanitizeCreateInput","sanitizeOutput","sanitizedQuery","state","populate","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","params","sanitizeUpdateInput","validateWorkflowUpdate","findById","WORKFLOW_POPULATE","notFound","getPermittedFieldToUpdate","dataToUpdate","updatedWorkflow","delete","deletedWorkflow","find","filters","sort","read","workflows","workflowCount","Promise","all","count","async","meta"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workflows.mjs","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { update, map } from 'lodash/fp';\n\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { validateWorkflowCreate, validateWorkflowUpdate } from '../validation/review-workflows';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\n\n/**\n *\n * @param { Core.Strapi } strapi - Strapi instance\n * @param userAbility\n * @return { PermissionChecker }\n */\nfunction getWorkflowsPermissionChecker({ strapi }: { strapi: Core.Strapi }, userAbility: unknown) {\n return strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model: WORKFLOW_MODEL_UID });\n}\n\n/**\n * Transforms workflow to an admin UI format.\n * Some attributes (like permissions) are presented in a different format in the admin UI.\n *\n * Permissions stored on each stage are split into two arrays:\n * - `fromPermissions`: entries with `actionParameters.from` (controls who can move\n * content out of the stage)\n * - `toPermissions`: entries with `actionParameters.to` (controls who can move\n * content into the stage)\n *\n * Role objects are also flattened to their numeric id.\n */\n\n/**\n * Shape of a permission row as returned by the DB populate.\n */\ninterface PopulatedPermission {\n action: string;\n subject?: string | null;\n role: number | { id: number };\n actionParameters?: { from?: number; to?: number };\n}\n\ninterface PopulatedStage {\n permissions?: PopulatedPermission[];\n [key: string]: unknown;\n}\n\nfunction formatWorkflowToAdmin(workflow: { stages?: PopulatedStage[]; [key: string]: unknown }) {\n if (!workflow) return;\n if (!workflow.stages) return workflow;\n\n const transformRoleToId = ({\n actionParameters: _,\n role,\n ...rest\n }: PopulatedPermission): StagePermission => ({\n ...rest,\n role: typeof role === 'object' ? role.id : role,\n });\n\n const transformStages = map((stage: PopulatedStage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map(transformRoleToId);\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map(transformRoleToId);\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return update('stages', transformStages, workflow);\n}\n\nexport default {\n /**\n * Create a new workflow\n */\n async create(ctx: Context) {\n const { body, query } = ctx.request;\n const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.create(query);\n\n const workflowBody = await validateWorkflowCreate(body.data);\n\n const workflowService = getService('workflows');\n const createdWorkflow = await workflowService\n .create({\n data: await sanitizeCreateInput(workflowBody),\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n ctx.created({\n data: await sanitizeOutput(createdWorkflow),\n });\n },\n\n /**\n * Update a workflow\n */\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { body, query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.update(query);\n const workflowBody = await validateWorkflowUpdate(body.data);\n\n // Find if workflow exists\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound();\n }\n\n // Sanitize input data\n const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow);\n const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);\n\n // Update workflow\n const updatedWorkflow = await workflowService\n .update(workflow, {\n data: dataToUpdate,\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n // Send sanitized response\n ctx.body = {\n data: await sanitizeOutput(updatedWorkflow),\n };\n },\n\n /**\n * Delete a workflow\n */\n async delete(ctx: Context) {\n const { id } = ctx.params;\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.delete(query);\n\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound(\"Workflow doesn't exist\");\n }\n\n const deletedWorkflow = await workflowService\n .delete(workflow, { populate })\n .then(formatWorkflowToAdmin);\n\n ctx.body = {\n data: await sanitizeOutput(deletedWorkflow),\n };\n },\n\n /**\n * List all workflows\n */\n async find(ctx: Context) {\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate, filters, sort } = await sanitizedQuery.read(query);\n\n const [workflows, workflowCount] = await Promise.all([\n workflowService.find({ populate, filters, sort }).then(map(formatWorkflowToAdmin)),\n workflowService.count(),\n ]);\n\n ctx.body = {\n data: await async.map(workflows, sanitizeOutput),\n meta: {\n workflowCount,\n },\n };\n },\n};\n"],"names":["getWorkflowsPermissionChecker","strapi","userAbility","plugin","service","create","model","WORKFLOW_MODEL_UID","formatWorkflowToAdmin","workflow","stages","transformRoleToId","actionParameters","_","role","rest","id","transformStages","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","toPermissions","to","update","ctx","body","query","request","sanitizeCreateInput","sanitizeOutput","sanitizedQuery","state","populate","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","params","sanitizeUpdateInput","validateWorkflowUpdate","findById","WORKFLOW_POPULATE","notFound","getPermittedFieldToUpdate","dataToUpdate","updatedWorkflow","delete","deletedWorkflow","find","filters","sort","read","workflows","workflowCount","Promise","all","count","async","meta"],"mappings":"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"}
|
package/dist/server/destroy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destroy.js","sources":["../../server/src/destroy.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"destroy.js","sources":["../../server/src/destroy.ts"],"sourcesContent":["export default async () => {};\n"],"names":[],"mappings":";;AAAA,cAAe,CAAA,UAAA,CAAa,CAAA;;;;"}
|
package/dist/server/destroy.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destroy.mjs","sources":["../../server/src/destroy.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"destroy.mjs","sources":["../../server/src/destroy.ts"],"sourcesContent":["export default async () => {};\n"],"names":[],"mappings":"AAAA,cAAe,CAAA,UAAA,CAAa,CAAA;;;;"}
|
package/dist/server/register.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
4
|
var index = require('./utils/index.js');
|
|
5
|
-
var shortenStageAttribute = require('./migrations/shorten-stage-attribute.js');
|
|
6
5
|
var setStagesDefaultColor = require('./migrations/set-stages-default-color.js');
|
|
7
6
|
var setStagesRoles = require('./migrations/set-stages-roles.js');
|
|
8
7
|
var setupStageTransferToRoles = require('./migrations/setup-stage-transfer-to-roles.js');
|
|
@@ -91,7 +90,6 @@ const setRelation = (attributeName, target, contentType)=>{
|
|
|
91
90
|
}
|
|
92
91
|
var register = (async ({ strapi })=>{
|
|
93
92
|
// Data Migrations
|
|
94
|
-
strapi.hook('strapi::content-types.beforeSync').register(shortenStageAttribute);
|
|
95
93
|
strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({
|
|
96
94
|
strapi
|
|
97
95
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe
|
|
1
|
+
{"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\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.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","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowStagesTransferToRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","ee","features","workflowsValidationService","getService"],"mappings":";;;;;;;;;;;;;;AAuBA,MAAMA,WAAAA,GAAc,CAACC,aAAAA,EAAoBC,MAAAA,EAAaC,WAAAA,GAAAA;AACpDC,IAAAA,MAAAA,CAAOC,MAAM,CAACF,WAAAA,CAAYG,UAAU,EAAE;AACpC,QAAA,CAACL,gBAAgB;YACfM,QAAAA,EAAU,IAAA;YACVC,OAAAA,EAAS,KAAA;YACTC,YAAAA,EAAc,KAAA;YACdC,OAAAA,EAAS,KAAA;YACTC,YAAAA,EAAc,IAAA;YACdC,IAAAA,EAAM,UAAA;YACNC,QAAAA,EAAU,UAAA;AACVX,YAAAA;AACF;AACF,KAAA,CAAA;IAEA,OAAOC,WAAAA;AACT,CAAA;AAEA;;AAEC,IACD,SAASW,gCAAAA,CAAiC,EAAEC,MAAM,EAA2B,EAAA;IAC3E,MAAMC,mBAAAA,GAAsBC,2CAAAA,CAA0BF,MAAAA,CAAOG,YAAY,CAAA;IAEzE,KAAK,MAAMC,kBAAkBH,mBAAAA,CAAqB;AAChDD,QAAAA,MAAAA,CAAOK,GAAG,CAAC,eAAA,CAAA,CAAiBC,MAAM,CAACF,gBAAgB,CAAChB,WAAAA,GAAAA;;AAElDH,YAAAA,WAAAA,CAAYsB,kCAAwBC,yBAAAA,EAAiBpB,WAAAA,CAAAA;;AAErDH,YAAAA,WAAAA,CAAYwB,qCAA2B,aAAA,EAAerB,WAAAA,CAAAA;AACxD,QAAA,CAAA,CAAA;AACF,IAAA;AACF;AAEA;;;;;AAKC,IACD,SAASsB,oBAAAA,CAAqB,EAAEV,MAAM,EAA2B,EAAA;AAC/D,IAAA,MAAM,EAAEW,+BAA+B,EAAEC,aAAa,EAAE,GAAGC,qBAAAA,CAAgB,gBAAA,CAAA;IAE3E,OAAO,OAAO,EAAEV,YAAY,EAAkD,GAAA;AAC5E,QAAA,MAAMW,yBAAyB,CAACV,cAAAA,GAAAA;;AAE9B,YAAA,MAAM,EAAEb,UAAU,EAAEwB,SAAS,EAAE,GAAGf,MAAAA,CAAOgB,EAAE,CAACC,QAAQ,CAACZ,GAAG,CAACD,cAAAA,CAAAA;AACzD,YAAA,MAAMc,gBAAgB3B,UAAU,CAACgB,iCAAuB,CAACY,SAAS,CAACC,IAAI;YACvE,OAAO;gBACLA,IAAAA,EAAMF,aAAAA;gBACNG,SAAAA,EAAW;AAAC,oBAAA;wBAAED,IAAAA,EAAML;AAAU;AAAE;AAClC,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMO,4BAA4B,CAAClB,cAAAA,GAAAA;;AAEjC,YAAA,MAAM,EAAEb,UAAU,EAAEwB,SAAS,EAAE,GAAGf,MAAAA,CAAOgB,EAAE,CAACC,QAAQ,CAACZ,GAAG,CAACD,cAAAA,CAAAA;AACzD,YAAA,MAAMc,gBAAgB3B,UAAU,CAACkB,oCAA0B,CAACU,SAAS,CAACC,IAAI;YAC1E,OAAO;gBACLA,IAAAA,EAAMF,aAAAA;gBACNG,SAAAA,EAAW;AAAC,oBAAA;wBAAED,IAAAA,EAAML;AAAU;AAAE;AAClC,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMQ,wBAAwBC,OAAAA,CAAK;AACjCtB,YAAAA,2CAAAA;AACAuB,YAAAA,SAAAA,CAAO,CAACC,GAAAA,GAAyBC,mCAAAA,CAAkBxB,YAAY,CAACuB,GAAAA,CAAI,CAAA;SACrE,CAAA,CAAEvB,YAAAA,CAAAA;;QAGH,MAAMyB,wBAAAA,GAA2BL,qBAAAA,CAAsBM,GAAG,CAACf,sBAAAA,CAAAA;AAC3D,QAAA,MAAMH,+BAAAA,CAAgC,mBAAA,CAAA;AACtC,QAAA,MAAMC,aAAAA,CAAcgB,wBAAAA,CAAAA;;QAGpB,MAAME,2BAAAA,GAA8BP,qBAAAA,CAAsBM,GAAG,CAACP,yBAAAA,CAAAA;AAC9D,QAAA,MAAMX,+BAAAA,CAAgC,sBAAA,CAAA;AACtC,QAAA,MAAMC,aAAAA,CAAckB,2BAAAA,CAAAA;AACtB,IAAA,CAAA;AACF;AAEA,eAAe,CAAA,OAAO,EAAE9B,MAAM,EAA2B,GAAA;;AAEvDA,IAAAA,MAAAA,CAAO+B,IAAI,CAAC,iCAAA,CAAA,CAAmCC,QAAQ,CAACtB,oBAAAA,CAAqB;AAAEV,QAAAA;AAAO,KAAA,CAAA,CAAA;AACtFA,IAAAA,MAAAA,CACG+B,IAAI,CAAC,iCAAA,CAAA,CACLC,QAAQ,CAACC,qBAAAA,CAAAA,CACTD,QAAQ,CAACE,cAAAA,CAAAA,CACTF,QAAQ,CAACG,yBAAAA,CAAAA,CACTH,QAAQ,CAACI,sBAAAA,CAAAA,CACTJ,QAAQ,CAACK,iBAAAA,CAAAA,CACTL,QAAQ,CAACM,0BAAAA,CAAAA;;AAGZC,IAAAA,uBAAAA,CAA2BC,qBAAqB,CAACxC,MAAAA,CAAAA;;IAGjDD,gCAAAA,CAAiC;AAAEC,QAAAA;AAAO,KAAA,CAAA;;AAG1C,IAAA,MAAMyC,yBAAyBC,eAAAA,CAC7B;QACEC,iBAAAA,EAAmBC,uBAAAA;QACnBC,iBAAAA,EAAmBC;AACrB,KAAA,EACA9C,OAAO+C,EAAE,CAACC,QAAQ,CAAC3C,GAAG,CAAC,kBAAA,CAAA,CAAA;IAEzB,MAAM4C,0BAAAA,GAA6BC,iBAAW,YAAA,EAAc;AAAElD,QAAAA;AAAO,KAAA,CAAA;AACrEiD,IAAAA,0BAAAA,CAA2BjB,QAAQ,CAACS,sBAAAA,CAAAA;AACtC,CAAA;;;;"}
|
package/dist/server/register.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { defaultsDeep, pipe, filter } from 'lodash/fp';
|
|
2
2
|
import { getService, getAdminService } from './utils/index.mjs';
|
|
3
|
-
import migrateStageAttribute from './migrations/shorten-stage-attribute.mjs';
|
|
4
3
|
import migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color.mjs';
|
|
5
4
|
import migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles.mjs';
|
|
6
5
|
import migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles.mjs';
|
|
@@ -89,7 +88,6 @@ const setRelation = (attributeName, target, contentType)=>{
|
|
|
89
88
|
}
|
|
90
89
|
var register = (async ({ strapi })=>{
|
|
91
90
|
// Data Migrations
|
|
92
|
-
strapi.hook('strapi::content-types.beforeSync').register(migrateStageAttribute);
|
|
93
91
|
strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({
|
|
94
92
|
strapi
|
|
95
93
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe
|
|
1
|
+
{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\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.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","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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assignees.js","sources":["../../../server/src/services/assignees.ts"],"sourcesContent":["import type { Core, UID
|
|
1
|
+
{"version":3,"file":"assignees.js","sources":["../../../server/src/services/assignees.ts"],"sourcesContent":["import type { Core, UID } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { isNil } from 'lodash/fp';\nimport { ENTITY_ASSIGNEE_ATTRIBUTE } from '../constants/workflows';\nimport { getService, getAdminService } from '../utils';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n\n return {\n async findEntityAssigneeId(id: string | number, model: UID.ContentType) {\n const entity = await strapi.db.query(model).findOne({\n where: { id },\n populate: [ENTITY_ASSIGNEE_ATTRIBUTE],\n select: [],\n });\n\n return entity?.[ENTITY_ASSIGNEE_ATTRIBUTE]?.id ?? null;\n },\n\n /**\n * Update the assignee of an entity\n */\n async updateEntityAssignee(\n entityToUpdate: {\n id: number | string;\n documentId: string;\n locale: string;\n updatedAt: string;\n },\n model: UID.ContentType,\n assigneeId: string | null\n ) {\n const { documentId, locale } = entityToUpdate;\n\n if (!isNil(assigneeId)) {\n const userExists = await getAdminService('user', { strapi }).exists({ id: assigneeId });\n\n if (!userExists) {\n throw new ApplicationError(`Selected user does not exist`);\n }\n }\n\n const oldAssigneeId = await this.findEntityAssigneeId(entityToUpdate.id, model);\n metrics.sendDidEditAssignee(oldAssigneeId, assigneeId || null);\n\n const entity = await strapi.documents(model).update({\n documentId,\n locale,\n data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: assigneeId || null },\n populate: [ENTITY_ASSIGNEE_ATTRIBUTE],\n fields: [],\n });\n\n // Update the `updated_at` field of the entity, so that the `status` is not considered `Modified`\n // NOTE: `updatedAt` is a protected attribute that can not be modified directly from the query layer\n // hence the knex query builder is used here.\n const { tableName } = strapi.db.metadata.get(model);\n await strapi.db\n .connection(tableName)\n .where({ id: entityToUpdate.id })\n .update({\n updated_at: new Date(entityToUpdate.updatedAt),\n });\n\n return entity;\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","metrics","getService","findEntityAssigneeId","id","model","entity","db","query","findOne","where","populate","ENTITY_ASSIGNEE_ATTRIBUTE","select","updateEntityAssignee","entityToUpdate","assigneeId","documentId","locale","isNil","userExists","getAdminService","exists","oldAssigneeId","sendDidEditAssignee","documents","update","data","fields","tableName","metadata","get","connection","updated_at","Date","updatedAt"],"mappings":";;;;;;;AAMA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,YAAAA;AAE7B,gBAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,MAAMC,OAAAA,GAAUC,iBAAW,kBAAA,EAAoB;AAAEF,QAAAA;AAAO,KAAA,CAAA;IAExD,OAAO;QACL,MAAMG,oBAAAA,CAAAA,CAAqBC,EAAmB,EAAEC,KAAsB,EAAA;YACpE,MAAMC,MAAAA,GAAS,MAAMN,MAAAA,CAAOO,EAAE,CAACC,KAAK,CAACH,KAAAA,CAAAA,CAAOI,OAAO,CAAC;gBAClDC,KAAAA,EAAO;AAAEN,oBAAAA;AAAG,iBAAA;gBACZO,QAAAA,EAAU;AAACC,oBAAAA;AAA0B,iBAAA;AACrCC,gBAAAA,MAAAA,EAAQ;AACV,aAAA,CAAA;AAEA,YAAA,OAAOP,MAAAA,GAASM,mCAAAA,CAA0B,EAAER,EAAAA,IAAM,IAAA;AACpD,QAAA,CAAA;AAEA;;AAEC,QACD,MAAMU,oBAAAA,CAAAA,CACJC,cAKC,EACDV,KAAsB,EACtBW,UAAyB,EAAA;AAEzB,YAAA,MAAM,EAAEC,UAAU,EAAEC,MAAM,EAAE,GAAGH,cAAAA;YAE/B,IAAI,CAACI,SAAMH,UAAAA,CAAAA,EAAa;gBACtB,MAAMI,UAAAA,GAAa,MAAMC,qBAAAA,CAAgB,MAAA,EAAQ;AAAErB,oBAAAA;AAAO,iBAAA,CAAA,CAAGsB,MAAM,CAAC;oBAAElB,EAAAA,EAAIY;AAAW,iBAAA,CAAA;AAErF,gBAAA,IAAI,CAACI,UAAAA,EAAY;AACf,oBAAA,MAAM,IAAItB,gBAAAA,CAAiB,CAAC,4BAA4B,CAAC,CAAA;AAC3D,gBAAA;AACF,YAAA;YAEA,MAAMyB,aAAAA,GAAgB,MAAM,IAAI,CAACpB,oBAAoB,CAACY,cAAAA,CAAeX,EAAE,EAAEC,KAAAA,CAAAA;YACzEJ,OAAAA,CAAQuB,mBAAmB,CAACD,aAAAA,EAAeP,UAAAA,IAAc,IAAA,CAAA;AAEzD,YAAA,MAAMV,SAAS,MAAMN,MAAAA,CAAOyB,SAAS,CAACpB,KAAAA,CAAAA,CAAOqB,MAAM,CAAC;AAClDT,gBAAAA,UAAAA;AACAC,gBAAAA,MAAAA;gBACAS,IAAAA,EAAM;oBAAE,CAACf,mCAAAA,GAA4BI,UAAAA,IAAc;AAAK,iBAAA;gBACxDL,QAAAA,EAAU;AAACC,oBAAAA;AAA0B,iBAAA;AACrCgB,gBAAAA,MAAAA,EAAQ;AACV,aAAA,CAAA;;;;YAKA,MAAM,EAAEC,SAAS,EAAE,GAAG7B,MAAAA,CAAOO,EAAE,CAACuB,QAAQ,CAACC,GAAG,CAAC1B,KAAAA,CAAAA;AAC7C,YAAA,MAAML,OAAOO,EAAE,CACZyB,UAAU,CAACH,SAAAA,CAAAA,CACXnB,KAAK,CAAC;AAAEN,gBAAAA,EAAAA,EAAIW,eAAeX;AAAG,aAAA,CAAA,CAC9BsB,MAAM,CAAC;gBACNO,UAAAA,EAAY,IAAIC,IAAAA,CAAKnB,cAAAA,CAAeoB,SAAS;AAC/C,aAAA,CAAA;YAEF,OAAO7B,MAAAA;AACT,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assignees.mjs","sources":["../../../server/src/services/assignees.ts"],"sourcesContent":["import type { Core, UID
|
|
1
|
+
{"version":3,"file":"assignees.mjs","sources":["../../../server/src/services/assignees.ts"],"sourcesContent":["import type { Core, UID } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { isNil } from 'lodash/fp';\nimport { ENTITY_ASSIGNEE_ATTRIBUTE } from '../constants/workflows';\nimport { getService, getAdminService } from '../utils';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n\n return {\n async findEntityAssigneeId(id: string | number, model: UID.ContentType) {\n const entity = await strapi.db.query(model).findOne({\n where: { id },\n populate: [ENTITY_ASSIGNEE_ATTRIBUTE],\n select: [],\n });\n\n return entity?.[ENTITY_ASSIGNEE_ATTRIBUTE]?.id ?? null;\n },\n\n /**\n * Update the assignee of an entity\n */\n async updateEntityAssignee(\n entityToUpdate: {\n id: number | string;\n documentId: string;\n locale: string;\n updatedAt: string;\n },\n model: UID.ContentType,\n assigneeId: string | null\n ) {\n const { documentId, locale } = entityToUpdate;\n\n if (!isNil(assigneeId)) {\n const userExists = await getAdminService('user', { strapi }).exists({ id: assigneeId });\n\n if (!userExists) {\n throw new ApplicationError(`Selected user does not exist`);\n }\n }\n\n const oldAssigneeId = await this.findEntityAssigneeId(entityToUpdate.id, model);\n metrics.sendDidEditAssignee(oldAssigneeId, assigneeId || null);\n\n const entity = await strapi.documents(model).update({\n documentId,\n locale,\n data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: assigneeId || null },\n populate: [ENTITY_ASSIGNEE_ATTRIBUTE],\n fields: [],\n });\n\n // Update the `updated_at` field of the entity, so that the `status` is not considered `Modified`\n // NOTE: `updatedAt` is a protected attribute that can not be modified directly from the query layer\n // hence the knex query builder is used here.\n const { tableName } = strapi.db.metadata.get(model);\n await strapi.db\n .connection(tableName)\n .where({ id: entityToUpdate.id })\n .update({\n updated_at: new Date(entityToUpdate.updatedAt),\n });\n\n return entity;\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","metrics","getService","findEntityAssigneeId","id","model","entity","db","query","findOne","where","populate","ENTITY_ASSIGNEE_ATTRIBUTE","select","updateEntityAssignee","entityToUpdate","assigneeId","documentId","locale","isNil","userExists","getAdminService","exists","oldAssigneeId","sendDidEditAssignee","documents","update","data","fields","tableName","metadata","get","connection","updated_at","Date","updatedAt"],"mappings":";;;;;AAMA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAE7B,gBAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,MAAMC,OAAAA,GAAUC,WAAW,kBAAA,EAAoB;AAAEF,QAAAA;AAAO,KAAA,CAAA;IAExD,OAAO;QACL,MAAMG,oBAAAA,CAAAA,CAAqBC,EAAmB,EAAEC,KAAsB,EAAA;YACpE,MAAMC,MAAAA,GAAS,MAAMN,MAAAA,CAAOO,EAAE,CAACC,KAAK,CAACH,KAAAA,CAAAA,CAAOI,OAAO,CAAC;gBAClDC,KAAAA,EAAO;AAAEN,oBAAAA;AAAG,iBAAA;gBACZO,QAAAA,EAAU;AAACC,oBAAAA;AAA0B,iBAAA;AACrCC,gBAAAA,MAAAA,EAAQ;AACV,aAAA,CAAA;AAEA,YAAA,OAAOP,MAAAA,GAASM,yBAAAA,CAA0B,EAAER,EAAAA,IAAM,IAAA;AACpD,QAAA,CAAA;AAEA;;AAEC,QACD,MAAMU,oBAAAA,CAAAA,CACJC,cAKC,EACDV,KAAsB,EACtBW,UAAyB,EAAA;AAEzB,YAAA,MAAM,EAAEC,UAAU,EAAEC,MAAM,EAAE,GAAGH,cAAAA;YAE/B,IAAI,CAACI,MAAMH,UAAAA,CAAAA,EAAa;gBACtB,MAAMI,UAAAA,GAAa,MAAMC,eAAAA,CAAgB,MAAA,EAAQ;AAAErB,oBAAAA;AAAO,iBAAA,CAAA,CAAGsB,MAAM,CAAC;oBAAElB,EAAAA,EAAIY;AAAW,iBAAA,CAAA;AAErF,gBAAA,IAAI,CAACI,UAAAA,EAAY;AACf,oBAAA,MAAM,IAAItB,gBAAAA,CAAiB,CAAC,4BAA4B,CAAC,CAAA;AAC3D,gBAAA;AACF,YAAA;YAEA,MAAMyB,aAAAA,GAAgB,MAAM,IAAI,CAACpB,oBAAoB,CAACY,cAAAA,CAAeX,EAAE,EAAEC,KAAAA,CAAAA;YACzEJ,OAAAA,CAAQuB,mBAAmB,CAACD,aAAAA,EAAeP,UAAAA,IAAc,IAAA,CAAA;AAEzD,YAAA,MAAMV,SAAS,MAAMN,MAAAA,CAAOyB,SAAS,CAACpB,KAAAA,CAAAA,CAAOqB,MAAM,CAAC;AAClDT,gBAAAA,UAAAA;AACAC,gBAAAA,MAAAA;gBACAS,IAAAA,EAAM;oBAAE,CAACf,yBAAAA,GAA4BI,UAAAA,IAAc;AAAK,iBAAA;gBACxDL,QAAAA,EAAU;AAACC,oBAAAA;AAA0B,iBAAA;AACrCgB,gBAAAA,MAAAA,EAAQ;AACV,aAAA,CAAA;;;;YAKA,MAAM,EAAEC,SAAS,EAAE,GAAG7B,MAAAA,CAAOO,EAAE,CAACuB,QAAQ,CAACC,GAAG,CAAC1B,KAAAA,CAAAA;AAC7C,YAAA,MAAML,OAAOO,EAAE,CACZyB,UAAU,CAACH,SAAAA,CAAAA,CACXnB,KAAK,CAAC;AAAEN,gBAAAA,EAAAA,EAAIW,eAAeX;AAAG,aAAA,CAAA,CAC9BsB,MAAM,CAAC;gBACNO,UAAAA,EAAY,IAAIC,IAAAA,CAAKnB,cAAAA,CAAeoB,SAAS;AAC/C,aAAA,CAAA;YAEF,OAAO7B,MAAAA;AACT,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -67,7 +67,7 @@ const handleStageOnUpdate = async (ctx, next)=>{
|
|
|
67
67
|
if (!result) {
|
|
68
68
|
return result;
|
|
69
69
|
}
|
|
70
|
-
// @ts-expect-error
|
|
70
|
+
// @ts-expect-error - Property 'strapi_stage' does not exist on type ...
|
|
71
71
|
const updatedStage = result?.[workflows.ENTITY_STAGE_ATTRIBUTE];
|
|
72
72
|
// Stage might be null if field is not populated
|
|
73
73
|
if (updatedStage && previousStage?.id && previousStage.id !== updatedStage.id) {
|
|
@@ -77,10 +77,10 @@ const handleStageOnUpdate = async (ctx, next)=>{
|
|
|
77
77
|
uid: model.uid,
|
|
78
78
|
// TODO v6: Rename to "entry", which is what is used for regular CRUD updates
|
|
79
79
|
entity: {
|
|
80
|
-
// @ts-expect-error
|
|
80
|
+
// @ts-expect-error - Property 'id' does not exist on type 'number'
|
|
81
81
|
id: result?.id,
|
|
82
82
|
documentId,
|
|
83
|
-
// @ts-expect-error
|
|
83
|
+
// @ts-expect-error - Property 'locale' does not exist on type 'number'
|
|
84
84
|
locale: result?.locale,
|
|
85
85
|
status: 'draft'
|
|
86
86
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-service-middleware.js","sources":["../../../server/src/services/document-service-middleware.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nimport { isNil } from 'lodash/fp';\nimport { ENTITY_STAGE_ATTRIBUTE } from '../constants/workflows';\nimport { WORKFLOW_UPDATE_STAGE } from '../constants/webhook-events';\nimport { getService } from '../utils';\n\ntype Middleware = Modules.Documents.Middleware.Middleware;\n\n/**\n * Get the stage information of an entity\n * @param {String} uid\n * @param {Number} id\n * @returns {Object}\n */\nconst getEntityStage = async (uid: any, id: any, params: any) => {\n const entity = await strapi.documents(uid).findOne({\n ...params,\n documentId: id,\n status: 'draft',\n populate: {\n [ENTITY_STAGE_ATTRIBUTE]: {\n populate: {\n workflow: true,\n },\n },\n },\n });\n\n return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? {};\n};\n\n/**\n * Ensures the entity is assigned to the default workflow stage\n */\nconst assignStageOnCreate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'create' && ctx.action !== 'clone') {\n return next();\n }\n\n /**\n * Content types can have assigned workflows,\n * if the CT has one, assign a default value to the stage attribute if it's not present\n */\n const workflow = await getService('workflows').getAssignedWorkflow(ctx.contentType.uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n return next();\n }\n\n const data = ctx.params.data as Record<string, any>;\n\n // Assign the default stage if the entity doesn't have one\n if (ctx.params?.data && isNil(data[ENTITY_STAGE_ATTRIBUTE])) {\n data[ENTITY_STAGE_ATTRIBUTE] = { id: workflow.stages[0].id };\n }\n\n return next();\n};\n\nconst handleStageOnUpdate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'update') {\n return next();\n }\n\n const { documentId } = ctx.params;\n const data = ctx.params.data as any;\n\n if (isNil(data?.[ENTITY_STAGE_ATTRIBUTE])) {\n delete data?.[ENTITY_STAGE_ATTRIBUTE];\n return next();\n }\n\n /**\n * Get last stage of the entity\n */\n const previousStage = await getEntityStage(ctx.contentType.uid, documentId, ctx.params);\n\n const result = await next();\n\n if (!result) {\n return result;\n }\n\n // @ts-expect-error
|
|
1
|
+
{"version":3,"file":"document-service-middleware.js","sources":["../../../server/src/services/document-service-middleware.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nimport { isNil } from 'lodash/fp';\nimport { ENTITY_STAGE_ATTRIBUTE } from '../constants/workflows';\nimport { WORKFLOW_UPDATE_STAGE } from '../constants/webhook-events';\nimport { getService } from '../utils';\n\ntype Middleware = Modules.Documents.Middleware.Middleware;\n\n/**\n * Get the stage information of an entity\n * @param {String} uid\n * @param {Number} id\n * @returns {Object}\n */\nconst getEntityStage = async (uid: any, id: any, params: any) => {\n const entity = await strapi.documents(uid).findOne({\n ...params,\n documentId: id,\n status: 'draft',\n populate: {\n [ENTITY_STAGE_ATTRIBUTE]: {\n populate: {\n workflow: true,\n },\n },\n },\n });\n\n return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? {};\n};\n\n/**\n * Ensures the entity is assigned to the default workflow stage\n */\nconst assignStageOnCreate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'create' && ctx.action !== 'clone') {\n return next();\n }\n\n /**\n * Content types can have assigned workflows,\n * if the CT has one, assign a default value to the stage attribute if it's not present\n */\n const workflow = await getService('workflows').getAssignedWorkflow(ctx.contentType.uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n return next();\n }\n\n const data = ctx.params.data as Record<string, any>;\n\n // Assign the default stage if the entity doesn't have one\n if (ctx.params?.data && isNil(data[ENTITY_STAGE_ATTRIBUTE])) {\n data[ENTITY_STAGE_ATTRIBUTE] = { id: workflow.stages[0].id };\n }\n\n return next();\n};\n\nconst handleStageOnUpdate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'update') {\n return next();\n }\n\n const { documentId } = ctx.params;\n const data = ctx.params.data as any;\n\n if (isNil(data?.[ENTITY_STAGE_ATTRIBUTE])) {\n delete data?.[ENTITY_STAGE_ATTRIBUTE];\n return next();\n }\n\n /**\n * Get last stage of the entity\n */\n const previousStage = await getEntityStage(ctx.contentType.uid, documentId, ctx.params);\n\n const result = await next();\n\n if (!result) {\n return result;\n }\n\n // @ts-expect-error - Property 'strapi_stage' does not exist on type ...\n const updatedStage = result?.[ENTITY_STAGE_ATTRIBUTE];\n\n // Stage might be null if field is not populated\n if (updatedStage && previousStage?.id && previousStage.id !== updatedStage.id) {\n const model = strapi.getModel(ctx.contentType.uid);\n\n strapi.eventHub.emit(WORKFLOW_UPDATE_STAGE, {\n model: model.modelName,\n uid: model.uid,\n // TODO v6: Rename to \"entry\", which is what is used for regular CRUD updates\n entity: {\n // @ts-expect-error - Property 'id' does not exist on type 'number'\n id: result?.id,\n documentId,\n // @ts-expect-error - Property 'locale' does not exist on type 'number'\n locale: result?.locale,\n status: 'draft',\n },\n workflow: {\n id: previousStage.workflow.id,\n stages: {\n from: {\n id: previousStage.id,\n name: previousStage.name,\n },\n to: {\n id: updatedStage.id,\n name: updatedStage.name,\n },\n },\n },\n });\n }\n\n return next();\n};\n\n/**\n * Check if the entity is at the required stage before publish\n */\nconst checkStageBeforePublish: Middleware = async (ctx, next) => {\n if (ctx.action !== 'publish') {\n return next();\n }\n\n const workflow = await getService('workflows').getAssignedWorkflow(ctx.contentType.uid, {\n populate: 'stageRequiredToPublish',\n });\n\n if (!workflow || !workflow.stageRequiredToPublish) {\n return next();\n }\n\n const { documentId } = ctx.params;\n const entryStage = await getEntityStage(ctx.contentType.uid, documentId, ctx.params);\n\n if (entryStage.id !== workflow.stageRequiredToPublish.id) {\n throw new errors.ValidationError('Entry is not at the required stage to publish');\n }\n\n return next();\n};\n\nexport default () => ({\n assignStageOnCreate,\n handleStageOnUpdate,\n checkStageBeforePublish,\n});\n"],"names":["getEntityStage","uid","id","params","entity","strapi","documents","findOne","documentId","status","populate","ENTITY_STAGE_ATTRIBUTE","workflow","assignStageOnCreate","ctx","next","action","getService","getAssignedWorkflow","contentType","data","isNil","stages","handleStageOnUpdate","previousStage","result","updatedStage","model","getModel","eventHub","emit","WORKFLOW_UPDATE_STAGE","modelName","locale","from","name","to","checkStageBeforePublish","stageRequiredToPublish","entryStage","errors","ValidationError"],"mappings":"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"}
|
|
@@ -65,7 +65,7 @@ const handleStageOnUpdate = async (ctx, next)=>{
|
|
|
65
65
|
if (!result) {
|
|
66
66
|
return result;
|
|
67
67
|
}
|
|
68
|
-
// @ts-expect-error
|
|
68
|
+
// @ts-expect-error - Property 'strapi_stage' does not exist on type ...
|
|
69
69
|
const updatedStage = result?.[ENTITY_STAGE_ATTRIBUTE];
|
|
70
70
|
// Stage might be null if field is not populated
|
|
71
71
|
if (updatedStage && previousStage?.id && previousStage.id !== updatedStage.id) {
|
|
@@ -75,10 +75,10 @@ const handleStageOnUpdate = async (ctx, next)=>{
|
|
|
75
75
|
uid: model.uid,
|
|
76
76
|
// TODO v6: Rename to "entry", which is what is used for regular CRUD updates
|
|
77
77
|
entity: {
|
|
78
|
-
// @ts-expect-error
|
|
78
|
+
// @ts-expect-error - Property 'id' does not exist on type 'number'
|
|
79
79
|
id: result?.id,
|
|
80
80
|
documentId,
|
|
81
|
-
// @ts-expect-error
|
|
81
|
+
// @ts-expect-error - Property 'locale' does not exist on type 'number'
|
|
82
82
|
locale: result?.locale,
|
|
83
83
|
status: 'draft'
|
|
84
84
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-service-middleware.mjs","sources":["../../../server/src/services/document-service-middleware.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nimport { isNil } from 'lodash/fp';\nimport { ENTITY_STAGE_ATTRIBUTE } from '../constants/workflows';\nimport { WORKFLOW_UPDATE_STAGE } from '../constants/webhook-events';\nimport { getService } from '../utils';\n\ntype Middleware = Modules.Documents.Middleware.Middleware;\n\n/**\n * Get the stage information of an entity\n * @param {String} uid\n * @param {Number} id\n * @returns {Object}\n */\nconst getEntityStage = async (uid: any, id: any, params: any) => {\n const entity = await strapi.documents(uid).findOne({\n ...params,\n documentId: id,\n status: 'draft',\n populate: {\n [ENTITY_STAGE_ATTRIBUTE]: {\n populate: {\n workflow: true,\n },\n },\n },\n });\n\n return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? {};\n};\n\n/**\n * Ensures the entity is assigned to the default workflow stage\n */\nconst assignStageOnCreate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'create' && ctx.action !== 'clone') {\n return next();\n }\n\n /**\n * Content types can have assigned workflows,\n * if the CT has one, assign a default value to the stage attribute if it's not present\n */\n const workflow = await getService('workflows').getAssignedWorkflow(ctx.contentType.uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n return next();\n }\n\n const data = ctx.params.data as Record<string, any>;\n\n // Assign the default stage if the entity doesn't have one\n if (ctx.params?.data && isNil(data[ENTITY_STAGE_ATTRIBUTE])) {\n data[ENTITY_STAGE_ATTRIBUTE] = { id: workflow.stages[0].id };\n }\n\n return next();\n};\n\nconst handleStageOnUpdate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'update') {\n return next();\n }\n\n const { documentId } = ctx.params;\n const data = ctx.params.data as any;\n\n if (isNil(data?.[ENTITY_STAGE_ATTRIBUTE])) {\n delete data?.[ENTITY_STAGE_ATTRIBUTE];\n return next();\n }\n\n /**\n * Get last stage of the entity\n */\n const previousStage = await getEntityStage(ctx.contentType.uid, documentId, ctx.params);\n\n const result = await next();\n\n if (!result) {\n return result;\n }\n\n // @ts-expect-error
|
|
1
|
+
{"version":3,"file":"document-service-middleware.mjs","sources":["../../../server/src/services/document-service-middleware.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nimport { isNil } from 'lodash/fp';\nimport { ENTITY_STAGE_ATTRIBUTE } from '../constants/workflows';\nimport { WORKFLOW_UPDATE_STAGE } from '../constants/webhook-events';\nimport { getService } from '../utils';\n\ntype Middleware = Modules.Documents.Middleware.Middleware;\n\n/**\n * Get the stage information of an entity\n * @param {String} uid\n * @param {Number} id\n * @returns {Object}\n */\nconst getEntityStage = async (uid: any, id: any, params: any) => {\n const entity = await strapi.documents(uid).findOne({\n ...params,\n documentId: id,\n status: 'draft',\n populate: {\n [ENTITY_STAGE_ATTRIBUTE]: {\n populate: {\n workflow: true,\n },\n },\n },\n });\n\n return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? {};\n};\n\n/**\n * Ensures the entity is assigned to the default workflow stage\n */\nconst assignStageOnCreate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'create' && ctx.action !== 'clone') {\n return next();\n }\n\n /**\n * Content types can have assigned workflows,\n * if the CT has one, assign a default value to the stage attribute if it's not present\n */\n const workflow = await getService('workflows').getAssignedWorkflow(ctx.contentType.uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n return next();\n }\n\n const data = ctx.params.data as Record<string, any>;\n\n // Assign the default stage if the entity doesn't have one\n if (ctx.params?.data && isNil(data[ENTITY_STAGE_ATTRIBUTE])) {\n data[ENTITY_STAGE_ATTRIBUTE] = { id: workflow.stages[0].id };\n }\n\n return next();\n};\n\nconst handleStageOnUpdate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'update') {\n return next();\n }\n\n const { documentId } = ctx.params;\n const data = ctx.params.data as any;\n\n if (isNil(data?.[ENTITY_STAGE_ATTRIBUTE])) {\n delete data?.[ENTITY_STAGE_ATTRIBUTE];\n return next();\n }\n\n /**\n * Get last stage of the entity\n */\n const previousStage = await getEntityStage(ctx.contentType.uid, documentId, ctx.params);\n\n const result = await next();\n\n if (!result) {\n return result;\n }\n\n // @ts-expect-error - Property 'strapi_stage' does not exist on type ...\n const updatedStage = result?.[ENTITY_STAGE_ATTRIBUTE];\n\n // Stage might be null if field is not populated\n if (updatedStage && previousStage?.id && previousStage.id !== updatedStage.id) {\n const model = strapi.getModel(ctx.contentType.uid);\n\n strapi.eventHub.emit(WORKFLOW_UPDATE_STAGE, {\n model: model.modelName,\n uid: model.uid,\n // TODO v6: Rename to \"entry\", which is what is used for regular CRUD updates\n entity: {\n // @ts-expect-error - Property 'id' does not exist on type 'number'\n id: result?.id,\n documentId,\n // @ts-expect-error - Property 'locale' does not exist on type 'number'\n locale: result?.locale,\n status: 'draft',\n },\n workflow: {\n id: previousStage.workflow.id,\n stages: {\n from: {\n id: previousStage.id,\n name: previousStage.name,\n },\n to: {\n id: updatedStage.id,\n name: updatedStage.name,\n },\n },\n },\n });\n }\n\n return next();\n};\n\n/**\n * Check if the entity is at the required stage before publish\n */\nconst checkStageBeforePublish: Middleware = async (ctx, next) => {\n if (ctx.action !== 'publish') {\n return next();\n }\n\n const workflow = await getService('workflows').getAssignedWorkflow(ctx.contentType.uid, {\n populate: 'stageRequiredToPublish',\n });\n\n if (!workflow || !workflow.stageRequiredToPublish) {\n return next();\n }\n\n const { documentId } = ctx.params;\n const entryStage = await getEntityStage(ctx.contentType.uid, documentId, ctx.params);\n\n if (entryStage.id !== workflow.stageRequiredToPublish.id) {\n throw new errors.ValidationError('Entry is not at the required stage to publish');\n }\n\n return next();\n};\n\nexport default () => ({\n assignStageOnCreate,\n handleStageOnUpdate,\n checkStageBeforePublish,\n});\n"],"names":["getEntityStage","uid","id","params","entity","strapi","documents","findOne","documentId","status","populate","ENTITY_STAGE_ATTRIBUTE","workflow","assignStageOnCreate","ctx","next","action","getService","getAssignedWorkflow","contentType","data","isNil","stages","handleStageOnUpdate","previousStage","result","updatedStage","model","getModel","eventHub","emit","WORKFLOW_UPDATE_STAGE","modelName","locale","from","name","to","checkStageBeforePublish","stageRequiredToPublish","entryStage","errors","ValidationError"],"mappings":"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"}
|