@strapi/content-releases 5.12.1 → 5.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/assets/purchase-page-illustration-dark.svg.js +6 -0
- package/dist/admin/assets/purchase-page-illustration-dark.svg.js.map +1 -0
- package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs +4 -0
- package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs.map +1 -0
- package/dist/admin/assets/purchase-page-illustration-light.svg.js +6 -0
- package/dist/admin/assets/purchase-page-illustration-light.svg.js.map +1 -0
- package/dist/admin/assets/purchase-page-illustration-light.svg.mjs +4 -0
- package/dist/admin/assets/purchase-page-illustration-light.svg.mjs.map +1 -0
- package/dist/admin/components/EntryValidationPopover.js +344 -0
- package/dist/admin/components/EntryValidationPopover.js.map +1 -0
- package/dist/admin/components/EntryValidationPopover.mjs +342 -0
- package/dist/admin/components/EntryValidationPopover.mjs.map +1 -0
- package/dist/admin/components/RelativeTime.js +76 -0
- package/dist/admin/components/RelativeTime.js.map +1 -0
- package/dist/admin/components/RelativeTime.mjs +55 -0
- package/dist/admin/components/RelativeTime.mjs.map +1 -0
- package/dist/admin/components/ReleaseAction.js +201 -0
- package/dist/admin/components/ReleaseAction.js.map +1 -0
- package/dist/admin/components/ReleaseAction.mjs +199 -0
- package/dist/admin/components/ReleaseAction.mjs.map +1 -0
- package/dist/admin/components/ReleaseActionMenu.js +243 -0
- package/dist/admin/components/ReleaseActionMenu.js.map +1 -0
- package/dist/admin/components/ReleaseActionMenu.mjs +222 -0
- package/dist/admin/components/ReleaseActionMenu.mjs.map +1 -0
- package/dist/admin/components/ReleaseActionModal.js +268 -0
- package/dist/admin/components/ReleaseActionModal.js.map +1 -0
- package/dist/admin/components/ReleaseActionModal.mjs +244 -0
- package/dist/admin/components/ReleaseActionModal.mjs.map +1 -0
- package/dist/admin/components/ReleaseActionOptions.js +104 -0
- package/dist/admin/components/ReleaseActionOptions.js.map +1 -0
- package/dist/admin/components/ReleaseActionOptions.mjs +102 -0
- package/dist/admin/components/ReleaseActionOptions.mjs.map +1 -0
- package/dist/admin/components/ReleaseListCell.js +103 -0
- package/dist/admin/components/ReleaseListCell.js.map +1 -0
- package/dist/admin/components/ReleaseListCell.mjs +100 -0
- package/dist/admin/components/ReleaseListCell.mjs.map +1 -0
- package/dist/admin/components/ReleaseModal.js +323 -0
- package/dist/admin/components/ReleaseModal.js.map +1 -0
- package/dist/admin/components/ReleaseModal.mjs +302 -0
- package/dist/admin/components/ReleaseModal.mjs.map +1 -0
- package/dist/admin/components/ReleasesPanel.js +138 -0
- package/dist/admin/components/ReleasesPanel.js.map +1 -0
- package/dist/admin/components/ReleasesPanel.mjs +136 -0
- package/dist/admin/components/ReleasesPanel.mjs.map +1 -0
- package/dist/admin/constants.js +77 -0
- package/dist/admin/constants.js.map +1 -0
- package/dist/admin/constants.mjs +75 -0
- package/dist/admin/constants.mjs.map +1 -0
- package/dist/admin/index.js +120 -14
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +121 -13
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/{chunks/hooks-DA5VbUAp.js → modules/hooks.js} +1 -1
- package/dist/admin/modules/hooks.js.map +1 -0
- package/dist/admin/{chunks/hooks-CFk_8Q0b.mjs → modules/hooks.mjs} +2 -2
- package/dist/admin/modules/hooks.mjs.map +1 -0
- package/dist/admin/pages/App.js +29 -0
- package/dist/admin/pages/App.js.map +1 -0
- package/dist/admin/pages/App.mjs +27 -0
- package/dist/admin/pages/App.mjs.map +1 -0
- package/dist/admin/pages/PurchaseContentReleases.js +192 -0
- package/dist/admin/pages/PurchaseContentReleases.js.map +1 -0
- package/dist/admin/pages/PurchaseContentReleases.mjs +190 -0
- package/dist/admin/pages/PurchaseContentReleases.mjs.map +1 -0
- package/dist/admin/pages/ReleaseDetailsPage.js +821 -0
- package/dist/admin/pages/ReleaseDetailsPage.js.map +1 -0
- package/dist/admin/pages/ReleaseDetailsPage.mjs +800 -0
- package/dist/admin/pages/ReleaseDetailsPage.mjs.map +1 -0
- package/dist/admin/pages/ReleasesPage.js +397 -0
- package/dist/admin/pages/ReleasesPage.js.map +1 -0
- package/dist/admin/pages/ReleasesPage.mjs +375 -0
- package/dist/admin/pages/ReleasesPage.mjs.map +1 -0
- package/dist/admin/{chunks/ReleasesSettingsPage-KRcoI1bC.js → pages/ReleasesSettingsPage.js} +9 -17
- package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -0
- package/dist/admin/{chunks/ReleasesSettingsPage-DUKdFdvx.mjs → pages/ReleasesSettingsPage.mjs} +5 -13
- package/dist/admin/pages/ReleasesSettingsPage.mjs.map +1 -0
- package/dist/admin/pluginId.js +6 -0
- package/dist/admin/pluginId.js.map +1 -0
- package/dist/admin/pluginId.mjs +4 -0
- package/dist/admin/pluginId.mjs.map +1 -0
- package/dist/admin/services/release.js +464 -0
- package/dist/admin/services/release.js.map +1 -0
- package/dist/admin/services/release.mjs +447 -0
- package/dist/admin/services/release.mjs.map +1 -0
- package/dist/admin/store/hooks.js +8 -0
- package/dist/admin/store/hooks.js.map +1 -0
- package/dist/admin/store/hooks.mjs +6 -0
- package/dist/admin/store/hooks.mjs.map +1 -0
- package/dist/admin/{chunks/en-BOpqX2t_.js → translations/en.json.js} +2 -2
- package/dist/admin/translations/en.json.js.map +1 -0
- package/dist/admin/{chunks/en-aQo8Bn_U.mjs → translations/en.json.mjs} +1 -1
- package/dist/admin/translations/en.json.mjs.map +1 -0
- package/dist/admin/{chunks/uk-9T9su-bj.js → translations/uk.json.js} +2 -2
- package/dist/admin/translations/uk.json.js.map +1 -0
- package/dist/admin/{chunks/uk-Bp9HotPq.mjs → translations/uk.json.mjs} +1 -1
- package/dist/admin/translations/uk.json.mjs.map +1 -0
- package/dist/admin/utils/api.js +8 -0
- package/dist/admin/utils/api.js.map +1 -0
- package/dist/admin/utils/api.mjs +6 -0
- package/dist/admin/utils/api.mjs.map +1 -0
- package/dist/admin/utils/prefixPluginTranslations.js +11 -0
- package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
- package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
- package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
- package/dist/admin/utils/time.js +42 -0
- package/dist/admin/utils/time.js.map +1 -0
- package/dist/admin/utils/time.mjs +39 -0
- package/dist/admin/utils/time.mjs.map +1 -0
- package/dist/admin/{chunks/schemas-DS7NeFDN.js → validation/schemas.js} +1 -1
- package/dist/admin/validation/schemas.js.map +1 -0
- package/dist/admin/{chunks/schemas-DMt8h1z-.mjs → validation/schemas.mjs} +2 -2
- package/dist/admin/validation/schemas.mjs.map +1 -0
- package/dist/server/bootstrap.js +68 -0
- package/dist/server/bootstrap.js.map +1 -0
- package/dist/server/bootstrap.mjs +66 -0
- package/dist/server/bootstrap.mjs.map +1 -0
- package/dist/server/constants.js +74 -0
- package/dist/server/constants.js.map +1 -0
- package/dist/server/constants.mjs +69 -0
- package/dist/server/constants.mjs.map +1 -0
- package/dist/server/content-types/index.js +12 -0
- package/dist/server/content-types/index.js.map +1 -0
- package/dist/server/content-types/index.mjs +10 -0
- package/dist/server/content-types/index.mjs.map +1 -0
- package/dist/server/content-types/release/index.js +10 -0
- package/dist/server/content-types/release/index.js.map +1 -0
- package/dist/server/content-types/release/index.mjs +8 -0
- package/dist/server/content-types/release/index.mjs.map +1 -0
- package/dist/server/content-types/release/schema.js +58 -0
- package/dist/server/content-types/release/schema.js.map +1 -0
- package/dist/server/content-types/release/schema.mjs +56 -0
- package/dist/server/content-types/release/schema.mjs.map +1 -0
- package/dist/server/content-types/release-action/index.js +10 -0
- package/dist/server/content-types/release-action/index.js.map +1 -0
- package/dist/server/content-types/release-action/index.mjs +8 -0
- package/dist/server/content-types/release-action/index.mjs.map +1 -0
- package/dist/server/content-types/release-action/schema.js +55 -0
- package/dist/server/content-types/release-action/schema.js.map +1 -0
- package/dist/server/content-types/release-action/schema.mjs +53 -0
- package/dist/server/content-types/release-action/schema.mjs.map +1 -0
- package/dist/server/controllers/index.js +14 -0
- package/dist/server/controllers/index.js.map +1 -0
- package/dist/server/controllers/index.mjs +12 -0
- package/dist/server/controllers/index.mjs.map +1 -0
- package/dist/server/controllers/release-action.js +150 -0
- package/dist/server/controllers/release-action.js.map +1 -0
- package/dist/server/controllers/release-action.mjs +148 -0
- package/dist/server/controllers/release-action.mjs.map +1 -0
- package/dist/server/controllers/release.js +302 -0
- package/dist/server/controllers/release.js.map +1 -0
- package/dist/server/controllers/release.mjs +300 -0
- package/dist/server/controllers/release.mjs.map +1 -0
- package/dist/server/controllers/settings.js +37 -0
- package/dist/server/controllers/settings.js.map +1 -0
- package/dist/server/controllers/settings.mjs +35 -0
- package/dist/server/controllers/settings.mjs.map +1 -0
- package/dist/server/controllers/validation/release-action.js +34 -0
- package/dist/server/controllers/validation/release-action.js.map +1 -0
- package/dist/server/controllers/validation/release-action.mjs +30 -0
- package/dist/server/controllers/validation/release-action.mjs.map +1 -0
- package/dist/server/controllers/validation/release.js +26 -0
- package/dist/server/controllers/validation/release.js.map +1 -0
- package/dist/server/controllers/validation/release.mjs +22 -0
- package/dist/server/controllers/validation/release.mjs.map +1 -0
- package/dist/server/controllers/validation/settings.js +32 -0
- package/dist/server/controllers/validation/settings.js.map +1 -0
- package/dist/server/controllers/validation/settings.mjs +10 -0
- package/dist/server/controllers/validation/settings.mjs.map +1 -0
- package/dist/server/destroy.js +15 -0
- package/dist/server/destroy.js.map +1 -0
- package/dist/server/destroy.mjs +13 -0
- package/dist/server/destroy.mjs.map +1 -0
- package/dist/server/index.js +16 -2336
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +7 -2308
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/middlewares/documents.js +104 -0
- package/dist/server/middlewares/documents.js.map +1 -0
- package/dist/server/middlewares/documents.mjs +101 -0
- package/dist/server/middlewares/documents.mjs.map +1 -0
- package/dist/server/migrations/database/5.0.0-document-id-in-actions.js +51 -0
- package/dist/server/migrations/database/5.0.0-document-id-in-actions.js.map +1 -0
- package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs +49 -0
- package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs.map +1 -0
- package/dist/server/migrations/index.js +205 -0
- package/dist/server/migrations/index.js.map +1 -0
- package/dist/server/migrations/index.mjs +198 -0
- package/dist/server/migrations/index.mjs.map +1 -0
- package/dist/server/register.js +23 -0
- package/dist/server/register.js.map +1 -0
- package/dist/server/register.mjs +21 -0
- package/dist/server/register.mjs.map +1 -0
- package/dist/server/routes/index.js +14 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/index.mjs +12 -0
- package/dist/server/routes/index.mjs.map +1 -0
- package/dist/server/routes/release-action.js +100 -0
- package/dist/server/routes/release-action.js.map +1 -0
- package/dist/server/routes/release-action.mjs +98 -0
- package/dist/server/routes/release-action.mjs.map +1 -0
- package/dist/server/routes/release.js +154 -0
- package/dist/server/routes/release.js.map +1 -0
- package/dist/server/routes/release.mjs +152 -0
- package/dist/server/routes/release.mjs.map +1 -0
- package/dist/server/routes/settings.js +46 -0
- package/dist/server/routes/settings.js.map +1 -0
- package/dist/server/routes/settings.mjs +44 -0
- package/dist/server/routes/settings.mjs.map +1 -0
- package/dist/server/services/index.js +18 -0
- package/dist/server/services/index.js.map +1 -0
- package/dist/server/services/index.mjs +16 -0
- package/dist/server/services/index.mjs.map +1 -0
- package/dist/server/services/release-action.js +323 -0
- package/dist/server/services/release-action.js.map +1 -0
- package/dist/server/services/release-action.mjs +321 -0
- package/dist/server/services/release-action.mjs.map +1 -0
- package/dist/server/services/release.js +324 -0
- package/dist/server/services/release.js.map +1 -0
- package/dist/server/services/release.mjs +322 -0
- package/dist/server/services/release.mjs.map +1 -0
- package/dist/server/services/scheduling.js +70 -0
- package/dist/server/services/scheduling.js.map +1 -0
- package/dist/server/services/scheduling.mjs +68 -0
- package/dist/server/services/scheduling.mjs.map +1 -0
- package/dist/server/services/settings.js +34 -0
- package/dist/server/services/settings.js.map +1 -0
- package/dist/server/services/settings.mjs +32 -0
- package/dist/server/services/settings.mjs.map +1 -0
- package/dist/server/services/validation.js +91 -0
- package/dist/server/services/validation.js.map +1 -0
- package/dist/server/services/validation.mjs +86 -0
- package/dist/server/services/validation.mjs.map +1 -0
- package/dist/server/utils/index.js +93 -0
- package/dist/server/utils/index.js.map +1 -0
- package/dist/server/utils/index.mjs +87 -0
- package/dist/server/utils/index.mjs.map +1 -0
- package/package.json +7 -7
- package/dist/admin/chunks/App-BkWgp5q_.mjs +0 -1845
- package/dist/admin/chunks/App-BkWgp5q_.mjs.map +0 -1
- package/dist/admin/chunks/App-CJiqPP7-.js +0 -1866
- package/dist/admin/chunks/App-CJiqPP7-.js.map +0 -1
- package/dist/admin/chunks/PurchaseContentReleases-CzayeVUD.mjs +0 -193
- package/dist/admin/chunks/PurchaseContentReleases-CzayeVUD.mjs.map +0 -1
- package/dist/admin/chunks/PurchaseContentReleases-Z9uEPb5b.js +0 -195
- package/dist/admin/chunks/PurchaseContentReleases-Z9uEPb5b.js.map +0 -1
- package/dist/admin/chunks/ReleasesSettingsPage-DUKdFdvx.mjs.map +0 -1
- package/dist/admin/chunks/ReleasesSettingsPage-KRcoI1bC.js.map +0 -1
- package/dist/admin/chunks/en-BOpqX2t_.js.map +0 -1
- package/dist/admin/chunks/en-aQo8Bn_U.mjs.map +0 -1
- package/dist/admin/chunks/hooks-CFk_8Q0b.mjs.map +0 -1
- package/dist/admin/chunks/hooks-DA5VbUAp.js.map +0 -1
- package/dist/admin/chunks/index-DBUaMD56.mjs +0 -1619
- package/dist/admin/chunks/index-DBUaMD56.mjs.map +0 -1
- package/dist/admin/chunks/index-vjWrvGN3.js +0 -1658
- package/dist/admin/chunks/index-vjWrvGN3.js.map +0 -1
- package/dist/admin/chunks/schemas-DMt8h1z-.mjs.map +0 -1
- package/dist/admin/chunks/schemas-DS7NeFDN.js.map +0 -1
- package/dist/admin/chunks/uk-9T9su-bj.js.map +0 -1
- package/dist/admin/chunks/uk-Bp9HotPq.mjs.map +0 -1
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@strapi/utils');
|
|
4
|
+
var constants = require('../constants.js');
|
|
5
|
+
var release = require('./validation/release.js');
|
|
6
|
+
var index = require('../utils/index.js');
|
|
7
|
+
|
|
8
|
+
const releaseController = {
|
|
9
|
+
/**
|
|
10
|
+
* Find releases based on documents attached or not to the release.
|
|
11
|
+
* If `hasEntryAttached` is true, it will return all releases that have the entry attached.
|
|
12
|
+
* If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.
|
|
13
|
+
*/ async findByDocumentAttached (ctx) {
|
|
14
|
+
const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
|
|
15
|
+
ability: ctx.state.userAbility,
|
|
16
|
+
model: constants.RELEASE_MODEL_UID
|
|
17
|
+
});
|
|
18
|
+
await permissionsManager.validateQuery(ctx.query);
|
|
19
|
+
const releaseService = index.getService('release', {
|
|
20
|
+
strapi
|
|
21
|
+
});
|
|
22
|
+
const query = await permissionsManager.sanitizeQuery(ctx.query);
|
|
23
|
+
await release.validatefindByDocumentAttachedParams(query);
|
|
24
|
+
// If entry is a singleType, we need to manually add the entryDocumentId to the query
|
|
25
|
+
const model = strapi.getModel(query.contentType);
|
|
26
|
+
if (model.kind && model.kind === 'singleType') {
|
|
27
|
+
const document = await strapi.db.query(model.uid).findOne({
|
|
28
|
+
select: [
|
|
29
|
+
'documentId'
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
if (!document) {
|
|
33
|
+
throw new utils.errors.NotFoundError(`No entry found for contentType ${query.contentType}`);
|
|
34
|
+
}
|
|
35
|
+
query.entryDocumentId = document.documentId;
|
|
36
|
+
}
|
|
37
|
+
const { contentType, hasEntryAttached, entryDocumentId, locale } = query;
|
|
38
|
+
const isEntryAttached = typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;
|
|
39
|
+
if (isEntryAttached) {
|
|
40
|
+
const releases = await releaseService.findMany({
|
|
41
|
+
where: {
|
|
42
|
+
releasedAt: null,
|
|
43
|
+
actions: {
|
|
44
|
+
contentType,
|
|
45
|
+
entryDocumentId: entryDocumentId ?? null,
|
|
46
|
+
locale: locale ?? null
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
populate: {
|
|
50
|
+
actions: {
|
|
51
|
+
fields: [
|
|
52
|
+
'type'
|
|
53
|
+
],
|
|
54
|
+
filters: {
|
|
55
|
+
contentType,
|
|
56
|
+
entryDocumentId: entryDocumentId ?? null,
|
|
57
|
+
locale: locale ?? null
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
ctx.body = {
|
|
63
|
+
data: releases
|
|
64
|
+
};
|
|
65
|
+
} else {
|
|
66
|
+
const relatedReleases = await releaseService.findMany({
|
|
67
|
+
where: {
|
|
68
|
+
releasedAt: null,
|
|
69
|
+
actions: {
|
|
70
|
+
contentType,
|
|
71
|
+
entryDocumentId: entryDocumentId ?? null,
|
|
72
|
+
locale: locale ?? null
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
const releases = await releaseService.findMany({
|
|
77
|
+
where: {
|
|
78
|
+
$or: [
|
|
79
|
+
{
|
|
80
|
+
id: {
|
|
81
|
+
$notIn: relatedReleases.map((release)=>release.id)
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
actions: null
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
releasedAt: null
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
ctx.body = {
|
|
92
|
+
data: releases
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
async findPage (ctx) {
|
|
97
|
+
const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
|
|
98
|
+
ability: ctx.state.userAbility,
|
|
99
|
+
model: constants.RELEASE_MODEL_UID
|
|
100
|
+
});
|
|
101
|
+
await permissionsManager.validateQuery(ctx.query);
|
|
102
|
+
const releaseService = index.getService('release', {
|
|
103
|
+
strapi
|
|
104
|
+
});
|
|
105
|
+
const query = await permissionsManager.sanitizeQuery(ctx.query);
|
|
106
|
+
const { results, pagination } = await releaseService.findPage(query);
|
|
107
|
+
const data = results.map((release)=>{
|
|
108
|
+
const { actions, ...releaseData } = release;
|
|
109
|
+
return {
|
|
110
|
+
...releaseData,
|
|
111
|
+
actions: {
|
|
112
|
+
meta: {
|
|
113
|
+
count: actions.count
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
const pendingReleasesCount = await strapi.db.query(constants.RELEASE_MODEL_UID).count({
|
|
119
|
+
where: {
|
|
120
|
+
releasedAt: null
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
ctx.body = {
|
|
124
|
+
data,
|
|
125
|
+
meta: {
|
|
126
|
+
pagination,
|
|
127
|
+
pendingReleasesCount
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
async findOne (ctx) {
|
|
132
|
+
const id = ctx.params.id;
|
|
133
|
+
const releaseService = index.getService('release', {
|
|
134
|
+
strapi
|
|
135
|
+
});
|
|
136
|
+
const releaseActionService = index.getService('release-action', {
|
|
137
|
+
strapi
|
|
138
|
+
});
|
|
139
|
+
const release = await releaseService.findOne(id, {
|
|
140
|
+
populate: [
|
|
141
|
+
'createdBy'
|
|
142
|
+
]
|
|
143
|
+
});
|
|
144
|
+
if (!release) {
|
|
145
|
+
throw new utils.errors.NotFoundError(`Release not found for id: ${id}`);
|
|
146
|
+
}
|
|
147
|
+
const count = await releaseActionService.countActions({
|
|
148
|
+
filters: {
|
|
149
|
+
release: id
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
const sanitizedRelease = {
|
|
153
|
+
...release,
|
|
154
|
+
createdBy: release.createdBy ? strapi.service('admin::user').sanitizeUser(release.createdBy) : null
|
|
155
|
+
};
|
|
156
|
+
// Format the data object
|
|
157
|
+
const data = {
|
|
158
|
+
...sanitizedRelease,
|
|
159
|
+
actions: {
|
|
160
|
+
meta: {
|
|
161
|
+
count
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
ctx.body = {
|
|
166
|
+
data
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
async mapEntriesToReleases (ctx) {
|
|
170
|
+
const { contentTypeUid, documentIds, locale } = ctx.query;
|
|
171
|
+
if (!contentTypeUid || !documentIds) {
|
|
172
|
+
throw new utils.errors.ValidationError('Missing required query parameters');
|
|
173
|
+
}
|
|
174
|
+
const releaseService = index.getService('release', {
|
|
175
|
+
strapi
|
|
176
|
+
});
|
|
177
|
+
const releasesWithActions = await releaseService.findMany({
|
|
178
|
+
where: {
|
|
179
|
+
releasedAt: null,
|
|
180
|
+
actions: {
|
|
181
|
+
contentType: contentTypeUid,
|
|
182
|
+
entryDocumentId: {
|
|
183
|
+
$in: documentIds
|
|
184
|
+
},
|
|
185
|
+
locale
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
populate: {
|
|
189
|
+
actions: true
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
const mappedEntriesInReleases = releasesWithActions.reduce((acc, release)=>{
|
|
193
|
+
release.actions.forEach((action)=>{
|
|
194
|
+
if (action.contentType !== contentTypeUid) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (locale && action.locale !== locale) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (!acc[action.entryDocumentId]) {
|
|
201
|
+
acc[action.entryDocumentId] = [
|
|
202
|
+
{
|
|
203
|
+
id: release.id,
|
|
204
|
+
name: release.name
|
|
205
|
+
}
|
|
206
|
+
];
|
|
207
|
+
} else {
|
|
208
|
+
acc[action.entryDocumentId].push({
|
|
209
|
+
id: release.id,
|
|
210
|
+
name: release.name
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return acc;
|
|
215
|
+
}, {});
|
|
216
|
+
ctx.body = {
|
|
217
|
+
data: mappedEntriesInReleases
|
|
218
|
+
};
|
|
219
|
+
},
|
|
220
|
+
async create (ctx) {
|
|
221
|
+
const user = ctx.state.user;
|
|
222
|
+
const releaseArgs = ctx.request.body;
|
|
223
|
+
await release.validateRelease(releaseArgs);
|
|
224
|
+
const releaseService = index.getService('release', {
|
|
225
|
+
strapi
|
|
226
|
+
});
|
|
227
|
+
const release$1 = await releaseService.create(releaseArgs, {
|
|
228
|
+
user
|
|
229
|
+
});
|
|
230
|
+
const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
|
|
231
|
+
ability: ctx.state.userAbility,
|
|
232
|
+
model: constants.RELEASE_MODEL_UID
|
|
233
|
+
});
|
|
234
|
+
ctx.created({
|
|
235
|
+
data: await permissionsManager.sanitizeOutput(release$1)
|
|
236
|
+
});
|
|
237
|
+
},
|
|
238
|
+
async update (ctx) {
|
|
239
|
+
const user = ctx.state.user;
|
|
240
|
+
const releaseArgs = ctx.request.body;
|
|
241
|
+
const id = ctx.params.id;
|
|
242
|
+
await release.validateRelease(releaseArgs);
|
|
243
|
+
const releaseService = index.getService('release', {
|
|
244
|
+
strapi
|
|
245
|
+
});
|
|
246
|
+
const release$1 = await releaseService.update(id, releaseArgs, {
|
|
247
|
+
user
|
|
248
|
+
});
|
|
249
|
+
const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
|
|
250
|
+
ability: ctx.state.userAbility,
|
|
251
|
+
model: constants.RELEASE_MODEL_UID
|
|
252
|
+
});
|
|
253
|
+
ctx.body = {
|
|
254
|
+
data: await permissionsManager.sanitizeOutput(release$1)
|
|
255
|
+
};
|
|
256
|
+
},
|
|
257
|
+
async delete (ctx) {
|
|
258
|
+
const id = ctx.params.id;
|
|
259
|
+
const releaseService = index.getService('release', {
|
|
260
|
+
strapi
|
|
261
|
+
});
|
|
262
|
+
const release = await releaseService.delete(id);
|
|
263
|
+
ctx.body = {
|
|
264
|
+
data: release
|
|
265
|
+
};
|
|
266
|
+
},
|
|
267
|
+
async publish (ctx) {
|
|
268
|
+
const id = ctx.params.id;
|
|
269
|
+
const releaseService = index.getService('release', {
|
|
270
|
+
strapi
|
|
271
|
+
});
|
|
272
|
+
const releaseActionService = index.getService('release-action', {
|
|
273
|
+
strapi
|
|
274
|
+
});
|
|
275
|
+
const release = await releaseService.publish(id);
|
|
276
|
+
const [countPublishActions, countUnpublishActions] = await Promise.all([
|
|
277
|
+
releaseActionService.countActions({
|
|
278
|
+
filters: {
|
|
279
|
+
release: id,
|
|
280
|
+
type: 'publish'
|
|
281
|
+
}
|
|
282
|
+
}),
|
|
283
|
+
releaseActionService.countActions({
|
|
284
|
+
filters: {
|
|
285
|
+
release: id,
|
|
286
|
+
type: 'unpublish'
|
|
287
|
+
}
|
|
288
|
+
})
|
|
289
|
+
]);
|
|
290
|
+
ctx.body = {
|
|
291
|
+
data: release,
|
|
292
|
+
meta: {
|
|
293
|
+
totalEntries: countPublishActions + countUnpublishActions,
|
|
294
|
+
totalPublishedEntries: countPublishActions,
|
|
295
|
+
totalUnpublishedEntries: countUnpublishActions
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
module.exports = releaseController;
|
|
302
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +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":";;;;;;;AAoBA,MAAMA,iBAAoB,GAAA;AACxB;;;;MAKA,MAAMC,wBAAuBC,GAAgB,EAAA;AAC3C,QAAA,MAAMC,qBAAqBC,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAASL,EAAAA,GAAAA,CAAIM,KAAK,CAACC,WAAW;YAC9BC,KAAOC,EAAAA;AACT,SAAA,CAAA;AACA,QAAA,MAAMR,kBAAmBS,CAAAA,aAAa,CAACV,GAAAA,CAAIW,KAAK,CAAA;QAChD,MAAMC,cAAAA,GAAiBC,iBAAW,SAAW,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAMS,QAAQ,MAAMV,kBAAAA,CAAmBa,aAAa,CAACd,IAAIW,KAAK,CAAA;AAE9D,QAAA,MAAMI,4CAAqCJ,CAAAA,KAAAA,CAAAA;;AAG3C,QAAA,MAAMH,KAAQN,GAAAA,MAAAA,CAAOc,QAAQ,CAACL,MAAMM,WAAW,CAAA;AAC/C,QAAA,IAAIT,MAAMU,IAAI,IAAIV,KAAMU,CAAAA,IAAI,KAAK,YAAc,EAAA;YAC7C,MAAMC,QAAAA,GAAW,MAAMjB,MAAAA,CAAOkB,EAAE,CAACT,KAAK,CAACH,KAAMa,CAAAA,GAAG,CAAEC,CAAAA,OAAO,CAAC;gBAAEC,MAAQ,EAAA;AAAC,oBAAA;AAAa;AAAC,aAAA,CAAA;AAEnF,YAAA,IAAI,CAACJ,QAAU,EAAA;gBACb,MAAM,IAAIK,YAAOC,CAAAA,aAAa,CAAC,CAAC,+BAA+B,EAAEd,KAAAA,CAAMM,WAAW,CAAC,CAAC,CAAA;AACtF;YAEAN,KAAMe,CAAAA,eAAe,GAAGP,QAAAA,CAASQ,UAAU;AAC7C;QAEA,MAAM,EAAEV,WAAW,EAAEW,gBAAgB,EAAEF,eAAe,EAAEG,MAAM,EAAE,GAAGlB,KAAAA;QACnE,MAAMmB,eAAAA,GACJ,OAAOF,gBAAqB,KAAA,QAAA,GAAWG,QAAQC,IAAKC,CAAAA,KAAK,CAACL,gBAAqB,CAAA,CAAA,GAAA,KAAA;AAEjF,QAAA,IAAIE,eAAiB,EAAA;AACnB,YAAA,MAAMI,QAAW,GAAA,MAAMtB,cAAeuB,CAAAA,QAAQ,CAAC;gBAC7CC,KAAO,EAAA;oBACLC,UAAY,EAAA,IAAA;oBACZC,OAAS,EAAA;AACPrB,wBAAAA,WAAAA;AACAS,wBAAAA,eAAAA,EAAiBA,eAAmB,IAAA,IAAA;AACpCG,wBAAAA,MAAAA,EAAQA,MAAU,IAAA;AACpB;AACF,iBAAA;gBACAU,QAAU,EAAA;oBACRD,OAAS,EAAA;wBACPE,MAAQ,EAAA;AAAC,4BAAA;AAAO,yBAAA;wBAChBC,OAAS,EAAA;AACPxB,4BAAAA,WAAAA;AACAS,4BAAAA,eAAAA,EAAiBA,eAAmB,IAAA,IAAA;AACpCG,4BAAAA,MAAAA,EAAQA,MAAU,IAAA;AACpB;AACF;AACF;AACF,aAAA,CAAA;AAEA7B,YAAAA,GAAAA,CAAI0C,IAAI,GAAG;gBAAEC,IAAMT,EAAAA;AAAS,aAAA;SACvB,MAAA;AACL,YAAA,MAAMU,eAAkB,GAAA,MAAMhC,cAAeuB,CAAAA,QAAQ,CAAC;gBACpDC,KAAO,EAAA;oBACLC,UAAY,EAAA,IAAA;oBACZC,OAAS,EAAA;AACPrB,wBAAAA,WAAAA;AACAS,wBAAAA,eAAAA,EAAiBA,eAAmB,IAAA,IAAA;AACpCG,wBAAAA,MAAAA,EAAQA,MAAU,IAAA;AACpB;AACF;AACF,aAAA,CAAA;AAEA,YAAA,MAAMK,QAAW,GAAA,MAAMtB,cAAeuB,CAAAA,QAAQ,CAAC;gBAC7CC,KAAO,EAAA;oBACLS,GAAK,EAAA;AACH,wBAAA;4BACEC,EAAI,EAAA;AACFC,gCAAAA,MAAAA,EAAQH,gBAAgBI,GAAG,CAAC,CAACC,OAAAA,GAAiBA,QAAQH,EAAE;AAC1D;AACF,yBAAA;AACA,wBAAA;4BACER,OAAS,EAAA;AACX;AACD,qBAAA;oBACDD,UAAY,EAAA;AACd;AACF,aAAA,CAAA;AACArC,YAAAA,GAAAA,CAAI0C,IAAI,GAAG;gBAAEC,IAAMT,EAAAA;AAAS,aAAA;AAC9B;AACF,KAAA;AAEA,IAAA,MAAMgB,UAASlD,GAAgB,EAAA;AAC7B,QAAA,MAAMC,qBAAqBC,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAASL,EAAAA,GAAAA,CAAIM,KAAK,CAACC,WAAW;YAC9BC,KAAOC,EAAAA;AACT,SAAA,CAAA;AAEA,QAAA,MAAMR,kBAAmBS,CAAAA,aAAa,CAACV,GAAAA,CAAIW,KAAK,CAAA;QAEhD,MAAMC,cAAAA,GAAiBC,iBAAW,SAAW,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;AAEtD,QAAA,MAAMS,QAAsC,MAAMV,kBAAAA,CAAmBa,aAAa,CAACd,IAAIW,KAAK,CAAA;QAC5F,MAAM,EAAEwC,OAAO,EAAEC,UAAU,EAAE,GAAG,MAAMxC,cAAesC,CAAAA,QAAQ,CAACvC,KAAAA,CAAAA;AAE9D,QAAA,MAAMgC,IAAOQ,GAAAA,OAAAA,CAAQH,GAAG,CAAC,CAACC,OAAAA,GAAAA;AACxB,YAAA,MAAM,EAAEX,OAAO,EAAE,GAAGe,aAAa,GAAGJ,OAAAA;YAEpC,OAAO;AACL,gBAAA,GAAGI,WAAW;gBACdf,OAAS,EAAA;oBACPgB,IAAM,EAAA;AACJC,wBAAAA,KAAAA,EAAOjB,QAAQiB;AACjB;AACF;AACF,aAAA;AACF,SAAA,CAAA;QAEA,MAAMC,oBAAAA,GAAuB,MAAMtD,MAAOkB,CAAAA,EAAE,CAACT,KAAK,CAACF,2BAAmB8C,CAAAA,CAAAA,KAAK,CAAC;YAC1EnB,KAAO,EAAA;gBACLC,UAAY,EAAA;AACd;AACF,SAAA,CAAA;AAEArC,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;AAAEC,YAAAA,IAAAA;YAAMW,IAAM,EAAA;AAAEF,gBAAAA,UAAAA;AAAYI,gBAAAA;AAAqB;AAAE,SAAA;AAChE,KAAA;AAEA,IAAA,MAAMlC,SAAQtB,GAAgB,EAAA;AAC5B,QAAA,MAAM8C,EAAyC9C,GAAAA,GAAAA,CAAIyD,MAAM,CAACX,EAAE;QAE5D,MAAMlC,cAAAA,GAAiBC,iBAAW,SAAW,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;QACtD,MAAMwD,oBAAAA,GAAuB7C,iBAAW,gBAAkB,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACnE,QAAA,MAAM+C,OAAU,GAAA,MAAMrC,cAAeU,CAAAA,OAAO,CAACwB,EAAI,EAAA;YAAEP,QAAU,EAAA;AAAC,gBAAA;AAAY;AAAC,SAAA,CAAA;AAC3E,QAAA,IAAI,CAACU,OAAS,EAAA;YACZ,MAAM,IAAIzB,aAAOC,aAAa,CAAC,CAAC,0BAA0B,EAAEqB,GAAG,CAAC,CAAA;AAClE;AAEA,QAAA,MAAMS,KAAQ,GAAA,MAAMG,oBAAqBC,CAAAA,YAAY,CAAC;YACpDlB,OAAS,EAAA;gBACPQ,OAASH,EAAAA;AACX;AACF,SAAA,CAAA;AACA,QAAA,MAAMc,gBAAmB,GAAA;AACvB,YAAA,GAAGX,OAAO;YACVY,SAAWZ,EAAAA,OAAAA,CAAQY,SAAS,GACxB3D,MAAOC,CAAAA,OAAO,CAAC,aAAA,CAAA,CAAe2D,YAAY,CAACb,OAAQY,CAAAA,SAAS,CAC5D,GAAA;AACN,SAAA;;AAGA,QAAA,MAAMlB,IAAO,GAAA;AACX,YAAA,GAAGiB,gBAAgB;YACnBtB,OAAS,EAAA;gBACPgB,IAAM,EAAA;AACJC,oBAAAA;AACF;AACF;AACF,SAAA;AAEAvD,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;AAAEC,YAAAA;AAAK,SAAA;AACpB,KAAA;AAEA,IAAA,MAAMoB,sBAAqB/D,GAAgB,EAAA;QACzC,MAAM,EAAEgE,cAAc,EAAEC,WAAW,EAAEpC,MAAM,EAAE,GAAG7B,GAAAA,CAAIW,KAAK;QAEzD,IAAI,CAACqD,cAAkB,IAAA,CAACC,WAAa,EAAA;YACnC,MAAM,IAAIzC,YAAO0C,CAAAA,eAAe,CAAC,mCAAA,CAAA;AACnC;QAEA,MAAMtD,cAAAA,GAAiBC,iBAAW,SAAW,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;AAEtD,QAAA,MAAMiE,mBAAsB,GAAA,MAAMvD,cAAeuB,CAAAA,QAAQ,CAAC;YACxDC,KAAO,EAAA;gBACLC,UAAY,EAAA,IAAA;gBACZC,OAAS,EAAA;oBACPrB,WAAa+C,EAAAA,cAAAA;oBACbtC,eAAiB,EAAA;wBACf0C,GAAKH,EAAAA;AACP,qBAAA;AACApC,oBAAAA;AACF;AACF,aAAA;YACAU,QAAU,EAAA;gBACRD,OAAS,EAAA;AACX;AACF,SAAA,CAAA;AAEA,QAAA,MAAM+B,uBAA0BF,GAAAA,mBAAAA,CAAoBG,MAAM,CACxD,CAACC,GAA4CtB,EAAAA,OAAAA,GAAAA;AAC3CA,YAAAA,OAAAA,CAAQX,OAAO,CAACkC,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACvB,IAAIA,MAAAA,CAAOxD,WAAW,KAAK+C,cAAgB,EAAA;AACzC,oBAAA;AACF;AAEA,gBAAA,IAAInC,MAAU4C,IAAAA,MAAAA,CAAO5C,MAAM,KAAKA,MAAQ,EAAA;AACtC,oBAAA;AACF;AAEA,gBAAA,IAAI,CAAC0C,GAAG,CAACE,MAAO/C,CAAAA,eAAe,CAAC,EAAE;AAChC6C,oBAAAA,GAAG,CAACE,MAAAA,CAAO/C,eAAe,CAAC,GAAG;AAAC,wBAAA;AAAEoB,4BAAAA,EAAAA,EAAIG,QAAQH,EAAE;AAAE4B,4BAAAA,IAAAA,EAAMzB,QAAQyB;AAAK;AAAE,qBAAA;iBACjE,MAAA;AACLH,oBAAAA,GAAG,CAACE,MAAO/C,CAAAA,eAAe,CAAC,CAACiD,IAAI,CAAC;AAAE7B,wBAAAA,EAAAA,EAAIG,QAAQH,EAAE;AAAE4B,wBAAAA,IAAAA,EAAMzB,QAAQyB;AAAK,qBAAA,CAAA;AACxE;AACF,aAAA,CAAA;YAEA,OAAOH,GAAAA;AACT,SAAA,EACA,EAAC,CAAA;AAGHvE,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAM0B,EAAAA;AACR,SAAA;AACF,KAAA;AAEA,IAAA,MAAMO,QAAO5E,GAAgB,EAAA;AAC3B,QAAA,MAAM6E,IAAiB7E,GAAAA,GAAAA,CAAIM,KAAK,CAACuE,IAAI;AACrC,QAAA,MAAMC,WAAc9E,GAAAA,GAAAA,CAAI+E,OAAO,CAACrC,IAAI;AAEpC,QAAA,MAAMsC,uBAAgBF,CAAAA,WAAAA,CAAAA;QAEtB,MAAMlE,cAAAA,GAAiBC,iBAAW,SAAW,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAM+C,SAAU,GAAA,MAAMrC,cAAegE,CAAAA,MAAM,CAACE,WAAa,EAAA;AAAED,YAAAA;AAAK,SAAA,CAAA;AAEhE,QAAA,MAAM5E,qBAAqBC,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAASL,EAAAA,GAAAA,CAAIM,KAAK,CAACC,WAAW;YAC9BC,KAAOC,EAAAA;AACT,SAAA,CAAA;AAEAT,QAAAA,GAAAA,CAAIiF,OAAO,CAAC;YACVtC,IAAM,EAAA,MAAM1C,kBAAmBiF,CAAAA,cAAc,CAACjC,SAAAA;AAChD,SAAA,CAAA;AACF,KAAA;AAEA,IAAA,MAAMkC,QAAOnF,GAAgB,EAAA;AAC3B,QAAA,MAAM6E,IAAiB7E,GAAAA,GAAAA,CAAIM,KAAK,CAACuE,IAAI;AACrC,QAAA,MAAMC,WAAc9E,GAAAA,GAAAA,CAAI+E,OAAO,CAACrC,IAAI;AACpC,QAAA,MAAMI,EAA4C9C,GAAAA,GAAAA,CAAIyD,MAAM,CAACX,EAAE;AAE/D,QAAA,MAAMkC,uBAAgBF,CAAAA,WAAAA,CAAAA;QAEtB,MAAMlE,cAAAA,GAAiBC,iBAAW,SAAW,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAM+C,YAAU,MAAMrC,cAAAA,CAAeuE,MAAM,CAACrC,IAAIgC,WAAa,EAAA;AAAED,YAAAA;AAAK,SAAA,CAAA;AAEpE,QAAA,MAAM5E,qBAAqBC,MAAOC,CAAAA,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAASL,EAAAA,GAAAA,CAAIM,KAAK,CAACC,WAAW;YAC9BC,KAAOC,EAAAA;AACT,SAAA,CAAA;AAEAT,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAM,EAAA,MAAM1C,kBAAmBiF,CAAAA,cAAc,CAACjC,SAAAA;AAChD,SAAA;AACF,KAAA;AAEA,IAAA,MAAMmC,QAAOpF,GAAgB,EAAA;AAC3B,QAAA,MAAM8C,EAA4C9C,GAAAA,GAAAA,CAAIyD,MAAM,CAACX,EAAE;QAE/D,MAAMlC,cAAAA,GAAiBC,iBAAW,SAAW,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAM+C,OAAU,GAAA,MAAMrC,cAAewE,CAAAA,MAAM,CAACtC,EAAAA,CAAAA;AAE5C9C,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAMM,EAAAA;AACR,SAAA;AACF,KAAA;AAEA,IAAA,MAAMoC,SAAQrF,GAAgB,EAAA;AAC5B,QAAA,MAAM8C,EAA6C9C,GAAAA,GAAAA,CAAIyD,MAAM,CAACX,EAAE;QAEhE,MAAMlC,cAAAA,GAAiBC,iBAAW,SAAW,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;QACtD,MAAMwD,oBAAAA,GAAuB7C,iBAAW,gBAAkB,EAAA;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACnE,QAAA,MAAM+C,OAAU,GAAA,MAAMrC,cAAeyE,CAAAA,OAAO,CAACvC,EAAAA,CAAAA;AAE7C,QAAA,MAAM,CAACwC,mBAAqBC,EAAAA,qBAAAA,CAAsB,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;AACrE/B,YAAAA,oBAAAA,CAAqBC,YAAY,CAAC;gBAChClB,OAAS,EAAA;oBACPQ,OAASH,EAAAA,EAAAA;oBACT4C,IAAM,EAAA;AACR;AACF,aAAA,CAAA;AACAhC,YAAAA,oBAAAA,CAAqBC,YAAY,CAAC;gBAChClB,OAAS,EAAA;oBACPQ,OAASH,EAAAA,EAAAA;oBACT4C,IAAM,EAAA;AACR;AACF,aAAA;AACD,SAAA,CAAA;AAED1F,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAMM,EAAAA,OAAAA;YACNK,IAAM,EAAA;AACJqC,gBAAAA,YAAAA,EAAcL,mBAAsBC,GAAAA,qBAAAA;gBACpCK,qBAAuBN,EAAAA,mBAAAA;gBACvBO,uBAAyBN,EAAAA;AAC3B;AACF,SAAA;AACF;AACF;;;;"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { errors } from '@strapi/utils';
|
|
2
|
+
import { RELEASE_MODEL_UID } from '../constants.mjs';
|
|
3
|
+
import { validatefindByDocumentAttachedParams, validateRelease } from './validation/release.mjs';
|
|
4
|
+
import { getService } from '../utils/index.mjs';
|
|
5
|
+
|
|
6
|
+
const releaseController = {
|
|
7
|
+
/**
|
|
8
|
+
* Find releases based on documents attached or not to the release.
|
|
9
|
+
* If `hasEntryAttached` is true, it will return all releases that have the entry attached.
|
|
10
|
+
* If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.
|
|
11
|
+
*/ async findByDocumentAttached (ctx) {
|
|
12
|
+
const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
|
|
13
|
+
ability: ctx.state.userAbility,
|
|
14
|
+
model: RELEASE_MODEL_UID
|
|
15
|
+
});
|
|
16
|
+
await permissionsManager.validateQuery(ctx.query);
|
|
17
|
+
const releaseService = getService('release', {
|
|
18
|
+
strapi
|
|
19
|
+
});
|
|
20
|
+
const query = await permissionsManager.sanitizeQuery(ctx.query);
|
|
21
|
+
await validatefindByDocumentAttachedParams(query);
|
|
22
|
+
// If entry is a singleType, we need to manually add the entryDocumentId to the query
|
|
23
|
+
const model = strapi.getModel(query.contentType);
|
|
24
|
+
if (model.kind && model.kind === 'singleType') {
|
|
25
|
+
const document = await strapi.db.query(model.uid).findOne({
|
|
26
|
+
select: [
|
|
27
|
+
'documentId'
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
if (!document) {
|
|
31
|
+
throw new errors.NotFoundError(`No entry found for contentType ${query.contentType}`);
|
|
32
|
+
}
|
|
33
|
+
query.entryDocumentId = document.documentId;
|
|
34
|
+
}
|
|
35
|
+
const { contentType, hasEntryAttached, entryDocumentId, locale } = query;
|
|
36
|
+
const isEntryAttached = typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;
|
|
37
|
+
if (isEntryAttached) {
|
|
38
|
+
const releases = await releaseService.findMany({
|
|
39
|
+
where: {
|
|
40
|
+
releasedAt: null,
|
|
41
|
+
actions: {
|
|
42
|
+
contentType,
|
|
43
|
+
entryDocumentId: entryDocumentId ?? null,
|
|
44
|
+
locale: locale ?? null
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
populate: {
|
|
48
|
+
actions: {
|
|
49
|
+
fields: [
|
|
50
|
+
'type'
|
|
51
|
+
],
|
|
52
|
+
filters: {
|
|
53
|
+
contentType,
|
|
54
|
+
entryDocumentId: entryDocumentId ?? null,
|
|
55
|
+
locale: locale ?? null
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
ctx.body = {
|
|
61
|
+
data: releases
|
|
62
|
+
};
|
|
63
|
+
} else {
|
|
64
|
+
const relatedReleases = await releaseService.findMany({
|
|
65
|
+
where: {
|
|
66
|
+
releasedAt: null,
|
|
67
|
+
actions: {
|
|
68
|
+
contentType,
|
|
69
|
+
entryDocumentId: entryDocumentId ?? null,
|
|
70
|
+
locale: locale ?? null
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
const releases = await releaseService.findMany({
|
|
75
|
+
where: {
|
|
76
|
+
$or: [
|
|
77
|
+
{
|
|
78
|
+
id: {
|
|
79
|
+
$notIn: relatedReleases.map((release)=>release.id)
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
actions: null
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
releasedAt: null
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
ctx.body = {
|
|
90
|
+
data: releases
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
async findPage (ctx) {
|
|
95
|
+
const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
|
|
96
|
+
ability: ctx.state.userAbility,
|
|
97
|
+
model: RELEASE_MODEL_UID
|
|
98
|
+
});
|
|
99
|
+
await permissionsManager.validateQuery(ctx.query);
|
|
100
|
+
const releaseService = getService('release', {
|
|
101
|
+
strapi
|
|
102
|
+
});
|
|
103
|
+
const query = await permissionsManager.sanitizeQuery(ctx.query);
|
|
104
|
+
const { results, pagination } = await releaseService.findPage(query);
|
|
105
|
+
const data = results.map((release)=>{
|
|
106
|
+
const { actions, ...releaseData } = release;
|
|
107
|
+
return {
|
|
108
|
+
...releaseData,
|
|
109
|
+
actions: {
|
|
110
|
+
meta: {
|
|
111
|
+
count: actions.count
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
const pendingReleasesCount = await strapi.db.query(RELEASE_MODEL_UID).count({
|
|
117
|
+
where: {
|
|
118
|
+
releasedAt: null
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
ctx.body = {
|
|
122
|
+
data,
|
|
123
|
+
meta: {
|
|
124
|
+
pagination,
|
|
125
|
+
pendingReleasesCount
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
async findOne (ctx) {
|
|
130
|
+
const id = ctx.params.id;
|
|
131
|
+
const releaseService = getService('release', {
|
|
132
|
+
strapi
|
|
133
|
+
});
|
|
134
|
+
const releaseActionService = getService('release-action', {
|
|
135
|
+
strapi
|
|
136
|
+
});
|
|
137
|
+
const release = await releaseService.findOne(id, {
|
|
138
|
+
populate: [
|
|
139
|
+
'createdBy'
|
|
140
|
+
]
|
|
141
|
+
});
|
|
142
|
+
if (!release) {
|
|
143
|
+
throw new errors.NotFoundError(`Release not found for id: ${id}`);
|
|
144
|
+
}
|
|
145
|
+
const count = await releaseActionService.countActions({
|
|
146
|
+
filters: {
|
|
147
|
+
release: id
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
const sanitizedRelease = {
|
|
151
|
+
...release,
|
|
152
|
+
createdBy: release.createdBy ? strapi.service('admin::user').sanitizeUser(release.createdBy) : null
|
|
153
|
+
};
|
|
154
|
+
// Format the data object
|
|
155
|
+
const data = {
|
|
156
|
+
...sanitizedRelease,
|
|
157
|
+
actions: {
|
|
158
|
+
meta: {
|
|
159
|
+
count
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
ctx.body = {
|
|
164
|
+
data
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
async mapEntriesToReleases (ctx) {
|
|
168
|
+
const { contentTypeUid, documentIds, locale } = ctx.query;
|
|
169
|
+
if (!contentTypeUid || !documentIds) {
|
|
170
|
+
throw new errors.ValidationError('Missing required query parameters');
|
|
171
|
+
}
|
|
172
|
+
const releaseService = getService('release', {
|
|
173
|
+
strapi
|
|
174
|
+
});
|
|
175
|
+
const releasesWithActions = await releaseService.findMany({
|
|
176
|
+
where: {
|
|
177
|
+
releasedAt: null,
|
|
178
|
+
actions: {
|
|
179
|
+
contentType: contentTypeUid,
|
|
180
|
+
entryDocumentId: {
|
|
181
|
+
$in: documentIds
|
|
182
|
+
},
|
|
183
|
+
locale
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
populate: {
|
|
187
|
+
actions: true
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
const mappedEntriesInReleases = releasesWithActions.reduce((acc, release)=>{
|
|
191
|
+
release.actions.forEach((action)=>{
|
|
192
|
+
if (action.contentType !== contentTypeUid) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (locale && action.locale !== locale) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (!acc[action.entryDocumentId]) {
|
|
199
|
+
acc[action.entryDocumentId] = [
|
|
200
|
+
{
|
|
201
|
+
id: release.id,
|
|
202
|
+
name: release.name
|
|
203
|
+
}
|
|
204
|
+
];
|
|
205
|
+
} else {
|
|
206
|
+
acc[action.entryDocumentId].push({
|
|
207
|
+
id: release.id,
|
|
208
|
+
name: release.name
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
return acc;
|
|
213
|
+
}, {});
|
|
214
|
+
ctx.body = {
|
|
215
|
+
data: mappedEntriesInReleases
|
|
216
|
+
};
|
|
217
|
+
},
|
|
218
|
+
async create (ctx) {
|
|
219
|
+
const user = ctx.state.user;
|
|
220
|
+
const releaseArgs = ctx.request.body;
|
|
221
|
+
await validateRelease(releaseArgs);
|
|
222
|
+
const releaseService = getService('release', {
|
|
223
|
+
strapi
|
|
224
|
+
});
|
|
225
|
+
const release = await releaseService.create(releaseArgs, {
|
|
226
|
+
user
|
|
227
|
+
});
|
|
228
|
+
const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
|
|
229
|
+
ability: ctx.state.userAbility,
|
|
230
|
+
model: RELEASE_MODEL_UID
|
|
231
|
+
});
|
|
232
|
+
ctx.created({
|
|
233
|
+
data: await permissionsManager.sanitizeOutput(release)
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
async update (ctx) {
|
|
237
|
+
const user = ctx.state.user;
|
|
238
|
+
const releaseArgs = ctx.request.body;
|
|
239
|
+
const id = ctx.params.id;
|
|
240
|
+
await validateRelease(releaseArgs);
|
|
241
|
+
const releaseService = getService('release', {
|
|
242
|
+
strapi
|
|
243
|
+
});
|
|
244
|
+
const release = await releaseService.update(id, releaseArgs, {
|
|
245
|
+
user
|
|
246
|
+
});
|
|
247
|
+
const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
|
|
248
|
+
ability: ctx.state.userAbility,
|
|
249
|
+
model: RELEASE_MODEL_UID
|
|
250
|
+
});
|
|
251
|
+
ctx.body = {
|
|
252
|
+
data: await permissionsManager.sanitizeOutput(release)
|
|
253
|
+
};
|
|
254
|
+
},
|
|
255
|
+
async delete (ctx) {
|
|
256
|
+
const id = ctx.params.id;
|
|
257
|
+
const releaseService = getService('release', {
|
|
258
|
+
strapi
|
|
259
|
+
});
|
|
260
|
+
const release = await releaseService.delete(id);
|
|
261
|
+
ctx.body = {
|
|
262
|
+
data: release
|
|
263
|
+
};
|
|
264
|
+
},
|
|
265
|
+
async publish (ctx) {
|
|
266
|
+
const id = ctx.params.id;
|
|
267
|
+
const releaseService = getService('release', {
|
|
268
|
+
strapi
|
|
269
|
+
});
|
|
270
|
+
const releaseActionService = getService('release-action', {
|
|
271
|
+
strapi
|
|
272
|
+
});
|
|
273
|
+
const release = await releaseService.publish(id);
|
|
274
|
+
const [countPublishActions, countUnpublishActions] = await Promise.all([
|
|
275
|
+
releaseActionService.countActions({
|
|
276
|
+
filters: {
|
|
277
|
+
release: id,
|
|
278
|
+
type: 'publish'
|
|
279
|
+
}
|
|
280
|
+
}),
|
|
281
|
+
releaseActionService.countActions({
|
|
282
|
+
filters: {
|
|
283
|
+
release: id,
|
|
284
|
+
type: 'unpublish'
|
|
285
|
+
}
|
|
286
|
+
})
|
|
287
|
+
]);
|
|
288
|
+
ctx.body = {
|
|
289
|
+
data: release,
|
|
290
|
+
meta: {
|
|
291
|
+
totalEntries: countPublishActions + countUnpublishActions,
|
|
292
|
+
totalPublishedEntries: countPublishActions,
|
|
293
|
+
totalUnpublishedEntries: countUnpublishActions
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
export { releaseController as default };
|
|
300
|
+
//# sourceMappingURL=release.mjs.map
|