@strapi/content-manager 5.46.0 → 5.47.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/constants/hooks.js +5 -0
- package/dist/admin/constants/hooks.js.map +1 -1
- package/dist/admin/constants/hooks.mjs +5 -0
- package/dist/admin/constants/hooks.mjs.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.js +64 -26
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +63 -27
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.js +2 -45
- package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.mjs +3 -46
- package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +4 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +4 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +11 -3
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +11 -3
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +1 -0
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +1 -0
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +38 -4
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +39 -5
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js +58 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +56 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -0
- package/dist/admin/src/constants/hooks.d.ts +23 -0
- package/dist/admin/src/exports.d.ts +1 -0
- package/dist/admin/src/history/components/VersionInputRenderer.d.ts +27 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +9 -5
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +4 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +38 -6
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -5
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +3 -4
- package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +15 -0
- package/dist/admin/translations/cs.json.js +0 -1
- package/dist/admin/translations/cs.json.js.map +1 -1
- package/dist/admin/translations/cs.json.mjs +0 -1
- package/dist/admin/translations/cs.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +0 -1
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +0 -1
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +0 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +0 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +0 -1
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +0 -1
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +0 -1
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +0 -1
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +0 -1
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +0 -1
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +0 -1
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +0 -1
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +0 -1
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +0 -1
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +175 -9
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +175 -9
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/translations/uk.json.js +0 -1
- package/dist/admin/translations/uk.json.js.map +1 -1
- package/dist/admin/translations/uk.json.mjs +0 -1
- package/dist/admin/translations/uk.json.mjs.map +1 -1
- package/dist/admin/translations/zh-Hans.json.js +0 -1
- package/dist/admin/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +0 -1
- package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
- package/dist/server/bootstrap.js +4 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +4 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/collection-types.js +9 -5
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +10 -6
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/mcp/derive-content-type-mcp-tools.js +524 -0
- package/dist/server/mcp/derive-content-type-mcp-tools.js.map +1 -0
- package/dist/server/mcp/derive-content-type-mcp-tools.mjs +518 -0
- package/dist/server/mcp/derive-content-type-mcp-tools.mjs.map +1 -0
- package/dist/server/mcp/handlers/collection-handlers.js +404 -0
- package/dist/server/mcp/handlers/collection-handlers.js.map +1 -0
- package/dist/server/mcp/handlers/collection-handlers.mjs +395 -0
- package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -0
- package/dist/server/mcp/handlers/constants.js +10 -0
- package/dist/server/mcp/handlers/constants.js.map +1 -0
- package/dist/server/mcp/handlers/constants.mjs +6 -0
- package/dist/server/mcp/handlers/constants.mjs.map +1 -0
- package/dist/server/mcp/handlers/single-type-handlers.js +344 -0
- package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -0
- package/dist/server/mcp/handlers/single-type-handlers.mjs +336 -0
- package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -0
- package/dist/server/mcp/permissions.js +138 -0
- package/dist/server/mcp/permissions.js.map +1 -0
- package/dist/server/mcp/permissions.mjs +131 -0
- package/dist/server/mcp/permissions.mjs.map +1 -0
- package/dist/server/mcp/register-content-manager-mcp-tools.js +30 -0
- package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -0
- package/dist/server/mcp/register-content-manager-mcp-tools.mjs +28 -0
- package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -0
- package/dist/server/mcp/schemas/blocks-schema.js +124 -0
- package/dist/server/mcp/schemas/blocks-schema.js.map +1 -0
- package/dist/server/mcp/schemas/blocks-schema.mjs +122 -0
- package/dist/server/mcp/schemas/blocks-schema.mjs.map +1 -0
- package/dist/server/mcp/schemas/data-schema.js +252 -0
- package/dist/server/mcp/schemas/data-schema.js.map +1 -0
- package/dist/server/mcp/schemas/data-schema.mjs +248 -0
- package/dist/server/mcp/schemas/data-schema.mjs.map +1 -0
- package/dist/server/mcp/schemas/filters-schema.js +111 -0
- package/dist/server/mcp/schemas/filters-schema.js.map +1 -0
- package/dist/server/mcp/schemas/filters-schema.mjs +107 -0
- package/dist/server/mcp/schemas/filters-schema.mjs.map +1 -0
- package/dist/server/mcp/schemas/input-schemas.js +18 -0
- package/dist/server/mcp/schemas/input-schemas.js.map +1 -0
- package/dist/server/mcp/schemas/input-schemas.mjs +13 -0
- package/dist/server/mcp/schemas/input-schemas.mjs.map +1 -0
- package/dist/server/mcp/schemas/output-schemas.js +48 -0
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -0
- package/dist/server/mcp/schemas/output-schemas.mjs +44 -0
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -0
- package/dist/server/mcp/schemas/sort-schema.js +80 -0
- package/dist/server/mcp/schemas/sort-schema.js.map +1 -0
- package/dist/server/mcp/schemas/sort-schema.mjs +76 -0
- package/dist/server/mcp/schemas/sort-schema.mjs.map +1 -0
- package/dist/server/mcp/utils.js +43 -0
- package/dist/server/mcp/utils.js.map +1 -0
- package/dist/server/mcp/utils.mjs +39 -0
- package/dist/server/mcp/utils.mjs.map +1 -0
- package/dist/server/services/index.js +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/permission-checker.js +4 -1
- package/dist/server/services/permission-checker.js.map +1 -1
- package/dist/server/services/permission-checker.mjs +1 -1
- package/dist/server/services/permission-checker.mjs.map +1 -1
- package/dist/server/services/utils/populate.js +3 -3
- package/dist/server/services/utils/populate.js.map +1 -1
- package/dist/server/services/utils/populate.mjs +3 -3
- package/dist/server/services/utils/populate.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -3
- package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts +12 -0
- package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/collection-handlers.d.ts +69 -0
- package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/constants.d.ts +4 -0
- package/dist/server/src/mcp/handlers/constants.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/index.d.ts +3 -0
- package/dist/server/src/mcp/handlers/index.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/single-type-handlers.d.ts +66 -0
- package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -0
- package/dist/server/src/mcp/permissions.d.ts +49 -0
- package/dist/server/src/mcp/permissions.d.ts.map +1 -0
- package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +8 -0
- package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/blocks-schema.d.ts +8 -0
- package/dist/server/src/mcp/schemas/blocks-schema.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/data-schema.d.ts +36 -0
- package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/filters-schema.d.ts +22 -0
- package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/index.d.ts +7 -0
- package/dist/server/src/mcp/schemas/index.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/input-schemas.d.ts +10 -0
- package/dist/server/src/mcp/schemas/input-schemas.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/output-schemas.d.ts +18 -0
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/sort-schema.d.ts +24 -0
- package/dist/server/src/mcp/schemas/sort-schema.d.ts.map +1 -0
- package/dist/server/src/mcp/types.d.ts +31 -0
- package/dist/server/src/mcp/types.d.ts.map +1 -0
- package/dist/server/src/mcp/utils.d.ts +21 -0
- package/dist/server/src/mcp/utils.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +3 -3
- package/dist/server/src/services/permission-checker.d.ts +13 -3
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
- package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/package.json +10 -8
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var strapiUtils = require('@strapi/utils');
|
|
4
|
+
var index = require('../../utils/index.js');
|
|
5
|
+
var dimensions = require('../../controllers/validation/dimensions.js');
|
|
6
|
+
var metadata = require('../../controllers/utils/metadata.js');
|
|
7
|
+
var populate = require('../../services/utils/populate.js');
|
|
8
|
+
var constants = require('./constants.js');
|
|
9
|
+
var permissions = require('../permissions.js');
|
|
10
|
+
var utils = require('../utils.js');
|
|
11
|
+
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Shared create-or-update logic mirroring single-types controller
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Core write logic shared by the single-type write handler.
|
|
17
|
+
* Creates the document when none exists; updates the existing draft otherwise.
|
|
18
|
+
* Enforces RBAC create/update permission and sanitizes input + output.
|
|
19
|
+
*/ const singleCreateOrUpdate = async (strapi, uid, context, args)=>{
|
|
20
|
+
const { userAbility, user } = context;
|
|
21
|
+
const { data, locale } = args;
|
|
22
|
+
// TODO: fix UID.SingleType assignability in @strapi/types
|
|
23
|
+
const typedUid = uid;
|
|
24
|
+
const documentManager = index.getService('document-manager');
|
|
25
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
26
|
+
userAbility,
|
|
27
|
+
model: uid
|
|
28
|
+
});
|
|
29
|
+
if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {
|
|
30
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
31
|
+
}
|
|
32
|
+
const sanitizedQuery = await permissionChecker.sanitizedQuery.update({
|
|
33
|
+
locale
|
|
34
|
+
});
|
|
35
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
36
|
+
locale
|
|
37
|
+
}, uid);
|
|
38
|
+
const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).countRelations().withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
|
|
39
|
+
const draftFindQuery = {
|
|
40
|
+
...sanitizedQuery,
|
|
41
|
+
populate: populate$1,
|
|
42
|
+
locale: resolvedLocale,
|
|
43
|
+
status: 'draft'
|
|
44
|
+
};
|
|
45
|
+
const [documentVersion, otherDocumentVersion] = await Promise.all([
|
|
46
|
+
documentManager.findMany(draftFindQuery, typedUid).then((docs)=>docs[0]),
|
|
47
|
+
strapi.db.query(typedUid).findOne({
|
|
48
|
+
select: [
|
|
49
|
+
'documentId'
|
|
50
|
+
]
|
|
51
|
+
})
|
|
52
|
+
]);
|
|
53
|
+
const documentId = otherDocumentVersion?.documentId;
|
|
54
|
+
if (documentVersion) {
|
|
55
|
+
if (permissionChecker.cannot.update(documentVersion)) {
|
|
56
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
57
|
+
}
|
|
58
|
+
} else if (permissionChecker.cannot.create()) {
|
|
59
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
60
|
+
}
|
|
61
|
+
const sanitizeInput = documentVersion ? permissionChecker.sanitizeUpdateInput(documentVersion) : permissionChecker.sanitizeCreateInput;
|
|
62
|
+
const isEdition = documentVersion !== null && documentVersion !== undefined;
|
|
63
|
+
const sanitizedData = strapiUtils.setCreatorFields({
|
|
64
|
+
user,
|
|
65
|
+
isEdition
|
|
66
|
+
})(await sanitizeInput(data));
|
|
67
|
+
const formatted = await strapi.db.transaction(async ()=>{
|
|
68
|
+
let doc;
|
|
69
|
+
if (documentId === undefined) {
|
|
70
|
+
doc = await documentManager.create(typedUid, {
|
|
71
|
+
data: sanitizedData,
|
|
72
|
+
...sanitizedQuery,
|
|
73
|
+
locale: resolvedLocale
|
|
74
|
+
});
|
|
75
|
+
} else {
|
|
76
|
+
doc = await documentManager.update(documentId, typedUid, {
|
|
77
|
+
data: sanitizedData,
|
|
78
|
+
populate: populate$1,
|
|
79
|
+
locale: resolvedLocale
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(doc);
|
|
83
|
+
return metadata.formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
|
|
84
|
+
});
|
|
85
|
+
return utils.ok(formatted);
|
|
86
|
+
};
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Handler factories
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
/**
|
|
91
|
+
* Creates a handler for reading the single-type document.
|
|
92
|
+
* Returns available locale metadata when the requested locale version does not exist.
|
|
93
|
+
* Enforces RBAC read permission.
|
|
94
|
+
*/ const createSingleGetHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
95
|
+
const { userAbility } = context;
|
|
96
|
+
const { locale, status } = args;
|
|
97
|
+
// TODO: fix UID.SingleType assignability in @strapi/types
|
|
98
|
+
const typedUid = uid;
|
|
99
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
100
|
+
userAbility,
|
|
101
|
+
model: uid
|
|
102
|
+
});
|
|
103
|
+
if (permissionChecker.cannot.read()) {
|
|
104
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
105
|
+
}
|
|
106
|
+
const permissionQuery = await permissionChecker.sanitizedQuery.read({
|
|
107
|
+
locale,
|
|
108
|
+
status
|
|
109
|
+
});
|
|
110
|
+
const { locale: resolvedLocale, status: resolvedStatus } = await dimensions.getDocumentLocaleAndStatus({
|
|
111
|
+
locale,
|
|
112
|
+
status
|
|
113
|
+
}, uid);
|
|
114
|
+
const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
|
|
115
|
+
const versionFindQuery = {
|
|
116
|
+
...permissionQuery,
|
|
117
|
+
populate: populate$1,
|
|
118
|
+
locale: resolvedLocale,
|
|
119
|
+
status: resolvedStatus
|
|
120
|
+
};
|
|
121
|
+
const version = await index.getService('document-manager').findMany(versionFindQuery, typedUid).then((docs)=>docs[0]);
|
|
122
|
+
if (!version) {
|
|
123
|
+
if (permissionChecker.cannot.create()) {
|
|
124
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
125
|
+
}
|
|
126
|
+
const document = await strapi.db.query(typedUid).findOne({});
|
|
127
|
+
if (!document) {
|
|
128
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
129
|
+
}
|
|
130
|
+
const { meta } = await metadata.formatDocumentWithMetadata(permissionChecker, typedUid, {
|
|
131
|
+
documentId: document.documentId,
|
|
132
|
+
locale: resolvedLocale,
|
|
133
|
+
publishedAt: null
|
|
134
|
+
}, {
|
|
135
|
+
availableLocales: true,
|
|
136
|
+
availableStatus: false
|
|
137
|
+
});
|
|
138
|
+
return utils.ok({
|
|
139
|
+
data: {},
|
|
140
|
+
meta
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (permissionChecker.cannot.read(version)) {
|
|
144
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
145
|
+
}
|
|
146
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(version);
|
|
147
|
+
const result = await metadata.formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
|
|
148
|
+
return utils.ok(result);
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Creates a handler for creating or updating the single-type document.
|
|
152
|
+
* Delegates to `singleCreateOrUpdate`; enforces RBAC create/update permission.
|
|
153
|
+
*/ const createSingleWriteHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
154
|
+
return singleCreateOrUpdate(strapi, uid, context, args);
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Creates a handler for deleting the single-type document (or a specific locale).
|
|
158
|
+
* Enforces RBAC delete permission on every locale version before deletion.
|
|
159
|
+
*/ const createSingleDeleteHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
160
|
+
const { userAbility } = context;
|
|
161
|
+
const { locale } = args;
|
|
162
|
+
// TODO: fix UID.SingleType assignability in @strapi/types
|
|
163
|
+
const typedUid = uid;
|
|
164
|
+
const documentManager = index.getService('document-manager');
|
|
165
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
166
|
+
userAbility,
|
|
167
|
+
model: uid
|
|
168
|
+
});
|
|
169
|
+
if (permissionChecker.cannot.delete()) {
|
|
170
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
171
|
+
}
|
|
172
|
+
const sanitizedQuery = await permissionChecker.sanitizedQuery.delete({
|
|
173
|
+
locale
|
|
174
|
+
});
|
|
175
|
+
const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).countRelations().withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
|
|
176
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
177
|
+
locale
|
|
178
|
+
}, uid);
|
|
179
|
+
const isLocalized = permissions.isContentTypeLocalized(strapi, uid);
|
|
180
|
+
const localeForQuery = isLocalized === true ? resolvedLocale : undefined;
|
|
181
|
+
const documentLocales = await documentManager.findLocales(undefined, typedUid, {
|
|
182
|
+
populate: populate$1,
|
|
183
|
+
locale: localeForQuery
|
|
184
|
+
});
|
|
185
|
+
if (documentLocales.length === 0) {
|
|
186
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
187
|
+
}
|
|
188
|
+
for (const document of documentLocales){
|
|
189
|
+
if (permissionChecker.cannot.delete(document)) {
|
|
190
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const deletedEntity = await documentManager.delete(documentLocales[0].documentId, typedUid, {
|
|
194
|
+
locale: localeForQuery
|
|
195
|
+
});
|
|
196
|
+
const sanitizedResult = await permissionChecker.sanitizeOutput(deletedEntity);
|
|
197
|
+
return utils.ok({
|
|
198
|
+
data: sanitizedResult
|
|
199
|
+
});
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* Creates a handler for publishing the single-type document draft.
|
|
203
|
+
* Enforces RBAC publish permission; throws NotFound when the draft is missing.
|
|
204
|
+
*/ const createSinglePublishHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
205
|
+
const { userAbility } = context;
|
|
206
|
+
const { locale } = args;
|
|
207
|
+
// TODO: fix UID.SingleType assignability in @strapi/types
|
|
208
|
+
const typedUid = uid;
|
|
209
|
+
const documentManager = index.getService('document-manager');
|
|
210
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
211
|
+
userAbility,
|
|
212
|
+
model: uid
|
|
213
|
+
});
|
|
214
|
+
if (permissionChecker.cannot.publish()) {
|
|
215
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
216
|
+
}
|
|
217
|
+
const publishedDocument = await strapi.db.transaction(async ()=>{
|
|
218
|
+
const sanitizedQuery = await permissionChecker.sanitizedQuery.publish({
|
|
219
|
+
locale
|
|
220
|
+
});
|
|
221
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
222
|
+
locale
|
|
223
|
+
}, uid);
|
|
224
|
+
const publishFindQuery = {
|
|
225
|
+
...sanitizedQuery,
|
|
226
|
+
locale: resolvedLocale,
|
|
227
|
+
status: 'draft'
|
|
228
|
+
};
|
|
229
|
+
const document = await index.getService('document-manager').findMany(publishFindQuery, typedUid).then((docs)=>docs[0]);
|
|
230
|
+
if (!document) {
|
|
231
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
232
|
+
}
|
|
233
|
+
if (permissionChecker.cannot.publish(document)) {
|
|
234
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
235
|
+
}
|
|
236
|
+
const publishResult = await documentManager.publish(document.documentId, typedUid, {
|
|
237
|
+
locale: resolvedLocale
|
|
238
|
+
});
|
|
239
|
+
return publishResult?.at(0);
|
|
240
|
+
});
|
|
241
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);
|
|
242
|
+
const result = await metadata.formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
|
|
243
|
+
return utils.ok(result);
|
|
244
|
+
};
|
|
245
|
+
/**
|
|
246
|
+
* Creates a handler for unpublishing the single-type document.
|
|
247
|
+
* Optionally discards the draft in the same transaction when `discardDraft` is true.
|
|
248
|
+
* Enforces RBAC unpublish (and discard) permission.
|
|
249
|
+
*/ const createSingleUnpublishHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
250
|
+
const { userAbility } = context;
|
|
251
|
+
const { locale, discardDraft } = args;
|
|
252
|
+
// TODO: fix UID.SingleType assignability in @strapi/types
|
|
253
|
+
const typedUid = uid;
|
|
254
|
+
const documentManager = index.getService('document-manager');
|
|
255
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
256
|
+
userAbility,
|
|
257
|
+
model: uid
|
|
258
|
+
});
|
|
259
|
+
if (permissionChecker.cannot.unpublish()) {
|
|
260
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
261
|
+
}
|
|
262
|
+
if (discardDraft === true && permissionChecker.cannot.discard()) {
|
|
263
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
264
|
+
}
|
|
265
|
+
const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish({
|
|
266
|
+
locale
|
|
267
|
+
});
|
|
268
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
269
|
+
locale
|
|
270
|
+
}, uid);
|
|
271
|
+
const unpublishFindQuery = {
|
|
272
|
+
...sanitizedQuery,
|
|
273
|
+
locale: resolvedLocale
|
|
274
|
+
};
|
|
275
|
+
const document = await index.getService('document-manager').findMany(unpublishFindQuery, typedUid).then((docs)=>docs[0]);
|
|
276
|
+
if (!document) {
|
|
277
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
278
|
+
}
|
|
279
|
+
if (permissionChecker.cannot.unpublish(document)) {
|
|
280
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
281
|
+
}
|
|
282
|
+
if (discardDraft === true && permissionChecker.cannot.discard(document)) {
|
|
283
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
284
|
+
}
|
|
285
|
+
const result = await strapi.db.transaction(async ()=>{
|
|
286
|
+
if (discardDraft === true) {
|
|
287
|
+
await documentManager.discardDraft(document.documentId, typedUid, {
|
|
288
|
+
locale: resolvedLocale
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
return strapiUtils.async.pipe((doc)=>documentManager.unpublish(doc.documentId, typedUid, {
|
|
292
|
+
locale: resolvedLocale
|
|
293
|
+
}), permissionChecker.sanitizeOutput, (doc)=>metadata.formatDocumentWithMetadata(permissionChecker, typedUid, doc))(document);
|
|
294
|
+
});
|
|
295
|
+
return utils.ok(result);
|
|
296
|
+
};
|
|
297
|
+
/**
|
|
298
|
+
* Creates a handler for discarding the draft of the single-type document.
|
|
299
|
+
* Restores the published version as the draft. Enforces RBAC discard permission.
|
|
300
|
+
*/ const createSingleDiscardDraftHandler = (uid)=>(_strapi, context)=>async ({ args })=>{
|
|
301
|
+
const { userAbility } = context;
|
|
302
|
+
const { locale } = args;
|
|
303
|
+
// TODO: fix UID.SingleType assignability in @strapi/types
|
|
304
|
+
const typedUid = uid;
|
|
305
|
+
const documentManager = index.getService('document-manager');
|
|
306
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
307
|
+
userAbility,
|
|
308
|
+
model: uid
|
|
309
|
+
});
|
|
310
|
+
if (permissionChecker.cannot.discard()) {
|
|
311
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
312
|
+
}
|
|
313
|
+
const sanitizedQuery = await permissionChecker.sanitizedQuery.discard({
|
|
314
|
+
locale
|
|
315
|
+
});
|
|
316
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
317
|
+
locale
|
|
318
|
+
}, uid);
|
|
319
|
+
const discardFindQuery = {
|
|
320
|
+
...sanitizedQuery,
|
|
321
|
+
locale: resolvedLocale,
|
|
322
|
+
status: 'published'
|
|
323
|
+
};
|
|
324
|
+
const document = await index.getService('document-manager').findMany(discardFindQuery, typedUid).then((docs)=>docs[0]);
|
|
325
|
+
if (!document) {
|
|
326
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
327
|
+
}
|
|
328
|
+
if (permissionChecker.cannot.discard(document)) {
|
|
329
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
330
|
+
}
|
|
331
|
+
const discardedDocument = await strapiUtils.async.pipe((doc)=>documentManager.discardDraft(doc.documentId, typedUid, {
|
|
332
|
+
locale: resolvedLocale
|
|
333
|
+
}), permissionChecker.sanitizeOutput, (doc)=>metadata.formatDocumentWithMetadata(permissionChecker, typedUid, doc))(document);
|
|
334
|
+
return utils.ok(discardedDocument);
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
exports.createSingleDeleteHandler = createSingleDeleteHandler;
|
|
338
|
+
exports.createSingleDiscardDraftHandler = createSingleDiscardDraftHandler;
|
|
339
|
+
exports.createSingleGetHandler = createSingleGetHandler;
|
|
340
|
+
exports.createSinglePublishHandler = createSinglePublishHandler;
|
|
341
|
+
exports.createSingleUnpublishHandler = createSingleUnpublishHandler;
|
|
342
|
+
exports.createSingleWriteHandler = createSingleWriteHandler;
|
|
343
|
+
exports.singleCreateOrUpdate = singleCreateOrUpdate;
|
|
344
|
+
//# sourceMappingURL=single-type-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-type-handlers.js","sources":["../../../../server/src/mcp/handlers/single-type-handlers.ts"],"sourcesContent":["import { errors, async as asyncPipe, setCreatorFields } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { getDocumentLocaleAndStatus } from '../../controllers/validation/dimensions';\nimport { formatDocumentWithMetadata } from '../../controllers/utils/metadata';\nimport { getPopulateForLocalizations } from '../../services/utils/populate';\nimport { MCP_NOT_FOUND_DOCUMENT } from './constants';\nimport { isContentTypeLocalized } from '../permissions';\nimport { ok } from '../utils';\n\ntype McpDocumentQuery = {\n populate?: unknown;\n locale?: string;\n status?: string;\n filters?: unknown;\n sort?: unknown;\n pagination?: unknown;\n [key: string]: unknown;\n};\n\ntype McpFindManyParams = Parameters<Modules.Documents.ServiceInstance['findMany']>[0];\n\n// ---------------------------------------------------------------------------\n// Input arg schemas — used for type-safe narrowing from Record<string, unknown>\n// ---------------------------------------------------------------------------\n\ntype SingleLocaleArgs = { locale?: string };\ntype SingleGetArgs = SingleLocaleArgs & { status?: 'draft' | 'published' };\ntype SingleUnpublishArgs = SingleLocaleArgs & { discardDraft?: boolean };\ntype SingleWriteArgs = { data: Record<string, unknown>; locale?: string };\n\n// ---------------------------------------------------------------------------\n// Shared create-or-update logic mirroring single-types controller\n// ---------------------------------------------------------------------------\n\n/**\n * Core write logic shared by the single-type write handler.\n * Creates the document when none exists; updates the existing draft otherwise.\n * Enforces RBAC create/update permission and sanitizes input + output.\n */\nexport const singleCreateOrUpdate = async (\n strapi: Core.Strapi,\n uid: UID.SingleType,\n context: Modules.MCP.McpHandlerContext,\n args: SingleWriteArgs\n): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { data, locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(sanitizedQuery)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const draftFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n populate,\n locale: resolvedLocale,\n status: 'draft',\n };\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n documentManager\n .findMany(draftFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]),\n strapi.db.query(typedUid).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizeInput = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const isEdition = documentVersion !== null && documentVersion !== undefined;\n const sanitizedData = setCreatorFields({ user, isEdition })(await sanitizeInput(data)) as Record<\n string,\n unknown\n >;\n\n const formatted = await strapi.db.transaction(async () => {\n let doc: any;\n\n if (documentId === undefined) {\n doc = await documentManager.create(typedUid, {\n data: sanitizedData,\n ...sanitizedQuery,\n locale: resolvedLocale,\n });\n } else {\n doc = await documentManager.update(documentId, typedUid, {\n data: sanitizedData,\n populate,\n locale: resolvedLocale,\n });\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(doc);\n return formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);\n });\n\n return ok(formatted as Record<string, unknown>);\n};\n\n// ---------------------------------------------------------------------------\n// Handler factories\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a handler for reading the single-type document.\n * Returns available locale metadata when the requested locale version does not exist.\n * Enforces RBAC read permission.\n */\nexport const createSingleGetHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleGetArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, status } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read({ locale, status });\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const versionFindQuery: McpDocumentQuery = {\n ...permissionQuery,\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n };\n const version = await getService('document-manager')\n .findMany(versionFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!version) {\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const document = await strapi.db.query(typedUid).findOne({});\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n typedUid,\n {\n documentId: document.documentId,\n locale: resolvedLocale,\n publishedAt: null,\n } as Parameters<typeof formatDocumentWithMetadata>[2],\n { availableLocales: true, availableStatus: false }\n );\n\n return ok({ data: {}, meta } as Record<string, unknown>);\n }\n\n if (permissionChecker.cannot.read(version)) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n const result = await formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for creating or updating the single-type document.\n * Delegates to `singleCreateOrUpdate`; enforces RBAC create/update permission.\n */\nexport const createSingleWriteHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n return singleCreateOrUpdate(strapi, uid, context, args as SingleWriteArgs);\n };\n\n/**\n * Creates a handler for deleting the single-type document (or a specific locale).\n * Enforces RBAC delete permission on every locale version before deletion.\n */\nexport const createSingleDeleteHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.delete()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete({ locale });\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(sanitizedQuery)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const isLocalized = isContentTypeLocalized(strapi, uid);\n\n const localeForQuery = isLocalized === true ? resolvedLocale : undefined;\n\n const documentLocales = await documentManager.findLocales(undefined, typedUid, {\n populate,\n locale: localeForQuery,\n });\n\n if (documentLocales.length === 0) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n throw new errors.ForbiddenError();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales[0].documentId, typedUid, {\n locale: localeForQuery,\n });\n\n const sanitizedResult = await permissionChecker.sanitizeOutput(deletedEntity);\n\n return ok({ data: sanitizedResult } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for publishing the single-type document draft.\n * Enforces RBAC publish permission; throws NotFound when the draft is missing.\n */\nexport const createSinglePublishHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.publish()) {\n throw new errors.ForbiddenError();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const publishFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n locale: resolvedLocale,\n status: 'draft',\n };\n const document = await getService('document-manager')\n .findMany(publishFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, typedUid, {\n locale: resolvedLocale,\n });\n\n return publishResult?.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n const result = await formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for unpublishing the single-type document.\n * Optionally discards the draft in the same transaction when `discardDraft` is true.\n * Enforces RBAC unpublish (and discard) permission.\n */\nexport const createSingleUnpublishHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleUnpublishArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, discardDraft } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.unpublish()) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const unpublishFindQuery: McpDocumentQuery = { ...sanitizedQuery, locale: resolvedLocale };\n const document = await getService('document-manager')\n .findMany(unpublishFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const result = await strapi.db.transaction(async () => {\n if (discardDraft === true) {\n await documentManager.discardDraft(document.documentId, typedUid, {\n locale: resolvedLocale,\n });\n }\n\n return asyncPipe.pipe(\n (doc: any) =>\n documentManager.unpublish(doc.documentId, typedUid, { locale: resolvedLocale }),\n permissionChecker.sanitizeOutput,\n (doc: any) => formatDocumentWithMetadata(permissionChecker, typedUid, doc)\n )(document);\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for discarding the draft of the single-type document.\n * Restores the published version as the draft. Enforces RBAC discard permission.\n */\nexport const createSingleDiscardDraftHandler =\n (uid: UID.SingleType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const discardFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n locale: resolvedLocale,\n status: 'published',\n };\n const document = await getService('document-manager')\n .findMany(discardFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const discardedDocument = await asyncPipe.pipe(\n (doc: any) =>\n documentManager.discardDraft(doc.documentId, typedUid, { locale: resolvedLocale }),\n permissionChecker.sanitizeOutput,\n (doc: any) => formatDocumentWithMetadata(permissionChecker, typedUid, doc)\n )(document);\n\n return ok(discardedDocument as Record<string, unknown>);\n };\n"],"names":["singleCreateOrUpdate","strapi","uid","context","args","userAbility","user","data","locale","typedUid","documentManager","getService","permissionChecker","create","model","cannot","update","errors","ForbiddenError","sanitizedQuery","resolvedLocale","getDocumentLocaleAndStatus","populate","populateFromQuery","populateDeep","Infinity","countRelations","withPopulateOverride","getPopulateForLocalizations","build","draftFindQuery","status","documentVersion","otherDocumentVersion","Promise","all","findMany","then","docs","db","query","findOne","select","documentId","sanitizeInput","sanitizeUpdateInput","sanitizeCreateInput","isEdition","undefined","sanitizedData","setCreatorFields","formatted","transaction","doc","sanitizedDocument","sanitizeOutput","formatDocumentWithMetadata","ok","createSingleGetHandler","read","permissionQuery","resolvedStatus","versionFindQuery","version","document","NotFoundError","MCP_NOT_FOUND_DOCUMENT","meta","publishedAt","availableLocales","availableStatus","result","createSingleWriteHandler","createSingleDeleteHandler","delete","isLocalized","isContentTypeLocalized","localeForQuery","documentLocales","findLocales","length","deletedEntity","sanitizedResult","createSinglePublishHandler","publish","publishedDocument","publishFindQuery","publishResult","at","createSingleUnpublishHandler","discardDraft","unpublish","discard","unpublishFindQuery","asyncPipe","pipe","createSingleDiscardDraftHandler","_strapi","discardFindQuery","discardedDocument"],"mappings":"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"}
|