@strapi/review-workflows 5.56.0 → 5.57.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/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 +4 -7
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +4 -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/index.d.ts +1 -1
- 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
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var lodash = require('lodash');
|
|
4
|
+
var workflows = require('./constants/workflows.js');
|
|
5
|
+
var webhookEvents = require('./constants/webhook-events.js');
|
|
6
|
+
|
|
7
|
+
const AUDITED_EVENTS = {
|
|
8
|
+
WORKFLOW_CREATE: 'workflow.create',
|
|
9
|
+
WORKFLOW_UPDATE: 'workflow.update',
|
|
10
|
+
WORKFLOW_DELETE: 'workflow.delete',
|
|
11
|
+
ENTRY_ASSIGNEE_UPDATE: 'entry.assignee.update'
|
|
12
|
+
};
|
|
13
|
+
const WORKFLOW_TRACKED_FIELDS = [
|
|
14
|
+
'name',
|
|
15
|
+
'contentTypes',
|
|
16
|
+
'stages',
|
|
17
|
+
'stageRequiredToPublish'
|
|
18
|
+
];
|
|
19
|
+
// Fixed locale, so the stored order does not depend on the server's language.
|
|
20
|
+
const alphabetically = (a, b)=>a.localeCompare(b, 'en');
|
|
21
|
+
const roleNames = (permissions, direction)=>permissions.filter((permission)=>permission.actionParameters?.[direction] != null).map((permission)=>permission.role?.name).filter((name)=>typeof name === 'string').sort(alphabetically);
|
|
22
|
+
const toWorkflowSnapshot = (row)=>({
|
|
23
|
+
name: row.name,
|
|
24
|
+
contentTypes: [
|
|
25
|
+
...row.contentTypes ?? []
|
|
26
|
+
].sort(alphabetically),
|
|
27
|
+
stages: (row.stages ?? []).map((stage)=>({
|
|
28
|
+
name: stage.name,
|
|
29
|
+
color: stage.color ?? null,
|
|
30
|
+
fromPermissions: roleNames(stage.permissions ?? [], 'from'),
|
|
31
|
+
toPermissions: roleNames(stage.permissions ?? [], 'to')
|
|
32
|
+
})),
|
|
33
|
+
stageRequiredToPublish: row.stageRequiredToPublish?.name ?? null
|
|
34
|
+
});
|
|
35
|
+
const getWorkflowChanges = (previous, next)=>{
|
|
36
|
+
const changes = {};
|
|
37
|
+
for (const field of WORKFLOW_TRACKED_FIELDS){
|
|
38
|
+
if (!lodash.isEqual(previous[field], next[field])) {
|
|
39
|
+
Object.assign(changes, {
|
|
40
|
+
[field]: {
|
|
41
|
+
before: previous[field],
|
|
42
|
+
after: next[field]
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return changes;
|
|
48
|
+
};
|
|
49
|
+
const toWorkflowEvent = (row)=>({
|
|
50
|
+
workflowId: row.id,
|
|
51
|
+
name: row.name
|
|
52
|
+
});
|
|
53
|
+
const registerAuditEvents = ({ strapi }, auditLogsLifecycle)=>{
|
|
54
|
+
const workflowResource = (event)=>({
|
|
55
|
+
type: 'workflow',
|
|
56
|
+
id: event.workflowId,
|
|
57
|
+
name: event.name
|
|
58
|
+
});
|
|
59
|
+
const entryResource = (event)=>({
|
|
60
|
+
type: 'entry',
|
|
61
|
+
uid: event.uid,
|
|
62
|
+
id: 'entity' in event ? event.entity.documentId : event.documentId
|
|
63
|
+
});
|
|
64
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.WORKFLOW_CREATE, (event)=>({
|
|
65
|
+
resource: workflowResource(event),
|
|
66
|
+
details: {
|
|
67
|
+
contentTypes: event.contentTypes,
|
|
68
|
+
stages: event.stages,
|
|
69
|
+
stageRequiredToPublish: event.stageRequiredToPublish
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
72
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.WORKFLOW_UPDATE, (event)=>({
|
|
73
|
+
resource: workflowResource(event),
|
|
74
|
+
details: {
|
|
75
|
+
changes: event.changes
|
|
76
|
+
}
|
|
77
|
+
}));
|
|
78
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.WORKFLOW_DELETE, (event)=>({
|
|
79
|
+
resource: workflowResource(event)
|
|
80
|
+
}));
|
|
81
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.ENTRY_ASSIGNEE_UPDATE, (event)=>({
|
|
82
|
+
resource: entryResource(event),
|
|
83
|
+
details: {
|
|
84
|
+
locale: event.locale,
|
|
85
|
+
changes: event.changes
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
// The webhook payload carries the workflow id only; its name is read here.
|
|
89
|
+
auditLogsLifecycle.registerEvent(webhookEvents.WORKFLOW_UPDATE_STAGE, async (event)=>{
|
|
90
|
+
const workflow = await strapi.db.query(workflows.WORKFLOW_MODEL_UID).findOne({
|
|
91
|
+
where: {
|
|
92
|
+
id: event.workflow.id
|
|
93
|
+
},
|
|
94
|
+
select: [
|
|
95
|
+
'name'
|
|
96
|
+
]
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
resource: entryResource(event),
|
|
100
|
+
details: {
|
|
101
|
+
locale: event.entity.locale ?? null,
|
|
102
|
+
workflow: {
|
|
103
|
+
id: event.workflow.id,
|
|
104
|
+
name: workflow?.name ?? null
|
|
105
|
+
},
|
|
106
|
+
changes: {
|
|
107
|
+
stage: {
|
|
108
|
+
before: event.workflow.stages.from,
|
|
109
|
+
after: event.workflow.stages.to
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
exports.AUDITED_EVENTS = AUDITED_EVENTS;
|
|
118
|
+
exports.WORKFLOW_TRACKED_FIELDS = WORKFLOW_TRACKED_FIELDS;
|
|
119
|
+
exports.getWorkflowChanges = getWorkflowChanges;
|
|
120
|
+
exports.registerAuditEvents = registerAuditEvents;
|
|
121
|
+
exports.toWorkflowEvent = toWorkflowEvent;
|
|
122
|
+
exports.toWorkflowSnapshot = toWorkflowSnapshot;
|
|
123
|
+
//# sourceMappingURL=audit-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logs.js","sources":["../../server/src/audit-logs.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport type { Core, Data, Modules, UID } from '@strapi/types';\n\nimport { WORKFLOW_MODEL_UID } from './constants/workflows';\nimport { WORKFLOW_UPDATE_STAGE } from './constants/webhook-events';\n\nexport const AUDITED_EVENTS = {\n WORKFLOW_CREATE: 'workflow.create',\n WORKFLOW_UPDATE: 'workflow.update',\n WORKFLOW_DELETE: 'workflow.delete',\n ENTRY_ASSIGNEE_UPDATE: 'entry.assignee.update',\n} as const;\n\ninterface WorkflowResource extends Modules.AuditLogs.Resource {\n type: 'workflow';\n id: Data.ID;\n name: string;\n}\n\ninterface EntryResource extends Modules.AuditLogs.Resource {\n type: 'entry';\n uid: UID.ContentType;\n id: string;\n}\n\n/** A stage as stored in the log: roles by name, sorted, so order alone is not a change. */\nexport interface StageSnapshot {\n name: string;\n color: string | null;\n fromPermissions: string[];\n toPermissions: string[];\n}\n\nexport interface WorkflowSnapshot {\n name: string;\n contentTypes: string[];\n stages: StageSnapshot[];\n stageRequiredToPublish: string | null;\n}\n\nexport const WORKFLOW_TRACKED_FIELDS = [\n 'name',\n 'contentTypes',\n 'stages',\n 'stageRequiredToPublish',\n] as const;\n\nexport type WorkflowChanges = {\n [K in keyof WorkflowSnapshot]?: Modules.AuditLogs.FieldChange<WorkflowSnapshot[K]>;\n};\n\n/** A workflow row read with WORKFLOW_POPULATE. Without the populated roles, the permission lists come out empty. */\nexport interface WorkflowRow {\n id: Data.ID;\n name: string;\n contentTypes?: string[] | null;\n stages?: Array<{\n name: string;\n color?: string | null;\n permissions?: Array<{\n actionParameters?: { from?: unknown; to?: unknown } | null;\n role?: { name: string } | null;\n }> | null;\n }> | null;\n stageRequiredToPublish?: { name: string } | null;\n}\n\nexport interface WorkflowEvent {\n workflowId: Data.ID;\n name: string;\n}\n\nexport type WorkflowCreateDetails = Omit<WorkflowSnapshot, 'name'>;\nexport type WorkflowCreateEvent = WorkflowEvent & WorkflowCreateDetails;\n\nexport interface WorkflowUpdateDetails {\n changes: WorkflowChanges;\n}\nexport type WorkflowUpdateEvent = WorkflowEvent & WorkflowUpdateDetails;\n\nexport interface EntryEvent {\n uid: UID.ContentType;\n documentId: string;\n locale: string | null;\n}\n\nexport interface AssigneeUpdateDetails {\n locale: string | null;\n changes: { assignee: Modules.AuditLogs.FieldChange<Data.ID | null> };\n}\nexport type AssigneeUpdateEvent = EntryEvent & Pick<AssigneeUpdateDetails, 'changes'>;\n\ninterface StageRef {\n id: Data.ID;\n name: string;\n}\n\nexport interface StageUpdateDetails {\n locale: string | null;\n workflow: { id: Data.ID; name: string | null };\n changes: { stage: Modules.AuditLogs.FieldChange<StageRef> };\n}\n\n/** The payload of the existing review-workflows.updateEntryStage webhook event. */\nexport interface StageUpdateEvent {\n uid: UID.ContentType;\n entity: { documentId: string; locale?: string | null };\n workflow: { id: Data.ID; stages: { from: StageRef; to: StageRef } };\n}\n\n// Fixed locale, so the stored order does not depend on the server's language.\nconst alphabetically = (a: string, b: string) => a.localeCompare(b, 'en');\n\nconst roleNames = (\n permissions: NonNullable<NonNullable<WorkflowRow['stages']>[number]['permissions']>,\n direction: 'from' | 'to'\n) =>\n permissions\n .filter((permission) => permission.actionParameters?.[direction] != null)\n .map((permission) => permission.role?.name)\n .filter((name): name is string => typeof name === 'string')\n .sort(alphabetically);\n\nexport const toWorkflowSnapshot = (row: WorkflowRow): WorkflowSnapshot => ({\n name: row.name,\n contentTypes: [...(row.contentTypes ?? [])].sort(alphabetically),\n stages: (row.stages ?? []).map((stage) => ({\n name: stage.name,\n color: stage.color ?? null,\n fromPermissions: roleNames(stage.permissions ?? [], 'from'),\n toPermissions: roleNames(stage.permissions ?? [], 'to'),\n })),\n stageRequiredToPublish: row.stageRequiredToPublish?.name ?? null,\n});\n\nexport const getWorkflowChanges = (\n previous: WorkflowSnapshot,\n next: WorkflowSnapshot\n): WorkflowChanges => {\n const changes: WorkflowChanges = {};\n\n for (const field of WORKFLOW_TRACKED_FIELDS) {\n if (!isEqual(previous[field], next[field])) {\n Object.assign(changes, { [field]: { before: previous[field], after: next[field] } });\n }\n }\n\n return changes;\n};\n\nexport const toWorkflowEvent = (row: WorkflowRow): WorkflowEvent => ({\n workflowId: row.id,\n name: row.name,\n});\n\n/**\n * The part of the audit-logs lifecycle service used by this plugin.\n * The full service type lives in the Admin EE package and cannot be imported here.\n */\ninterface AuditLogsLifecycle {\n registerEvent<TDetails, TResource extends Modules.AuditLogs.Resource>(\n name: string,\n transform: Modules.AuditLogs.EventTransformer<TDetails, TResource>\n ): void;\n}\n\nexport const registerAuditEvents = (\n { strapi }: { strapi: Core.Strapi },\n auditLogsLifecycle: AuditLogsLifecycle\n) => {\n const workflowResource = (event: WorkflowEvent): WorkflowResource => ({\n type: 'workflow',\n id: event.workflowId,\n name: event.name,\n });\n\n const entryResource = (event: EntryEvent | StageUpdateEvent): EntryResource => ({\n type: 'entry',\n uid: event.uid,\n id: 'entity' in event ? event.entity.documentId : event.documentId,\n });\n\n auditLogsLifecycle.registerEvent<WorkflowCreateDetails, WorkflowResource>(\n AUDITED_EVENTS.WORKFLOW_CREATE,\n (event: WorkflowCreateEvent) => ({\n resource: workflowResource(event),\n details: {\n contentTypes: event.contentTypes,\n stages: event.stages,\n stageRequiredToPublish: event.stageRequiredToPublish,\n },\n })\n );\n\n auditLogsLifecycle.registerEvent<WorkflowUpdateDetails, WorkflowResource>(\n AUDITED_EVENTS.WORKFLOW_UPDATE,\n (event: WorkflowUpdateEvent) => ({\n resource: workflowResource(event),\n details: { changes: event.changes },\n })\n );\n\n auditLogsLifecycle.registerEvent<undefined, WorkflowResource>(\n AUDITED_EVENTS.WORKFLOW_DELETE,\n (event: WorkflowEvent) => ({ resource: workflowResource(event) })\n );\n\n auditLogsLifecycle.registerEvent<AssigneeUpdateDetails, EntryResource>(\n AUDITED_EVENTS.ENTRY_ASSIGNEE_UPDATE,\n (event: AssigneeUpdateEvent) => ({\n resource: entryResource(event),\n details: { locale: event.locale, changes: event.changes },\n })\n );\n\n // The webhook payload carries the workflow id only; its name is read here.\n auditLogsLifecycle.registerEvent<StageUpdateDetails, EntryResource>(\n WORKFLOW_UPDATE_STAGE,\n async (event: StageUpdateEvent) => {\n const workflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .findOne({ where: { id: event.workflow.id }, select: ['name'] });\n\n return {\n resource: entryResource(event),\n details: {\n locale: event.entity.locale ?? null,\n workflow: { id: event.workflow.id, name: workflow?.name ?? null },\n changes: {\n stage: { before: event.workflow.stages.from, after: event.workflow.stages.to },\n },\n },\n };\n }\n );\n};\n"],"names":["AUDITED_EVENTS","WORKFLOW_CREATE","WORKFLOW_UPDATE","WORKFLOW_DELETE","ENTRY_ASSIGNEE_UPDATE","WORKFLOW_TRACKED_FIELDS","alphabetically","a","b","localeCompare","roleNames","permissions","direction","filter","permission","actionParameters","map","role","name","sort","toWorkflowSnapshot","row","contentTypes","stages","stage","color","fromPermissions","toPermissions","stageRequiredToPublish","getWorkflowChanges","previous","next","changes","field","isEqual","Object","assign","before","after","toWorkflowEvent","workflowId","id","registerAuditEvents","strapi","auditLogsLifecycle","workflowResource","event","type","entryResource","uid","entity","documentId","registerEvent","resource","details","locale","WORKFLOW_UPDATE_STAGE","workflow","db","query","WORKFLOW_MODEL_UID","findOne","where","select","from","to"],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { isEqual } from 'lodash';
|
|
2
|
+
import { WORKFLOW_MODEL_UID } from './constants/workflows.mjs';
|
|
3
|
+
import { WORKFLOW_UPDATE_STAGE } from './constants/webhook-events.mjs';
|
|
4
|
+
|
|
5
|
+
const AUDITED_EVENTS = {
|
|
6
|
+
WORKFLOW_CREATE: 'workflow.create',
|
|
7
|
+
WORKFLOW_UPDATE: 'workflow.update',
|
|
8
|
+
WORKFLOW_DELETE: 'workflow.delete',
|
|
9
|
+
ENTRY_ASSIGNEE_UPDATE: 'entry.assignee.update'
|
|
10
|
+
};
|
|
11
|
+
const WORKFLOW_TRACKED_FIELDS = [
|
|
12
|
+
'name',
|
|
13
|
+
'contentTypes',
|
|
14
|
+
'stages',
|
|
15
|
+
'stageRequiredToPublish'
|
|
16
|
+
];
|
|
17
|
+
// Fixed locale, so the stored order does not depend on the server's language.
|
|
18
|
+
const alphabetically = (a, b)=>a.localeCompare(b, 'en');
|
|
19
|
+
const roleNames = (permissions, direction)=>permissions.filter((permission)=>permission.actionParameters?.[direction] != null).map((permission)=>permission.role?.name).filter((name)=>typeof name === 'string').sort(alphabetically);
|
|
20
|
+
const toWorkflowSnapshot = (row)=>({
|
|
21
|
+
name: row.name,
|
|
22
|
+
contentTypes: [
|
|
23
|
+
...row.contentTypes ?? []
|
|
24
|
+
].sort(alphabetically),
|
|
25
|
+
stages: (row.stages ?? []).map((stage)=>({
|
|
26
|
+
name: stage.name,
|
|
27
|
+
color: stage.color ?? null,
|
|
28
|
+
fromPermissions: roleNames(stage.permissions ?? [], 'from'),
|
|
29
|
+
toPermissions: roleNames(stage.permissions ?? [], 'to')
|
|
30
|
+
})),
|
|
31
|
+
stageRequiredToPublish: row.stageRequiredToPublish?.name ?? null
|
|
32
|
+
});
|
|
33
|
+
const getWorkflowChanges = (previous, next)=>{
|
|
34
|
+
const changes = {};
|
|
35
|
+
for (const field of WORKFLOW_TRACKED_FIELDS){
|
|
36
|
+
if (!isEqual(previous[field], next[field])) {
|
|
37
|
+
Object.assign(changes, {
|
|
38
|
+
[field]: {
|
|
39
|
+
before: previous[field],
|
|
40
|
+
after: next[field]
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return changes;
|
|
46
|
+
};
|
|
47
|
+
const toWorkflowEvent = (row)=>({
|
|
48
|
+
workflowId: row.id,
|
|
49
|
+
name: row.name
|
|
50
|
+
});
|
|
51
|
+
const registerAuditEvents = ({ strapi }, auditLogsLifecycle)=>{
|
|
52
|
+
const workflowResource = (event)=>({
|
|
53
|
+
type: 'workflow',
|
|
54
|
+
id: event.workflowId,
|
|
55
|
+
name: event.name
|
|
56
|
+
});
|
|
57
|
+
const entryResource = (event)=>({
|
|
58
|
+
type: 'entry',
|
|
59
|
+
uid: event.uid,
|
|
60
|
+
id: 'entity' in event ? event.entity.documentId : event.documentId
|
|
61
|
+
});
|
|
62
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.WORKFLOW_CREATE, (event)=>({
|
|
63
|
+
resource: workflowResource(event),
|
|
64
|
+
details: {
|
|
65
|
+
contentTypes: event.contentTypes,
|
|
66
|
+
stages: event.stages,
|
|
67
|
+
stageRequiredToPublish: event.stageRequiredToPublish
|
|
68
|
+
}
|
|
69
|
+
}));
|
|
70
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.WORKFLOW_UPDATE, (event)=>({
|
|
71
|
+
resource: workflowResource(event),
|
|
72
|
+
details: {
|
|
73
|
+
changes: event.changes
|
|
74
|
+
}
|
|
75
|
+
}));
|
|
76
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.WORKFLOW_DELETE, (event)=>({
|
|
77
|
+
resource: workflowResource(event)
|
|
78
|
+
}));
|
|
79
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.ENTRY_ASSIGNEE_UPDATE, (event)=>({
|
|
80
|
+
resource: entryResource(event),
|
|
81
|
+
details: {
|
|
82
|
+
locale: event.locale,
|
|
83
|
+
changes: event.changes
|
|
84
|
+
}
|
|
85
|
+
}));
|
|
86
|
+
// The webhook payload carries the workflow id only; its name is read here.
|
|
87
|
+
auditLogsLifecycle.registerEvent(WORKFLOW_UPDATE_STAGE, async (event)=>{
|
|
88
|
+
const workflow = await strapi.db.query(WORKFLOW_MODEL_UID).findOne({
|
|
89
|
+
where: {
|
|
90
|
+
id: event.workflow.id
|
|
91
|
+
},
|
|
92
|
+
select: [
|
|
93
|
+
'name'
|
|
94
|
+
]
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
resource: entryResource(event),
|
|
98
|
+
details: {
|
|
99
|
+
locale: event.entity.locale ?? null,
|
|
100
|
+
workflow: {
|
|
101
|
+
id: event.workflow.id,
|
|
102
|
+
name: workflow?.name ?? null
|
|
103
|
+
},
|
|
104
|
+
changes: {
|
|
105
|
+
stage: {
|
|
106
|
+
before: event.workflow.stages.from,
|
|
107
|
+
after: event.workflow.stages.to
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export { AUDITED_EVENTS, WORKFLOW_TRACKED_FIELDS, getWorkflowChanges, registerAuditEvents, toWorkflowEvent, toWorkflowSnapshot };
|
|
116
|
+
//# sourceMappingURL=audit-logs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logs.mjs","sources":["../../server/src/audit-logs.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport type { Core, Data, Modules, UID } from '@strapi/types';\n\nimport { WORKFLOW_MODEL_UID } from './constants/workflows';\nimport { WORKFLOW_UPDATE_STAGE } from './constants/webhook-events';\n\nexport const AUDITED_EVENTS = {\n WORKFLOW_CREATE: 'workflow.create',\n WORKFLOW_UPDATE: 'workflow.update',\n WORKFLOW_DELETE: 'workflow.delete',\n ENTRY_ASSIGNEE_UPDATE: 'entry.assignee.update',\n} as const;\n\ninterface WorkflowResource extends Modules.AuditLogs.Resource {\n type: 'workflow';\n id: Data.ID;\n name: string;\n}\n\ninterface EntryResource extends Modules.AuditLogs.Resource {\n type: 'entry';\n uid: UID.ContentType;\n id: string;\n}\n\n/** A stage as stored in the log: roles by name, sorted, so order alone is not a change. */\nexport interface StageSnapshot {\n name: string;\n color: string | null;\n fromPermissions: string[];\n toPermissions: string[];\n}\n\nexport interface WorkflowSnapshot {\n name: string;\n contentTypes: string[];\n stages: StageSnapshot[];\n stageRequiredToPublish: string | null;\n}\n\nexport const WORKFLOW_TRACKED_FIELDS = [\n 'name',\n 'contentTypes',\n 'stages',\n 'stageRequiredToPublish',\n] as const;\n\nexport type WorkflowChanges = {\n [K in keyof WorkflowSnapshot]?: Modules.AuditLogs.FieldChange<WorkflowSnapshot[K]>;\n};\n\n/** A workflow row read with WORKFLOW_POPULATE. Without the populated roles, the permission lists come out empty. */\nexport interface WorkflowRow {\n id: Data.ID;\n name: string;\n contentTypes?: string[] | null;\n stages?: Array<{\n name: string;\n color?: string | null;\n permissions?: Array<{\n actionParameters?: { from?: unknown; to?: unknown } | null;\n role?: { name: string } | null;\n }> | null;\n }> | null;\n stageRequiredToPublish?: { name: string } | null;\n}\n\nexport interface WorkflowEvent {\n workflowId: Data.ID;\n name: string;\n}\n\nexport type WorkflowCreateDetails = Omit<WorkflowSnapshot, 'name'>;\nexport type WorkflowCreateEvent = WorkflowEvent & WorkflowCreateDetails;\n\nexport interface WorkflowUpdateDetails {\n changes: WorkflowChanges;\n}\nexport type WorkflowUpdateEvent = WorkflowEvent & WorkflowUpdateDetails;\n\nexport interface EntryEvent {\n uid: UID.ContentType;\n documentId: string;\n locale: string | null;\n}\n\nexport interface AssigneeUpdateDetails {\n locale: string | null;\n changes: { assignee: Modules.AuditLogs.FieldChange<Data.ID | null> };\n}\nexport type AssigneeUpdateEvent = EntryEvent & Pick<AssigneeUpdateDetails, 'changes'>;\n\ninterface StageRef {\n id: Data.ID;\n name: string;\n}\n\nexport interface StageUpdateDetails {\n locale: string | null;\n workflow: { id: Data.ID; name: string | null };\n changes: { stage: Modules.AuditLogs.FieldChange<StageRef> };\n}\n\n/** The payload of the existing review-workflows.updateEntryStage webhook event. */\nexport interface StageUpdateEvent {\n uid: UID.ContentType;\n entity: { documentId: string; locale?: string | null };\n workflow: { id: Data.ID; stages: { from: StageRef; to: StageRef } };\n}\n\n// Fixed locale, so the stored order does not depend on the server's language.\nconst alphabetically = (a: string, b: string) => a.localeCompare(b, 'en');\n\nconst roleNames = (\n permissions: NonNullable<NonNullable<WorkflowRow['stages']>[number]['permissions']>,\n direction: 'from' | 'to'\n) =>\n permissions\n .filter((permission) => permission.actionParameters?.[direction] != null)\n .map((permission) => permission.role?.name)\n .filter((name): name is string => typeof name === 'string')\n .sort(alphabetically);\n\nexport const toWorkflowSnapshot = (row: WorkflowRow): WorkflowSnapshot => ({\n name: row.name,\n contentTypes: [...(row.contentTypes ?? [])].sort(alphabetically),\n stages: (row.stages ?? []).map((stage) => ({\n name: stage.name,\n color: stage.color ?? null,\n fromPermissions: roleNames(stage.permissions ?? [], 'from'),\n toPermissions: roleNames(stage.permissions ?? [], 'to'),\n })),\n stageRequiredToPublish: row.stageRequiredToPublish?.name ?? null,\n});\n\nexport const getWorkflowChanges = (\n previous: WorkflowSnapshot,\n next: WorkflowSnapshot\n): WorkflowChanges => {\n const changes: WorkflowChanges = {};\n\n for (const field of WORKFLOW_TRACKED_FIELDS) {\n if (!isEqual(previous[field], next[field])) {\n Object.assign(changes, { [field]: { before: previous[field], after: next[field] } });\n }\n }\n\n return changes;\n};\n\nexport const toWorkflowEvent = (row: WorkflowRow): WorkflowEvent => ({\n workflowId: row.id,\n name: row.name,\n});\n\n/**\n * The part of the audit-logs lifecycle service used by this plugin.\n * The full service type lives in the Admin EE package and cannot be imported here.\n */\ninterface AuditLogsLifecycle {\n registerEvent<TDetails, TResource extends Modules.AuditLogs.Resource>(\n name: string,\n transform: Modules.AuditLogs.EventTransformer<TDetails, TResource>\n ): void;\n}\n\nexport const registerAuditEvents = (\n { strapi }: { strapi: Core.Strapi },\n auditLogsLifecycle: AuditLogsLifecycle\n) => {\n const workflowResource = (event: WorkflowEvent): WorkflowResource => ({\n type: 'workflow',\n id: event.workflowId,\n name: event.name,\n });\n\n const entryResource = (event: EntryEvent | StageUpdateEvent): EntryResource => ({\n type: 'entry',\n uid: event.uid,\n id: 'entity' in event ? event.entity.documentId : event.documentId,\n });\n\n auditLogsLifecycle.registerEvent<WorkflowCreateDetails, WorkflowResource>(\n AUDITED_EVENTS.WORKFLOW_CREATE,\n (event: WorkflowCreateEvent) => ({\n resource: workflowResource(event),\n details: {\n contentTypes: event.contentTypes,\n stages: event.stages,\n stageRequiredToPublish: event.stageRequiredToPublish,\n },\n })\n );\n\n auditLogsLifecycle.registerEvent<WorkflowUpdateDetails, WorkflowResource>(\n AUDITED_EVENTS.WORKFLOW_UPDATE,\n (event: WorkflowUpdateEvent) => ({\n resource: workflowResource(event),\n details: { changes: event.changes },\n })\n );\n\n auditLogsLifecycle.registerEvent<undefined, WorkflowResource>(\n AUDITED_EVENTS.WORKFLOW_DELETE,\n (event: WorkflowEvent) => ({ resource: workflowResource(event) })\n );\n\n auditLogsLifecycle.registerEvent<AssigneeUpdateDetails, EntryResource>(\n AUDITED_EVENTS.ENTRY_ASSIGNEE_UPDATE,\n (event: AssigneeUpdateEvent) => ({\n resource: entryResource(event),\n details: { locale: event.locale, changes: event.changes },\n })\n );\n\n // The webhook payload carries the workflow id only; its name is read here.\n auditLogsLifecycle.registerEvent<StageUpdateDetails, EntryResource>(\n WORKFLOW_UPDATE_STAGE,\n async (event: StageUpdateEvent) => {\n const workflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .findOne({ where: { id: event.workflow.id }, select: ['name'] });\n\n return {\n resource: entryResource(event),\n details: {\n locale: event.entity.locale ?? null,\n workflow: { id: event.workflow.id, name: workflow?.name ?? null },\n changes: {\n stage: { before: event.workflow.stages.from, after: event.workflow.stages.to },\n },\n },\n };\n }\n );\n};\n"],"names":["AUDITED_EVENTS","WORKFLOW_CREATE","WORKFLOW_UPDATE","WORKFLOW_DELETE","ENTRY_ASSIGNEE_UPDATE","WORKFLOW_TRACKED_FIELDS","alphabetically","a","b","localeCompare","roleNames","permissions","direction","filter","permission","actionParameters","map","role","name","sort","toWorkflowSnapshot","row","contentTypes","stages","stage","color","fromPermissions","toPermissions","stageRequiredToPublish","getWorkflowChanges","previous","next","changes","field","isEqual","Object","assign","before","after","toWorkflowEvent","workflowId","id","registerAuditEvents","strapi","auditLogsLifecycle","workflowResource","event","type","entryResource","uid","entity","documentId","registerEvent","resource","details","locale","WORKFLOW_UPDATE_STAGE","workflow","db","query","WORKFLOW_MODEL_UID","findOne","where","select","from","to"],"mappings":"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"}
|
package/dist/server/bootstrap.js
CHANGED
|
@@ -5,6 +5,7 @@ var actions = require('./config/actions.js');
|
|
|
5
5
|
var defaultStages = require('./constants/default-stages.json.js');
|
|
6
6
|
var defaultWorkflow = require('./constants/default-workflow.json.js');
|
|
7
7
|
var webhookEvents = require('./constants/webhook-events.js');
|
|
8
|
+
var auditLogs = require('./audit-logs.js');
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Initialize the default workflow if there is no workflow in the database
|
|
@@ -40,6 +41,12 @@ var bootstrap = (async ({ strapi: strapi1 })=>{
|
|
|
40
41
|
await actionProvider.registerMany(actions.reviewWorkflows);
|
|
41
42
|
// Webhooks and events
|
|
42
43
|
await registerWebhookEvents();
|
|
44
|
+
// Absent in CE, without the audit-logs license, or when disabled by config
|
|
45
|
+
if (strapi1.has('audit-logs-lifecycle')) {
|
|
46
|
+
auditLogs.registerAuditEvents({
|
|
47
|
+
strapi: strapi1
|
|
48
|
+
}, strapi1.get('audit-logs-lifecycle'));
|
|
49
|
+
}
|
|
43
50
|
await index.getService('workflow-weekly-metrics').registerCron();
|
|
44
51
|
// Data initialization
|
|
45
52
|
await initDefaultWorkflow();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getAdminService, getService } from './utils';\nimport actions from './config/actions';\n\nimport defaultStages from './constants/default-stages.json';\nimport defaultWorkflow from './constants/default-workflow.json';\nimport webhookEvents from './constants/webhook-events';\n\n/**\n * Initialize the default workflow if there is no workflow in the database\n */\n\nasync function initDefaultWorkflow() {\n const workflowsService = getService('workflows', { strapi });\n const stagesService = getService('stages', { strapi });\n\n const wfCount = await workflowsService.count();\n const stagesCount = await stagesService.count();\n\n // Check if there is nothing about review-workflow in DB\n // If any, the feature has already been initialized with a workflow and stages\n if (wfCount === 0 && stagesCount === 0) {\n const workflow = {\n ...defaultWorkflow,\n contentTypes: [],\n stages: defaultStages,\n };\n\n await workflowsService.create({ data: workflow });\n }\n}\n\n/**\n * Webhook store limits the events that can be triggered,\n * this function extends it with the events review workflows can trigger\n */\nconst registerWebhookEvents = async () =>\n Object.entries(webhookEvents).forEach(([eventKey, event]) =>\n strapi.get('webhookStore').addAllowedEvent(eventKey, event)\n );\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Permissions\n const { actionProvider } = getAdminService('permission');\n await actionProvider.registerMany(actions.reviewWorkflows);\n\n // Webhooks and events\n await registerWebhookEvents();\n await getService('workflow-weekly-metrics').registerCron();\n\n // Data initialization\n await initDefaultWorkflow();\n\n // Document service middleware\n const docsMiddlewares = getService('document-service-middlewares');\n strapi.documents.use(docsMiddlewares.assignStageOnCreate);\n strapi.documents.use(docsMiddlewares.handleStageOnUpdate);\n strapi.documents.use(docsMiddlewares.checkStageBeforePublish);\n};\n"],"names":["initDefaultWorkflow","workflowsService","getService","strapi","stagesService","wfCount","count","stagesCount","workflow","defaultWorkflow","contentTypes","stages","defaultStages","create","data","registerWebhookEvents","Object","entries","webhookEvents","forEach","eventKey","event","get","addAllowedEvent","actionProvider","getAdminService","registerMany","actions","reviewWorkflows","registerCron","docsMiddlewares","documents","use","assignStageOnCreate","handleStageOnUpdate","checkStageBeforePublish"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getAdminService, getService } from './utils';\nimport actions from './config/actions';\n\nimport defaultStages from './constants/default-stages.json';\nimport defaultWorkflow from './constants/default-workflow.json';\nimport webhookEvents from './constants/webhook-events';\nimport { registerAuditEvents } from './audit-logs';\n\n/**\n * Initialize the default workflow if there is no workflow in the database\n */\n\nasync function initDefaultWorkflow() {\n const workflowsService = getService('workflows', { strapi });\n const stagesService = getService('stages', { strapi });\n\n const wfCount = await workflowsService.count();\n const stagesCount = await stagesService.count();\n\n // Check if there is nothing about review-workflow in DB\n // If any, the feature has already been initialized with a workflow and stages\n if (wfCount === 0 && stagesCount === 0) {\n const workflow = {\n ...defaultWorkflow,\n contentTypes: [],\n stages: defaultStages,\n };\n\n await workflowsService.create({ data: workflow });\n }\n}\n\n/**\n * Webhook store limits the events that can be triggered,\n * this function extends it with the events review workflows can trigger\n */\nconst registerWebhookEvents = async () =>\n Object.entries(webhookEvents).forEach(([eventKey, event]) =>\n strapi.get('webhookStore').addAllowedEvent(eventKey, event)\n );\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Permissions\n const { actionProvider } = getAdminService('permission');\n await actionProvider.registerMany(actions.reviewWorkflows);\n\n // Webhooks and events\n await registerWebhookEvents();\n\n // Absent in CE, without the audit-logs license, or when disabled by config\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents({ strapi }, strapi.get('audit-logs-lifecycle'));\n }\n await getService('workflow-weekly-metrics').registerCron();\n\n // Data initialization\n await initDefaultWorkflow();\n\n // Document service middleware\n const docsMiddlewares = getService('document-service-middlewares');\n strapi.documents.use(docsMiddlewares.assignStageOnCreate);\n strapi.documents.use(docsMiddlewares.handleStageOnUpdate);\n strapi.documents.use(docsMiddlewares.checkStageBeforePublish);\n};\n"],"names":["initDefaultWorkflow","workflowsService","getService","strapi","stagesService","wfCount","count","stagesCount","workflow","defaultWorkflow","contentTypes","stages","defaultStages","create","data","registerWebhookEvents","Object","entries","webhookEvents","forEach","eventKey","event","get","addAllowedEvent","actionProvider","getAdminService","registerMany","actions","reviewWorkflows","has","registerAuditEvents","registerCron","docsMiddlewares","documents","use","assignStageOnCreate","handleStageOnUpdate","checkStageBeforePublish"],"mappings":";;;;;;;;;AASA;;AAEC,IAED,eAAeA,mBAAAA,GAAAA;IACb,MAAMC,gBAAAA,GAAmBC,iBAAW,WAAA,EAAa;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAC1D,MAAMC,aAAAA,GAAgBF,iBAAW,QAAA,EAAU;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAEpD,MAAME,OAAAA,GAAU,MAAMJ,gBAAAA,CAAiBK,KAAK,EAAA;IAC5C,MAAMC,WAAAA,GAAc,MAAMH,aAAAA,CAAcE,KAAK,EAAA;;;IAI7C,IAAID,OAAAA,KAAY,CAAA,IAAKE,WAAAA,KAAgB,CAAA,EAAG;AACtC,QAAA,MAAMC,QAAAA,GAAW;AACf,YAAA,GAAGC,uBAAe;AAClBC,YAAAA,YAAAA,EAAc,EAAE;YAChBC,MAAAA,EAAQC;AACV,SAAA;QAEA,MAAMX,gBAAAA,CAAiBY,MAAM,CAAC;YAAEC,IAAAA,EAAMN;AAAS,SAAA,CAAA;AACjD,IAAA;AACF;AAEA;;;IAIA,MAAMO,wBAAwB,UAC5BC,MAAAA,CAAOC,OAAO,CAACC,qBAAAA,CAAAA,CAAeC,OAAO,CAAC,CAAC,CAACC,QAAAA,EAAUC,KAAAA,CAAM,GACtDlB,MAAAA,CAAOmB,GAAG,CAAC,cAAA,CAAA,CAAgBC,eAAe,CAACH,QAAAA,EAAUC,KAAAA,CAAAA,CAAAA;AAGzD,gBAAe,CAAA,OAAO,EAAElB,MAAAA,EAAAA,OAAM,EAA2B,GAAA;;AAEvD,IAAA,MAAM,EAAEqB,cAAc,EAAE,GAAGC,qBAAAA,CAAgB,YAAA,CAAA;AAC3C,IAAA,MAAMD,cAAAA,CAAeE,YAAY,CAACC,OAAAA,CAAQC,eAAe,CAAA;;IAGzD,MAAMb,qBAAAA,EAAAA;;IAGN,IAAIZ,OAAAA,CAAO0B,GAAG,CAAC,sBAAA,CAAA,EAAyB;QACtCC,6BAAAA,CAAoB;YAAE3B,MAAAA,EAAAA;SAAO,EAAGA,OAAAA,CAAOmB,GAAG,CAAC,sBAAA,CAAA,CAAA;AAC7C,IAAA;IACA,MAAMpB,gBAAAA,CAAW,2BAA2B6B,YAAY,EAAA;;IAGxD,MAAM/B,mBAAAA,EAAAA;;AAGN,IAAA,MAAMgC,kBAAkB9B,gBAAAA,CAAW,8BAAA,CAAA;AACnCC,IAAAA,OAAAA,CAAO8B,SAAS,CAACC,GAAG,CAACF,gBAAgBG,mBAAmB,CAAA;AACxDhC,IAAAA,OAAAA,CAAO8B,SAAS,CAACC,GAAG,CAACF,gBAAgBI,mBAAmB,CAAA;AACxDjC,IAAAA,OAAAA,CAAO8B,SAAS,CAACC,GAAG,CAACF,gBAAgBK,uBAAuB,CAAA;AAC9D,CAAA;;;;"}
|
|
@@ -3,6 +3,7 @@ import actions from './config/actions.mjs';
|
|
|
3
3
|
import defaultStages from './constants/default-stages.json.mjs';
|
|
4
4
|
import defaultWorkflow from './constants/default-workflow.json.mjs';
|
|
5
5
|
import webhookEvents from './constants/webhook-events.mjs';
|
|
6
|
+
import { registerAuditEvents } from './audit-logs.mjs';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Initialize the default workflow if there is no workflow in the database
|
|
@@ -38,6 +39,12 @@ var bootstrap = (async ({ strapi: strapi1 })=>{
|
|
|
38
39
|
await actionProvider.registerMany(actions.reviewWorkflows);
|
|
39
40
|
// Webhooks and events
|
|
40
41
|
await registerWebhookEvents();
|
|
42
|
+
// Absent in CE, without the audit-logs license, or when disabled by config
|
|
43
|
+
if (strapi1.has('audit-logs-lifecycle')) {
|
|
44
|
+
registerAuditEvents({
|
|
45
|
+
strapi: strapi1
|
|
46
|
+
}, strapi1.get('audit-logs-lifecycle'));
|
|
47
|
+
}
|
|
41
48
|
await getService('workflow-weekly-metrics').registerCron();
|
|
42
49
|
// Data initialization
|
|
43
50
|
await initDefaultWorkflow();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getAdminService, getService } from './utils';\nimport actions from './config/actions';\n\nimport defaultStages from './constants/default-stages.json';\nimport defaultWorkflow from './constants/default-workflow.json';\nimport webhookEvents from './constants/webhook-events';\n\n/**\n * Initialize the default workflow if there is no workflow in the database\n */\n\nasync function initDefaultWorkflow() {\n const workflowsService = getService('workflows', { strapi });\n const stagesService = getService('stages', { strapi });\n\n const wfCount = await workflowsService.count();\n const stagesCount = await stagesService.count();\n\n // Check if there is nothing about review-workflow in DB\n // If any, the feature has already been initialized with a workflow and stages\n if (wfCount === 0 && stagesCount === 0) {\n const workflow = {\n ...defaultWorkflow,\n contentTypes: [],\n stages: defaultStages,\n };\n\n await workflowsService.create({ data: workflow });\n }\n}\n\n/**\n * Webhook store limits the events that can be triggered,\n * this function extends it with the events review workflows can trigger\n */\nconst registerWebhookEvents = async () =>\n Object.entries(webhookEvents).forEach(([eventKey, event]) =>\n strapi.get('webhookStore').addAllowedEvent(eventKey, event)\n );\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Permissions\n const { actionProvider } = getAdminService('permission');\n await actionProvider.registerMany(actions.reviewWorkflows);\n\n // Webhooks and events\n await registerWebhookEvents();\n await getService('workflow-weekly-metrics').registerCron();\n\n // Data initialization\n await initDefaultWorkflow();\n\n // Document service middleware\n const docsMiddlewares = getService('document-service-middlewares');\n strapi.documents.use(docsMiddlewares.assignStageOnCreate);\n strapi.documents.use(docsMiddlewares.handleStageOnUpdate);\n strapi.documents.use(docsMiddlewares.checkStageBeforePublish);\n};\n"],"names":["initDefaultWorkflow","workflowsService","getService","strapi","stagesService","wfCount","count","stagesCount","workflow","defaultWorkflow","contentTypes","stages","defaultStages","create","data","registerWebhookEvents","Object","entries","webhookEvents","forEach","eventKey","event","get","addAllowedEvent","actionProvider","getAdminService","registerMany","actions","reviewWorkflows","registerCron","docsMiddlewares","documents","use","assignStageOnCreate","handleStageOnUpdate","checkStageBeforePublish"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import { Core } from '@strapi/types';\nimport { getAdminService, getService } from './utils';\nimport actions from './config/actions';\n\nimport defaultStages from './constants/default-stages.json';\nimport defaultWorkflow from './constants/default-workflow.json';\nimport webhookEvents from './constants/webhook-events';\nimport { registerAuditEvents } from './audit-logs';\n\n/**\n * Initialize the default workflow if there is no workflow in the database\n */\n\nasync function initDefaultWorkflow() {\n const workflowsService = getService('workflows', { strapi });\n const stagesService = getService('stages', { strapi });\n\n const wfCount = await workflowsService.count();\n const stagesCount = await stagesService.count();\n\n // Check if there is nothing about review-workflow in DB\n // If any, the feature has already been initialized with a workflow and stages\n if (wfCount === 0 && stagesCount === 0) {\n const workflow = {\n ...defaultWorkflow,\n contentTypes: [],\n stages: defaultStages,\n };\n\n await workflowsService.create({ data: workflow });\n }\n}\n\n/**\n * Webhook store limits the events that can be triggered,\n * this function extends it with the events review workflows can trigger\n */\nconst registerWebhookEvents = async () =>\n Object.entries(webhookEvents).forEach(([eventKey, event]) =>\n strapi.get('webhookStore').addAllowedEvent(eventKey, event)\n );\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Permissions\n const { actionProvider } = getAdminService('permission');\n await actionProvider.registerMany(actions.reviewWorkflows);\n\n // Webhooks and events\n await registerWebhookEvents();\n\n // Absent in CE, without the audit-logs license, or when disabled by config\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents({ strapi }, strapi.get('audit-logs-lifecycle'));\n }\n await getService('workflow-weekly-metrics').registerCron();\n\n // Data initialization\n await initDefaultWorkflow();\n\n // Document service middleware\n const docsMiddlewares = getService('document-service-middlewares');\n strapi.documents.use(docsMiddlewares.assignStageOnCreate);\n strapi.documents.use(docsMiddlewares.handleStageOnUpdate);\n strapi.documents.use(docsMiddlewares.checkStageBeforePublish);\n};\n"],"names":["initDefaultWorkflow","workflowsService","getService","strapi","stagesService","wfCount","count","stagesCount","workflow","defaultWorkflow","contentTypes","stages","defaultStages","create","data","registerWebhookEvents","Object","entries","webhookEvents","forEach","eventKey","event","get","addAllowedEvent","actionProvider","getAdminService","registerMany","actions","reviewWorkflows","has","registerAuditEvents","registerCron","docsMiddlewares","documents","use","assignStageOnCreate","handleStageOnUpdate","checkStageBeforePublish"],"mappings":";;;;;;;AASA;;AAEC,IAED,eAAeA,mBAAAA,GAAAA;IACb,MAAMC,gBAAAA,GAAmBC,WAAW,WAAA,EAAa;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAC1D,MAAMC,aAAAA,GAAgBF,WAAW,QAAA,EAAU;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAEpD,MAAME,OAAAA,GAAU,MAAMJ,gBAAAA,CAAiBK,KAAK,EAAA;IAC5C,MAAMC,WAAAA,GAAc,MAAMH,aAAAA,CAAcE,KAAK,EAAA;;;IAI7C,IAAID,OAAAA,KAAY,CAAA,IAAKE,WAAAA,KAAgB,CAAA,EAAG;AACtC,QAAA,MAAMC,QAAAA,GAAW;AACf,YAAA,GAAGC,eAAe;AAClBC,YAAAA,YAAAA,EAAc,EAAE;YAChBC,MAAAA,EAAQC;AACV,SAAA;QAEA,MAAMX,gBAAAA,CAAiBY,MAAM,CAAC;YAAEC,IAAAA,EAAMN;AAAS,SAAA,CAAA;AACjD,IAAA;AACF;AAEA;;;IAIA,MAAMO,wBAAwB,UAC5BC,MAAAA,CAAOC,OAAO,CAACC,aAAAA,CAAAA,CAAeC,OAAO,CAAC,CAAC,CAACC,QAAAA,EAAUC,KAAAA,CAAM,GACtDlB,MAAAA,CAAOmB,GAAG,CAAC,cAAA,CAAA,CAAgBC,eAAe,CAACH,QAAAA,EAAUC,KAAAA,CAAAA,CAAAA;AAGzD,gBAAe,CAAA,OAAO,EAAElB,MAAAA,EAAAA,OAAM,EAA2B,GAAA;;AAEvD,IAAA,MAAM,EAAEqB,cAAc,EAAE,GAAGC,eAAAA,CAAgB,YAAA,CAAA;AAC3C,IAAA,MAAMD,cAAAA,CAAeE,YAAY,CAACC,OAAAA,CAAQC,eAAe,CAAA;;IAGzD,MAAMb,qBAAAA,EAAAA;;IAGN,IAAIZ,OAAAA,CAAO0B,GAAG,CAAC,sBAAA,CAAA,EAAyB;QACtCC,mBAAAA,CAAoB;YAAE3B,MAAAA,EAAAA;SAAO,EAAGA,OAAAA,CAAOmB,GAAG,CAAC,sBAAA,CAAA,CAAA;AAC7C,IAAA;IACA,MAAMpB,UAAAA,CAAW,2BAA2B6B,YAAY,EAAA;;IAGxD,MAAM/B,mBAAAA,EAAAA;;AAGN,IAAA,MAAMgC,kBAAkB9B,UAAAA,CAAW,8BAAA,CAAA;AACnCC,IAAAA,OAAAA,CAAO8B,SAAS,CAACC,GAAG,CAACF,gBAAgBG,mBAAmB,CAAA;AACxDhC,IAAAA,OAAAA,CAAO8B,SAAS,CAACC,GAAG,CAACF,gBAAgBI,mBAAmB,CAAA;AACxDjC,IAAAA,OAAAA,CAAO8B,SAAS,CAACC,GAAG,CAACF,gBAAgBK,uBAAuB,CAAA;AAC9D,CAAA;;;;"}
|
|
@@ -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 reviewWorkflows = require('../validation/review-workflows.js');
|
|
@@ -24,17 +23,20 @@ function formatWorkflowToAdmin(workflow) {
|
|
|
24
23
|
...rest,
|
|
25
24
|
role: typeof role === 'object' ? role.id : role
|
|
26
25
|
});
|
|
27
|
-
const
|
|
26
|
+
const stages = workflow.stages.map((stage)=>{
|
|
28
27
|
const { permissions: allPermissions = [], ...rest } = stage;
|
|
29
|
-
const fromPermissions = allPermissions.filter((p)=>p.actionParameters?.from).map(transformRoleToId);
|
|
30
|
-
const toPermissions = allPermissions.filter((p)=>p.actionParameters?.to).map(transformRoleToId);
|
|
28
|
+
const fromPermissions = allPermissions.filter((p)=>p.actionParameters?.from).map((permission)=>transformRoleToId(permission));
|
|
29
|
+
const toPermissions = allPermissions.filter((p)=>p.actionParameters?.to).map((permission)=>transformRoleToId(permission));
|
|
31
30
|
return {
|
|
32
31
|
...rest,
|
|
33
32
|
fromPermissions,
|
|
34
33
|
toPermissions
|
|
35
34
|
};
|
|
36
35
|
});
|
|
37
|
-
return
|
|
36
|
+
return {
|
|
37
|
+
...workflow,
|
|
38
|
+
stages
|
|
39
|
+
};
|
|
38
40
|
}
|
|
39
41
|
var workflows = {
|
|
40
42
|
/**
|
|
@@ -123,7 +125,7 @@ var workflows = {
|
|
|
123
125
|
populate,
|
|
124
126
|
filters,
|
|
125
127
|
sort
|
|
126
|
-
}).then(
|
|
128
|
+
}).then((workflows)=>workflows.map((workflow)=>formatWorkflowToAdmin(workflow))),
|
|
127
129
|
workflowService.count()
|
|
128
130
|
]);
|
|
129
131
|
ctx.body = {
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"workflows.js","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\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 stages = workflow.stages.map((stage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map((permission) => transformRoleToId(permission));\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map((permission) => transformRoleToId(permission));\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return { ...workflow, stages };\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\n .find({ populate, filters, sort })\n .then((workflows: Parameters<typeof formatWorkflowToAdmin>[0][]) =>\n workflows.map((workflow) => formatWorkflowToAdmin(workflow))\n ),\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","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","permission","toPermissions","to","ctx","body","query","request","sanitizeCreateInput","sanitizeOutput","sanitizedQuery","state","populate","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","update","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,4 +1,3 @@
|
|
|
1
|
-
import { map, update } from 'lodash/fp';
|
|
2
1
|
import { async } from '@strapi/utils';
|
|
3
2
|
import { getService } from '../utils/index.mjs';
|
|
4
3
|
import { validateWorkflowUpdate, validateWorkflowCreate } from '../validation/review-workflows.mjs';
|
|
@@ -22,17 +21,20 @@ function formatWorkflowToAdmin(workflow) {
|
|
|
22
21
|
...rest,
|
|
23
22
|
role: typeof role === 'object' ? role.id : role
|
|
24
23
|
});
|
|
25
|
-
const
|
|
24
|
+
const stages = workflow.stages.map((stage)=>{
|
|
26
25
|
const { permissions: allPermissions = [], ...rest } = stage;
|
|
27
|
-
const fromPermissions = allPermissions.filter((p)=>p.actionParameters?.from).map(transformRoleToId);
|
|
28
|
-
const toPermissions = allPermissions.filter((p)=>p.actionParameters?.to).map(transformRoleToId);
|
|
26
|
+
const fromPermissions = allPermissions.filter((p)=>p.actionParameters?.from).map((permission)=>transformRoleToId(permission));
|
|
27
|
+
const toPermissions = allPermissions.filter((p)=>p.actionParameters?.to).map((permission)=>transformRoleToId(permission));
|
|
29
28
|
return {
|
|
30
29
|
...rest,
|
|
31
30
|
fromPermissions,
|
|
32
31
|
toPermissions
|
|
33
32
|
};
|
|
34
33
|
});
|
|
35
|
-
return
|
|
34
|
+
return {
|
|
35
|
+
...workflow,
|
|
36
|
+
stages
|
|
37
|
+
};
|
|
36
38
|
}
|
|
37
39
|
var workflows = {
|
|
38
40
|
/**
|
|
@@ -121,7 +123,7 @@ var workflows = {
|
|
|
121
123
|
populate,
|
|
122
124
|
filters,
|
|
123
125
|
sort
|
|
124
|
-
}).then(map(formatWorkflowToAdmin)),
|
|
126
|
+
}).then((workflows)=>workflows.map((workflow)=>formatWorkflowToAdmin(workflow))),
|
|
125
127
|
workflowService.count()
|
|
126
128
|
]);
|
|
127
129
|
ctx.body = {
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"file":"workflows.mjs","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\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 stages = workflow.stages.map((stage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map((permission) => transformRoleToId(permission));\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map((permission) => transformRoleToId(permission));\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return { ...workflow, stages };\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\n .find({ populate, filters, sort })\n .then((workflows: Parameters<typeof formatWorkflowToAdmin>[0][]) =>\n workflows.map((workflow) => formatWorkflowToAdmin(workflow))\n ),\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","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","permission","toPermissions","to","ctx","body","query","request","sanitizeCreateInput","sanitizeOutput","sanitizedQuery","state","populate","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","update","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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"}
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var fp = require('lodash/fp');
|
|
6
|
-
|
|
7
5
|
/**
|
|
8
6
|
* A Strapi middleware function that adds support for review workflows.
|
|
9
7
|
*
|
|
@@ -23,7 +21,13 @@ var fp = require('lodash/fp');
|
|
|
23
21
|
// Move reviewWorkflows to options.reviewWorkflows
|
|
24
22
|
const { reviewWorkflows, ...contentType } = ctx.request.body.contentType;
|
|
25
23
|
if (typeof reviewWorkflows === 'boolean') {
|
|
26
|
-
ctx.request.body.contentType =
|
|
24
|
+
ctx.request.body.contentType = {
|
|
25
|
+
...contentType,
|
|
26
|
+
options: {
|
|
27
|
+
...contentType.options,
|
|
28
|
+
reviewWorkflows
|
|
29
|
+
}
|
|
30
|
+
};
|
|
27
31
|
}
|
|
28
32
|
};
|
|
29
33
|
strapi.server.router.use('/content-type-builder/content-types/:uid?', (ctx, next)=>{
|