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