@strapi/content-releases 5.52.2 → 5.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/pages/ReleasesPage.js +0 -1
- package/dist/admin/pages/ReleasesPage.js.map +1 -1
- package/dist/admin/pages/ReleasesPage.mjs +0 -1
- package/dist/admin/pages/ReleasesPage.mjs.map +1 -1
- package/dist/server/audit-logs.js +182 -0
- package/dist/server/audit-logs.js.map +1 -0
- package/dist/server/audit-logs.mjs +175 -0
- package/dist/server/audit-logs.mjs.map +1 -0
- package/dist/server/bootstrap.js +6 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +6 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/constants.js +20 -0
- package/dist/server/constants.js.map +1 -1
- package/dist/server/constants.mjs +20 -1
- package/dist/server/constants.mjs.map +1 -1
- package/dist/server/controllers/release.js +9 -21
- package/dist/server/controllers/release.js.map +1 -1
- package/dist/server/controllers/release.mjs +9 -21
- package/dist/server/controllers/release.mjs.map +1 -1
- package/dist/server/controllers/settings.js +0 -1
- package/dist/server/controllers/settings.js.map +1 -1
- package/dist/server/controllers/settings.mjs +0 -1
- package/dist/server/controllers/settings.mjs.map +1 -1
- package/dist/server/services/release-action.js +59 -3
- package/dist/server/services/release-action.js.map +1 -1
- package/dist/server/services/release-action.mjs +60 -4
- package/dist/server/services/release-action.mjs.map +1 -1
- package/dist/server/services/release.js +110 -10
- package/dist/server/services/release.js.map +1 -1
- package/dist/server/services/release.mjs +111 -11
- package/dist/server/services/release.mjs.map +1 -1
- package/dist/server/services/scheduling.js +7 -2
- package/dist/server/services/scheduling.js.map +1 -1
- package/dist/server/services/scheduling.mjs +7 -2
- package/dist/server/services/scheduling.mjs.map +1 -1
- package/dist/server/services/settings.js +29 -1
- package/dist/server/services/settings.js.map +1 -1
- package/dist/server/services/settings.mjs +29 -1
- package/dist/server/services/settings.mjs.map +1 -1
- package/dist/server/src/audit-logs.d.ts +99 -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/constants.d.ts +20 -0
- package/dist/server/src/constants.d.ts.map +1 -1
- package/dist/server/src/controllers/release.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +8 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +8 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/release-action.d.ts.map +1 -1
- package/dist/server/src/services/release.d.ts +8 -1
- package/dist/server/src/services/release.d.ts.map +1 -1
- package/dist/server/src/services/scheduling.d.ts.map +1 -1
- package/dist/server/src/services/settings.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { AUDITED_EVENTS } from './constants.mjs';
|
|
2
|
+
|
|
3
|
+
const RELEASE_EDITABLE_FIELDS = [
|
|
4
|
+
'name',
|
|
5
|
+
'scheduledAt',
|
|
6
|
+
'timezone'
|
|
7
|
+
];
|
|
8
|
+
/** Audit rows are never pruned by size, so the failure reason is capped */ const MAX_REASON_LENGTH = 100;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the fields that changed in a release update.
|
|
11
|
+
* `isScheduled` is included when the release changes between scheduled and unscheduled.
|
|
12
|
+
*/ const getReleaseChanges = (previous, next)=>{
|
|
13
|
+
const changes = {};
|
|
14
|
+
for (const field of RELEASE_EDITABLE_FIELDS){
|
|
15
|
+
const hasChanged = (previous?.[field] ?? null) !== (next[field] ?? null);
|
|
16
|
+
if (hasChanged) {
|
|
17
|
+
changes[field] = {
|
|
18
|
+
before: previous?.[field] ?? null,
|
|
19
|
+
after: next[field] ?? null
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (field === 'scheduledAt' && changes.scheduledAt) {
|
|
23
|
+
const wasScheduled = previous?.scheduledAt != null;
|
|
24
|
+
const isScheduled = next.scheduledAt != null;
|
|
25
|
+
if (wasScheduled !== isScheduled) {
|
|
26
|
+
changes.isScheduled = {
|
|
27
|
+
before: wasScheduled,
|
|
28
|
+
after: isScheduled
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return changes;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Emits an audit event and waits for it to be processed.
|
|
37
|
+
* A failed audit write, or a failing listener, is logged here and doesn't affect the
|
|
38
|
+
* operation that emitted the event.
|
|
39
|
+
*/ const emitAudit = async ({ strapi }, event, payload)=>{
|
|
40
|
+
try {
|
|
41
|
+
await strapi.eventHub.emit(event, payload);
|
|
42
|
+
} catch (error) {
|
|
43
|
+
strapi.log.error(`An event listener failed while handling ${event}`, {
|
|
44
|
+
error
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Emits an audit event for a write that may be part of a bulk transaction.
|
|
50
|
+
* Inside one, the event waits for its commit, so a rollback leaves no rows for
|
|
51
|
+
* entries that were never added. Standalone, it is emitted right away.
|
|
52
|
+
*/ const emitAuditOnCommit = async ({ strapi }, event, payload)=>{
|
|
53
|
+
if (!strapi.db.inTransaction()) {
|
|
54
|
+
await emitAudit({
|
|
55
|
+
strapi
|
|
56
|
+
}, event, payload);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
await strapi.db.transaction(({ onCommit })=>onCommit(()=>emitAudit({
|
|
60
|
+
strapi
|
|
61
|
+
}, event, payload)));
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Runs work as a system principal so events emitted during the operation
|
|
65
|
+
* are recorded with a system actor.
|
|
66
|
+
*/ const runAsSystem = async ({ strapi }, origin, work)=>{
|
|
67
|
+
let result;
|
|
68
|
+
await strapi.requestContext.run({
|
|
69
|
+
state: {
|
|
70
|
+
auditSource: origin
|
|
71
|
+
},
|
|
72
|
+
request: {
|
|
73
|
+
url: ''
|
|
74
|
+
}
|
|
75
|
+
}, async ()=>{
|
|
76
|
+
result = await work();
|
|
77
|
+
});
|
|
78
|
+
return result;
|
|
79
|
+
};
|
|
80
|
+
const registerAuditEvents = (auditLogsLifecycle)=>{
|
|
81
|
+
const releaseResource = (event)=>({
|
|
82
|
+
type: 'release',
|
|
83
|
+
id: event.releaseId,
|
|
84
|
+
name: event.name
|
|
85
|
+
});
|
|
86
|
+
const entryRef = (event)=>({
|
|
87
|
+
contentType: event.contentType,
|
|
88
|
+
documentId: event.entryDocumentId,
|
|
89
|
+
locale: event.locale ?? null
|
|
90
|
+
});
|
|
91
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_CREATE, (event)=>({
|
|
92
|
+
resource: releaseResource(event),
|
|
93
|
+
details: {
|
|
94
|
+
isScheduled: event.scheduledAt != null,
|
|
95
|
+
...event.scheduledAt && {
|
|
96
|
+
scheduledAt: event.scheduledAt,
|
|
97
|
+
timezone: event.timezone
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}));
|
|
101
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_UPDATE, (event)=>({
|
|
102
|
+
resource: releaseResource(event),
|
|
103
|
+
details: {
|
|
104
|
+
changes: event.changes
|
|
105
|
+
}
|
|
106
|
+
}));
|
|
107
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_DELETE, (event)=>({
|
|
108
|
+
resource: releaseResource(event)
|
|
109
|
+
}));
|
|
110
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_TRIGGER, (event)=>{
|
|
111
|
+
const base = {
|
|
112
|
+
resource: releaseResource(event),
|
|
113
|
+
outcome: event.outcome
|
|
114
|
+
};
|
|
115
|
+
if (event.outcome === 'failure') {
|
|
116
|
+
return {
|
|
117
|
+
...base,
|
|
118
|
+
details: {
|
|
119
|
+
reason: event.reason?.slice(0, MAX_REASON_LENGTH),
|
|
120
|
+
// Only when the emitter can attribute the counts.
|
|
121
|
+
...event.published != null && {
|
|
122
|
+
published: event.published,
|
|
123
|
+
unpublished: event.unpublished,
|
|
124
|
+
failed: event.failed
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
if (event.published != null && event.unpublished != null) {
|
|
130
|
+
return {
|
|
131
|
+
...base,
|
|
132
|
+
details: {
|
|
133
|
+
published: event.published,
|
|
134
|
+
unpublished: event.unpublished,
|
|
135
|
+
failed: 0
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return base;
|
|
140
|
+
});
|
|
141
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_ENTRY_ADD, (event)=>({
|
|
142
|
+
resource: releaseResource(event),
|
|
143
|
+
details: {
|
|
144
|
+
entry: entryRef(event),
|
|
145
|
+
actionType: event.type
|
|
146
|
+
}
|
|
147
|
+
}));
|
|
148
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_ENTRY_UPDATE, (event)=>({
|
|
149
|
+
resource: releaseResource(event),
|
|
150
|
+
details: {
|
|
151
|
+
entry: entryRef(event),
|
|
152
|
+
actionType: {
|
|
153
|
+
before: event.from,
|
|
154
|
+
after: event.to
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}));
|
|
158
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_ENTRY_REMOVE, (event)=>({
|
|
159
|
+
resource: releaseResource(event),
|
|
160
|
+
details: {
|
|
161
|
+
entry: entryRef(event)
|
|
162
|
+
}
|
|
163
|
+
}));
|
|
164
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_SETTINGS_UPDATE, (event)=>({
|
|
165
|
+
resource: {
|
|
166
|
+
type: 'release'
|
|
167
|
+
},
|
|
168
|
+
details: {
|
|
169
|
+
changes: event.changes
|
|
170
|
+
}
|
|
171
|
+
}));
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export { RELEASE_EDITABLE_FIELDS, emitAudit, emitAuditOnCommit, getReleaseChanges, registerAuditEvents, runAsSystem };
|
|
175
|
+
//# sourceMappingURL=audit-logs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logs.mjs","sources":["../../server/src/audit-logs.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nimport { AUDITED_EVENTS } from './constants';\n\n/**\n * Transformers for the release audit events.\n * Each builds {resource, details, outcome} from its emitted event.\n */\n\ninterface ReleaseEvent {\n releaseId: number;\n name?: string;\n scheduledAt?: string | null;\n timezone?: string | null;\n}\n\ninterface ReleaseEntryEvent {\n releaseId: number;\n name?: string;\n contentType: string;\n entryDocumentId: string;\n locale: string | null;\n}\n\nexport interface CreateDetails {\n isScheduled: boolean;\n scheduledAt?: string | null;\n timezone?: string | null;\n}\n\nexport interface FieldChange {\n before: string | boolean | null;\n after: string | boolean | null;\n}\n\nexport const RELEASE_EDITABLE_FIELDS = ['name', 'scheduledAt', 'timezone'] as const;\n\n/** Audit rows are never pruned by size, so the failure reason is capped */\nconst MAX_REASON_LENGTH = 100;\n\ntype ReleaseChangedField = (typeof RELEASE_EDITABLE_FIELDS)[number] | 'isScheduled';\n\nexport interface UpdateDetails {\n changes: Partial<Record<ReleaseChangedField, FieldChange>>;\n}\n\n/**\n * Returns the fields that changed in a release update.\n * `isScheduled` is included when the release changes between scheduled and unscheduled.\n */\nexport const getReleaseChanges = (\n previous: { name?: string; scheduledAt?: string | null; timezone?: string | null } | null,\n next: { name?: string; scheduledAt?: string | null; timezone?: string | null }\n) => {\n const changes: Partial<Record<ReleaseChangedField, FieldChange>> = {};\n\n for (const field of RELEASE_EDITABLE_FIELDS) {\n const hasChanged = (previous?.[field] ?? null) !== (next[field] ?? null);\n\n if (hasChanged) {\n changes[field] = { before: previous?.[field] ?? null, after: next[field] ?? null };\n }\n\n if (field === 'scheduledAt' && changes.scheduledAt) {\n const wasScheduled = previous?.scheduledAt != null;\n const isScheduled = next.scheduledAt != null;\n\n if (wasScheduled !== isScheduled) {\n changes.isScheduled = { before: wasScheduled, after: isScheduled };\n }\n }\n }\n\n return changes;\n};\n\nexport interface TriggerDetails {\n published: number;\n unpublished: number;\n failed: number;\n}\n\nexport interface TriggerFailureDetails {\n /**\n * Only the error name is stored, capped in length. Error objects may contain\n * sensitive data such as database error details, and a custom error class can put\n * arbitrary text in its name.\n */\n reason: string;\n // A failed run is not atomic, so counts are not reported. Reserved for partial releases.\n published?: number;\n unpublished?: number;\n failed?: number;\n}\n\ntype TriggerEvent = ReleaseEvent &\n (\n | { outcome: 'success'; published?: number; unpublished?: number }\n | {\n outcome: 'failure';\n reason: string;\n published?: number;\n unpublished?: number;\n failed?: number;\n }\n );\n\nexport interface SettingsUpdateDetails {\n changes: Partial<Record<'defaultTimezone', FieldChange>>;\n}\n\ninterface EntryRef {\n contentType: string;\n documentId: string;\n locale: string | null;\n}\n\nexport interface EntryAddDetails {\n entry: EntryRef;\n actionType: 'publish' | 'unpublish';\n}\n\nexport interface EntryUpdateDetails {\n entry: EntryRef;\n actionType: { before: 'publish' | 'unpublish'; after: 'publish' | 'unpublish' };\n}\n\nexport interface EntryRemoveDetails {\n entry: EntryRef;\n}\n\n/**\n * Emits an audit event and waits for it to be processed.\n * A failed audit write, or a failing listener, is logged here and doesn't affect the\n * operation that emitted the event.\n */\nexport const emitAudit = async (\n { strapi }: { strapi: Core.Strapi },\n event: string,\n payload: unknown\n): Promise<void> => {\n try {\n await strapi.eventHub.emit(event, payload);\n } catch (error) {\n strapi.log.error(`An event listener failed while handling ${event}`, { error });\n }\n};\n\n/**\n * Emits an audit event for a write that may be part of a bulk transaction.\n * Inside one, the event waits for its commit, so a rollback leaves no rows for\n * entries that were never added. Standalone, it is emitted right away.\n */\nexport const emitAuditOnCommit = async (\n { strapi }: { strapi: Core.Strapi },\n event: string,\n payload: unknown\n): Promise<void> => {\n if (!strapi.db.inTransaction()) {\n await emitAudit({ strapi }, event, payload);\n return;\n }\n\n await strapi.db.transaction(({ onCommit }) =>\n onCommit(() => emitAudit({ strapi }, event, payload))\n );\n};\n\n/**\n * Runs work as a system principal so events emitted during the operation\n * are recorded with a system actor.\n */\nexport const runAsSystem = async <T>(\n { strapi }: { strapi: Core.Strapi },\n origin: Modules.AuditLogs.SystemOrigin,\n work: () => Promise<T>\n): Promise<T> => {\n let result: T;\n\n await strapi.requestContext.run(\n { state: { auditSource: origin }, request: { url: '' } } as any,\n async () => {\n result = await work();\n }\n );\n\n return result!;\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>(\n name: string,\n transform: Modules.AuditLogs.EventTransformer<TDetails>\n ): void;\n}\n\nexport const registerAuditEvents = (auditLogsLifecycle: AuditLogsLifecycle) => {\n const releaseResource = (event: ReleaseEvent): Modules.AuditLogs.Resource => ({\n type: 'release',\n id: event.releaseId,\n name: event.name,\n });\n\n const entryRef = (event: ReleaseEntryEvent): EntryRef => ({\n contentType: event.contentType,\n documentId: event.entryDocumentId,\n locale: event.locale ?? null,\n });\n\n auditLogsLifecycle.registerEvent<CreateDetails>(\n AUDITED_EVENTS.RELEASE_CREATE,\n (event: ReleaseEvent) => ({\n resource: releaseResource(event),\n details: {\n isScheduled: event.scheduledAt != null,\n ...(event.scheduledAt && { scheduledAt: event.scheduledAt, timezone: event.timezone }),\n },\n })\n );\n\n auditLogsLifecycle.registerEvent<UpdateDetails>(\n AUDITED_EVENTS.RELEASE_UPDATE,\n (event: ReleaseEvent & UpdateDetails) => ({\n resource: releaseResource(event),\n details: { changes: event.changes },\n })\n );\n\n auditLogsLifecycle.registerEvent(AUDITED_EVENTS.RELEASE_DELETE, (event: ReleaseEvent) => ({\n resource: releaseResource(event),\n }));\n\n auditLogsLifecycle.registerEvent<TriggerDetails | TriggerFailureDetails>(\n AUDITED_EVENTS.RELEASE_TRIGGER,\n (event: TriggerEvent) => {\n const base = { resource: releaseResource(event), outcome: event.outcome };\n\n if (event.outcome === 'failure') {\n return {\n ...base,\n details: {\n reason: event.reason?.slice(0, MAX_REASON_LENGTH),\n // Only when the emitter can attribute the counts.\n ...(event.published != null && {\n published: event.published,\n unpublished: event.unpublished,\n failed: event.failed,\n }),\n },\n };\n }\n\n if (event.published != null && event.unpublished != null) {\n return {\n ...base,\n details: { published: event.published, unpublished: event.unpublished, failed: 0 },\n };\n }\n\n return base;\n }\n );\n\n auditLogsLifecycle.registerEvent<EntryAddDetails>(\n AUDITED_EVENTS.RELEASE_ENTRY_ADD,\n (event: ReleaseEntryEvent & { type: 'publish' | 'unpublish' }) => ({\n resource: releaseResource(event),\n details: { entry: entryRef(event), actionType: event.type },\n })\n );\n\n auditLogsLifecycle.registerEvent<EntryUpdateDetails>(\n AUDITED_EVENTS.RELEASE_ENTRY_UPDATE,\n (\n event: ReleaseEntryEvent & {\n from: 'publish' | 'unpublish';\n to: 'publish' | 'unpublish';\n }\n ) => ({\n resource: releaseResource(event),\n details: { entry: entryRef(event), actionType: { before: event.from, after: event.to } },\n })\n );\n\n auditLogsLifecycle.registerEvent<EntryRemoveDetails>(\n AUDITED_EVENTS.RELEASE_ENTRY_REMOVE,\n (event: ReleaseEntryEvent) => ({\n resource: releaseResource(event),\n details: { entry: entryRef(event) },\n })\n );\n\n auditLogsLifecycle.registerEvent<SettingsUpdateDetails>(\n AUDITED_EVENTS.RELEASE_SETTINGS_UPDATE,\n (event: SettingsUpdateDetails) => ({\n resource: { type: 'release' },\n details: { changes: event.changes },\n })\n );\n};\n"],"names":["RELEASE_EDITABLE_FIELDS","MAX_REASON_LENGTH","getReleaseChanges","previous","next","changes","field","hasChanged","before","after","scheduledAt","wasScheduled","isScheduled","emitAudit","strapi","event","payload","eventHub","emit","error","log","emitAuditOnCommit","db","inTransaction","transaction","onCommit","runAsSystem","origin","work","result","requestContext","run","state","auditSource","request","url","registerAuditEvents","auditLogsLifecycle","releaseResource","type","id","releaseId","name","entryRef","contentType","documentId","entryDocumentId","locale","registerEvent","AUDITED_EVENTS","RELEASE_CREATE","resource","details","timezone","RELEASE_UPDATE","RELEASE_DELETE","RELEASE_TRIGGER","base","outcome","reason","slice","published","unpublished","failed","RELEASE_ENTRY_ADD","entry","actionType","RELEASE_ENTRY_UPDATE","from","to","RELEASE_ENTRY_REMOVE","RELEASE_SETTINGS_UPDATE"],"mappings":"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"}
|
package/dist/server/bootstrap.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var constants = require('./constants.js');
|
|
4
|
+
var auditLogs = require('./audit-logs.js');
|
|
4
5
|
var index = require('./utils/index.js');
|
|
5
6
|
var documents = require('./middlewares/documents.js');
|
|
6
7
|
|
|
@@ -61,6 +62,11 @@ const bootstrap = async ({ strapi: strapi1 })=>{
|
|
|
61
62
|
Object.entries(constants.ALLOWED_WEBHOOK_EVENTS).forEach(([key, value])=>{
|
|
62
63
|
strapi1.get('webhookStore').addAllowedEvent(key, value);
|
|
63
64
|
});
|
|
65
|
+
// Absent in CE, without the audit-logs license, or when disabled by config;
|
|
66
|
+
// get() throws for services that were never added, so probe first.
|
|
67
|
+
if (strapi1.has('audit-logs-lifecycle')) {
|
|
68
|
+
auditLogs.registerAuditEvents(strapi1.get('audit-logs-lifecycle'));
|
|
69
|
+
}
|
|
64
70
|
}
|
|
65
71
|
};
|
|
66
72
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from './constants';\nimport { getService } from './utils';\nimport { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents';\n\ninterface DeleteManyParams {\n contentType: UID.ContentType;\n locale: string | null;\n entryDocumentId?: Modules.Documents.ID;\n}\n\nconst deleteReleasesActionsAndUpdateReleaseStatus = async (params: DeleteManyParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n // We update the status of each release after delete the actions\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n if (strapi.ee.features.isEnabled('cms-content-releases')) {\n const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter(\n (uid: any) => strapi.contentTypes[uid]?.options?.draftAndPublish\n );\n\n strapi.db.lifecycles.subscribe({\n models: contentTypesWithDraftAndPublish,\n\n /**\n * deleteMany is still used outside documents service, for example when deleting a locale\n */\n async afterDeleteMany(event) {\n try {\n const model = strapi.getModel(event.model.uid as UID.Schema);\n // @ts-expect-error TODO: lifecycles types looks like are not 100% finished\n if (model.kind === 'collectionType' && model.options?.draftAndPublish) {\n const { where } = event.params;\n\n deleteReleasesActionsAndUpdateReleaseStatus({\n contentType: model.uid,\n locale: where?.locale ?? null,\n ...(where?.documentId && { entryDocumentId: where.documentId }),\n });\n }\n } catch (error) {\n // If an error happens we don't want to block the delete entry flow, but we log the error\n strapi.log.error('Error while deleting release actions after entry deleteMany', {\n error,\n });\n }\n },\n });\n\n // We register middleware to handle ReleaseActions when changes on documents are made\n strapi.documents.use(deleteActionsOnDelete);\n strapi.documents.use(updateActionsOnUpdate);\n\n getService('scheduling', { strapi })\n .syncFromDatabase()\n .catch((err: Error) => {\n strapi.log.error(\n 'Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.'\n );\n\n throw err;\n });\n\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n strapi.get('webhookStore').addAllowedEvent(key, value);\n });\n }\n};\n"],"names":["deleteReleasesActionsAndUpdateReleaseStatus","params","releases","strapi","db","query","RELEASE_MODEL_UID","findMany","where","actions","RELEASE_ACTION_MODEL_UID","deleteMany","release","getService","updateReleaseStatus","id","bootstrap","ee","features","isEnabled","contentTypesWithDraftAndPublish","Object","keys","contentTypes","filter","uid","options","draftAndPublish","lifecycles","subscribe","models","afterDeleteMany","event","model","getModel","kind","contentType","locale","documentId","entryDocumentId","error","log","documents","use","deleteActionsOnDelete","updateActionsOnUpdate","syncFromDatabase","catch","err","entries","ALLOWED_WEBHOOK_EVENTS","forEach","key","value","get","addAllowedEvent"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from './constants';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService } from './utils';\nimport { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents';\n\ninterface DeleteManyParams {\n contentType: UID.ContentType;\n locale: string | null;\n entryDocumentId?: Modules.Documents.ID;\n}\n\nconst deleteReleasesActionsAndUpdateReleaseStatus = async (params: DeleteManyParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n // We update the status of each release after delete the actions\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n if (strapi.ee.features.isEnabled('cms-content-releases')) {\n const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter(\n (uid: any) => strapi.contentTypes[uid]?.options?.draftAndPublish\n );\n\n strapi.db.lifecycles.subscribe({\n models: contentTypesWithDraftAndPublish,\n\n /**\n * deleteMany is still used outside documents service, for example when deleting a locale\n */\n async afterDeleteMany(event) {\n try {\n const model = strapi.getModel(event.model.uid as UID.Schema);\n // @ts-expect-error TODO: lifecycles types looks like are not 100% finished\n if (model.kind === 'collectionType' && model.options?.draftAndPublish) {\n const { where } = event.params;\n\n deleteReleasesActionsAndUpdateReleaseStatus({\n contentType: model.uid,\n locale: where?.locale ?? null,\n ...(where?.documentId && { entryDocumentId: where.documentId }),\n });\n }\n } catch (error) {\n // If an error happens we don't want to block the delete entry flow, but we log the error\n strapi.log.error('Error while deleting release actions after entry deleteMany', {\n error,\n });\n }\n },\n });\n\n // We register middleware to handle ReleaseActions when changes on documents are made\n strapi.documents.use(deleteActionsOnDelete);\n strapi.documents.use(updateActionsOnUpdate);\n\n getService('scheduling', { strapi })\n .syncFromDatabase()\n .catch((err: Error) => {\n strapi.log.error(\n 'Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.'\n );\n\n throw err;\n });\n\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n strapi.get('webhookStore').addAllowedEvent(key, value);\n });\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n }\n};\n"],"names":["deleteReleasesActionsAndUpdateReleaseStatus","params","releases","strapi","db","query","RELEASE_MODEL_UID","findMany","where","actions","RELEASE_ACTION_MODEL_UID","deleteMany","release","getService","updateReleaseStatus","id","bootstrap","ee","features","isEnabled","contentTypesWithDraftAndPublish","Object","keys","contentTypes","filter","uid","options","draftAndPublish","lifecycles","subscribe","models","afterDeleteMany","event","model","getModel","kind","contentType","locale","documentId","entryDocumentId","error","log","documents","use","deleteActionsOnDelete","updateActionsOnUpdate","syncFromDatabase","catch","err","entries","ALLOWED_WEBHOOK_EVENTS","forEach","key","value","get","addAllowedEvent","has","registerAuditEvents"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ALLOWED_WEBHOOK_EVENTS, RELEASE_MODEL_UID, RELEASE_ACTION_MODEL_UID } from './constants.mjs';
|
|
2
|
+
import { registerAuditEvents } from './audit-logs.mjs';
|
|
2
3
|
import { getService } from './utils/index.mjs';
|
|
3
4
|
import { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents.mjs';
|
|
4
5
|
|
|
@@ -59,6 +60,11 @@ const bootstrap = async ({ strapi: strapi1 })=>{
|
|
|
59
60
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value])=>{
|
|
60
61
|
strapi1.get('webhookStore').addAllowedEvent(key, value);
|
|
61
62
|
});
|
|
63
|
+
// Absent in CE, without the audit-logs license, or when disabled by config;
|
|
64
|
+
// get() throws for services that were never added, so probe first.
|
|
65
|
+
if (strapi1.has('audit-logs-lifecycle')) {
|
|
66
|
+
registerAuditEvents(strapi1.get('audit-logs-lifecycle'));
|
|
67
|
+
}
|
|
62
68
|
}
|
|
63
69
|
};
|
|
64
70
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from './constants';\nimport { getService } from './utils';\nimport { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents';\n\ninterface DeleteManyParams {\n contentType: UID.ContentType;\n locale: string | null;\n entryDocumentId?: Modules.Documents.ID;\n}\n\nconst deleteReleasesActionsAndUpdateReleaseStatus = async (params: DeleteManyParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n // We update the status of each release after delete the actions\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n if (strapi.ee.features.isEnabled('cms-content-releases')) {\n const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter(\n (uid: any) => strapi.contentTypes[uid]?.options?.draftAndPublish\n );\n\n strapi.db.lifecycles.subscribe({\n models: contentTypesWithDraftAndPublish,\n\n /**\n * deleteMany is still used outside documents service, for example when deleting a locale\n */\n async afterDeleteMany(event) {\n try {\n const model = strapi.getModel(event.model.uid as UID.Schema);\n // @ts-expect-error TODO: lifecycles types looks like are not 100% finished\n if (model.kind === 'collectionType' && model.options?.draftAndPublish) {\n const { where } = event.params;\n\n deleteReleasesActionsAndUpdateReleaseStatus({\n contentType: model.uid,\n locale: where?.locale ?? null,\n ...(where?.documentId && { entryDocumentId: where.documentId }),\n });\n }\n } catch (error) {\n // If an error happens we don't want to block the delete entry flow, but we log the error\n strapi.log.error('Error while deleting release actions after entry deleteMany', {\n error,\n });\n }\n },\n });\n\n // We register middleware to handle ReleaseActions when changes on documents are made\n strapi.documents.use(deleteActionsOnDelete);\n strapi.documents.use(updateActionsOnUpdate);\n\n getService('scheduling', { strapi })\n .syncFromDatabase()\n .catch((err: Error) => {\n strapi.log.error(\n 'Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.'\n );\n\n throw err;\n });\n\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n strapi.get('webhookStore').addAllowedEvent(key, value);\n });\n }\n};\n"],"names":["deleteReleasesActionsAndUpdateReleaseStatus","params","releases","strapi","db","query","RELEASE_MODEL_UID","findMany","where","actions","RELEASE_ACTION_MODEL_UID","deleteMany","release","getService","updateReleaseStatus","id","bootstrap","ee","features","isEnabled","contentTypesWithDraftAndPublish","Object","keys","contentTypes","filter","uid","options","draftAndPublish","lifecycles","subscribe","models","afterDeleteMany","event","model","getModel","kind","contentType","locale","documentId","entryDocumentId","error","log","documents","use","deleteActionsOnDelete","updateActionsOnUpdate","syncFromDatabase","catch","err","entries","ALLOWED_WEBHOOK_EVENTS","forEach","key","value","get","addAllowedEvent"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from './constants';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService } from './utils';\nimport { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents';\n\ninterface DeleteManyParams {\n contentType: UID.ContentType;\n locale: string | null;\n entryDocumentId?: Modules.Documents.ID;\n}\n\nconst deleteReleasesActionsAndUpdateReleaseStatus = async (params: DeleteManyParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n // We update the status of each release after delete the actions\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n if (strapi.ee.features.isEnabled('cms-content-releases')) {\n const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter(\n (uid: any) => strapi.contentTypes[uid]?.options?.draftAndPublish\n );\n\n strapi.db.lifecycles.subscribe({\n models: contentTypesWithDraftAndPublish,\n\n /**\n * deleteMany is still used outside documents service, for example when deleting a locale\n */\n async afterDeleteMany(event) {\n try {\n const model = strapi.getModel(event.model.uid as UID.Schema);\n // @ts-expect-error TODO: lifecycles types looks like are not 100% finished\n if (model.kind === 'collectionType' && model.options?.draftAndPublish) {\n const { where } = event.params;\n\n deleteReleasesActionsAndUpdateReleaseStatus({\n contentType: model.uid,\n locale: where?.locale ?? null,\n ...(where?.documentId && { entryDocumentId: where.documentId }),\n });\n }\n } catch (error) {\n // If an error happens we don't want to block the delete entry flow, but we log the error\n strapi.log.error('Error while deleting release actions after entry deleteMany', {\n error,\n });\n }\n },\n });\n\n // We register middleware to handle ReleaseActions when changes on documents are made\n strapi.documents.use(deleteActionsOnDelete);\n strapi.documents.use(updateActionsOnUpdate);\n\n getService('scheduling', { strapi })\n .syncFromDatabase()\n .catch((err: Error) => {\n strapi.log.error(\n 'Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.'\n );\n\n throw err;\n });\n\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n strapi.get('webhookStore').addAllowedEvent(key, value);\n });\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n }\n};\n"],"names":["deleteReleasesActionsAndUpdateReleaseStatus","params","releases","strapi","db","query","RELEASE_MODEL_UID","findMany","where","actions","RELEASE_ACTION_MODEL_UID","deleteMany","release","getService","updateReleaseStatus","id","bootstrap","ee","features","isEnabled","contentTypesWithDraftAndPublish","Object","keys","contentTypes","filter","uid","options","draftAndPublish","lifecycles","subscribe","models","afterDeleteMany","event","model","getModel","kind","contentType","locale","documentId","entryDocumentId","error","log","documents","use","deleteActionsOnDelete","updateActionsOnUpdate","syncFromDatabase","catch","err","entries","ALLOWED_WEBHOOK_EVENTS","forEach","key","value","get","addAllowedEvent","has","registerAuditEvents"],"mappings":"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"}
|
package/dist/server/constants.js
CHANGED
|
@@ -66,9 +66,29 @@ const ACTIONS = [
|
|
|
66
66
|
const ALLOWED_WEBHOOK_EVENTS = {
|
|
67
67
|
RELEASES_PUBLISH: 'releases.publish'
|
|
68
68
|
};
|
|
69
|
+
/**
|
|
70
|
+
* Audit Log events, transformed in audit-logs.ts and registered during bootstrap.
|
|
71
|
+
*
|
|
72
|
+
* RELEASE_TRIGGER is different from the releases.publish webhook.
|
|
73
|
+
* The webhook has its own payload format, which is already a public contract.
|
|
74
|
+
*
|
|
75
|
+
* TODO: Decide whether these should eventually converge when the
|
|
76
|
+
* releases.publish payload is revised: replace it with release.trigger,
|
|
77
|
+
* or keep both formats permanently.
|
|
78
|
+
*/ const AUDITED_EVENTS = {
|
|
79
|
+
RELEASE_CREATE: 'release.create',
|
|
80
|
+
RELEASE_UPDATE: 'release.update',
|
|
81
|
+
RELEASE_DELETE: 'release.delete',
|
|
82
|
+
RELEASE_TRIGGER: 'release.trigger',
|
|
83
|
+
RELEASE_ENTRY_ADD: 'release.entry.add',
|
|
84
|
+
RELEASE_ENTRY_UPDATE: 'release.entry.update',
|
|
85
|
+
RELEASE_ENTRY_REMOVE: 'release.entry.remove',
|
|
86
|
+
RELEASE_SETTINGS_UPDATE: 'release.settings.update'
|
|
87
|
+
};
|
|
69
88
|
|
|
70
89
|
exports.ACTIONS = ACTIONS;
|
|
71
90
|
exports.ALLOWED_WEBHOOK_EVENTS = ALLOWED_WEBHOOK_EVENTS;
|
|
91
|
+
exports.AUDITED_EVENTS = AUDITED_EVENTS;
|
|
72
92
|
exports.RELEASE_ACTION_MODEL_UID = RELEASE_ACTION_MODEL_UID;
|
|
73
93
|
exports.RELEASE_MODEL_UID = RELEASE_MODEL_UID;
|
|
74
94
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../server/src/constants.ts"],"sourcesContent":["export const RELEASE_MODEL_UID = 'plugin::content-releases.release';\nexport const RELEASE_ACTION_MODEL_UID = 'plugin::content-releases.release-action';\n\nexport const ACTIONS = [\n {\n section: 'plugins',\n displayName: 'Read',\n uid: 'read',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Create',\n uid: 'create',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Edit',\n uid: 'update',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Delete',\n uid: 'delete',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Publish',\n uid: 'publish',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Remove an entry from a release',\n uid: 'delete-action',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Add an entry to a release',\n uid: 'create-action',\n pluginName: 'content-releases',\n },\n\n // Settings\n {\n uid: 'settings.read',\n section: 'settings',\n displayName: 'Read',\n category: 'content releases',\n subCategory: 'options',\n pluginName: 'content-releases',\n },\n\n {\n uid: 'settings.update',\n section: 'settings',\n displayName: 'Edit',\n category: 'content releases',\n subCategory: 'options',\n pluginName: 'content-releases',\n },\n];\n\nexport const ALLOWED_WEBHOOK_EVENTS = {\n RELEASES_PUBLISH: 'releases.publish',\n};\n"],"names":["RELEASE_MODEL_UID","RELEASE_ACTION_MODEL_UID","ACTIONS","section","displayName","uid","pluginName","category","subCategory","ALLOWED_WEBHOOK_EVENTS","RELEASES_PUBLISH"],"mappings":";;AAAO,MAAMA,oBAAoB;AAC1B,MAAMC,2BAA2B;MAE3BC,OAAAA,GAAU;AACrB,IAAA;QACEC,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,MAAA;QACbC,GAAAA,EAAK,MAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,QAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,MAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,QAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,SAAA;QACbC,GAAAA,EAAK,SAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,gCAAA;QACbC,GAAAA,EAAK,eAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,2BAAA;QACbC,GAAAA,EAAK,eAAA;QACLC,UAAAA,EAAY;AACd,KAAA;;AAGA,IAAA;QACED,GAAAA,EAAK,eAAA;QACLF,OAAAA,EAAS,UAAA;QACTC,WAAAA,EAAa,MAAA;QACbG,QAAAA,EAAU,kBAAA;QACVC,WAAAA,EAAa,SAAA;QACbF,UAAAA,EAAY;AACd,KAAA;AAEA,IAAA;QACED,GAAAA,EAAK,iBAAA;QACLF,OAAAA,EAAS,UAAA;QACTC,WAAAA,EAAa,MAAA;QACbG,QAAAA,EAAU,kBAAA;QACVC,WAAAA,EAAa,SAAA;QACbF,UAAAA,EAAY;AACd;;MAGWG,sBAAAA,GAAyB;IACpCC,gBAAAA,EAAkB;AACpB
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../server/src/constants.ts"],"sourcesContent":["export const RELEASE_MODEL_UID = 'plugin::content-releases.release';\nexport const RELEASE_ACTION_MODEL_UID = 'plugin::content-releases.release-action';\n\nexport const ACTIONS = [\n {\n section: 'plugins',\n displayName: 'Read',\n uid: 'read',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Create',\n uid: 'create',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Edit',\n uid: 'update',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Delete',\n uid: 'delete',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Publish',\n uid: 'publish',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Remove an entry from a release',\n uid: 'delete-action',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Add an entry to a release',\n uid: 'create-action',\n pluginName: 'content-releases',\n },\n\n // Settings\n {\n uid: 'settings.read',\n section: 'settings',\n displayName: 'Read',\n category: 'content releases',\n subCategory: 'options',\n pluginName: 'content-releases',\n },\n\n {\n uid: 'settings.update',\n section: 'settings',\n displayName: 'Edit',\n category: 'content releases',\n subCategory: 'options',\n pluginName: 'content-releases',\n },\n];\n\nexport const ALLOWED_WEBHOOK_EVENTS = {\n RELEASES_PUBLISH: 'releases.publish',\n};\n\n/**\n * Audit Log events, transformed in audit-logs.ts and registered during bootstrap.\n *\n * RELEASE_TRIGGER is different from the releases.publish webhook.\n * The webhook has its own payload format, which is already a public contract.\n *\n * TODO: Decide whether these should eventually converge when the\n * releases.publish payload is revised: replace it with release.trigger,\n * or keep both formats permanently.\n */\nexport const AUDITED_EVENTS = {\n RELEASE_CREATE: 'release.create',\n RELEASE_UPDATE: 'release.update',\n RELEASE_DELETE: 'release.delete',\n RELEASE_TRIGGER: 'release.trigger',\n RELEASE_ENTRY_ADD: 'release.entry.add',\n RELEASE_ENTRY_UPDATE: 'release.entry.update',\n RELEASE_ENTRY_REMOVE: 'release.entry.remove',\n RELEASE_SETTINGS_UPDATE: 'release.settings.update',\n} as const;\n"],"names":["RELEASE_MODEL_UID","RELEASE_ACTION_MODEL_UID","ACTIONS","section","displayName","uid","pluginName","category","subCategory","ALLOWED_WEBHOOK_EVENTS","RELEASES_PUBLISH","AUDITED_EVENTS","RELEASE_CREATE","RELEASE_UPDATE","RELEASE_DELETE","RELEASE_TRIGGER","RELEASE_ENTRY_ADD","RELEASE_ENTRY_UPDATE","RELEASE_ENTRY_REMOVE","RELEASE_SETTINGS_UPDATE"],"mappings":";;AAAO,MAAMA,oBAAoB;AAC1B,MAAMC,2BAA2B;MAE3BC,OAAAA,GAAU;AACrB,IAAA;QACEC,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,MAAA;QACbC,GAAAA,EAAK,MAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,QAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,MAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,QAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,SAAA;QACbC,GAAAA,EAAK,SAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,gCAAA;QACbC,GAAAA,EAAK,eAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,2BAAA;QACbC,GAAAA,EAAK,eAAA;QACLC,UAAAA,EAAY;AACd,KAAA;;AAGA,IAAA;QACED,GAAAA,EAAK,eAAA;QACLF,OAAAA,EAAS,UAAA;QACTC,WAAAA,EAAa,MAAA;QACbG,QAAAA,EAAU,kBAAA;QACVC,WAAAA,EAAa,SAAA;QACbF,UAAAA,EAAY;AACd,KAAA;AAEA,IAAA;QACED,GAAAA,EAAK,iBAAA;QACLF,OAAAA,EAAS,UAAA;QACTC,WAAAA,EAAa,MAAA;QACbG,QAAAA,EAAU,kBAAA;QACVC,WAAAA,EAAa,SAAA;QACbF,UAAAA,EAAY;AACd;;MAGWG,sBAAAA,GAAyB;IACpCC,gBAAAA,EAAkB;AACpB;AAEA;;;;;;;;;UAUaC,cAAAA,GAAiB;IAC5BC,cAAAA,EAAgB,gBAAA;IAChBC,cAAAA,EAAgB,gBAAA;IAChBC,cAAAA,EAAgB,gBAAA;IAChBC,eAAAA,EAAiB,iBAAA;IACjBC,iBAAAA,EAAmB,mBAAA;IACnBC,oBAAAA,EAAsB,sBAAA;IACtBC,oBAAAA,EAAsB,sBAAA;IACtBC,uBAAAA,EAAyB;AAC3B;;;;;;;;"}
|
|
@@ -64,6 +64,25 @@ const ACTIONS = [
|
|
|
64
64
|
const ALLOWED_WEBHOOK_EVENTS = {
|
|
65
65
|
RELEASES_PUBLISH: 'releases.publish'
|
|
66
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Audit Log events, transformed in audit-logs.ts and registered during bootstrap.
|
|
69
|
+
*
|
|
70
|
+
* RELEASE_TRIGGER is different from the releases.publish webhook.
|
|
71
|
+
* The webhook has its own payload format, which is already a public contract.
|
|
72
|
+
*
|
|
73
|
+
* TODO: Decide whether these should eventually converge when the
|
|
74
|
+
* releases.publish payload is revised: replace it with release.trigger,
|
|
75
|
+
* or keep both formats permanently.
|
|
76
|
+
*/ const AUDITED_EVENTS = {
|
|
77
|
+
RELEASE_CREATE: 'release.create',
|
|
78
|
+
RELEASE_UPDATE: 'release.update',
|
|
79
|
+
RELEASE_DELETE: 'release.delete',
|
|
80
|
+
RELEASE_TRIGGER: 'release.trigger',
|
|
81
|
+
RELEASE_ENTRY_ADD: 'release.entry.add',
|
|
82
|
+
RELEASE_ENTRY_UPDATE: 'release.entry.update',
|
|
83
|
+
RELEASE_ENTRY_REMOVE: 'release.entry.remove',
|
|
84
|
+
RELEASE_SETTINGS_UPDATE: 'release.settings.update'
|
|
85
|
+
};
|
|
67
86
|
|
|
68
|
-
export { ACTIONS, ALLOWED_WEBHOOK_EVENTS, RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID };
|
|
87
|
+
export { ACTIONS, ALLOWED_WEBHOOK_EVENTS, AUDITED_EVENTS, RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID };
|
|
69
88
|
//# sourceMappingURL=constants.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sources":["../../server/src/constants.ts"],"sourcesContent":["export const RELEASE_MODEL_UID = 'plugin::content-releases.release';\nexport const RELEASE_ACTION_MODEL_UID = 'plugin::content-releases.release-action';\n\nexport const ACTIONS = [\n {\n section: 'plugins',\n displayName: 'Read',\n uid: 'read',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Create',\n uid: 'create',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Edit',\n uid: 'update',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Delete',\n uid: 'delete',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Publish',\n uid: 'publish',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Remove an entry from a release',\n uid: 'delete-action',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Add an entry to a release',\n uid: 'create-action',\n pluginName: 'content-releases',\n },\n\n // Settings\n {\n uid: 'settings.read',\n section: 'settings',\n displayName: 'Read',\n category: 'content releases',\n subCategory: 'options',\n pluginName: 'content-releases',\n },\n\n {\n uid: 'settings.update',\n section: 'settings',\n displayName: 'Edit',\n category: 'content releases',\n subCategory: 'options',\n pluginName: 'content-releases',\n },\n];\n\nexport const ALLOWED_WEBHOOK_EVENTS = {\n RELEASES_PUBLISH: 'releases.publish',\n};\n"],"names":["RELEASE_MODEL_UID","RELEASE_ACTION_MODEL_UID","ACTIONS","section","displayName","uid","pluginName","category","subCategory","ALLOWED_WEBHOOK_EVENTS","RELEASES_PUBLISH"],"mappings":"AAAO,MAAMA,oBAAoB;AAC1B,MAAMC,2BAA2B;MAE3BC,OAAAA,GAAU;AACrB,IAAA;QACEC,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,MAAA;QACbC,GAAAA,EAAK,MAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,QAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,MAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,QAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,SAAA;QACbC,GAAAA,EAAK,SAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,gCAAA;QACbC,GAAAA,EAAK,eAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,2BAAA;QACbC,GAAAA,EAAK,eAAA;QACLC,UAAAA,EAAY;AACd,KAAA;;AAGA,IAAA;QACED,GAAAA,EAAK,eAAA;QACLF,OAAAA,EAAS,UAAA;QACTC,WAAAA,EAAa,MAAA;QACbG,QAAAA,EAAU,kBAAA;QACVC,WAAAA,EAAa,SAAA;QACbF,UAAAA,EAAY;AACd,KAAA;AAEA,IAAA;QACED,GAAAA,EAAK,iBAAA;QACLF,OAAAA,EAAS,UAAA;QACTC,WAAAA,EAAa,MAAA;QACbG,QAAAA,EAAU,kBAAA;QACVC,WAAAA,EAAa,SAAA;QACbF,UAAAA,EAAY;AACd;;MAGWG,sBAAAA,GAAyB;IACpCC,gBAAAA,EAAkB;AACpB;;;;"}
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../server/src/constants.ts"],"sourcesContent":["export const RELEASE_MODEL_UID = 'plugin::content-releases.release';\nexport const RELEASE_ACTION_MODEL_UID = 'plugin::content-releases.release-action';\n\nexport const ACTIONS = [\n {\n section: 'plugins',\n displayName: 'Read',\n uid: 'read',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Create',\n uid: 'create',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Edit',\n uid: 'update',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Delete',\n uid: 'delete',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Publish',\n uid: 'publish',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Remove an entry from a release',\n uid: 'delete-action',\n pluginName: 'content-releases',\n },\n {\n section: 'plugins',\n displayName: 'Add an entry to a release',\n uid: 'create-action',\n pluginName: 'content-releases',\n },\n\n // Settings\n {\n uid: 'settings.read',\n section: 'settings',\n displayName: 'Read',\n category: 'content releases',\n subCategory: 'options',\n pluginName: 'content-releases',\n },\n\n {\n uid: 'settings.update',\n section: 'settings',\n displayName: 'Edit',\n category: 'content releases',\n subCategory: 'options',\n pluginName: 'content-releases',\n },\n];\n\nexport const ALLOWED_WEBHOOK_EVENTS = {\n RELEASES_PUBLISH: 'releases.publish',\n};\n\n/**\n * Audit Log events, transformed in audit-logs.ts and registered during bootstrap.\n *\n * RELEASE_TRIGGER is different from the releases.publish webhook.\n * The webhook has its own payload format, which is already a public contract.\n *\n * TODO: Decide whether these should eventually converge when the\n * releases.publish payload is revised: replace it with release.trigger,\n * or keep both formats permanently.\n */\nexport const AUDITED_EVENTS = {\n RELEASE_CREATE: 'release.create',\n RELEASE_UPDATE: 'release.update',\n RELEASE_DELETE: 'release.delete',\n RELEASE_TRIGGER: 'release.trigger',\n RELEASE_ENTRY_ADD: 'release.entry.add',\n RELEASE_ENTRY_UPDATE: 'release.entry.update',\n RELEASE_ENTRY_REMOVE: 'release.entry.remove',\n RELEASE_SETTINGS_UPDATE: 'release.settings.update',\n} as const;\n"],"names":["RELEASE_MODEL_UID","RELEASE_ACTION_MODEL_UID","ACTIONS","section","displayName","uid","pluginName","category","subCategory","ALLOWED_WEBHOOK_EVENTS","RELEASES_PUBLISH","AUDITED_EVENTS","RELEASE_CREATE","RELEASE_UPDATE","RELEASE_DELETE","RELEASE_TRIGGER","RELEASE_ENTRY_ADD","RELEASE_ENTRY_UPDATE","RELEASE_ENTRY_REMOVE","RELEASE_SETTINGS_UPDATE"],"mappings":"AAAO,MAAMA,oBAAoB;AAC1B,MAAMC,2BAA2B;MAE3BC,OAAAA,GAAU;AACrB,IAAA;QACEC,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,MAAA;QACbC,GAAAA,EAAK,MAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,QAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,MAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,QAAA;QACbC,GAAAA,EAAK,QAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,SAAA;QACbC,GAAAA,EAAK,SAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,gCAAA;QACbC,GAAAA,EAAK,eAAA;QACLC,UAAAA,EAAY;AACd,KAAA;AACA,IAAA;QACEH,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,2BAAA;QACbC,GAAAA,EAAK,eAAA;QACLC,UAAAA,EAAY;AACd,KAAA;;AAGA,IAAA;QACED,GAAAA,EAAK,eAAA;QACLF,OAAAA,EAAS,UAAA;QACTC,WAAAA,EAAa,MAAA;QACbG,QAAAA,EAAU,kBAAA;QACVC,WAAAA,EAAa,SAAA;QACbF,UAAAA,EAAY;AACd,KAAA;AAEA,IAAA;QACED,GAAAA,EAAK,iBAAA;QACLF,OAAAA,EAAS,UAAA;QACTC,WAAAA,EAAa,MAAA;QACbG,QAAAA,EAAU,kBAAA;QACVC,WAAAA,EAAa,SAAA;QACbF,UAAAA,EAAY;AACd;;MAGWG,sBAAAA,GAAyB;IACpCC,gBAAAA,EAAkB;AACpB;AAEA;;;;;;;;;UAUaC,cAAAA,GAAiB;IAC5BC,cAAAA,EAAgB,gBAAA;IAChBC,cAAAA,EAAgB,gBAAA;IAChBC,cAAAA,EAAgB,gBAAA;IAChBC,eAAAA,EAAiB,iBAAA;IACjBC,iBAAAA,EAAmB,mBAAA;IACnBC,oBAAAA,EAAsB,sBAAA;IACtBC,oBAAAA,EAAsB,sBAAA;IACtBC,uBAAAA,EAAyB;AAC3B;;;;"}
|
|
@@ -269,30 +269,18 @@ const releaseController = {
|
|
|
269
269
|
const releaseService = index.getService('release', {
|
|
270
270
|
strapi
|
|
271
271
|
});
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
filters: {
|
|
279
|
-
release: id,
|
|
280
|
-
type: 'publish'
|
|
281
|
-
}
|
|
282
|
-
}),
|
|
283
|
-
releaseActionService.countActions({
|
|
284
|
-
filters: {
|
|
285
|
-
release: id,
|
|
286
|
-
type: 'unpublish'
|
|
287
|
-
}
|
|
288
|
-
})
|
|
289
|
-
]);
|
|
272
|
+
// The service audits the run itself, whoever the caller is
|
|
273
|
+
const { release, counts, countsError } = await releaseService.publish(id);
|
|
274
|
+
// The publish is committed and audited; the response still needs the counts
|
|
275
|
+
if (!counts) {
|
|
276
|
+
throw countsError ?? new Error('Failed to count the release entries');
|
|
277
|
+
}
|
|
290
278
|
ctx.body = {
|
|
291
279
|
data: release,
|
|
292
280
|
meta: {
|
|
293
|
-
totalEntries:
|
|
294
|
-
totalPublishedEntries:
|
|
295
|
-
totalUnpublishedEntries:
|
|
281
|
+
totalEntries: counts.published + counts.unpublished,
|
|
282
|
+
totalPublishedEntries: counts.published,
|
|
283
|
+
totalUnpublishedEntries: counts.unpublished
|
|
296
284
|
}
|
|
297
285
|
};
|
|
298
286
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.js","sources":["../../../server/src/controllers/release.ts"],"sourcesContent":["import type Koa from 'koa';\nimport { errors } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { RELEASE_MODEL_UID } from '../constants';\nimport { validateRelease, validatefindByDocumentAttachedParams } from './validation/release';\nimport type {\n CreateRelease,\n UpdateRelease,\n PublishRelease,\n GetRelease,\n Release,\n DeleteRelease,\n GetReleases,\n MapEntriesToReleases,\n} from '../../../shared/contracts/releases';\nimport type { UserInfo } from '../../../shared/types';\nimport { getService } from '../utils';\n\ntype ReleaseWithPopulatedActions = Release & { actions: { count: number } };\n\nconst releaseController = {\n /**\n * Find releases based on documents attached or not to the release.\n * If `hasEntryAttached` is true, it will return all releases that have the entry attached.\n * If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.\n */\n async findByDocumentAttached(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n await permissionsManager.validateQuery(ctx.query);\n const releaseService = getService('release', { strapi });\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n await validatefindByDocumentAttachedParams(query);\n\n // If entry is a singleType, we need to manually add the entryDocumentId to the query\n const model = strapi.getModel(query.contentType) as Schema.ContentType;\n if (model.kind && model.kind === 'singleType') {\n const document = await strapi.db.query(model.uid).findOne({ select: ['documentId'] });\n\n if (!document) {\n throw new errors.NotFoundError(`No entry found for contentType ${query.contentType}`);\n }\n\n query.entryDocumentId = document.documentId;\n }\n\n const { contentType, hasEntryAttached, entryDocumentId, locale } = query;\n const isEntryAttached =\n typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;\n\n if (isEntryAttached) {\n const releases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n populate: {\n actions: {\n fields: ['type'],\n filters: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n },\n });\n\n ctx.body = { data: releases };\n } else {\n const relatedReleases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n });\n\n const releases = await releaseService.findMany({\n where: {\n $or: [\n {\n id: {\n $notIn: relatedReleases.map((release: any) => release.id),\n },\n },\n {\n actions: null,\n },\n ],\n releasedAt: null,\n },\n });\n ctx.body = { data: releases };\n }\n },\n\n async findPage(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n\n const releaseService = getService('release', { strapi });\n\n const query: GetReleases.Request['query'] = await permissionsManager.sanitizeQuery(ctx.query);\n const { results, pagination } = await releaseService.findPage(query);\n\n const data = results.map((release: ReleaseWithPopulatedActions) => {\n const { actions, ...releaseData } = release;\n\n return {\n ...releaseData,\n actions: {\n meta: {\n count: actions.count,\n },\n },\n };\n });\n\n const pendingReleasesCount = await strapi.db.query(RELEASE_MODEL_UID).count({\n where: {\n releasedAt: null,\n },\n });\n\n ctx.body = { data, meta: { pagination, pendingReleasesCount } };\n },\n\n async findOne(ctx: Koa.Context) {\n const id: GetRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.findOne(id, { populate: ['createdBy'] });\n if (!release) {\n throw new errors.NotFoundError(`Release not found for id: ${id}`);\n }\n\n const count = await releaseActionService.countActions({\n filters: {\n release: id,\n },\n });\n const sanitizedRelease = {\n ...release,\n createdBy: release.createdBy\n ? strapi.service('admin::user').sanitizeUser(release.createdBy)\n : null,\n };\n\n // Format the data object\n const data = {\n ...sanitizedRelease,\n actions: {\n meta: {\n count,\n },\n },\n };\n\n ctx.body = { data };\n },\n\n async mapEntriesToReleases(ctx: Koa.Context) {\n const { contentTypeUid, documentIds, locale } = ctx.query;\n\n if (!contentTypeUid || !documentIds) {\n throw new errors.ValidationError('Missing required query parameters');\n }\n\n const releaseService = getService('release', { strapi });\n\n const releasesWithActions = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType: contentTypeUid,\n entryDocumentId: {\n $in: documentIds,\n },\n locale,\n },\n },\n populate: {\n actions: true,\n },\n });\n\n const mappedEntriesInReleases = releasesWithActions.reduce(\n (acc: MapEntriesToReleases.Response['data'], release: Release) => {\n release.actions.forEach((action) => {\n if (action.contentType !== contentTypeUid) {\n return;\n }\n\n if (locale && action.locale !== locale) {\n return;\n }\n\n if (!acc[action.entryDocumentId]) {\n acc[action.entryDocumentId] = [{ id: release.id, name: release.name }];\n } else {\n acc[action.entryDocumentId].push({ id: release.id, name: release.name });\n }\n });\n\n return acc;\n },\n {} as MapEntriesToReleases.Response['data']\n );\n\n ctx.body = {\n data: mappedEntriesInReleases,\n };\n },\n\n async create(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as CreateRelease.Request['body'];\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.create(releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(release),\n });\n },\n\n async update(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as UpdateRelease.Request['body'];\n const id: UpdateRelease.Request['params']['id'] = ctx.params.id;\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.update(id, releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(release),\n };\n },\n\n async delete(ctx: Koa.Context) {\n const id: DeleteRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.delete(id);\n\n ctx.body = {\n data: release,\n };\n },\n\n async publish(ctx: Koa.Context) {\n const id: PublishRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.publish(id);\n\n const [countPublishActions, countUnpublishActions] = await Promise.all([\n releaseActionService.countActions({\n filters: {\n release: id,\n type: 'publish',\n },\n }),\n releaseActionService.countActions({\n filters: {\n release: id,\n type: 'unpublish',\n },\n }),\n ]);\n\n ctx.body = {\n data: release,\n meta: {\n totalEntries: countPublishActions + countUnpublishActions,\n totalPublishedEntries: countPublishActions,\n totalUnpublishedEntries: countUnpublishActions,\n },\n };\n },\n};\n\nexport default releaseController;\n"],"names":["releaseController","findByDocumentAttached","ctx","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_MODEL_UID","validateQuery","query","releaseService","getService","sanitizeQuery","validatefindByDocumentAttachedParams","getModel","contentType","kind","document","db","uid","findOne","select","errors","NotFoundError","entryDocumentId","documentId","hasEntryAttached","locale","isEntryAttached","Boolean","JSON","parse","releases","findMany","where","releasedAt","actions","populate","fields","filters","body","data","relatedReleases","$or","id","$notIn","map","release","findPage","results","pagination","releaseData","meta","count","pendingReleasesCount","params","releaseActionService","countActions","sanitizedRelease","createdBy","sanitizeUser","mapEntriesToReleases","contentTypeUid","documentIds","ValidationError","releasesWithActions","$in","mappedEntriesInReleases","reduce","acc","forEach","action","name","push","create","user","releaseArgs","request","validateRelease","created","sanitizeOutput","update","delete","publish","countPublishActions","countUnpublishActions","Promise","all","type","totalEntries","totalPublishedEntries","totalUnpublishedEntries"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"release.js","sources":["../../../server/src/controllers/release.ts"],"sourcesContent":["import type Koa from 'koa';\nimport { errors } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { RELEASE_MODEL_UID } from '../constants';\nimport { validateRelease, validatefindByDocumentAttachedParams } from './validation/release';\nimport type {\n CreateRelease,\n UpdateRelease,\n PublishRelease,\n GetRelease,\n Release,\n DeleteRelease,\n GetReleases,\n MapEntriesToReleases,\n} from '../../../shared/contracts/releases';\nimport type { UserInfo } from '../../../shared/types';\nimport { getService } from '../utils';\n\ntype ReleaseWithPopulatedActions = Release & { actions: { count: number } };\n\nconst releaseController = {\n /**\n * Find releases based on documents attached or not to the release.\n * If `hasEntryAttached` is true, it will return all releases that have the entry attached.\n * If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.\n */\n async findByDocumentAttached(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n await permissionsManager.validateQuery(ctx.query);\n const releaseService = getService('release', { strapi });\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n await validatefindByDocumentAttachedParams(query);\n\n // If entry is a singleType, we need to manually add the entryDocumentId to the query\n const model = strapi.getModel(query.contentType) as Schema.ContentType;\n if (model.kind && model.kind === 'singleType') {\n const document = await strapi.db.query(model.uid).findOne({ select: ['documentId'] });\n\n if (!document) {\n throw new errors.NotFoundError(`No entry found for contentType ${query.contentType}`);\n }\n\n query.entryDocumentId = document.documentId;\n }\n\n const { contentType, hasEntryAttached, entryDocumentId, locale } = query;\n const isEntryAttached =\n typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;\n\n if (isEntryAttached) {\n const releases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n populate: {\n actions: {\n fields: ['type'],\n filters: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n },\n });\n\n ctx.body = { data: releases };\n } else {\n const relatedReleases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n });\n\n const releases = await releaseService.findMany({\n where: {\n $or: [\n {\n id: {\n $notIn: relatedReleases.map((release: any) => release.id),\n },\n },\n {\n actions: null,\n },\n ],\n releasedAt: null,\n },\n });\n ctx.body = { data: releases };\n }\n },\n\n async findPage(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n\n const releaseService = getService('release', { strapi });\n\n const query: GetReleases.Request['query'] = await permissionsManager.sanitizeQuery(ctx.query);\n const { results, pagination } = await releaseService.findPage(query);\n\n const data = results.map((release: ReleaseWithPopulatedActions) => {\n const { actions, ...releaseData } = release;\n\n return {\n ...releaseData,\n actions: {\n meta: {\n count: actions.count,\n },\n },\n };\n });\n\n const pendingReleasesCount = await strapi.db.query(RELEASE_MODEL_UID).count({\n where: {\n releasedAt: null,\n },\n });\n\n ctx.body = { data, meta: { pagination, pendingReleasesCount } };\n },\n\n async findOne(ctx: Koa.Context) {\n const id: GetRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.findOne(id, { populate: ['createdBy'] });\n if (!release) {\n throw new errors.NotFoundError(`Release not found for id: ${id}`);\n }\n\n const count = await releaseActionService.countActions({\n filters: {\n release: id,\n },\n });\n const sanitizedRelease = {\n ...release,\n createdBy: release.createdBy\n ? strapi.service('admin::user').sanitizeUser(release.createdBy)\n : null,\n };\n\n // Format the data object\n const data = {\n ...sanitizedRelease,\n actions: {\n meta: {\n count,\n },\n },\n };\n\n ctx.body = { data };\n },\n\n async mapEntriesToReleases(ctx: Koa.Context) {\n const { contentTypeUid, documentIds, locale } = ctx.query;\n\n if (!contentTypeUid || !documentIds) {\n throw new errors.ValidationError('Missing required query parameters');\n }\n\n const releaseService = getService('release', { strapi });\n\n const releasesWithActions = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType: contentTypeUid,\n entryDocumentId: {\n $in: documentIds,\n },\n locale,\n },\n },\n populate: {\n actions: true,\n },\n });\n\n const mappedEntriesInReleases = releasesWithActions.reduce(\n (acc: MapEntriesToReleases.Response['data'], release: Release) => {\n release.actions.forEach((action) => {\n if (action.contentType !== contentTypeUid) {\n return;\n }\n\n if (locale && action.locale !== locale) {\n return;\n }\n\n if (!acc[action.entryDocumentId]) {\n acc[action.entryDocumentId] = [{ id: release.id, name: release.name }];\n } else {\n acc[action.entryDocumentId].push({ id: release.id, name: release.name });\n }\n });\n\n return acc;\n },\n {} as MapEntriesToReleases.Response['data']\n );\n\n ctx.body = {\n data: mappedEntriesInReleases,\n };\n },\n\n async create(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as CreateRelease.Request['body'];\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.create(releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(release),\n });\n },\n\n async update(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as UpdateRelease.Request['body'];\n const id: UpdateRelease.Request['params']['id'] = ctx.params.id;\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n\n const release = await releaseService.update(id, releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(release),\n };\n },\n\n async delete(ctx: Koa.Context) {\n const id: DeleteRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.delete(id);\n\n ctx.body = {\n data: release,\n };\n },\n\n async publish(ctx: Koa.Context) {\n const id: PublishRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n\n // The service audits the run itself, whoever the caller is\n const { release, counts, countsError } = await releaseService.publish(id);\n\n // The publish is committed and audited; the response still needs the counts\n if (!counts) {\n throw countsError ?? new Error('Failed to count the release entries');\n }\n\n ctx.body = {\n data: release,\n meta: {\n totalEntries: counts.published + counts.unpublished,\n totalPublishedEntries: counts.published,\n totalUnpublishedEntries: counts.unpublished,\n },\n };\n },\n};\n\nexport default releaseController;\n"],"names":["releaseController","findByDocumentAttached","ctx","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_MODEL_UID","validateQuery","query","releaseService","getService","sanitizeQuery","validatefindByDocumentAttachedParams","getModel","contentType","kind","document","db","uid","findOne","select","errors","NotFoundError","entryDocumentId","documentId","hasEntryAttached","locale","isEntryAttached","Boolean","JSON","parse","releases","findMany","where","releasedAt","actions","populate","fields","filters","body","data","relatedReleases","$or","id","$notIn","map","release","findPage","results","pagination","releaseData","meta","count","pendingReleasesCount","params","releaseActionService","countActions","sanitizedRelease","createdBy","sanitizeUser","mapEntriesToReleases","contentTypeUid","documentIds","ValidationError","releasesWithActions","$in","mappedEntriesInReleases","reduce","acc","forEach","action","name","push","create","user","releaseArgs","request","validateRelease","created","sanitizeOutput","update","delete","publish","counts","countsError","Error","totalEntries","published","unpublished","totalPublishedEntries","totalUnpublishedEntries"],"mappings":"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"}
|
|
@@ -267,30 +267,18 @@ const releaseController = {
|
|
|
267
267
|
const releaseService = getService('release', {
|
|
268
268
|
strapi
|
|
269
269
|
});
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
filters: {
|
|
277
|
-
release: id,
|
|
278
|
-
type: 'publish'
|
|
279
|
-
}
|
|
280
|
-
}),
|
|
281
|
-
releaseActionService.countActions({
|
|
282
|
-
filters: {
|
|
283
|
-
release: id,
|
|
284
|
-
type: 'unpublish'
|
|
285
|
-
}
|
|
286
|
-
})
|
|
287
|
-
]);
|
|
270
|
+
// The service audits the run itself, whoever the caller is
|
|
271
|
+
const { release, counts, countsError } = await releaseService.publish(id);
|
|
272
|
+
// The publish is committed and audited; the response still needs the counts
|
|
273
|
+
if (!counts) {
|
|
274
|
+
throw countsError ?? new Error('Failed to count the release entries');
|
|
275
|
+
}
|
|
288
276
|
ctx.body = {
|
|
289
277
|
data: release,
|
|
290
278
|
meta: {
|
|
291
|
-
totalEntries:
|
|
292
|
-
totalPublishedEntries:
|
|
293
|
-
totalUnpublishedEntries:
|
|
279
|
+
totalEntries: counts.published + counts.unpublished,
|
|
280
|
+
totalPublishedEntries: counts.published,
|
|
281
|
+
totalUnpublishedEntries: counts.unpublished
|
|
294
282
|
}
|
|
295
283
|
};
|
|
296
284
|
}
|