@strapi/content-manager 5.46.1 → 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/history/components/VersionInputRenderer.js +63 -25
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +62 -26
- package/dist/admin/history/components/VersionInputRenderer.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/src/history/components/VersionInputRenderer.d.ts +27 -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/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 +9 -7
|
@@ -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":";;;;;;;;;;AA+DA;AACA;AACA;AAEA;;;IAIO,MAAMA,2BAAAA,GACX,CAACC,GAAAA,GACD,CAACC,MAAAA,EAAqBC,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAAgC,GAAA;YAC3C,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEG,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,OAAO,EAAE,GAAGP,IAAAA;AAE1D,YAAA,MAAMQ,mBAAmBC,UAAAA,CAAW,mBAAA,CAAA;AACpC,YAAA,MAAMC,kBAAkBD,UAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAME,iBAAAA,GAAoBF,UAAAA,CAAW,oBAAA,CAAA,CAAsBG,MAAM,CAAC;AAAEX,gBAAAA,WAAAA;gBAAaY,KAAAA,EAAOhB;AAAI,aAAA,CAAA;AAE5F,YAAA,IAAIc,iBAAAA,CAAkBG,MAAM,CAACC,IAAI,EAAA,EAAI;gBACnC,MAAM,IAAIC,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMC,KAAAA,GAAiC;AACrC,gBAAA,GAAId,SAASe,SAAAA,IAAa;AAAEf,oBAAAA;iBAAM;AAClC,gBAAA,GAAIC,aAAac,SAAAA,IAAa;AAAEd,oBAAAA;iBAAU;AAC1C,gBAAA,GAAIC,SAASa,SAAAA,IAAa;AAAEb,oBAAAA;iBAAM;AAClC,gBAAA,GAAIC,YAAYY,SAAAA,IAAa;AAAEZ,oBAAAA;;AACjC,aAAA;AAEA,YAAA,MAAMa,kBAAkB,MAAMT,iBAAAA,CAAkBU,cAAc,CAACN,IAAI,CAACG,KAAAA,CAAAA;AAEpE,YAAA,MAAMI,QAAAA,GAAW,MAAMb,UAAAA,CAAW,kBAAA,CAAA,CAAoBZ,GAAAA,CAAAA,CACnD0B,iBAAiB,CAACH,eAAAA,CAAAA,CAClBI,YAAY,CAAC,CAAA,CAAA,CACbC,cAAc,CAAC;gBAAEC,KAAAA,EAAO,KAAA;gBAAOC,MAAAA,EAAQ;AAAK,aAAA,CAAA,CAC5CC,oBAAoB,CAACC,2BAAAA,CAA4BhC,GAAAA,CAAAA,CAAAA,CACjDiC,KAAK,EAAA;YAER,MAAM,EAAE5B,QAAQ6B,cAAc,EAAE5B,QAAQ6B,cAAc,EAAE,GAAG,MAAMC,0BAAAA,CAC/D;AAAE/B,gBAAAA,MAAAA;AAAQC,gBAAAA;aAAO,EACjBN,GAAAA,CAAAA;AAGF,YAAA,MAAMqC,aAAAA,GAAkC;AACtC,gBAAA,GAAGd,eAAe;AAClBE,gBAAAA,QAAAA;gBACApB,MAAAA,EAAQ6B,cAAAA;gBACR5B,MAAAA,EAAQ6B;AACV,aAAA;YACA,MAAM,EAAEG,OAAAA,EAASC,SAAS,EAAEC,UAAU,EAAE,GAAG,MAAM3B,eAAAA,CAAgB4B,QAAQ,CACvEJ,aAAAA,EACArC,GAAAA,CAAAA;AAGF,YAAA,MAAM0C,qBAAqBC,YAAAA,CAAaD,kBAAkB,CAACzC,MAAAA,CAAO2C,QAAQ,CAAC5C,GAAAA,CAAAA,CAAAA;YAC3E,MAAM6C,kBAAAA,GAAqBH,qBACvBI,iBAAAA,CAAkB,MAAMnC,iBAAiBoC,sBAAsB,CAAC/C,GAAAA,EAAKuC,SAAAA,CAAAA,CAAAA,GACrE,IAAIS,GAAAA,EAAAA;AAER,YAAA,MAAMC,YAAY,CAACC,QAAAA,GAAAA;AACjB,gBAAA,MAAMC,oBAAoBN,kBAAAA,CAAmBO,GAAG,CAACF,QAAAA,CAASG,UAAU,KAAK,EAAE;AAC3EH,gBAAAA,QAAAA,CAAS5C,MAAM,GAAGK,gBAAAA,CAAiB2C,SAAS,CAACJ,QAAAA,EAAUC,iBAAAA,CAAAA;gBACvD,OAAOD,QAAAA;AACT,YAAA,CAAA;YAEA,MAAMZ,OAAAA,GAAU,MAAMiB,KAAAA,CAAUC,GAAG,CACjCjB,SAAAA,EACAgB,KAAAA,CAAUE,IAAI,CAAC3C,iBAAAA,CAAkB4C,cAAc,EAAET,SAAAA,CAAAA,CAAAA;AAGnD,YAAA,OAAOU,EAAAA,CAAG;AAAErB,gBAAAA,OAAAA;AAASE,gBAAAA;AAAW,aAAA,CAAA;QAClC;AAEF;;;IAIO,MAAMoB,0BAAAA,GACX,CAAC5D,GAAAA,GACD,CAAC6D,OAAAA,EAAsB3D,OAAAA,GACvB,OAAO,EACLC,IAAI,EAGL,GAAA;YACC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEmD,UAAU,EAAEhD,MAAM,EAAEC,MAAM,EAAE,GAAGH,IAAAA;AAEvC,YAAA,MAAMU,kBAAkBD,UAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAME,iBAAAA,GAAoBF,UAAAA,CAAW,oBAAA,CAAA,CAAsBG,MAAM,CAAC;AAAEX,gBAAAA,WAAAA;gBAAaY,KAAAA,EAAOhB;AAAI,aAAA,CAAA;AAE5F,YAAA,IAAIc,iBAAAA,CAAkBG,MAAM,CAACC,IAAI,EAAA,EAAI;gBACnC,MAAM,IAAIC,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMG,kBAAkB,MAAMT,iBAAAA,CAAkBU,cAAc,CAACN,IAAI,CAAC;AAAEb,gBAAAA,MAAAA;AAAQC,gBAAAA;AAAO,aAAA,CAAA;AAErF,YAAA,MAAMmB,WAAW,MAAMb,UAAAA,CAAW,kBAAA,CAAA,CAAoBZ,GAAAA,CAAAA,CACnD0B,iBAAiB,CAACH,eAAAA,CAAAA,CAClBI,YAAY,CAACmC,UACblC,cAAc,EAAA,CACdG,oBAAoB,CAACC,2BAAAA,CAA4BhC,MACjDiC,KAAK,EAAA;YAER,MAAM,EAAE5B,QAAQ6B,cAAc,EAAE5B,QAAQ6B,cAAc,EAAE,GAAG,MAAMC,0BAAAA,CAC/D;AAAE/B,gBAAAA,MAAAA;AAAQC,gBAAAA;aAAO,EACjBN,GAAAA,CAAAA;AAGF,YAAA,MAAM+D,UAAU,MAAMlD,eAAAA,CAAgBmD,OAAO,CAACX,YAAYrD,GAAAA,EAAK;AAC7DyB,gBAAAA,QAAAA;gBACApB,MAAAA,EAAQ6B,cAAAA;gBACR5B,MAAAA,EAAQ6B;AACV,aAAA,CAAA;AAEA,YAAA,IAAI,CAAC4B,OAAAA,EAAS;AACZ,gBAAA,MAAME,MAAAA,GAAS,MAAMpD,eAAAA,CAAgBoD,MAAM,CAACjE,GAAAA,EAAKqD,UAAAA,CAAAA;AACjD,gBAAA,IAAI,CAACY,MAAAA,EAAQ;oBACX,MAAM,IAAI9C,MAAAA,CAAO+C,aAAa,CAACC,sBAAAA,CAAAA;AACjC,gBAAA;AAEA,gBAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMC,0BAAAA,CACrBvD,mBACAd,GAAAA,EACA;AAAEqD,oBAAAA,UAAAA;oBAAYhD,MAAAA,EAAQ6B,cAAAA;oBAAgBoC,WAAAA,EAAa;iBAAK,EAGxD;oBAAEC,gBAAAA,EAAkB,IAAA;oBAAMC,eAAAA,EAAiB;AAAM,iBAAA,CAAA;AAGnD,gBAAA,OAAOb,EAAAA,CAAG;AAAEc,oBAAAA,IAAAA,EAAM,EAAC;AAAGL,oBAAAA;AAAK,iBAAA,CAAA;AAC7B,YAAA;AAEA,YAAA,IAAItD,iBAAAA,CAAkBG,MAAM,CAACC,IAAI,CAAC6C,OAAAA,CAAAA,EAAU;gBAC1C,MAAM,IAAI5C,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMsD,iBAAAA,GAAoB,MAAM5D,iBAAAA,CAAkB4C,cAAc,CAACK,OAAAA,CAAAA;AACjE,YAAA,MAAMY,MAAAA,GAAS,MAAMN,0BAAAA,CAA2BvD,iBAAAA,EAAmBd,GAAAA,EAAK0E,iBAAAA,CAAAA;AAExE,YAAA,OAAOf,EAAAA,CAAGgB,MAAAA,CAAAA;QACZ;AAEF;;;IAIO,MAAMC,6BAAAA,GACX,CAAC5E,GAAAA,GACD,CAACC,MAAAA,EAAqBC,OAAAA,GACtB,OAAO,EACLC,IAAI,EAGL,GAAA;AACC,YAAA,MAAM,EAAEC,WAAW,EAAEyE,IAAI,EAAE,GAAG3E,OAAAA;AAC9B,YAAA,MAAM,EAAEuE,IAAI,EAAEpE,MAAM,EAAE,GAAGF,IAAAA;AAEzB,YAAA,MAAMU,kBAAkBD,UAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAME,iBAAAA,GAAoBF,UAAAA,CAAW,oBAAA,CAAA,CAAsBG,MAAM,CAAC;AAAEX,gBAAAA,WAAAA;gBAAaY,KAAAA,EAAOhB;AAAI,aAAA,CAAA;AAE5F,YAAA,IAAIc,iBAAAA,CAAkBG,MAAM,CAACF,MAAM,EAAA,EAAI;gBACrC,MAAM,IAAII,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAM0D,gBAAgBC,gBAAAA,CAAiB;AAAEF,gBAAAA;aAAK,CAAA,CAC5C,MAAM/D,iBAAAA,CAAkBkE,mBAAmB,CAACP,IAAAA,CAAAA,CAAAA;YAG9C,MAAM,EAAEpE,QAAQ6B,cAAc,EAAE5B,MAAM,EAAE,GAAG,MAAM8B,0BAAAA,CAA2B;AAAE/B,gBAAAA;aAAO,EAAGL,GAAAA,CAAAA;AAExF,YAAA,MAAM2E,SAAS,MAAM1E,MAAAA,CAAOgF,EAAE,CAACC,WAAW,CAAC,UAAA;AACzC,gBAAA,MAAMhC,QAAAA,GAAW,MAAMrC,eAAAA,CAAgBE,MAAM,CAACf,GAAAA,EAAK;oBACjDyE,IAAAA,EAAMK,aAAAA;oBACNzE,MAAAA,EAAQ6B,cAAAA;AACR5B,oBAAAA;AACF,iBAAA,CAAA;AAEA,gBAAA,MAAMoE,iBAAAA,GAAoB,MAAM5D,iBAAAA,CAAkB4C,cAAc,CAACR,QAAAA,CAAAA;gBACjE,OAAOmB,0BAAAA,CAA2BvD,iBAAAA,EAAmBd,GAAAA,EAAK0E,iBAAAA,EAAmB;oBAC3EH,gBAAAA,EAAkB,KAAA;oBAClBC,eAAAA,EAAiB;AACnB,iBAAA,CAAA;AACF,YAAA,CAAA,CAAA;AAEA,YAAA,OAAOb,EAAAA,CAAGgB,MAAAA,CAAAA;QACZ;AAEF;;;;IAKO,MAAMQ,6BAAAA,GACX,CAACnF,GAAAA,GACD,CAACC,MAAAA,EAAqBC,OAAAA,GACtB,OAAO,EACLC,IAAI,EAGL,GAAA;AACC,YAAA,MAAM,EAAEC,WAAW,EAAEyE,IAAI,EAAE,GAAG3E,OAAAA;AAC9B,YAAA,MAAM,EAAEmD,UAAU,EAAEoB,IAAI,EAAEpE,MAAM,EAAE,GAAGF,IAAAA;AAErC,YAAA,MAAMU,kBAAkBD,UAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAME,iBAAAA,GAAoBF,UAAAA,CAAW,oBAAA,CAAA,CAAsBG,MAAM,CAAC;AAAEX,gBAAAA,WAAAA;gBAAaY,KAAAA,EAAOhB;AAAI,aAAA,CAAA;AAE5F,YAAA,IAAIc,iBAAAA,CAAkBG,MAAM,CAACmE,MAAM,EAAA,EAAI;gBACrC,MAAM,IAAIjE,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMG,kBAAkB,MAAMT,iBAAAA,CAAkBU,cAAc,CAAC4D,MAAM,CAAC;AAAE/E,gBAAAA;AAAO,aAAA,CAAA;YAC/E,MAAMoB,QAAAA,GAAW,MAAMb,UAAAA,CAAW,kBAAA,CAAA,CAAoBZ,KACnD0B,iBAAiB,CAACH,iBAClBU,KAAK,EAAA;AAER,YAAA,MAAM,EAAE5B,MAAAA,EAAQ6B,cAAc,EAAE,GAAG,MAAME,0BAAAA,CAA2B;AAAE/B,gBAAAA;aAAO,EAAGL,GAAAA,CAAAA;AAEhF,YAAA,MAAM,CAACqF,eAAAA,EAAiBC,cAAAA,CAAe,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;gBAC1D3E,eAAAA,CAAgBmD,OAAO,CAACX,UAAAA,EAAYrD,GAAAA,EAAK;AACvCyB,oBAAAA,QAAAA;oBACApB,MAAAA,EAAQ6B,cAAAA;oBACR5B,MAAAA,EAAQ;AACV,iBAAA,CAAA;gBACAO,eAAAA,CAAgBoD,MAAM,CAACjE,GAAAA,EAAKqD,UAAAA;AAC7B,aAAA,CAAA;AAED,YAAA,IAAI,CAACiC,cAAAA,EAAgB;gBACnB,MAAM,IAAInE,MAAAA,CAAO+C,aAAa,CAACC,sBAAAA,CAAAA;AACjC,YAAA;;AAGA,YAAA,IAAIkB,eAAAA,EAAiB;AACnB,gBAAA,IAAIvE,iBAAAA,CAAkBG,MAAM,CAACmE,MAAM,CAACC,eAAAA,CAAAA,EAAkB;oBACpD,MAAM,IAAIlE,OAAOC,cAAc,EAAA;AACjC,gBAAA;AACF,YAAA,CAAA,MAAO,IAAIN,iBAAAA,CAAkBG,MAAM,CAACF,MAAM,EAAA,EAAI;gBAC5C,MAAM,IAAII,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMqE,gBAAgBJ,eAAAA,GAClBvE,iBAAAA,CAAkB4E,mBAAmB,CAACL,eAAAA,CAAAA,GACtCvE,kBAAkBkE,mBAAmB;YAEzC,MAAMW,SAAAA,GAAYN,eAAAA,KAAoB,IAAA,IAAQA,eAAAA,KAAoB/D,SAAAA;AAClE,YAAA,MAAMwD,gBAAgBC,gBAAAA,CAAiB;AAAEF,gBAAAA,IAAAA;AAAMc,gBAAAA;AAAU,aAAA,CAAA,CACvD,MAAMF,aAAAA,CAAchB,IAAAA,CAAAA,CAAAA;AAGtB,YAAA,MAAME,SAAS,MAAM1E,MAAAA,CAAOgF,EAAE,CAACC,WAAW,CAAC,UAAA;gBACzC,MAAMU,eAAAA,GAAkB,MAAM/E,eAAAA,CAAgBuE,MAAM,CAClDC,eAAAA,EAAiBhC,UAAAA,IAAcA,YAC/BrD,GAAAA,EACA;oBAAEyE,IAAAA,EAAMK,aAAAA;oBAAezE,MAAAA,EAAQ6B;AAAe,iBAAA,CAAA;AAGhD,gBAAA,MAAMwC,iBAAAA,GAAoB,MAAM5D,iBAAAA,CAAkB4C,cAAc,CAACkC,eAAAA,CAAAA;gBACjE,OAAOvB,0BAAAA,CAA2BvD,mBAAmBd,GAAAA,EAAK0E,iBAAAA,CAAAA;AAC5D,YAAA,CAAA,CAAA;AAEA,YAAA,OAAOf,EAAAA,CAAGgB,MAAAA,CAAAA;QACZ;AAEF;;;IAIO,MAAMkB,6BAAAA,GACX,CAAC7F,GAAAA,GACD,CAACC,MAAAA,EAAqBC,OAAAA,GACtB,OAAO,EACLC,IAAI,EAGL,GAAA;YACC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEmD,UAAU,EAAEhD,MAAM,EAAE,GAAGF,IAAAA;AAE/B,YAAA,MAAMU,kBAAkBD,UAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAME,iBAAAA,GAAoBF,UAAAA,CAAW,oBAAA,CAAA,CAAsBG,MAAM,CAAC;AAAEX,gBAAAA,WAAAA;gBAAaY,KAAAA,EAAOhB;AAAI,aAAA,CAAA;AAE5F,YAAA,IAAIc,iBAAAA,CAAkBG,MAAM,CAAC6E,MAAM,EAAA,EAAI;gBACrC,MAAM,IAAI3E,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMG,kBAAkB,MAAMT,iBAAAA,CAAkBU,cAAc,CAACsE,MAAM,CAAC;AAAEzF,gBAAAA;AAAO,aAAA,CAAA;YAC/E,MAAMoB,QAAAA,GAAW,MAAMb,UAAAA,CAAW,kBAAA,CAAA,CAAoBZ,KACnD0B,iBAAiB,CAACH,iBAClBU,KAAK,EAAA;AAER,YAAA,MAAM,EAAE5B,MAAAA,EAAQ6B,cAAc,EAAE,GAAG,MAAME,0BAAAA,CAA2B;AAAE/B,gBAAAA;aAAO,EAAGL,GAAAA,CAAAA;YAEhF,MAAM+F,WAAAA,GAAcC,uBAAuB/F,MAAAA,EAAQD,GAAAA,CAAAA;YAEnD,MAAMiG,cAAAA,GAAiBF,WAAAA,KAAgB,IAAA,GAAO7D,cAAAA,GAAiBZ,SAAAA;AAE/D,YAAA,MAAM4E,kBAAkB,MAAMrF,eAAAA,CAAgBsF,WAAW,CAAC9C,YAAYrD,GAAAA,EAAK;AACzEyB,gBAAAA,QAAAA;gBACApB,MAAAA,EAAQ4F;AACV,aAAA,CAAA;YAEA,IAAIC,eAAAA,CAAgBE,MAAM,KAAK,CAAA,EAAG;gBAChC,MAAM,IAAIjF,MAAAA,CAAO+C,aAAa,CAACC,sBAAAA,CAAAA;AACjC,YAAA;YAEA,KAAK,MAAMjB,YAAYgD,eAAAA,CAAiB;AACtC,gBAAA,IAAIpF,iBAAAA,CAAkBG,MAAM,CAAC6E,MAAM,CAAC5C,QAAAA,CAAAA,EAAW;oBAC7C,MAAM,IAAI/B,OAAOC,cAAc,EAAA;AACjC,gBAAA;AACF,YAAA;AAEA,YAAA,MAAMuD,SAAS,MAAM9D,eAAAA,CAAgBiF,MAAM,CAACzC,YAAYrD,GAAAA,EAAK;gBAAEK,MAAAA,EAAQ4F;AAAe,aAAA,CAAA;AACtF,YAAA,MAAMI,eAAAA,GAAkB,MAAMvF,iBAAAA,CAAkB4C,cAAc,CAACiB,MAAAA,CAAAA;AAE/D,YAAA,OAAOhB,EAAAA,CAAG;gBAAEc,IAAAA,EAAM4B;AAAgB,aAAA,CAAA;QACpC;AAEF;;;IAIO,MAAMC,8BAAAA,GACX,CAACtG,GAAAA,GACD,CAACC,MAAAA,EAAqBC,OAAAA,GACtB,OAAO,EACLC,IAAI,EAGL,GAAA;YACC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEmD,UAAU,EAAEhD,MAAM,EAAE,GAAGF,IAAAA;AAE/B,YAAA,MAAMU,kBAAkBD,UAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAME,iBAAAA,GAAoBF,UAAAA,CAAW,oBAAA,CAAA,CAAsBG,MAAM,CAAC;AAAEX,gBAAAA,WAAAA;gBAAaY,KAAAA,EAAOhB;AAAI,aAAA,CAAA;AAE5F,YAAA,IAAIc,iBAAAA,CAAkBG,MAAM,CAACsF,OAAO,EAAA,EAAI;gBACtC,MAAM,IAAIpF,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAM,EAAEf,MAAAA,EAAQ6B,cAAc,EAAE,GAAG,MAAME,0BAAAA,CAA2B;AAAE/B,gBAAAA;aAAO,EAAGL,GAAAA,CAAAA;AAEhF,YAAA,MAAMwG,oBAAoB,MAAMvG,MAAAA,CAAOgF,EAAE,CAACC,WAAW,CAAC,UAAA;AACpD,gBAAA,MAAMjB,MAAAA,GAAS,MAAMpD,eAAAA,CAAgBoD,MAAM,CAACjE,GAAAA,EAAKqD,UAAAA,CAAAA;AACjD,gBAAA,IAAI,CAACY,MAAAA,EAAQ;oBACX,MAAM,IAAI9C,MAAAA,CAAO+C,aAAa,CAACC,sBAAAA,CAAAA;AACjC,gBAAA;AAEA,gBAAA,MAAMjB,WAAW,MAAMrC,eAAAA,CAAgBmD,OAAO,CAACX,YAAYrD,GAAAA,EAAK;oBAC9DK,MAAAA,EAAQ6B,cAAAA;oBACR5B,MAAAA,EAAQ;AACV,iBAAA,CAAA;AAEA,gBAAA,IAAI,CAAC4C,QAAAA,EAAU;oBACb,MAAM,IAAI/B,MAAAA,CAAO+C,aAAa,CAACuC,oBAAAA,CAAAA;AACjC,gBAAA;AAEA,gBAAA,IAAI3F,iBAAAA,CAAkBG,MAAM,CAACsF,OAAO,CAACrD,QAAAA,CAAAA,EAAW;oBAC9C,MAAM,IAAI/B,OAAOC,cAAc,EAAA;AACjC,gBAAA;gBAEA,MAAMsF,aAAAA,GAAgB,MAAM7F,eAAAA,CAAgB0F,OAAO,CAACrD,QAAAA,CAASG,UAAU,EAAErD,GAAAA,EAAK;oBAC5EK,MAAAA,EAAQ6B;AACV,iBAAA,CAAA;AAEA,gBAAA,IAAI,CAACwE,aAAAA,IAAiBA,aAAAA,CAAcN,MAAM,KAAK,CAAA,EAAG;oBAChD,MAAM,IAAIjF,MAAAA,CAAO+C,aAAa,CAACyC,0BAAAA,CAAAA;AACjC,gBAAA;gBAEA,OAAOD,aAAa,CAAC,CAAA,CAAE;AACzB,YAAA,CAAA,CAAA;AAEA,YAAA,MAAMhC,iBAAAA,GAAoB,MAAM5D,iBAAAA,CAAkB4C,cAAc,CAAC8C,iBAAAA,CAAAA;AACjE,YAAA,MAAM7B,MAAAA,GAAS,MAAMN,0BAAAA,CAA2BvD,iBAAAA,EAAmBd,GAAAA,EAAK0E,iBAAAA,CAAAA;AAExE,YAAA,OAAOf,EAAAA,CAAGgB,MAAAA,CAAAA;QACZ;AAEF;;;;IAKO,MAAMiC,gCAAAA,GACX,CAAC5G,GAAAA,GACD,CAACC,MAAAA,EAAqBC,OAAAA,GACtB,OAAO,EACLC,IAAI,EAGL,GAAA;YACC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEmD,UAAU,EAAEhD,MAAM,EAAEwG,YAAY,EAAE,GAAG1G,IAAAA;AAE7C,YAAA,MAAMU,kBAAkBD,UAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAME,iBAAAA,GAAoBF,UAAAA,CAAW,oBAAA,CAAA,CAAsBG,MAAM,CAAC;AAAEX,gBAAAA,WAAAA;gBAAaY,KAAAA,EAAOhB;AAAI,aAAA,CAAA;AAE5F,YAAA,IAAIc,iBAAAA,CAAkBG,MAAM,CAAC6F,SAAS,EAAA,EAAI;gBACxC,MAAM,IAAI3F,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,IAAIyF,iBAAiB,IAAA,IAAQ/F,iBAAAA,CAAkBG,MAAM,CAAC8F,OAAO,EAAA,EAAI;gBAC/D,MAAM,IAAI5F,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMG,kBAAkB,MAAMT,iBAAAA,CAAkBU,cAAc,CAACsF,SAAS,CAAC;AAAEzG,gBAAAA;AAAO,aAAA,CAAA;YAClF,MAAMoB,QAAAA,GAAW,MAAMb,UAAAA,CAAW,kBAAA,CAAA,CAAoBZ,KACnD0B,iBAAiB,CAACH,iBAClBU,KAAK,EAAA;AAER,YAAA,MAAM,EAAE5B,MAAAA,EAAQ6B,cAAc,EAAE,GAAG,MAAME,0BAAAA,CAA2B;AAAE/B,gBAAAA;aAAO,EAAGL,GAAAA,CAAAA;AAEhF,YAAA,MAAMkD,WAAW,MAAMrC,eAAAA,CAAgBmD,OAAO,CAACX,YAAYrD,GAAAA,EAAK;AAC9DyB,gBAAAA,QAAAA;gBACApB,MAAAA,EAAQ6B,cAAAA;gBACR5B,MAAAA,EAAQ;AACV,aAAA,CAAA;AAEA,YAAA,IAAI,CAAC4C,QAAAA,EAAU;gBACb,MAAM,IAAI/B,MAAAA,CAAO+C,aAAa,CAACC,sBAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAIrD,iBAAAA,CAAkBG,MAAM,CAAC6F,SAAS,CAAC5D,QAAAA,CAAAA,EAAW;gBAChD,MAAM,IAAI/B,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,IAAIyF,iBAAiB,IAAA,IAAQ/F,iBAAAA,CAAkBG,MAAM,CAAC8F,OAAO,CAAC7D,QAAAA,CAAAA,EAAW;gBACvE,MAAM,IAAI/B,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAM4F,sBAAsB,MAAM/G,MAAAA,CAAOgF,EAAE,CAACC,WAAW,CAAC,UAAA;AACtD,gBAAA,IAAI2B,iBAAiB,IAAA,EAAM;AACzB,oBAAA,MAAMhG,gBAAgBgG,YAAY,CAAC3D,QAAAA,CAASG,UAAU,EAAErD,GAAAA,EAAK;wBAAEK,MAAAA,EAAQ6B;AAAe,qBAAA,CAAA;AACxF,gBAAA;AAEA,gBAAA,OAAOrB,gBAAgBiG,SAAS,CAAC5D,QAAAA,CAASG,UAAU,EAAErD,GAAAA,EAAK;oBAAEK,MAAAA,EAAQ6B;AAAe,iBAAA,CAAA;AACtF,YAAA,CAAA,CAAA;AAEA,YAAA,MAAMwC,iBAAAA,GAAoB,MAAM5D,iBAAAA,CAAkB4C,cAAc,CAACsD,mBAAAA,CAAAA;AACjE,YAAA,MAAMrC,MAAAA,GAAS,MAAMN,0BAAAA,CAA2BvD,iBAAAA,EAAmBd,GAAAA,EAAK0E,iBAAAA,CAAAA;AAExE,YAAA,OAAOf,EAAAA,CAAGgB,MAAAA,CAAAA;QACZ;AAEF;;;IAIO,MAAMsC,mCAAAA,GACX,CAACjH,GAAAA,GACD,CAAC6D,OAAAA,EAAsB3D,OAAAA,GACvB,OAAO,EACLC,IAAI,EAGL,GAAA;YACC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEmD,UAAU,EAAEhD,MAAM,EAAE,GAAGF,IAAAA;AAE/B,YAAA,MAAMU,kBAAkBD,UAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAME,iBAAAA,GAAoBF,UAAAA,CAAW,oBAAA,CAAA,CAAsBG,MAAM,CAAC;AAAEX,gBAAAA,WAAAA;gBAAaY,KAAAA,EAAOhB;AAAI,aAAA,CAAA;AAE5F,YAAA,IAAIc,iBAAAA,CAAkBG,MAAM,CAAC8F,OAAO,EAAA,EAAI;gBACtC,MAAM,IAAI5F,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMG,kBAAkB,MAAMT,iBAAAA,CAAkBU,cAAc,CAACuF,OAAO,CAAC;AAAE1G,gBAAAA;AAAO,aAAA,CAAA;YAChF,MAAMoB,QAAAA,GAAW,MAAMb,UAAAA,CAAW,kBAAA,CAAA,CAAoBZ,KACnD0B,iBAAiB,CAACH,iBAClBU,KAAK,EAAA;AAER,YAAA,MAAM,EAAE5B,MAAAA,EAAQ6B,cAAc,EAAE,GAAG,MAAME,0BAAAA,CAA2B;AAAE/B,gBAAAA;aAAO,EAAGL,GAAAA,CAAAA;AAEhF,YAAA,MAAMkD,WAAW,MAAMrC,eAAAA,CAAgBmD,OAAO,CAACX,YAAYrD,GAAAA,EAAK;AAC9DyB,gBAAAA,QAAAA;gBACApB,MAAAA,EAAQ6B,cAAAA;gBACR5B,MAAAA,EAAQ;AACV,aAAA,CAAA;AAEA,YAAA,IAAI,CAAC4C,QAAAA,EAAU;gBACb,MAAM,IAAI/B,MAAAA,CAAO+C,aAAa,CAACC,sBAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAIrD,iBAAAA,CAAkBG,MAAM,CAAC8F,OAAO,CAAC7D,QAAAA,CAAAA,EAAW;gBAC9C,MAAM,IAAI/B,OAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAM8F,iBAAAA,GAAoB,MAAM3D,KAAAA,CAAUE,IAAI,CAC5C,CAAC0D,GAAAA,GAAatG,eAAAA,CAAgBgG,YAAY,CAACM,GAAAA,CAAI9D,UAAU,EAAErD,GAAAA,EAAK;oBAAEK,MAAAA,EAAQ6B;iBAAe,CAAA,EACzFpB,iBAAAA,CAAkB4C,cAAc,EAChC,CAACyD,MAAa9C,0BAAAA,CAA2BvD,iBAAAA,EAAmBd,KAAKmH,GAAAA,CAAAA,CAAAA,CACjEjE,QAAAA,CAAAA;AAEF,YAAA,OAAOS,EAAAA,CAAGuD,iBAAAA,CAAAA;QACZ;;;;"}
|
|
@@ -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;;;;"}
|