@strapi/review-workflows 5.56.0 → 5.58.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/server/audit-logs.js +123 -0
- package/dist/server/audit-logs.js.map +1 -0
- package/dist/server/audit-logs.mjs +116 -0
- package/dist/server/audit-logs.mjs.map +1 -0
- package/dist/server/bootstrap.js +7 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +7 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/workflows.js +8 -6
- package/dist/server/controllers/workflows.js.map +1 -1
- package/dist/server/controllers/workflows.mjs +8 -6
- package/dist/server/controllers/workflows.mjs.map +1 -1
- package/dist/server/entitlements.js +29 -0
- package/dist/server/entitlements.js.map +1 -0
- package/dist/server/entitlements.mjs +27 -0
- package/dist/server/entitlements.mjs.map +1 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +5 -0
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/middlewares/review-workflows.js +7 -3
- package/dist/server/middlewares/review-workflows.js.map +1 -1
- package/dist/server/middlewares/review-workflows.mjs +7 -3
- package/dist/server/middlewares/review-workflows.mjs.map +1 -1
- package/dist/server/migrations/handle-deleted-ct-in-workflows.js +2 -2
- package/dist/server/migrations/handle-deleted-ct-in-workflows.js.map +1 -1
- package/dist/server/migrations/handle-deleted-ct-in-workflows.mjs +2 -2
- package/dist/server/migrations/handle-deleted-ct-in-workflows.mjs.map +1 -1
- package/dist/server/migrations/multiple-workflows.js +2 -5
- package/dist/server/migrations/multiple-workflows.js.map +1 -1
- package/dist/server/migrations/multiple-workflows.mjs +2 -5
- package/dist/server/migrations/multiple-workflows.mjs.map +1 -1
- package/dist/server/register.js +6 -7
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +6 -7
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/assignees.js +18 -2
- package/dist/server/services/assignees.js.map +1 -1
- package/dist/server/services/assignees.mjs +19 -3
- package/dist/server/services/assignees.mjs.map +1 -1
- package/dist/server/services/document-service-middleware.js +2 -3
- package/dist/server/services/document-service-middleware.js.map +1 -1
- package/dist/server/services/document-service-middleware.mjs +2 -3
- package/dist/server/services/document-service-middleware.mjs.map +1 -1
- package/dist/server/services/metrics/weekly-metrics.js +8 -8
- package/dist/server/services/metrics/weekly-metrics.js.map +1 -1
- package/dist/server/services/metrics/weekly-metrics.mjs +4 -4
- package/dist/server/services/metrics/weekly-metrics.mjs.map +1 -1
- package/dist/server/services/stage-permissions.js +1 -2
- package/dist/server/services/stage-permissions.js.map +1 -1
- package/dist/server/services/stage-permissions.mjs +1 -2
- package/dist/server/services/stage-permissions.mjs.map +1 -1
- package/dist/server/services/stages.js +8 -8
- package/dist/server/services/stages.js.map +1 -1
- package/dist/server/services/stages.mjs +7 -7
- package/dist/server/services/stages.mjs.map +1 -1
- package/dist/server/services/validation.js +1 -2
- package/dist/server/services/validation.js.map +1 -1
- package/dist/server/services/validation.mjs +1 -2
- package/dist/server/services/validation.mjs.map +1 -1
- package/dist/server/services/workflow-content-types.js +23 -6
- package/dist/server/services/workflow-content-types.js.map +1 -1
- package/dist/server/services/workflow-content-types.mjs +21 -4
- package/dist/server/services/workflow-content-types.mjs.map +1 -1
- package/dist/server/services/workflows.js +91 -13
- package/dist/server/services/workflows.js.map +1 -1
- package/dist/server/services/workflows.mjs +91 -13
- package/dist/server/services/workflows.mjs.map +1 -1
- package/dist/server/src/audit-logs.d.ts +112 -0
- package/dist/server/src/audit-logs.d.ts.map +1 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/workflows.d.ts.map +1 -1
- package/dist/server/src/entitlements.d.ts +7 -0
- package/dist/server/src/entitlements.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +17 -14
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/review-workflows.d.ts.map +1 -1
- package/dist/server/src/migrations/handle-deleted-ct-in-workflows.d.ts.map +1 -1
- package/dist/server/src/migrations/multiple-workflows.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/assignees.d.ts.map +1 -1
- package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics/weekly-metrics.d.ts +1 -1
- package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
- package/dist/server/src/services/stage-permissions.d.ts.map +1 -1
- package/dist/server/src/services/validation.d.ts.map +1 -1
- package/dist/server/src/services/workflow-content-types.d.ts +10 -3
- package/dist/server/src/services/workflow-content-types.d.ts.map +1 -1
- package/dist/server/src/services/workflows.d.ts.map +1 -1
- package/dist/server/src/utils/review-workflows.d.ts +12 -8
- package/dist/server/src/utils/review-workflows.d.ts.map +1 -1
- package/dist/server/utils/review-workflows.js +8 -13
- package/dist/server/utils/review-workflows.js.map +1 -1
- package/dist/server/utils/review-workflows.mjs +8 -13
- package/dist/server/utils/review-workflows.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
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 {
|
|
1
|
+
{"version":3,"file":"assignees.js","sources":["../../../server/src/services/assignees.ts"],"sourcesContent":["import type { Core, UID } from '@strapi/types';\nimport { errors, emitAudit } from '@strapi/utils';\nimport { ENTITY_ASSIGNEE_ATTRIBUTE } from '../constants/workflows';\nimport { AUDITED_EVENTS } from '../audit-logs';\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 (assigneeId != null) {\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 const newAssigneeId = entity?.[ENTITY_ASSIGNEE_ATTRIBUTE]?.id ?? null;\n\n if (oldAssigneeId !== newAssigneeId) {\n await emitAudit({ strapi }, AUDITED_EVENTS.ENTRY_ASSIGNEE_UPDATE, {\n uid: model,\n documentId,\n locale: locale ?? null,\n changes: { assignee: { before: oldAssigneeId, after: newAssigneeId } },\n });\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","userExists","getAdminService","exists","oldAssigneeId","sendDidEditAssignee","documents","update","data","fields","tableName","metadata","get","connection","updated_at","Date","updatedAt","newAssigneeId","emitAudit","AUDITED_EVENTS","ENTRY_ASSIGNEE_UPDATE","uid","changes","assignee","before","after"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { errors } from '@strapi/utils';
|
|
2
|
-
import { isNil } from 'lodash/fp';
|
|
1
|
+
import { errors, emitAudit } from '@strapi/utils';
|
|
3
2
|
import { ENTITY_ASSIGNEE_ATTRIBUTE } from '../constants/workflows.mjs';
|
|
3
|
+
import { AUDITED_EVENTS } from '../audit-logs.mjs';
|
|
4
4
|
import { getService, getAdminService } from '../utils/index.mjs';
|
|
5
5
|
|
|
6
6
|
const { ApplicationError } = errors;
|
|
@@ -25,7 +25,7 @@ var assignees = (({ strapi })=>{
|
|
|
25
25
|
* Update the assignee of an entity
|
|
26
26
|
*/ async updateEntityAssignee (entityToUpdate, model, assigneeId) {
|
|
27
27
|
const { documentId, locale } = entityToUpdate;
|
|
28
|
-
if (
|
|
28
|
+
if (assigneeId != null) {
|
|
29
29
|
const userExists = await getAdminService('user', {
|
|
30
30
|
strapi
|
|
31
31
|
}).exists({
|
|
@@ -57,6 +57,22 @@ var assignees = (({ strapi })=>{
|
|
|
57
57
|
}).update({
|
|
58
58
|
updated_at: new Date(entityToUpdate.updatedAt)
|
|
59
59
|
});
|
|
60
|
+
const newAssigneeId = entity?.[ENTITY_ASSIGNEE_ATTRIBUTE]?.id ?? null;
|
|
61
|
+
if (oldAssigneeId !== newAssigneeId) {
|
|
62
|
+
await emitAudit({
|
|
63
|
+
strapi
|
|
64
|
+
}, AUDITED_EVENTS.ENTRY_ASSIGNEE_UPDATE, {
|
|
65
|
+
uid: model,
|
|
66
|
+
documentId,
|
|
67
|
+
locale: locale ?? null,
|
|
68
|
+
changes: {
|
|
69
|
+
assignee: {
|
|
70
|
+
before: oldAssigneeId,
|
|
71
|
+
after: newAssigneeId
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
60
76
|
return entity;
|
|
61
77
|
}
|
|
62
78
|
};
|
|
@@ -1 +1 @@
|
|
|
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 {
|
|
1
|
+
{"version":3,"file":"assignees.mjs","sources":["../../../server/src/services/assignees.ts"],"sourcesContent":["import type { Core, UID } from '@strapi/types';\nimport { errors, emitAudit } from '@strapi/utils';\nimport { ENTITY_ASSIGNEE_ATTRIBUTE } from '../constants/workflows';\nimport { AUDITED_EVENTS } from '../audit-logs';\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 (assigneeId != null) {\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 const newAssigneeId = entity?.[ENTITY_ASSIGNEE_ATTRIBUTE]?.id ?? null;\n\n if (oldAssigneeId !== newAssigneeId) {\n await emitAudit({ strapi }, AUDITED_EVENTS.ENTRY_ASSIGNEE_UPDATE, {\n uid: model,\n documentId,\n locale: locale ?? null,\n changes: { assignee: { before: oldAssigneeId, after: newAssigneeId } },\n });\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","userExists","getAdminService","exists","oldAssigneeId","sendDidEditAssignee","documents","update","data","fields","tableName","metadata","get","connection","updated_at","Date","updatedAt","newAssigneeId","emitAudit","AUDITED_EVENTS","ENTRY_ASSIGNEE_UPDATE","uid","changes","assignee","before","after"],"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;AAE/B,YAAA,IAAIC,cAAc,IAAA,EAAM;gBACtB,MAAMG,UAAAA,GAAa,MAAMC,eAAAA,CAAgB,MAAA,EAAQ;AAAEpB,oBAAAA;AAAO,iBAAA,CAAA,CAAGqB,MAAM,CAAC;oBAAEjB,EAAAA,EAAIY;AAAW,iBAAA,CAAA;AAErF,gBAAA,IAAI,CAACG,UAAAA,EAAY;AACf,oBAAA,MAAM,IAAIrB,gBAAAA,CAAiB,CAAC,4BAA4B,CAAC,CAAA;AAC3D,gBAAA;AACF,YAAA;YAEA,MAAMwB,aAAAA,GAAgB,MAAM,IAAI,CAACnB,oBAAoB,CAACY,cAAAA,CAAeX,EAAE,EAAEC,KAAAA,CAAAA;YACzEJ,OAAAA,CAAQsB,mBAAmB,CAACD,aAAAA,EAAeN,UAAAA,IAAc,IAAA,CAAA;AAEzD,YAAA,MAAMV,SAAS,MAAMN,MAAAA,CAAOwB,SAAS,CAACnB,KAAAA,CAAAA,CAAOoB,MAAM,CAAC;AAClDR,gBAAAA,UAAAA;AACAC,gBAAAA,MAAAA;gBACAQ,IAAAA,EAAM;oBAAE,CAACd,yBAAAA,GAA4BI,UAAAA,IAAc;AAAK,iBAAA;gBACxDL,QAAAA,EAAU;AAACC,oBAAAA;AAA0B,iBAAA;AACrCe,gBAAAA,MAAAA,EAAQ;AACV,aAAA,CAAA;;;;YAKA,MAAM,EAAEC,SAAS,EAAE,GAAG5B,MAAAA,CAAOO,EAAE,CAACsB,QAAQ,CAACC,GAAG,CAACzB,KAAAA,CAAAA;AAC7C,YAAA,MAAML,OAAOO,EAAE,CACZwB,UAAU,CAACH,SAAAA,CAAAA,CACXlB,KAAK,CAAC;AAAEN,gBAAAA,EAAAA,EAAIW,eAAeX;AAAG,aAAA,CAAA,CAC9BqB,MAAM,CAAC;gBACNO,UAAAA,EAAY,IAAIC,IAAAA,CAAKlB,cAAAA,CAAemB,SAAS;AAC/C,aAAA,CAAA;AAEF,YAAA,MAAMC,aAAAA,GAAgB7B,MAAAA,GAASM,yBAAAA,CAA0B,EAAER,EAAAA,IAAM,IAAA;AAEjE,YAAA,IAAIkB,kBAAkBa,aAAAA,EAAe;AACnC,gBAAA,MAAMC,SAAAA,CAAU;AAAEpC,oBAAAA;iBAAO,EAAGqC,cAAAA,CAAeC,qBAAqB,EAAE;oBAChEC,GAAAA,EAAKlC,KAAAA;AACLY,oBAAAA,UAAAA;AACAC,oBAAAA,MAAAA,EAAQA,MAAAA,IAAU,IAAA;oBAClBsB,OAAAA,EAAS;wBAAEC,QAAAA,EAAU;4BAAEC,MAAAA,EAAQpB,aAAAA;4BAAeqB,KAAAA,EAAOR;AAAc;AAAE;AACvE,iBAAA,CAAA;AACF,YAAA;YAEA,OAAO7B,MAAAA;AACT,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
|
-
var fp = require('lodash/fp');
|
|
5
4
|
var workflows = require('../constants/workflows.js');
|
|
6
5
|
var webhookEvents = require('../constants/webhook-events.js');
|
|
7
6
|
var index = require('../utils/index.js');
|
|
@@ -43,7 +42,7 @@ var index = require('../utils/index.js');
|
|
|
43
42
|
}
|
|
44
43
|
const data = ctx.params.data;
|
|
45
44
|
// Assign the default stage if the entity doesn't have one
|
|
46
|
-
if (ctx.params?.data &&
|
|
45
|
+
if (ctx.params?.data && data[workflows.ENTITY_STAGE_ATTRIBUTE] == null) {
|
|
47
46
|
data[workflows.ENTITY_STAGE_ATTRIBUTE] = {
|
|
48
47
|
id: workflow.stages[0].id
|
|
49
48
|
};
|
|
@@ -56,7 +55,7 @@ const handleStageOnUpdate = async (ctx, next)=>{
|
|
|
56
55
|
}
|
|
57
56
|
const { documentId } = ctx.params;
|
|
58
57
|
const data = ctx.params.data;
|
|
59
|
-
if (
|
|
58
|
+
if (data?.[workflows.ENTITY_STAGE_ATTRIBUTE] == null) {
|
|
60
59
|
delete data?.[workflows.ENTITY_STAGE_ATTRIBUTE];
|
|
61
60
|
return next();
|
|
62
61
|
}
|
|
@@ -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 {
|
|
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 { 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 && data[ENTITY_STAGE_ATTRIBUTE] == null) {\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 (data?.[ENTITY_STAGE_ATTRIBUTE] == null) {\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","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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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { errors } from '@strapi/utils';
|
|
2
|
-
import { isNil } from 'lodash/fp';
|
|
3
2
|
import { ENTITY_STAGE_ATTRIBUTE } from '../constants/workflows.mjs';
|
|
4
3
|
import { WORKFLOW_UPDATE_STAGE } from '../constants/webhook-events.mjs';
|
|
5
4
|
import { getService } from '../utils/index.mjs';
|
|
@@ -41,7 +40,7 @@ import { getService } from '../utils/index.mjs';
|
|
|
41
40
|
}
|
|
42
41
|
const data = ctx.params.data;
|
|
43
42
|
// Assign the default stage if the entity doesn't have one
|
|
44
|
-
if (ctx.params?.data &&
|
|
43
|
+
if (ctx.params?.data && data[ENTITY_STAGE_ATTRIBUTE] == null) {
|
|
45
44
|
data[ENTITY_STAGE_ATTRIBUTE] = {
|
|
46
45
|
id: workflow.stages[0].id
|
|
47
46
|
};
|
|
@@ -54,7 +53,7 @@ const handleStageOnUpdate = async (ctx, next)=>{
|
|
|
54
53
|
}
|
|
55
54
|
const { documentId } = ctx.params;
|
|
56
55
|
const data = ctx.params.data;
|
|
57
|
-
if (
|
|
56
|
+
if (data?.[ENTITY_STAGE_ATTRIBUTE] == null) {
|
|
58
57
|
delete data?.[ENTITY_STAGE_ATTRIBUTE];
|
|
59
58
|
return next();
|
|
60
59
|
}
|
|
@@ -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 {
|
|
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 { 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 && data[ENTITY_STAGE_ATTRIBUTE] == null) {\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 (data?.[ENTITY_STAGE_ATTRIBUTE] == null) {\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","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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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var lodash = require('lodash');
|
|
4
4
|
var dateFns = require('date-fns');
|
|
5
5
|
var index = require('../../utils/index.js');
|
|
6
6
|
|
|
@@ -19,7 +19,7 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
|
|
|
19
19
|
name: 'ee',
|
|
20
20
|
key: 'metrics'
|
|
21
21
|
});
|
|
22
|
-
return
|
|
22
|
+
return lodash.defaultTo(value, {});
|
|
23
23
|
};
|
|
24
24
|
const setMetricsStoreValue = (value)=>strapi.store.set({
|
|
25
25
|
type: 'plugin',
|
|
@@ -33,13 +33,13 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
|
|
|
33
33
|
const workflows = await workflowsService.find({
|
|
34
34
|
populate: 'stages'
|
|
35
35
|
});
|
|
36
|
-
const stagesCount =
|
|
37
|
-
const contentTypesCount =
|
|
36
|
+
const stagesCount = lodash.map(workflows, (workflow)=>lodash.size(workflow.stages));
|
|
37
|
+
const contentTypesCount = lodash.map(workflows, (workflow)=>lodash.size(workflow.contentTypes));
|
|
38
38
|
return {
|
|
39
|
-
numberOfActiveWorkflows:
|
|
40
|
-
avgStagesCount:
|
|
41
|
-
maxStagesCount:
|
|
42
|
-
activatedContentTypes:
|
|
39
|
+
numberOfActiveWorkflows: lodash.size(workflows),
|
|
40
|
+
avgStagesCount: lodash.mean(stagesCount),
|
|
41
|
+
maxStagesCount: lodash.max(stagesCount),
|
|
42
|
+
activatedContentTypes: lodash.sum(contentTypesCount)
|
|
43
43
|
};
|
|
44
44
|
},
|
|
45
45
|
async sendMetrics () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weekly-metrics.js","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport {
|
|
1
|
+
{"version":3,"file":"weekly-metrics.js","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics() {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { map, size, sum, max, mean, defaultTo } from 'lodash';
|
|
2
2
|
import { add } from 'date-fns';
|
|
3
3
|
import { getService } from '../../utils/index.mjs';
|
|
4
4
|
|
|
@@ -17,7 +17,7 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
|
|
|
17
17
|
name: 'ee',
|
|
18
18
|
key: 'metrics'
|
|
19
19
|
});
|
|
20
|
-
return defaultTo({}
|
|
20
|
+
return defaultTo(value, {});
|
|
21
21
|
};
|
|
22
22
|
const setMetricsStoreValue = (value)=>strapi.store.set({
|
|
23
23
|
type: 'plugin',
|
|
@@ -31,8 +31,8 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
|
|
|
31
31
|
const workflows = await workflowsService.find({
|
|
32
32
|
populate: 'stages'
|
|
33
33
|
});
|
|
34
|
-
const stagesCount =
|
|
35
|
-
const contentTypesCount =
|
|
34
|
+
const stagesCount = map(workflows, (workflow)=>size(workflow.stages));
|
|
35
|
+
const contentTypesCount = map(workflows, (workflow)=>size(workflow.contentTypes));
|
|
36
36
|
return {
|
|
37
37
|
numberOfActiveWorkflows: size(workflows),
|
|
38
38
|
avgStagesCount: mean(stagesCount),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weekly-metrics.mjs","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport {
|
|
1
|
+
{"version":3,"file":"weekly-metrics.mjs","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics() {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var fp = require('lodash/fp');
|
|
4
3
|
var utils = require('@strapi/utils');
|
|
5
4
|
var index = require('../utils/index.js');
|
|
6
5
|
var workflows = require('../constants/workflows.js');
|
|
@@ -56,7 +55,7 @@ var stagePermissions = (({ strapi })=>{
|
|
|
56
55
|
return utils.async.map(permissions, this.registerTo);
|
|
57
56
|
},
|
|
58
57
|
async unregister (permissions) {
|
|
59
|
-
const permissionIds = permissions.map(
|
|
58
|
+
const permissionIds = permissions.map((permission)=>permission?.id);
|
|
60
59
|
await permissionService.deleteByIds(permissionIds);
|
|
61
60
|
},
|
|
62
61
|
can (action, fromStage) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage-permissions.js","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport {
|
|
1
|
+
{"version":3,"file":"stage-permissions.js","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\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((permission) => permission?.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","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","Set","undefined","has"],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { prop } from 'lodash/fp';
|
|
2
1
|
import { errors, async } from '@strapi/utils';
|
|
3
2
|
import { getAdminService } from '../utils/index.mjs';
|
|
4
3
|
import { STAGE_MODEL_UID, STAGE_TRANSITION_UID } from '../constants/workflows.mjs';
|
|
@@ -54,7 +53,7 @@ var stagePermissions = (({ strapi })=>{
|
|
|
54
53
|
return async.map(permissions, this.registerTo);
|
|
55
54
|
},
|
|
56
55
|
async unregister (permissions) {
|
|
57
|
-
const permissionIds = permissions.map(
|
|
56
|
+
const permissionIds = permissions.map((permission)=>permission?.id);
|
|
58
57
|
await permissionService.deleteByIds(permissionIds);
|
|
59
58
|
},
|
|
60
59
|
can (action, fromStage) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage-permissions.mjs","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport {
|
|
1
|
+
{"version":3,"file":"stage-permissions.mjs","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\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((permission) => permission?.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","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","Set","undefined","has"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
|
-
var
|
|
4
|
+
var lodash = require('lodash');
|
|
5
5
|
var workflows = require('../constants/workflows.js');
|
|
6
6
|
var index = require('../utils/index.js');
|
|
7
7
|
|
|
@@ -12,7 +12,7 @@ const sanitizedStageFields = [
|
|
|
12
12
|
'workflow',
|
|
13
13
|
'color'
|
|
14
14
|
];
|
|
15
|
-
const sanitizeStageFields =
|
|
15
|
+
const sanitizeStageFields = (stage)=>lodash.pick(stage, sanitizedStageFields);
|
|
16
16
|
var stages = (({ strapi })=>{
|
|
17
17
|
const metrics = index.getService('workflow-metrics', {
|
|
18
18
|
strapi
|
|
@@ -186,7 +186,7 @@ var stages = (({ strapi })=>{
|
|
|
186
186
|
]
|
|
187
187
|
});
|
|
188
188
|
// Put all the newly created stages ids
|
|
189
|
-
const createdStagesIds =
|
|
189
|
+
const createdStagesIds = lodash.map(createdStages, 'id');
|
|
190
190
|
// Update the workflow stages
|
|
191
191
|
await utils.async.map(updated, (destStage)=>{
|
|
192
192
|
const srcStage = srcStages.find((s)=>s.id === destStage.id);
|
|
@@ -233,9 +233,9 @@ var stages = (({ strapi })=>{
|
|
|
233
233
|
// Stage doesn't have DP or i18n enabled, connecting it through the `id`
|
|
234
234
|
// will be safer than relying on the `documentId` + `locale` + `status` transformation
|
|
235
235
|
data: {
|
|
236
|
-
[workflows.ENTITY_STAGE_ATTRIBUTE]:
|
|
236
|
+
[workflows.ENTITY_STAGE_ATTRIBUTE]: lodash.pick(stage, [
|
|
237
237
|
'id'
|
|
238
|
-
]
|
|
238
|
+
])
|
|
239
239
|
},
|
|
240
240
|
populate: [
|
|
241
241
|
workflows.ENTITY_STAGE_ATTRIBUTE
|
|
@@ -301,10 +301,10 @@ var stages = (({ strapi })=>{
|
|
|
301
301
|
};
|
|
302
302
|
});
|
|
303
303
|
const normalizeStageForDiff = (stage)=>({
|
|
304
|
-
...
|
|
304
|
+
...lodash.pick(stage, [
|
|
305
305
|
'name',
|
|
306
306
|
'color'
|
|
307
|
-
]
|
|
307
|
+
]),
|
|
308
308
|
fromPermissions: stage.fromPermissions ?? [],
|
|
309
309
|
toPermissions: stage.toPermissions ?? []
|
|
310
310
|
});
|
|
@@ -333,7 +333,7 @@ const normalizeStageForDiff = (stage)=>({
|
|
|
333
333
|
const srcStage = sourceStages.find((stage)=>stage.id === stageToCompare.id);
|
|
334
334
|
if (!srcStage) {
|
|
335
335
|
acc.created.push(stageToCompare);
|
|
336
|
-
} else if (!
|
|
336
|
+
} else if (!lodash.isEqual(normalizeStageForDiff(srcStage), normalizeStageForDiff(stageToCompare))) {
|
|
337
337
|
acc.updated.push(stageToCompare);
|
|
338
338
|
}
|
|
339
339
|
return acc;
|