@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,404 @@
|
|
|
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 documentStatus = require('../../controllers/utils/document-status.js');
|
|
8
|
+
var populate = require('../../services/utils/populate.js');
|
|
9
|
+
var constants = require('./constants.js');
|
|
10
|
+
var permissions = require('../permissions.js');
|
|
11
|
+
var utils = require('../utils.js');
|
|
12
|
+
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Handler factories
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Creates a handler for listing (paginated) documents of a collection-type.
|
|
18
|
+
* Enforces RBAC read permission and sanitizes query + output via permissionChecker.
|
|
19
|
+
*/ const createCollectionListHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
20
|
+
const { userAbility } = context;
|
|
21
|
+
const { locale, status, page, pageSize, sort, filters } = args;
|
|
22
|
+
const documentMetadata = index.getService('document-metadata');
|
|
23
|
+
const documentManager = index.getService('document-manager');
|
|
24
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
25
|
+
userAbility,
|
|
26
|
+
model: uid
|
|
27
|
+
});
|
|
28
|
+
if (permissionChecker.cannot.read()) {
|
|
29
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
30
|
+
}
|
|
31
|
+
const query = {
|
|
32
|
+
...page !== undefined && {
|
|
33
|
+
page
|
|
34
|
+
},
|
|
35
|
+
...pageSize !== undefined && {
|
|
36
|
+
pageSize
|
|
37
|
+
},
|
|
38
|
+
...sort !== undefined && {
|
|
39
|
+
sort
|
|
40
|
+
},
|
|
41
|
+
...filters !== undefined && {
|
|
42
|
+
filters
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const permissionQuery = await permissionChecker.sanitizedQuery.read(query);
|
|
46
|
+
const populate$1 = await index.getService('populate-builder')(uid).populateFromQuery(permissionQuery).populateDeep(1).countRelations({
|
|
47
|
+
toOne: false,
|
|
48
|
+
toMany: true
|
|
49
|
+
}).withPopulateOverride(populate.getPopulateForLocalizations(uid)).build();
|
|
50
|
+
const { locale: resolvedLocale, status: resolvedStatus } = await dimensions.getDocumentLocaleAndStatus({
|
|
51
|
+
locale,
|
|
52
|
+
status
|
|
53
|
+
}, uid);
|
|
54
|
+
const findPageQuery = {
|
|
55
|
+
...permissionQuery,
|
|
56
|
+
populate: populate$1,
|
|
57
|
+
locale: resolvedLocale,
|
|
58
|
+
status: resolvedStatus
|
|
59
|
+
};
|
|
60
|
+
const { results: documents, pagination } = await documentManager.findPage(findPageQuery, uid);
|
|
61
|
+
const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(uid));
|
|
62
|
+
const statusByDocumentId = hasDraftAndPublish ? documentStatus.indexByDocumentId(await documentMetadata.getManyAvailableStatus(uid, documents)) : new Map();
|
|
63
|
+
const setStatus = (document)=>{
|
|
64
|
+
const availableStatuses = statusByDocumentId.get(document.documentId) || [];
|
|
65
|
+
document.status = documentMetadata.getStatus(document, availableStatuses);
|
|
66
|
+
return document;
|
|
67
|
+
};
|
|
68
|
+
const results = await strapiUtils.async.map(documents, strapiUtils.async.pipe(permissionChecker.sanitizeOutput, setStatus));
|
|
69
|
+
return utils.ok({
|
|
70
|
+
results,
|
|
71
|
+
pagination
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Creates a handler for fetching a single collection-type document by `documentId`.
|
|
76
|
+
* Enforces RBAC read permission; returns available locale metadata when the locale is missing.
|
|
77
|
+
*/ const createCollectionGetHandler = (uid)=>(_strapi, context)=>async ({ args })=>{
|
|
78
|
+
const { userAbility } = context;
|
|
79
|
+
const { documentId, locale, status } = args;
|
|
80
|
+
const documentManager = index.getService('document-manager');
|
|
81
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
82
|
+
userAbility,
|
|
83
|
+
model: uid
|
|
84
|
+
});
|
|
85
|
+
if (permissionChecker.cannot.read()) {
|
|
86
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
87
|
+
}
|
|
88
|
+
const permissionQuery = await permissionChecker.sanitizedQuery.read({
|
|
89
|
+
locale,
|
|
90
|
+
status
|
|
91
|
+
});
|
|
92
|
+
const populate$1 = await index.getService('populate-builder')(uid).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().withPopulateOverride(populate.getPopulateForLocalizations(uid)).build();
|
|
93
|
+
const { locale: resolvedLocale, status: resolvedStatus } = await dimensions.getDocumentLocaleAndStatus({
|
|
94
|
+
locale,
|
|
95
|
+
status
|
|
96
|
+
}, uid);
|
|
97
|
+
const version = await documentManager.findOne(documentId, uid, {
|
|
98
|
+
populate: populate$1,
|
|
99
|
+
locale: resolvedLocale,
|
|
100
|
+
status: resolvedStatus
|
|
101
|
+
});
|
|
102
|
+
if (!version) {
|
|
103
|
+
const exists = await documentManager.exists(uid, documentId);
|
|
104
|
+
if (!exists) {
|
|
105
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
106
|
+
}
|
|
107
|
+
const { meta } = await metadata.formatDocumentWithMetadata(permissionChecker, uid, {
|
|
108
|
+
documentId,
|
|
109
|
+
locale: resolvedLocale,
|
|
110
|
+
publishedAt: null
|
|
111
|
+
}, {
|
|
112
|
+
availableLocales: true,
|
|
113
|
+
availableStatus: false
|
|
114
|
+
});
|
|
115
|
+
return utils.ok({
|
|
116
|
+
data: {},
|
|
117
|
+
meta
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
if (permissionChecker.cannot.read(version)) {
|
|
121
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
122
|
+
}
|
|
123
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(version);
|
|
124
|
+
const result = await metadata.formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);
|
|
125
|
+
return utils.ok(result);
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Creates a handler for creating a new collection-type document.
|
|
129
|
+
* Enforces RBAC create permission; sanitizes input and stamps creator fields.
|
|
130
|
+
*/ const createCollectionCreateHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
131
|
+
const { userAbility, user } = context;
|
|
132
|
+
const { data, locale } = args;
|
|
133
|
+
const documentManager = index.getService('document-manager');
|
|
134
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
135
|
+
userAbility,
|
|
136
|
+
model: uid
|
|
137
|
+
});
|
|
138
|
+
if (permissionChecker.cannot.create()) {
|
|
139
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
140
|
+
}
|
|
141
|
+
const sanitizedData = strapiUtils.setCreatorFields({
|
|
142
|
+
user
|
|
143
|
+
})(await permissionChecker.sanitizeCreateInput(data));
|
|
144
|
+
const { locale: resolvedLocale, status } = await dimensions.getDocumentLocaleAndStatus({
|
|
145
|
+
locale
|
|
146
|
+
}, uid);
|
|
147
|
+
const result = await strapi.db.transaction(async ()=>{
|
|
148
|
+
const document = await documentManager.create(uid, {
|
|
149
|
+
data: sanitizedData,
|
|
150
|
+
locale: resolvedLocale,
|
|
151
|
+
status
|
|
152
|
+
});
|
|
153
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(document);
|
|
154
|
+
return metadata.formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument, {
|
|
155
|
+
availableLocales: false,
|
|
156
|
+
availableStatus: false
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
return utils.ok(result);
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Creates a handler for updating an existing collection-type document draft.
|
|
163
|
+
* Creates a new locale version when the target locale does not yet exist for the document.
|
|
164
|
+
* Enforces RBAC update (or create) permission accordingly.
|
|
165
|
+
*/ const createCollectionUpdateHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
166
|
+
const { userAbility, user } = context;
|
|
167
|
+
const { documentId, data, locale } = args;
|
|
168
|
+
const documentManager = index.getService('document-manager');
|
|
169
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
170
|
+
userAbility,
|
|
171
|
+
model: uid
|
|
172
|
+
});
|
|
173
|
+
if (permissionChecker.cannot.update()) {
|
|
174
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
175
|
+
}
|
|
176
|
+
const permissionQuery = await permissionChecker.sanitizedQuery.update({
|
|
177
|
+
locale
|
|
178
|
+
});
|
|
179
|
+
const populate = await index.getService('populate-builder')(uid).populateFromQuery(permissionQuery).build();
|
|
180
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
181
|
+
locale
|
|
182
|
+
}, uid);
|
|
183
|
+
const [documentVersion, documentExists] = await Promise.all([
|
|
184
|
+
documentManager.findOne(documentId, uid, {
|
|
185
|
+
populate,
|
|
186
|
+
locale: resolvedLocale,
|
|
187
|
+
status: 'draft'
|
|
188
|
+
}),
|
|
189
|
+
documentManager.exists(uid, documentId)
|
|
190
|
+
]);
|
|
191
|
+
if (!documentExists) {
|
|
192
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
193
|
+
}
|
|
194
|
+
// If version is not found but document exists, the intent is to create a new locale
|
|
195
|
+
if (documentVersion) {
|
|
196
|
+
if (permissionChecker.cannot.update(documentVersion)) {
|
|
197
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
198
|
+
}
|
|
199
|
+
} else if (permissionChecker.cannot.create()) {
|
|
200
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
201
|
+
}
|
|
202
|
+
const sanitizeInput = documentVersion ? permissionChecker.sanitizeUpdateInput(documentVersion) : permissionChecker.sanitizeCreateInput;
|
|
203
|
+
const isEdition = documentVersion !== null && documentVersion !== undefined;
|
|
204
|
+
const sanitizedData = strapiUtils.setCreatorFields({
|
|
205
|
+
user,
|
|
206
|
+
isEdition
|
|
207
|
+
})(await sanitizeInput(data));
|
|
208
|
+
const result = await strapi.db.transaction(async ()=>{
|
|
209
|
+
const updatedDocument = await documentManager.update(documentVersion?.documentId ?? documentId, uid, {
|
|
210
|
+
data: sanitizedData,
|
|
211
|
+
locale: resolvedLocale
|
|
212
|
+
});
|
|
213
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(updatedDocument);
|
|
214
|
+
return metadata.formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);
|
|
215
|
+
});
|
|
216
|
+
return utils.ok(result);
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* Creates a handler for deleting a collection-type document (or a specific locale).
|
|
220
|
+
* Enforces RBAC delete permission on every locale version before deletion.
|
|
221
|
+
*/ const createCollectionDeleteHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
222
|
+
const { userAbility } = context;
|
|
223
|
+
const { documentId, locale } = args;
|
|
224
|
+
const documentManager = index.getService('document-manager');
|
|
225
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
226
|
+
userAbility,
|
|
227
|
+
model: uid
|
|
228
|
+
});
|
|
229
|
+
if (permissionChecker.cannot.delete()) {
|
|
230
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
231
|
+
}
|
|
232
|
+
const permissionQuery = await permissionChecker.sanitizedQuery.delete({
|
|
233
|
+
locale
|
|
234
|
+
});
|
|
235
|
+
const populate = await index.getService('populate-builder')(uid).populateFromQuery(permissionQuery).build();
|
|
236
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
237
|
+
locale
|
|
238
|
+
}, uid);
|
|
239
|
+
const isLocalized = permissions.isContentTypeLocalized(strapi, uid);
|
|
240
|
+
const localeForQuery = isLocalized === true ? resolvedLocale : undefined;
|
|
241
|
+
const documentLocales = await documentManager.findLocales(documentId, uid, {
|
|
242
|
+
populate,
|
|
243
|
+
locale: localeForQuery
|
|
244
|
+
});
|
|
245
|
+
if (documentLocales.length === 0) {
|
|
246
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
247
|
+
}
|
|
248
|
+
for (const document of documentLocales){
|
|
249
|
+
if (permissionChecker.cannot.delete(document)) {
|
|
250
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const result = await documentManager.delete(documentId, uid, {
|
|
254
|
+
locale: localeForQuery
|
|
255
|
+
});
|
|
256
|
+
const sanitizedResult = await permissionChecker.sanitizeOutput(result);
|
|
257
|
+
return utils.ok({
|
|
258
|
+
data: sanitizedResult
|
|
259
|
+
});
|
|
260
|
+
};
|
|
261
|
+
/**
|
|
262
|
+
* Creates a handler for publishing a collection-type document draft.
|
|
263
|
+
* Enforces RBAC publish permission; throws NotFound when the draft or document is missing.
|
|
264
|
+
*/ const createCollectionPublishHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
265
|
+
const { userAbility } = context;
|
|
266
|
+
const { documentId, locale } = args;
|
|
267
|
+
const documentManager = index.getService('document-manager');
|
|
268
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
269
|
+
userAbility,
|
|
270
|
+
model: uid
|
|
271
|
+
});
|
|
272
|
+
if (permissionChecker.cannot.publish()) {
|
|
273
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
274
|
+
}
|
|
275
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
276
|
+
locale
|
|
277
|
+
}, uid);
|
|
278
|
+
const publishedDocument = await strapi.db.transaction(async ()=>{
|
|
279
|
+
const exists = await documentManager.exists(uid, documentId);
|
|
280
|
+
if (!exists) {
|
|
281
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
282
|
+
}
|
|
283
|
+
const document = await documentManager.findOne(documentId, uid, {
|
|
284
|
+
locale: resolvedLocale,
|
|
285
|
+
status: 'draft'
|
|
286
|
+
});
|
|
287
|
+
if (!document) {
|
|
288
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_LOCALE);
|
|
289
|
+
}
|
|
290
|
+
if (permissionChecker.cannot.publish(document)) {
|
|
291
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
292
|
+
}
|
|
293
|
+
const publishResult = await documentManager.publish(document.documentId, uid, {
|
|
294
|
+
locale: resolvedLocale
|
|
295
|
+
});
|
|
296
|
+
if (!publishResult || publishResult.length === 0) {
|
|
297
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_OR_PUBLISHED);
|
|
298
|
+
}
|
|
299
|
+
return publishResult[0];
|
|
300
|
+
});
|
|
301
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);
|
|
302
|
+
const result = await metadata.formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);
|
|
303
|
+
return utils.ok(result);
|
|
304
|
+
};
|
|
305
|
+
/**
|
|
306
|
+
* Creates a handler for unpublishing a collection-type document.
|
|
307
|
+
* Optionally discards the draft in the same transaction when `discardDraft` is true.
|
|
308
|
+
* Enforces RBAC unpublish (and discard) permission.
|
|
309
|
+
*/ const createCollectionUnpublishHandler = (uid)=>(strapi, context)=>async ({ args })=>{
|
|
310
|
+
const { userAbility } = context;
|
|
311
|
+
const { documentId, locale, discardDraft } = args;
|
|
312
|
+
const documentManager = index.getService('document-manager');
|
|
313
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
314
|
+
userAbility,
|
|
315
|
+
model: uid
|
|
316
|
+
});
|
|
317
|
+
if (permissionChecker.cannot.unpublish()) {
|
|
318
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
319
|
+
}
|
|
320
|
+
if (discardDraft === true && permissionChecker.cannot.discard()) {
|
|
321
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
322
|
+
}
|
|
323
|
+
const permissionQuery = await permissionChecker.sanitizedQuery.unpublish({
|
|
324
|
+
locale
|
|
325
|
+
});
|
|
326
|
+
const populate = await index.getService('populate-builder')(uid).populateFromQuery(permissionQuery).build();
|
|
327
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
328
|
+
locale
|
|
329
|
+
}, uid);
|
|
330
|
+
const document = await documentManager.findOne(documentId, uid, {
|
|
331
|
+
populate,
|
|
332
|
+
locale: resolvedLocale,
|
|
333
|
+
status: 'published'
|
|
334
|
+
});
|
|
335
|
+
if (!document) {
|
|
336
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
337
|
+
}
|
|
338
|
+
if (permissionChecker.cannot.unpublish(document)) {
|
|
339
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
340
|
+
}
|
|
341
|
+
if (discardDraft === true && permissionChecker.cannot.discard(document)) {
|
|
342
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
343
|
+
}
|
|
344
|
+
const unpublishedDocument = await strapi.db.transaction(async ()=>{
|
|
345
|
+
if (discardDraft === true) {
|
|
346
|
+
await documentManager.discardDraft(document.documentId, uid, {
|
|
347
|
+
locale: resolvedLocale
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
return documentManager.unpublish(document.documentId, uid, {
|
|
351
|
+
locale: resolvedLocale
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(unpublishedDocument);
|
|
355
|
+
const result = await metadata.formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);
|
|
356
|
+
return utils.ok(result);
|
|
357
|
+
};
|
|
358
|
+
/**
|
|
359
|
+
* Creates a handler for discarding the draft of a collection-type document.
|
|
360
|
+
* Restores the published version as the draft. Enforces RBAC discard permission.
|
|
361
|
+
*/ const createCollectionDiscardDraftHandler = (uid)=>(_strapi, context)=>async ({ args })=>{
|
|
362
|
+
const { userAbility } = context;
|
|
363
|
+
const { documentId, locale } = args;
|
|
364
|
+
const documentManager = index.getService('document-manager');
|
|
365
|
+
const permissionChecker = index.getService('permission-checker').create({
|
|
366
|
+
userAbility,
|
|
367
|
+
model: uid
|
|
368
|
+
});
|
|
369
|
+
if (permissionChecker.cannot.discard()) {
|
|
370
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
371
|
+
}
|
|
372
|
+
const permissionQuery = await permissionChecker.sanitizedQuery.discard({
|
|
373
|
+
locale
|
|
374
|
+
});
|
|
375
|
+
const populate = await index.getService('populate-builder')(uid).populateFromQuery(permissionQuery).build();
|
|
376
|
+
const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
|
|
377
|
+
locale
|
|
378
|
+
}, uid);
|
|
379
|
+
const document = await documentManager.findOne(documentId, uid, {
|
|
380
|
+
populate,
|
|
381
|
+
locale: resolvedLocale,
|
|
382
|
+
status: 'published'
|
|
383
|
+
});
|
|
384
|
+
if (!document) {
|
|
385
|
+
throw new strapiUtils.errors.NotFoundError(constants.MCP_NOT_FOUND_DOCUMENT);
|
|
386
|
+
}
|
|
387
|
+
if (permissionChecker.cannot.discard(document)) {
|
|
388
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
389
|
+
}
|
|
390
|
+
const discardedDocument = await strapiUtils.async.pipe((doc)=>documentManager.discardDraft(doc.documentId, uid, {
|
|
391
|
+
locale: resolvedLocale
|
|
392
|
+
}), permissionChecker.sanitizeOutput, (doc)=>metadata.formatDocumentWithMetadata(permissionChecker, uid, doc))(document);
|
|
393
|
+
return utils.ok(discardedDocument);
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
exports.createCollectionCreateHandler = createCollectionCreateHandler;
|
|
397
|
+
exports.createCollectionDeleteHandler = createCollectionDeleteHandler;
|
|
398
|
+
exports.createCollectionDiscardDraftHandler = createCollectionDiscardDraftHandler;
|
|
399
|
+
exports.createCollectionGetHandler = createCollectionGetHandler;
|
|
400
|
+
exports.createCollectionListHandler = createCollectionListHandler;
|
|
401
|
+
exports.createCollectionPublishHandler = createCollectionPublishHandler;
|
|
402
|
+
exports.createCollectionUnpublishHandler = createCollectionUnpublishHandler;
|
|
403
|
+
exports.createCollectionUpdateHandler = createCollectionUpdateHandler;
|
|
404
|
+
//# sourceMappingURL=collection-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-handlers.js","sources":["../../../../server/src/mcp/handlers/collection-handlers.ts"],"sourcesContent":["import { errors, contentTypes, 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 { indexByDocumentId } from '../../controllers/utils/document-status';\nimport { getPopulateForLocalizations } from '../../services/utils/populate';\nimport {\n MCP_NOT_FOUND_DOCUMENT,\n MCP_NOT_FOUND_LOCALE,\n MCP_NOT_FOUND_OR_PUBLISHED,\n} 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// Arg types — type-level only; runtime validation is handled by the MCP SDK\n// ---------------------------------------------------------------------------\n\ntype CollectionListArgs = {\n locale?: string;\n status?: 'draft' | 'published';\n page?: number;\n pageSize?: number;\n sort?: unknown;\n filters?: unknown;\n};\n\ntype DocumentLocaleArgs = {\n documentId: string;\n locale?: string;\n};\n\ntype CollectionGetArgs = DocumentLocaleArgs & {\n status?: 'draft' | 'published';\n};\n\ntype CollectionCreateArgs = {\n data: Record<string, unknown>;\n locale?: string;\n};\n\ntype CollectionUpdateArgs = DocumentLocaleArgs & {\n data: Record<string, unknown>;\n};\n\ntype CollectionUnpublishArgs = DocumentLocaleArgs & {\n discardDraft?: boolean;\n};\n\n// ---------------------------------------------------------------------------\n// Handler factories\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a handler for listing (paginated) documents of a collection-type.\n * Enforces RBAC read permission and sanitizes query + output via permissionChecker.\n */\nexport const createCollectionListHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: CollectionListArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, status, page, pageSize, sort, filters } = args;\n\n const documentMetadata = getService('document-metadata');\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const query: Record<string, unknown> = {\n ...(page !== undefined && { page }),\n ...(pageSize !== undefined && { pageSize }),\n ...(sort !== undefined && { sort }),\n ...(filters !== undefined && { filters }),\n };\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .populateDeep(1)\n .countRelations({ toOne: false, toMany: true })\n .withPopulateOverride(getPopulateForLocalizations(uid))\n .build();\n\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const findPageQuery: McpDocumentQuery = {\n ...permissionQuery,\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n };\n const { results: documents, pagination } = await documentManager.findPage(\n findPageQuery as McpFindManyParams,\n uid\n );\n\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(strapi.getModel(uid));\n const statusByDocumentId = hasDraftAndPublish\n ? indexByDocumentId(await documentMetadata.getManyAvailableStatus(uid, documents))\n : new Map();\n\n const setStatus = (document: any) => {\n const availableStatuses = statusByDocumentId.get(document.documentId) || [];\n document.status = documentMetadata.getStatus(document, availableStatuses);\n return document;\n };\n\n const results = await asyncPipe.map(\n documents,\n asyncPipe.pipe(permissionChecker.sanitizeOutput, setStatus)\n );\n\n return ok({ results, pagination } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for fetching a single collection-type document by `documentId`.\n * Enforces RBAC read permission; returns available locale metadata when the locale is missing.\n */\nexport const createCollectionGetHandler =\n (uid: UID.CollectionType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale, status } = args as CollectionGetArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read({ locale, status });\n\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(uid))\n .build();\n\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const version = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n });\n\n if (!version) {\n const exists = await documentManager.exists(uid, documentId);\n if (!exists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n { documentId, locale: resolvedLocale, publishedAt: null } as Parameters<\n typeof formatDocumentWithMetadata\n >[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, uid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for creating a new collection-type document.\n * Enforces RBAC create permission; sanitizes input and stamps creator fields.\n */\nexport const createCollectionCreateHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { data, locale } = args as CollectionCreateArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedData = setCreatorFields({ user })(\n await permissionChecker.sanitizeCreateInput(data)\n ) as Record<string, unknown>;\n\n const { locale: resolvedLocale, status } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const result = await strapi.db.transaction(async () => {\n const document = await documentManager.create(uid, {\n data: sanitizedData,\n locale: resolvedLocale,\n status,\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n return formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument, {\n availableLocales: false,\n availableStatus: false,\n });\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for updating an existing collection-type document draft.\n * Creates a new locale version when the target locale does not yet exist for the document.\n * Enforces RBAC update (or create) permission accordingly.\n */\nexport const createCollectionUpdateHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { documentId, data, locale } = args as CollectionUpdateArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.update({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const [documentVersion, documentExists] = await Promise.all([\n documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'draft',\n }),\n documentManager.exists(uid, documentId),\n ]);\n\n if (!documentExists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n // If version is not found but document exists, the intent is to create a new locale\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 })(\n await sanitizeInput(data)\n ) as Record<string, unknown>;\n\n const result = await strapi.db.transaction(async () => {\n const updatedDocument = await documentManager.update(\n documentVersion?.documentId ?? documentId,\n uid,\n { data: sanitizedData, locale: resolvedLocale }\n );\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(updatedDocument);\n return formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for deleting a collection-type document (or a specific locale).\n * Enforces RBAC delete permission on every locale version before deletion.\n */\nexport const createCollectionDeleteHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.delete()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.delete({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\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(documentId, uid, {\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 result = await documentManager.delete(documentId, uid, { locale: localeForQuery });\n const sanitizedResult = await permissionChecker.sanitizeOutput(result);\n\n return ok({ data: sanitizedResult } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for publishing a collection-type document draft.\n * Enforces RBAC publish permission; throws NotFound when the draft or document is missing.\n */\nexport const createCollectionPublishHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.publish()) {\n throw new errors.ForbiddenError();\n }\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const exists = await documentManager.exists(uid, documentId);\n if (!exists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const document = await documentManager.findOne(documentId, uid, {\n locale: resolvedLocale,\n status: 'draft',\n });\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_LOCALE);\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, uid, {\n locale: resolvedLocale,\n });\n\n if (!publishResult || publishResult.length === 0) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_OR_PUBLISHED);\n }\n\n return publishResult[0];\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n const result = await formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for unpublishing a collection-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 createCollectionUnpublishHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale, discardDraft } = args as CollectionUnpublishArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\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 permissionQuery = await permissionChecker.sanitizedQuery.unpublish({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const document = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'published',\n });\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 unpublishedDocument = await strapi.db.transaction(async () => {\n if (discardDraft === true) {\n await documentManager.discardDraft(document.documentId, uid, { locale: resolvedLocale });\n }\n\n return documentManager.unpublish(document.documentId, uid, { locale: resolvedLocale });\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(unpublishedDocument);\n const result = await formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for discarding the draft of a collection-type document.\n * Restores the published version as the draft. Enforces RBAC discard permission.\n */\nexport const createCollectionDiscardDraftHandler =\n (uid: UID.CollectionType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.discard({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const document = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'published',\n });\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) => documentManager.discardDraft(doc.documentId, uid, { locale: resolvedLocale }),\n permissionChecker.sanitizeOutput,\n (doc: any) => formatDocumentWithMetadata(permissionChecker, uid, doc)\n )(document);\n\n return ok(discardedDocument as Record<string, unknown>);\n };\n"],"names":["createCollectionListHandler","uid","strapi","context","args","userAbility","locale","status","page","pageSize","sort","filters","documentMetadata","getService","documentManager","permissionChecker","create","model","cannot","read","errors","ForbiddenError","query","undefined","permissionQuery","sanitizedQuery","populate","populateFromQuery","populateDeep","countRelations","toOne","toMany","withPopulateOverride","getPopulateForLocalizations","build","resolvedLocale","resolvedStatus","getDocumentLocaleAndStatus","findPageQuery","results","documents","pagination","findPage","hasDraftAndPublish","contentTypes","getModel","statusByDocumentId","indexByDocumentId","getManyAvailableStatus","Map","setStatus","document","availableStatuses","get","documentId","getStatus","asyncPipe","map","pipe","sanitizeOutput","ok","createCollectionGetHandler","_strapi","Infinity","version","findOne","exists","NotFoundError","MCP_NOT_FOUND_DOCUMENT","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","data","sanitizedDocument","result","createCollectionCreateHandler","user","sanitizedData","setCreatorFields","sanitizeCreateInput","db","transaction","createCollectionUpdateHandler","update","documentVersion","documentExists","Promise","all","sanitizeInput","sanitizeUpdateInput","isEdition","updatedDocument","createCollectionDeleteHandler","delete","isLocalized","isContentTypeLocalized","localeForQuery","documentLocales","findLocales","length","sanitizedResult","createCollectionPublishHandler","publish","publishedDocument","MCP_NOT_FOUND_LOCALE","publishResult","MCP_NOT_FOUND_OR_PUBLISHED","createCollectionUnpublishHandler","discardDraft","unpublish","discard","unpublishedDocument","createCollectionDiscardDraftHandler","discardedDocument","doc"],"mappings":"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"}
|