@strapi/content-manager 5.52.0 → 5.52.1
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/pages/EditView/components/DocumentActions.js +3 -2
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +3 -2
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/server/controllers/collection-types.js +16 -1
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +16 -1
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/single-types.js +20 -3
- package/dist/server/controllers/single-types.js.map +1 -1
- package/dist/server/controllers/single-types.mjs +20 -3
- package/dist/server/controllers/single-types.mjs.map +1 -1
- package/dist/server/mcp/utils.js +4 -2
- package/dist/server/mcp/utils.js.map +1 -1
- package/dist/server/mcp/utils.mjs +4 -2
- package/dist/server/mcp/utils.mjs.map +1 -1
- package/dist/server/services/document-manager.js +3 -6
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +4 -7
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/utils/draft-relations.js +5 -0
- package/dist/server/services/utils/draft-relations.js.map +1 -1
- package/dist/server/services/utils/draft-relations.mjs +5 -1
- package/dist/server/services/utils/draft-relations.mjs.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/single-types.d.ts.map +1 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/utils.d.ts +3 -1
- package/dist/server/src/mcp/utils.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-types.mjs","sources":["../../../server/src/controllers/single-types.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { setCreatorFields, async, errors } from '@strapi/utils';\n\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { getService } from '../utils';\nimport { formatDocumentWithMetadata } from './utils/metadata';\nimport { getPopulateForLocalizations } from '../services/utils/populate';\n\ntype OptionsWithPopulate = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\nconst buildPopulateFromQuery = async (query: any, model: any) => {\n return getService('populate-builder')(model)\n .populateFromQuery(query)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(model))\n .build();\n};\n\nconst findDocument = async (query: any, uid: UID.SingleType, opts: any = {}) => {\n const documentManager = getService('document-manager');\n const populate = await buildPopulateFromQuery(query, uid);\n\n return (\n documentManager\n .findMany({ ...opts, populate }, uid)\n // Return the first document found\n .then((documents: any) => documents[0])\n );\n};\n\nconst createOrUpdateDocument = async (ctx: any, opts?: OptionsWithPopulate) => {\n const { user, userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n findDocument(sanitizedQuery, model, { locale, status: 'draft' }),\n // Find the first document to check if it exists\n strapi.db.query(model).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n const pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n\n // If version is not found, but document exists,\n // the intent is to create a new document 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 sanitizedBody = await sanitizeFn(body);\n\n if (!documentId) {\n return documentManager.create(model, {\n data: sanitizedBody,\n ...sanitizedQuery,\n locale,\n });\n }\n\n return documentManager.update(documentId, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n};\n\nexport default {\n async find(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const version = await findDocument(permissionQuery, model, { locale, status });\n\n // allow user with create permission to know a single type is not created\n if (!version) {\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n // Check if document exists\n const document = await strapi.db.query(model).findOne({});\n\n if (!document) {\n return ctx.notFound();\n }\n\n // If the requested locale doesn't exist, return an empty response\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n model,\n // @ts-expect-error - fix types\n { documentId: document.documentId, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n ctx.body = { data: {}, meta };\n return;\n }\n\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async createOrUpdate(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const document = await createOrUpdateDocument(ctx);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.delete()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n const documentLocales = await documentManager.findLocales(undefined, model, {\n populate,\n locale,\n });\n\n if (documentLocales.length === 0) {\n return ctx.notFound();\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n return ctx.forbidden();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales.at(0).documentId, model, {\n locale,\n });\n\n ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n },\n\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.publish()) {\n return ctx.forbidden();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Find the existing document\n let document = await findDocument(sanitizedQuery, model, { locale, status: 'draft' });\n\n // If document exists and user can update it, update it before publishing\n const shouldUpdate = document && permissionChecker.can.update(document);\n // If document doesn't exist and user can create it, create it before publishing\n const shouldCreate = !document && permissionChecker.can.create();\n if (shouldUpdate || shouldCreate) {\n document = await createOrUpdateDocument(ctx, { populate });\n } else if (!document) {\n // Document doesn't exist and user can't create it\n throw new errors.ForbiddenError();\n }\n\n // If document doesn't exist, throw an error\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, model, { locale });\n\n return publishResult.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const {\n body: { discardDraft, ...body },\n query = {},\n } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.unpublish()) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale });\n\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n await strapi.db.transaction(async () => {\n if (discardDraft) {\n await documentManager.discardDraft(document.documentId, model, { locale });\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.unpublish(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n });\n },\n\n async discard(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale, status: 'published' });\n\n // Can not discard a document that is not published\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.discardDraft(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query } = ctx.request;\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const document = await findDocument({}, model, { locale });\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.read(document)) {\n return ctx.forbidden();\n }\n\n const counts = await documentManager.countDraftRelations(document.documentId, model, locale);\n\n return {\n data: counts,\n };\n },\n};\n"],"names":["buildPopulateFromQuery","query","model","getService","populateFromQuery","populateDeep","Infinity","countRelations","withPopulateOverride","getPopulateForLocalizations","build","findDocument","uid","opts","documentManager","populate","findMany","then","documents","createOrUpdateDocument","ctx","user","userAbility","state","params","body","request","permissionChecker","create","cannot","update","errors","ForbiddenError","sanitizedQuery","locale","getDocumentLocaleAndStatus","documentVersion","otherDocumentVersion","Promise","all","status","strapi","db","findOne","select","documentId","pickPermittedFields","sanitizeUpdateInput","sanitizeCreateInput","setCreator","setCreatorFields","isEdition","sanitizeFn","async","pipe","sanitizedBody","data","find","read","forbidden","permissionQuery","version","document","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","sanitizeOutput","createOrUpdate","delete","documentLocales","findLocales","undefined","length","deletedEntity","at","publish","publishedDocument","transaction","shouldUpdate","can","shouldCreate","NotFoundError","publishResult","unpublish","discardDraft","discard","countDraftRelations","counts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"single-types.mjs","sources":["../../../server/src/controllers/single-types.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { setCreatorFields, async, errors } from '@strapi/utils';\n\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { getService } from '../utils';\nimport { formatDocumentWithMetadata } from './utils/metadata';\nimport { getPopulateForLocalizations } from '../services/utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from '../services/utils/draft-relations';\n\ntype OptionsWithPopulate = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\nconst buildPopulateFromQuery = async (query: any, model: any) => {\n return getService('populate-builder')(model)\n .populateFromQuery(query)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(model))\n .build();\n};\n\nconst findDocument = async (query: any, uid: UID.SingleType, opts: any = {}) => {\n const documentManager = getService('document-manager');\n const populate = await buildPopulateFromQuery(query, uid);\n\n return (\n documentManager\n .findMany({ ...opts, populate }, uid)\n // Return the first document found\n .then((documents: any) => documents[0])\n );\n};\n\nconst createOrUpdateDocument = async (ctx: any, opts?: OptionsWithPopulate) => {\n const { user, userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n findDocument(sanitizedQuery, model, { locale, status: 'draft' }),\n // Find the first document to check if it exists\n strapi.db.query(model).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n const pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n\n // If version is not found, but document exists,\n // the intent is to create a new document 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 sanitizedBody = await sanitizeFn(body);\n\n if (!documentId) {\n return documentManager.create(model, {\n data: sanitizedBody,\n ...sanitizedQuery,\n locale,\n });\n }\n\n return documentManager.update(documentId, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n};\n\nexport default {\n async find(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const version = await findDocument(permissionQuery, model, { locale, status });\n\n // allow user with create permission to know a single type is not created\n if (!version) {\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n // Check if document exists\n const document = await strapi.db.query(model).findOne({});\n\n if (!document) {\n return ctx.notFound();\n }\n\n // If the requested locale doesn't exist, return an empty response\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n model,\n // @ts-expect-error - fix types\n { documentId: document.documentId, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n ctx.body = { data: {}, meta };\n return;\n }\n\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async createOrUpdate(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const document = await createOrUpdateDocument(ctx);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.delete()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n const documentLocales = await documentManager.findLocales(undefined, model, {\n populate,\n locale,\n });\n\n if (documentLocales.length === 0) {\n return ctx.notFound();\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n return ctx.forbidden();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales.at(0).documentId, model, {\n locale,\n });\n\n ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n },\n\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.publish()) {\n return ctx.forbidden();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Find the existing document\n let document = await findDocument(sanitizedQuery, model, { locale, status: 'draft' });\n\n // If document exists and user can update it, update it before publishing\n const shouldUpdate = document && permissionChecker.can.update(document);\n // If document doesn't exist and user can create it, create it before publishing\n const shouldCreate = !document && permissionChecker.can.create();\n if (shouldUpdate || shouldCreate) {\n document = await createOrUpdateDocument(ctx, { populate });\n } else if (!document) {\n // Document doesn't exist and user can't create it\n throw new errors.ForbiddenError();\n }\n\n // If document doesn't exist, throw an error\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, model, { locale });\n\n return publishResult.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const {\n body: { discardDraft, ...body },\n query = {},\n } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.unpublish()) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale });\n\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n await strapi.db.transaction(async () => {\n if (discardDraft) {\n await documentManager.discardDraft(document.documentId, model, { locale });\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.unpublish(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n });\n },\n\n async discard(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale, status: 'published' });\n\n // Can not discard a document that is not published\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.discardDraft(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query } = ctx.request;\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n\n const document = await findDocument(permissionQuery, model, { locale });\n\n if (!document) {\n // The single type may simply not have a version in the requested locale yet.\n // Check every existing locale/status version — findLocales returns one row\n // per locale AND per publication state — before deciding it truly doesn't exist.\n const populate = await buildPopulateFromQuery(permissionQuery, model);\n const versions = await documentManager.findLocales(undefined, model, { populate });\n\n if (versions.length === 0) {\n return ctx.notFound();\n }\n\n if (versions.every((version) => permissionChecker.cannot.read(version))) {\n return ctx.forbidden();\n }\n\n return { data: EMPTY_DRAFT_RELATION_COUNTS };\n }\n\n if (permissionChecker.cannot.read(document)) {\n return ctx.forbidden();\n }\n\n const counts = await documentManager.countDraftRelations(document.documentId, model, locale);\n\n return {\n data: counts,\n };\n },\n};\n"],"names":["buildPopulateFromQuery","query","model","getService","populateFromQuery","populateDeep","Infinity","countRelations","withPopulateOverride","getPopulateForLocalizations","build","findDocument","uid","opts","documentManager","populate","findMany","then","documents","createOrUpdateDocument","ctx","user","userAbility","state","params","body","request","permissionChecker","create","cannot","update","errors","ForbiddenError","sanitizedQuery","locale","getDocumentLocaleAndStatus","documentVersion","otherDocumentVersion","Promise","all","status","strapi","db","findOne","select","documentId","pickPermittedFields","sanitizeUpdateInput","sanitizeCreateInput","setCreator","setCreatorFields","isEdition","sanitizeFn","async","pipe","sanitizedBody","data","find","read","forbidden","permissionQuery","version","document","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","sanitizeOutput","createOrUpdate","delete","documentLocales","findLocales","undefined","length","deletedEntity","at","publish","publishedDocument","transaction","shouldUpdate","can","shouldCreate","NotFoundError","publishResult","unpublish","discardDraft","discard","countDraftRelations","versions","every","EMPTY_DRAFT_RELATION_COUNTS","counts"],"mappings":"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"}
|
package/dist/server/mcp/utils.js
CHANGED
|
@@ -5,12 +5,14 @@ var shapeRelations = require('./sanitizers/shape-relations.js');
|
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Converts a Strapi content-type UID into a safe MCP tool-name segment.
|
|
8
|
-
* `api::article.article` → `article`; `
|
|
8
|
+
* `api::article.article` → `article`; `api::writer.editor` → `writer_editor` (the api name and the
|
|
9
|
+
* content-type name differ, so both are kept to stay unique within the api);
|
|
10
|
+
* `plugin::i18n.locale` → `plugin-i18n_locale`.
|
|
9
11
|
*/ const slugifyUidForMcpToolName = (uid)=>{
|
|
10
12
|
const [namespace, modelName] = uid.split('::');
|
|
11
13
|
const parts = modelName.split('.').map((part)=>part.toLowerCase());
|
|
12
14
|
if (namespace === 'api') {
|
|
13
|
-
return parts[0];
|
|
15
|
+
return parts[0] === parts[1] ? parts[0] : parts.join('_');
|
|
14
16
|
}
|
|
15
17
|
return `${namespace.toLowerCase()}-${parts.join('_')}`;
|
|
16
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../server/src/mcp/utils.ts"],"sourcesContent":["import type { Modules, UID } from '@strapi/types';\n\nimport { formatDocumentWithMetadata } from '../controllers/utils/metadata';\nimport type { GetMetadataOptions } from '../services/document-metadata';\nimport { shapeRelationsForMcp } from './sanitizers/shape-relations';\n\n/**\n * Converts a Strapi content-type UID into a safe MCP tool-name segment.\n * `api::article.article` → `article`; `plugin::i18n.locale` → `plugin-i18n_locale`.\n */\nexport const slugifyUidForMcpToolName = (uid: string): string => {\n const [namespace, modelName] = uid.split('::');\n const parts = modelName.split('.').map((part) => part.toLowerCase());\n\n if (namespace === 'api') {\n return parts[0];\n }\n\n return `${namespace.toLowerCase()}-${parts.join('_')}`;\n};\n\ntype McpPermissionChecker = {\n sanitizeOutput: (doc: unknown) => Promise<Record<string, unknown>>;\n};\n\n/**\n * Output chokepoint for MCP handlers returning `{ data, meta }`.\n * Order matters — calculate, then strip:\n * 1. permission-based sanitization,\n * 2. formatDocumentWithMetadata — computes `data.status` and `localizations[].status`\n * from `publishedAt`/`updatedAt`, which relation shaping removes,\n * 3. relation shaping on the formatted `data` (identity-only relations; the\n * freshly-computed `localizations[].status` survives via RelationIdentity).\n *\n * Handlers that do NOT attach metadata (delete, list) compose\n * `permissionChecker.sanitizeOutput` + `shapeRelationsForMcp` directly instead.\n */\nexport const sanitizeFormatShape = async (\n permissionChecker: McpPermissionChecker,\n uid: UID.ContentType,\n doc: unknown,\n opts?: GetMetadataOptions\n): Promise<Record<string, unknown>> => {\n const sanitized = await permissionChecker.sanitizeOutput(doc);\n const formatted = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n sanitized as unknown as Parameters<typeof formatDocumentWithMetadata>[2],\n opts\n );\n\n if (formatted.data === null || formatted.data === undefined) {\n return formatted;\n }\n\n const shapedData = await shapeRelationsForMcp(uid, formatted.data as Record<string, unknown>);\n return { ...formatted, data: shapedData };\n};\n\n/** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */\nexport const ok = (\n structuredContent: Record<string, unknown>\n): Modules.MCP.McpToolHandlerReturn => ({\n content: [{ type: 'text', text: JSON.stringify(structuredContent) }],\n structuredContent,\n});\n\n/**\n * Generates the `title` and `description` metadata for a derived MCP tool.\n * Appends operation-specific notes for write/publish/unpublish/discard_draft operations.\n */\nexport const describeTool = (params: {\n apiID: string;\n uid: string;\n operation: string;\n}): { title: string; description: string } => {\n const { apiID, uid, operation } = params;\n const operationNoteByType: Partial<Record<string, string>> = {\n write:\n ' Creates or updates the single-type document. If no document exists, creates one; otherwise updates the existing draft.',\n publish:\n ' Operates on an existing document by documentId and may return a different numeric id for the published version row.',\n unpublish:\n ' Operates on an existing document by documentId and may return a different numeric id for the draft version row.',\n discard_draft:\n ' Operates on an existing document by documentId; treat documentId as the stable identity.',\n };\n\n return {\n title: `Content: ${apiID} — ${operation}`,\n description: `Content-manager ${operation} for ${uid}.${operationNoteByType[operation] ?? ''}`,\n };\n};\n"],"names":["slugifyUidForMcpToolName","uid","namespace","modelName","split","parts","map","part","toLowerCase","join","sanitizeFormatShape","permissionChecker","doc","opts","sanitized","sanitizeOutput","formatted","formatDocumentWithMetadata","data","undefined","shapedData","shapeRelationsForMcp","ok","structuredContent","content","type","text","JSON","stringify","describeTool","params","apiID","operation","operationNoteByType","write","publish","unpublish","discard_draft","title","description"],"mappings":";;;;;AAMA
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../server/src/mcp/utils.ts"],"sourcesContent":["import type { Modules, UID } from '@strapi/types';\n\nimport { formatDocumentWithMetadata } from '../controllers/utils/metadata';\nimport type { GetMetadataOptions } from '../services/document-metadata';\nimport { shapeRelationsForMcp } from './sanitizers/shape-relations';\n\n/**\n * Converts a Strapi content-type UID into a safe MCP tool-name segment.\n * `api::article.article` → `article`; `api::writer.editor` → `writer_editor` (the api name and the\n * content-type name differ, so both are kept to stay unique within the api);\n * `plugin::i18n.locale` → `plugin-i18n_locale`.\n */\nexport const slugifyUidForMcpToolName = (uid: string): string => {\n const [namespace, modelName] = uid.split('::');\n const parts = modelName.split('.').map((part) => part.toLowerCase());\n\n if (namespace === 'api') {\n return parts[0] === parts[1] ? parts[0] : parts.join('_');\n }\n\n return `${namespace.toLowerCase()}-${parts.join('_')}`;\n};\n\ntype McpPermissionChecker = {\n sanitizeOutput: (doc: unknown) => Promise<Record<string, unknown>>;\n};\n\n/**\n * Output chokepoint for MCP handlers returning `{ data, meta }`.\n * Order matters — calculate, then strip:\n * 1. permission-based sanitization,\n * 2. formatDocumentWithMetadata — computes `data.status` and `localizations[].status`\n * from `publishedAt`/`updatedAt`, which relation shaping removes,\n * 3. relation shaping on the formatted `data` (identity-only relations; the\n * freshly-computed `localizations[].status` survives via RelationIdentity).\n *\n * Handlers that do NOT attach metadata (delete, list) compose\n * `permissionChecker.sanitizeOutput` + `shapeRelationsForMcp` directly instead.\n */\nexport const sanitizeFormatShape = async (\n permissionChecker: McpPermissionChecker,\n uid: UID.ContentType,\n doc: unknown,\n opts?: GetMetadataOptions\n): Promise<Record<string, unknown>> => {\n const sanitized = await permissionChecker.sanitizeOutput(doc);\n const formatted = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n sanitized as unknown as Parameters<typeof formatDocumentWithMetadata>[2],\n opts\n );\n\n if (formatted.data === null || formatted.data === undefined) {\n return formatted;\n }\n\n const shapedData = await shapeRelationsForMcp(uid, formatted.data as Record<string, unknown>);\n return { ...formatted, data: shapedData };\n};\n\n/** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */\nexport const ok = (\n structuredContent: Record<string, unknown>\n): Modules.MCP.McpToolHandlerReturn => ({\n content: [{ type: 'text', text: JSON.stringify(structuredContent) }],\n structuredContent,\n});\n\n/**\n * Generates the `title` and `description` metadata for a derived MCP tool.\n * Appends operation-specific notes for write/publish/unpublish/discard_draft operations.\n */\nexport const describeTool = (params: {\n apiID: string;\n uid: string;\n operation: string;\n}): { title: string; description: string } => {\n const { apiID, uid, operation } = params;\n const operationNoteByType: Partial<Record<string, string>> = {\n write:\n ' Creates or updates the single-type document. If no document exists, creates one; otherwise updates the existing draft.',\n publish:\n ' Operates on an existing document by documentId and may return a different numeric id for the published version row.',\n unpublish:\n ' Operates on an existing document by documentId and may return a different numeric id for the draft version row.',\n discard_draft:\n ' Operates on an existing document by documentId; treat documentId as the stable identity.',\n };\n\n return {\n title: `Content: ${apiID} — ${operation}`,\n description: `Content-manager ${operation} for ${uid}.${operationNoteByType[operation] ?? ''}`,\n };\n};\n"],"names":["slugifyUidForMcpToolName","uid","namespace","modelName","split","parts","map","part","toLowerCase","join","sanitizeFormatShape","permissionChecker","doc","opts","sanitized","sanitizeOutput","formatted","formatDocumentWithMetadata","data","undefined","shapedData","shapeRelationsForMcp","ok","structuredContent","content","type","text","JSON","stringify","describeTool","params","apiID","operation","operationNoteByType","write","publish","unpublish","discard_draft","title","description"],"mappings":";;;;;AAMA;;;;;IAMO,MAAMA,wBAAAA,GAA2B,CAACC,GAAAA,GAAAA;AACvC,IAAA,MAAM,CAACC,SAAAA,EAAWC,SAAAA,CAAU,GAAGF,GAAAA,CAAIG,KAAK,CAAC,IAAA,CAAA;IACzC,MAAMC,KAAAA,GAAQF,SAAAA,CAAUC,KAAK,CAAC,GAAA,CAAA,CAAKE,GAAG,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,WAAW,EAAA,CAAA;AAEjE,IAAA,IAAIN,cAAc,KAAA,EAAO;AACvB,QAAA,OAAOG,KAAK,CAAC,CAAA,CAAE,KAAKA,KAAK,CAAC,CAAA,CAAE,GAAGA,KAAK,CAAC,CAAA,CAAE,GAAGA,KAAAA,CAAMI,IAAI,CAAC,GAAA,CAAA;AACvD,IAAA;IAEA,OAAO,CAAA,EAAGP,UAAUM,WAAW,EAAA,CAAG,CAAC,EAAEH,KAAAA,CAAMI,IAAI,CAAC,GAAA,CAAA,CAAA,CAAM;AACxD;AAMA;;;;;;;;;;;AAWC,IACM,MAAMC,mBAAAA,GAAsB,OACjCC,iBAAAA,EACAV,KACAW,GAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,SAAAA,GAAY,MAAMH,iBAAAA,CAAkBI,cAAc,CAACH,GAAAA,CAAAA;AACzD,IAAA,MAAMI,SAAAA,GAAY,MAAMC,mCAAAA,CACtBN,iBAAAA,EACAV,KACAa,SAAAA,EACAD,IAAAA,CAAAA;AAGF,IAAA,IAAIG,UAAUE,IAAI,KAAK,QAAQF,SAAAA,CAAUE,IAAI,KAAKC,SAAAA,EAAW;QAC3D,OAAOH,SAAAA;AACT,IAAA;AAEA,IAAA,MAAMI,UAAAA,GAAa,MAAMC,mCAAAA,CAAqBpB,GAAAA,EAAKe,UAAUE,IAAI,CAAA;IACjE,OAAO;AAAE,QAAA,GAAGF,SAAS;QAAEE,IAAAA,EAAME;AAAW,KAAA;AAC1C;AAEA,2GACO,MAAME,EAAAA,GAAK,CAChBC,qBACsC;QACtCC,OAAAA,EAAS;AAAC,YAAA;gBAAEC,IAAAA,EAAM,MAAA;gBAAQC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAACL,iBAAAA;AAAmB;AAAE,SAAA;AACpEA,QAAAA;AACF,KAAA;AAEA;;;IAIO,MAAMM,YAAAA,GAAe,CAACC,MAAAA,GAAAA;AAK3B,IAAA,MAAM,EAAEC,KAAK,EAAE9B,GAAG,EAAE+B,SAAS,EAAE,GAAGF,MAAAA;AAClC,IAAA,MAAMG,mBAAAA,GAAuD;QAC3DC,KAAAA,EACE,yHAAA;QACFC,OAAAA,EACE,sHAAA;QACFC,SAAAA,EACE,kHAAA;QACFC,aAAAA,EACE;AACJ,KAAA;IAEA,OAAO;AACLC,QAAAA,KAAAA,EAAO,CAAC,SAAS,EAAEP,KAAAA,CAAM,GAAG,EAAEC,SAAAA,CAAAA,CAAW;AACzCO,QAAAA,WAAAA,EAAa,CAAC,gBAAgB,EAAEP,SAAAA,CAAU,KAAK,EAAE/B,GAAAA,CAAI,CAAC,EAAEgC,mBAAmB,CAACD,SAAAA,CAAU,IAAI,EAAA,CAAA;AAC5F,KAAA;AACF;;;;;;;"}
|
|
@@ -3,12 +3,14 @@ import { shapeRelationsForMcp } from './sanitizers/shape-relations.mjs';
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Converts a Strapi content-type UID into a safe MCP tool-name segment.
|
|
6
|
-
* `api::article.article` → `article`; `
|
|
6
|
+
* `api::article.article` → `article`; `api::writer.editor` → `writer_editor` (the api name and the
|
|
7
|
+
* content-type name differ, so both are kept to stay unique within the api);
|
|
8
|
+
* `plugin::i18n.locale` → `plugin-i18n_locale`.
|
|
7
9
|
*/ const slugifyUidForMcpToolName = (uid)=>{
|
|
8
10
|
const [namespace, modelName] = uid.split('::');
|
|
9
11
|
const parts = modelName.split('.').map((part)=>part.toLowerCase());
|
|
10
12
|
if (namespace === 'api') {
|
|
11
|
-
return parts[0];
|
|
13
|
+
return parts[0] === parts[1] ? parts[0] : parts.join('_');
|
|
12
14
|
}
|
|
13
15
|
return `${namespace.toLowerCase()}-${parts.join('_')}`;
|
|
14
16
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","sources":["../../../server/src/mcp/utils.ts"],"sourcesContent":["import type { Modules, UID } from '@strapi/types';\n\nimport { formatDocumentWithMetadata } from '../controllers/utils/metadata';\nimport type { GetMetadataOptions } from '../services/document-metadata';\nimport { shapeRelationsForMcp } from './sanitizers/shape-relations';\n\n/**\n * Converts a Strapi content-type UID into a safe MCP tool-name segment.\n * `api::article.article` → `article`; `plugin::i18n.locale` → `plugin-i18n_locale`.\n */\nexport const slugifyUidForMcpToolName = (uid: string): string => {\n const [namespace, modelName] = uid.split('::');\n const parts = modelName.split('.').map((part) => part.toLowerCase());\n\n if (namespace === 'api') {\n return parts[0];\n }\n\n return `${namespace.toLowerCase()}-${parts.join('_')}`;\n};\n\ntype McpPermissionChecker = {\n sanitizeOutput: (doc: unknown) => Promise<Record<string, unknown>>;\n};\n\n/**\n * Output chokepoint for MCP handlers returning `{ data, meta }`.\n * Order matters — calculate, then strip:\n * 1. permission-based sanitization,\n * 2. formatDocumentWithMetadata — computes `data.status` and `localizations[].status`\n * from `publishedAt`/`updatedAt`, which relation shaping removes,\n * 3. relation shaping on the formatted `data` (identity-only relations; the\n * freshly-computed `localizations[].status` survives via RelationIdentity).\n *\n * Handlers that do NOT attach metadata (delete, list) compose\n * `permissionChecker.sanitizeOutput` + `shapeRelationsForMcp` directly instead.\n */\nexport const sanitizeFormatShape = async (\n permissionChecker: McpPermissionChecker,\n uid: UID.ContentType,\n doc: unknown,\n opts?: GetMetadataOptions\n): Promise<Record<string, unknown>> => {\n const sanitized = await permissionChecker.sanitizeOutput(doc);\n const formatted = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n sanitized as unknown as Parameters<typeof formatDocumentWithMetadata>[2],\n opts\n );\n\n if (formatted.data === null || formatted.data === undefined) {\n return formatted;\n }\n\n const shapedData = await shapeRelationsForMcp(uid, formatted.data as Record<string, unknown>);\n return { ...formatted, data: shapedData };\n};\n\n/** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */\nexport const ok = (\n structuredContent: Record<string, unknown>\n): Modules.MCP.McpToolHandlerReturn => ({\n content: [{ type: 'text', text: JSON.stringify(structuredContent) }],\n structuredContent,\n});\n\n/**\n * Generates the `title` and `description` metadata for a derived MCP tool.\n * Appends operation-specific notes for write/publish/unpublish/discard_draft operations.\n */\nexport const describeTool = (params: {\n apiID: string;\n uid: string;\n operation: string;\n}): { title: string; description: string } => {\n const { apiID, uid, operation } = params;\n const operationNoteByType: Partial<Record<string, string>> = {\n write:\n ' Creates or updates the single-type document. If no document exists, creates one; otherwise updates the existing draft.',\n publish:\n ' Operates on an existing document by documentId and may return a different numeric id for the published version row.',\n unpublish:\n ' Operates on an existing document by documentId and may return a different numeric id for the draft version row.',\n discard_draft:\n ' Operates on an existing document by documentId; treat documentId as the stable identity.',\n };\n\n return {\n title: `Content: ${apiID} — ${operation}`,\n description: `Content-manager ${operation} for ${uid}.${operationNoteByType[operation] ?? ''}`,\n };\n};\n"],"names":["slugifyUidForMcpToolName","uid","namespace","modelName","split","parts","map","part","toLowerCase","join","sanitizeFormatShape","permissionChecker","doc","opts","sanitized","sanitizeOutput","formatted","formatDocumentWithMetadata","data","undefined","shapedData","shapeRelationsForMcp","ok","structuredContent","content","type","text","JSON","stringify","describeTool","params","apiID","operation","operationNoteByType","write","publish","unpublish","discard_draft","title","description"],"mappings":";;;AAMA
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../server/src/mcp/utils.ts"],"sourcesContent":["import type { Modules, UID } from '@strapi/types';\n\nimport { formatDocumentWithMetadata } from '../controllers/utils/metadata';\nimport type { GetMetadataOptions } from '../services/document-metadata';\nimport { shapeRelationsForMcp } from './sanitizers/shape-relations';\n\n/**\n * Converts a Strapi content-type UID into a safe MCP tool-name segment.\n * `api::article.article` → `article`; `api::writer.editor` → `writer_editor` (the api name and the\n * content-type name differ, so both are kept to stay unique within the api);\n * `plugin::i18n.locale` → `plugin-i18n_locale`.\n */\nexport const slugifyUidForMcpToolName = (uid: string): string => {\n const [namespace, modelName] = uid.split('::');\n const parts = modelName.split('.').map((part) => part.toLowerCase());\n\n if (namespace === 'api') {\n return parts[0] === parts[1] ? parts[0] : parts.join('_');\n }\n\n return `${namespace.toLowerCase()}-${parts.join('_')}`;\n};\n\ntype McpPermissionChecker = {\n sanitizeOutput: (doc: unknown) => Promise<Record<string, unknown>>;\n};\n\n/**\n * Output chokepoint for MCP handlers returning `{ data, meta }`.\n * Order matters — calculate, then strip:\n * 1. permission-based sanitization,\n * 2. formatDocumentWithMetadata — computes `data.status` and `localizations[].status`\n * from `publishedAt`/`updatedAt`, which relation shaping removes,\n * 3. relation shaping on the formatted `data` (identity-only relations; the\n * freshly-computed `localizations[].status` survives via RelationIdentity).\n *\n * Handlers that do NOT attach metadata (delete, list) compose\n * `permissionChecker.sanitizeOutput` + `shapeRelationsForMcp` directly instead.\n */\nexport const sanitizeFormatShape = async (\n permissionChecker: McpPermissionChecker,\n uid: UID.ContentType,\n doc: unknown,\n opts?: GetMetadataOptions\n): Promise<Record<string, unknown>> => {\n const sanitized = await permissionChecker.sanitizeOutput(doc);\n const formatted = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n sanitized as unknown as Parameters<typeof formatDocumentWithMetadata>[2],\n opts\n );\n\n if (formatted.data === null || formatted.data === undefined) {\n return formatted;\n }\n\n const shapedData = await shapeRelationsForMcp(uid, formatted.data as Record<string, unknown>);\n return { ...formatted, data: shapedData };\n};\n\n/** Wraps a plain object into the dual-representation MCP tool return value (text + structuredContent). */\nexport const ok = (\n structuredContent: Record<string, unknown>\n): Modules.MCP.McpToolHandlerReturn => ({\n content: [{ type: 'text', text: JSON.stringify(structuredContent) }],\n structuredContent,\n});\n\n/**\n * Generates the `title` and `description` metadata for a derived MCP tool.\n * Appends operation-specific notes for write/publish/unpublish/discard_draft operations.\n */\nexport const describeTool = (params: {\n apiID: string;\n uid: string;\n operation: string;\n}): { title: string; description: string } => {\n const { apiID, uid, operation } = params;\n const operationNoteByType: Partial<Record<string, string>> = {\n write:\n ' Creates or updates the single-type document. If no document exists, creates one; otherwise updates the existing draft.',\n publish:\n ' Operates on an existing document by documentId and may return a different numeric id for the published version row.',\n unpublish:\n ' Operates on an existing document by documentId and may return a different numeric id for the draft version row.',\n discard_draft:\n ' Operates on an existing document by documentId; treat documentId as the stable identity.',\n };\n\n return {\n title: `Content: ${apiID} — ${operation}`,\n description: `Content-manager ${operation} for ${uid}.${operationNoteByType[operation] ?? ''}`,\n };\n};\n"],"names":["slugifyUidForMcpToolName","uid","namespace","modelName","split","parts","map","part","toLowerCase","join","sanitizeFormatShape","permissionChecker","doc","opts","sanitized","sanitizeOutput","formatted","formatDocumentWithMetadata","data","undefined","shapedData","shapeRelationsForMcp","ok","structuredContent","content","type","text","JSON","stringify","describeTool","params","apiID","operation","operationNoteByType","write","publish","unpublish","discard_draft","title","description"],"mappings":";;;AAMA;;;;;IAMO,MAAMA,wBAAAA,GAA2B,CAACC,GAAAA,GAAAA;AACvC,IAAA,MAAM,CAACC,SAAAA,EAAWC,SAAAA,CAAU,GAAGF,GAAAA,CAAIG,KAAK,CAAC,IAAA,CAAA;IACzC,MAAMC,KAAAA,GAAQF,SAAAA,CAAUC,KAAK,CAAC,GAAA,CAAA,CAAKE,GAAG,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,WAAW,EAAA,CAAA;AAEjE,IAAA,IAAIN,cAAc,KAAA,EAAO;AACvB,QAAA,OAAOG,KAAK,CAAC,CAAA,CAAE,KAAKA,KAAK,CAAC,CAAA,CAAE,GAAGA,KAAK,CAAC,CAAA,CAAE,GAAGA,KAAAA,CAAMI,IAAI,CAAC,GAAA,CAAA;AACvD,IAAA;IAEA,OAAO,CAAA,EAAGP,UAAUM,WAAW,EAAA,CAAG,CAAC,EAAEH,KAAAA,CAAMI,IAAI,CAAC,GAAA,CAAA,CAAA,CAAM;AACxD;AAMA;;;;;;;;;;;AAWC,IACM,MAAMC,mBAAAA,GAAsB,OACjCC,iBAAAA,EACAV,KACAW,GAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,SAAAA,GAAY,MAAMH,iBAAAA,CAAkBI,cAAc,CAACH,GAAAA,CAAAA;AACzD,IAAA,MAAMI,SAAAA,GAAY,MAAMC,0BAAAA,CACtBN,iBAAAA,EACAV,KACAa,SAAAA,EACAD,IAAAA,CAAAA;AAGF,IAAA,IAAIG,UAAUE,IAAI,KAAK,QAAQF,SAAAA,CAAUE,IAAI,KAAKC,SAAAA,EAAW;QAC3D,OAAOH,SAAAA;AACT,IAAA;AAEA,IAAA,MAAMI,UAAAA,GAAa,MAAMC,oBAAAA,CAAqBpB,GAAAA,EAAKe,UAAUE,IAAI,CAAA;IACjE,OAAO;AAAE,QAAA,GAAGF,SAAS;QAAEE,IAAAA,EAAME;AAAW,KAAA;AAC1C;AAEA,2GACO,MAAME,EAAAA,GAAK,CAChBC,qBACsC;QACtCC,OAAAA,EAAS;AAAC,YAAA;gBAAEC,IAAAA,EAAM,MAAA;gBAAQC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAACL,iBAAAA;AAAmB;AAAE,SAAA;AACpEA,QAAAA;AACF,KAAA;AAEA;;;IAIO,MAAMM,YAAAA,GAAe,CAACC,MAAAA,GAAAA;AAK3B,IAAA,MAAM,EAAEC,KAAK,EAAE9B,GAAG,EAAE+B,SAAS,EAAE,GAAGF,MAAAA;AAClC,IAAA,MAAMG,mBAAAA,GAAuD;QAC3DC,KAAAA,EACE,yHAAA;QACFC,OAAAA,EACE,sHAAA;QACFC,SAAAA,EACE,kHAAA;QACFC,aAAAA,EACE;AACJ,KAAA;IAEA,OAAO;AACLC,QAAAA,KAAAA,EAAO,CAAC,SAAS,EAAEP,KAAAA,CAAM,GAAG,EAAEC,SAAAA,CAAAA,CAAW;AACzCO,QAAAA,WAAAA,EAAa,CAAC,gBAAgB,EAAEP,SAAAA,CAAU,KAAK,EAAE/B,GAAAA,CAAI,CAAC,EAAEgC,mBAAmB,CAACD,SAAAA,CAAU,IAAI,EAAA,CAAA;AAC5F,KAAA;AACF;;;;"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
4
|
var strapiUtils = require('@strapi/utils');
|
|
5
5
|
var populate = require('./utils/populate.js');
|
|
6
|
+
var draftRelations = require('./utils/draft-relations.js');
|
|
6
7
|
var draft = require('./utils/draft.js');
|
|
7
8
|
|
|
8
|
-
const { ApplicationError } = strapiUtils.errors;
|
|
9
9
|
const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;
|
|
10
10
|
const omitPublishedAtField = fp.omit(PUBLISHED_AT_ATTRIBUTE);
|
|
11
11
|
const omitIdField = fp.omit('id');
|
|
@@ -200,10 +200,7 @@ const documentManager = ({ strapi })=>{
|
|
|
200
200
|
async countDraftRelations (id, uid, locale) {
|
|
201
201
|
const { populate: populate$1, hasRelations } = populate.getDeepPopulateDraftCount(uid);
|
|
202
202
|
if (!hasRelations) {
|
|
203
|
-
return
|
|
204
|
-
unpublishedRelations: 0,
|
|
205
|
-
draftM2mLinks: 0
|
|
206
|
-
};
|
|
203
|
+
return draftRelations.EMPTY_DRAFT_RELATION_COUNTS;
|
|
207
204
|
}
|
|
208
205
|
const document = await strapi.documents(uid).findOne({
|
|
209
206
|
documentId: id,
|
|
@@ -211,7 +208,7 @@ const documentManager = ({ strapi })=>{
|
|
|
211
208
|
locale
|
|
212
209
|
});
|
|
213
210
|
if (!document) {
|
|
214
|
-
|
|
211
|
+
return draftRelations.EMPTY_DRAFT_RELATION_COUNTS;
|
|
215
212
|
}
|
|
216
213
|
return draft.sumDraftCounts(strapi, document, uid);
|
|
217
214
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(['id', 'documentId'], body),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return { unpublishedRelations: 0, draftM2mLinks: 0 };\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","unpublishedRelations","draftM2mLinks","document","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\n\nimport { contentTypes, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(['id', 'documentId'], body),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","document","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":";;;;;;;;AAaA,MAAM,EAAEA,sBAAsB,EAAE,GAAGC,yBAAaC,SAAS;AAEzD,MAAMC,uBAAuBC,OAAAA,CAAKJ,sBAAAA,CAAAA;AAClC,MAAMK,cAAcD,OAAAA,CAAK,IAAA,CAAA;AAEzB,MAAME,eAAAA,GAAkB,CAAC,EAAEC,MAAM,EAA2B,GAAA;IAC1D,OAAO;AACL,QAAA,MAAMC,SACJC,EAAU,EACVC,GAAuB,EACvBC,IAAAA,GAAwD,EAAE,EAAA;AAE1D,YAAA,OAAOJ,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKF,OAAO,CAAC;AAAE,gBAAA,GAAGG,IAAI;gBAAEE,UAAAA,EAAYJ;AAAG,aAAA,CAAA;AACjE,QAAA,CAAA;AAEA;;AAEC,QACD,MAAMK,WAAAA,CAAAA,CACJL,EAAiC,EACjCC,GAAuB,EACvBC,IAIC,EAAA;;AAGD,YAAA,MAAMI,QAAa,EAAC;;AAGpB,YAAA,IAAIN,EAAAA,EAAI;AACNM,gBAAAA,KAAAA,CAAMF,UAAU,GAAGJ,EAAAA;AACrB,YAAA;;AAGA,YAAA,IAAIO,KAAAA,CAAMC,OAAO,CAACN,IAAAA,CAAKO,MAAM,CAAA,EAAG;AAC9BH,gBAAAA,KAAAA,CAAMG,MAAM,GAAG;AAAEC,oBAAAA,GAAAA,EAAKR,KAAKO;AAAO,iBAAA;AACpC,YAAA,CAAA,MAAO,IAAIP,IAAAA,CAAKO,MAAM,IAAIP,IAAAA,CAAKO,MAAM,KAAK,GAAA,EAAK;;gBAE7CH,KAAAA,CAAMG,MAAM,GAAGP,IAAAA,CAAKO,MAAM;AAC5B,YAAA;;AAGA,YAAA,IAAI,OAAOP,IAAAA,CAAKS,WAAW,KAAK,SAAA,EAAW;AACzCL,gBAAAA,KAAAA,CAAMM,WAAW,GAAG;AAAEC,oBAAAA,QAAAA,EAAUX,KAAKS;AAAY,iBAAA;AACnD,YAAA;AAEA,YAAA,OAAOb,OAAOgB,EAAE,CAACC,KAAK,CAACd,GAAAA,CAAAA,CAAKe,QAAQ,CAAC;AAAEC,gBAAAA,QAAAA,EAAUf,KAAKe,QAAQ;AAAEX,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA,CAAA;QAEA,MAAMU,QAAAA,CAAAA,CAASd,IAAkC,EAAED,GAAuB,EAAA;AACxE,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;AAAEe,gBAAAA,QAAAA,EAAUE,wBAAAA,CAAgBlB,GAAAA;AAAK,aAAA;AACzD,YAAA,OAAOH,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKe,QAAQ,CAACE,MAAAA,CAAAA;AACxC,QAAA,CAAA;QAEA,MAAME,QAAAA,CAAAA,CAASlB,IAAkC,EAAED,GAAuB,EAAA;AACxE,YAAA,MAAMiB,SAASG,sBAAAA,CAAWC,qBAAqB,CAACpB,IAAAA,IAAQ,EAAC,EAAG;gBAC1DqB,QAAAA,EAAU;AACZ,aAAA,CAAA;YAEA,MAAM,EAAEN,UAAUO,SAAS,EAAEC,MAAMC,KAAK,EAAE,GAAGC,WAAAA,EAAa,GAAGT,MAAAA;YAC7D,MAAM,CAACf,WAAWyB,KAAAA,GAAQ,CAAC,CAAC,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;AAC/ChC,gBAAAA,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKe,QAAQ,CAACE,MAAAA,CAAAA;AAC/BpB,gBAAAA,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAK8B,KAAK,CAACJ,WAAAA;AAC7B,aAAA,CAAA;YAED,OAAO;gBACLK,OAAAA,EAAS7B,SAAAA;gBACTkB,UAAAA,EAAYA,sBAAAA,CAAWY,4BAA4B,CAACf,MAAAA,EAAQU,KAAAA;AAC9D,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMM,MAAAA,CAAAA,CAAOjC,GAAuB,EAAEC,IAAAA,GAAmC,EAAS,EAAA;AAChF,YAAA,MAAMe,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMkB,0BAAAA,CAAkBlC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;gBAAEkC,MAAAA,EAAQ,OAAA;AAAkBnB,0BAAAA;AAAS,aAAA;AAE7D,YAAA,OAAOnB,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKiC,MAAM,CAAChB,MAAAA,CAAAA;AACtC,QAAA,CAAA;AAEA,QAAA,MAAMmB,QACJrC,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAuD,EAAS,EAAA;AAEhE,YAAA,MAAMoC,cAAcC,OAAAA,CAAK7C,oBAAAA,EAAsBE,aAAaM,IAAAA,CAAKsC,IAAI,IAAI,EAAC,CAAA;AAC1E,YAAA,MAAMvB,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMkB,0BAAAA,CAAkBlC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;gBAAEsC,IAAAA,EAAMF,WAAAA;AAAarB,0BAAAA,UAAAA;gBAAUmB,MAAAA,EAAQ;AAAQ,aAAA;AAEvE,YAAA,OAAOtC,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKoC,MAAM,CAAC;AAAE,gBAAA,GAAGnB,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA;AAClE,QAAA,CAAA;AAEA,QAAA,MAAMyC,KAAAA,CAAAA,CACJzC,EAAwB,EACxB0C,IAAsE,EACtEzC,GAAuB,EAAA;YAEvB,MAAMgB,UAAAA,GAAW,MAAMkB,0BAAAA,CAAkBlC,GAAAA,CAAAA;;AAGzC,YAAA,MAAMQ,SAASiC,IAAAA,EAAMjC,MAAAA;AACrB,YAAA,MAAMS,MAAAA,GAAS;;AAEbsB,gBAAAA,IAAAA,EAAM7C,OAAAA,CAAK;AAAC,oBAAA,IAAA;AAAM,oBAAA;iBAAa,EAAE+C,IAAAA,CAAAA;AACjCjC,gBAAAA,MAAAA;AACAQ,0BAAAA;AACF,aAAA;AAEA,YAAA,OAAOnB,MAAAA,CACJK,SAAS,CAACF,GAAAA,CAAAA,CACVwC,KAAK,CAAC;AAAE,gBAAA,GAAGvB,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA,CAClC2C,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,QAAQC,EAAAA,CAAG,CAAA,CAAA,CAAA;AACzC,QAAA,CAAA;AAEA;;AAEC,QACD,MAAMC,MAAAA,CAAAA,CAAO9C,GAAuB,EAAED,EAAW,EAAA;;AAE/C,YAAA,IAAIA,EAAAA,EAAI;gBACN,MAAM+B,KAAAA,GAAQ,MAAMjC,MAAAA,CAAOgB,EAAE,CAACC,KAAK,CAACd,GAAAA,CAAAA,CAAK8B,KAAK,CAAC;oBAAEzB,KAAAA,EAAO;wBAAEF,UAAAA,EAAYJ;AAAG;AAAE,iBAAA,CAAA;AAC3E,gBAAA,OAAO+B,KAAAA,GAAQ,CAAA;AACjB,YAAA;;YAGA,MAAMA,KAAAA,GAAQ,MAAMjC,MAAAA,CAAOgB,EAAE,CAACC,KAAK,CAACd,KAAK8B,KAAK,EAAA;AAC9C,YAAA,OAAOA,KAAAA,GAAQ,CAAA;AACjB,QAAA,CAAA;AAEA,QAAA,MAAMiB,QACJhD,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAuD,EAAS,EAAA;AAEhE,YAAA,MAAMJ,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAK+C,MAAM,CAAC;AACjC,gBAAA,GAAG9C,IAAI;gBACPE,UAAAA,EAAYJ;AACd,aAAA,CAAA;AACA,YAAA,OAAO,EAAC;AACV,QAAA,CAAA;;AAGA,QAAA,MAAMiD,YACJC,WAAmC,EACnCjD,GAAuB,EACvBC,IAAAA,GAA2D,EAAE,EAAA;AAE7D,YAAA,MAAMiD,iBAAiB,MAAMrD,MAAAA,CAAOgB,EAAE,CAACsC,WAAW,CAAC,UAAA;AACjD,gBAAA,OAAOvB,OAAAA,CAAQC,GAAG,CAACoB,WAAAA,CAAYG,GAAG,CAAC,OAAOrD,EAAAA,GAAO,IAAI,CAACgD,MAAM,CAAChD,IAAIC,GAAAA,EAAKC,IAAAA,CAAAA,CAAAA,CAAAA;AACxE,YAAA,CAAA,CAAA;YAEA,OAAO;AAAE6B,gBAAAA,KAAAA,EAAOoB,eAAeG;AAAO,aAAA;AACxC,QAAA,CAAA;AAEA,QAAA,MAAMC,SACJvD,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAgF,EAAS,EAAA;AAEzF,YAAA,MAAMe,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMkB,0BAAAA,CAAkBlC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;AAAEe,0BAAAA;AAAS,aAAA;AAEnC,YAAA,OAAOnB,MAAAA,CACJK,SAAS,CAACF,GAAAA,CAAAA,CACVsD,OAAO,CAAC;AAAE,gBAAA,GAAGrC,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA,CACpC2C,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,OAAAA,CAAAA;AAC9B,QAAA,CAAA;AAEA,QAAA,MAAMW,WAAAA,CAAAA,CAAYvD,GAAoB,EAAEiD,WAAqB,EAAEzC,MAA0B,EAAA;AACvF,YAAA,OAAOX,MAAAA,CAAOgB,EAAE,CAACsC,WAAW,CAAC,UAAA;AAC3B,gBAAA,MAAMpB,OAAAA,GAAU,MAAMH,OAAAA,CAAQC,GAAG,CAC/BoB,WAAAA,CAAYG,GAAG,CAAC,CAACjD,aAAe,IAAI,CAACmD,OAAO,CAACnD,YAAYH,GAAAA,EAAK;AAAEQ,wBAAAA,MAAAA;AAAQQ,wBAAAA,QAAAA,EAAU;AAAG,qBAAA,CAAA,CAAA,CAAA;AAGvF,gBAAA,MAAMwC,yBAAyBzB,OAAAA,CAAQ0B,IAAI,GAAGC,MAAM,CAACC,SAASN,MAAM;gBACpE,OAAOG,sBAAAA;AACT,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMI,eACJX,WAAmC,EACnCjD,GAAuB,EACvBC,IAAAA,GAA0D,EAAS,EAAA;AAEnE,YAAA,MAAM4D,qBAAqB,MAAMhE,MAAAA,CAAOgB,EAAE,CAACsC,WAAW,CAAC,UAAA;AACrD,gBAAA,OAAOvB,OAAAA,CAAQC,GAAG,CAChBoB,WAAAA,CAAYG,GAAG,CAAC,CAACrD,EAAAA,GACfF,MAAAA,CACGK,SAAS,CAACF,GAAAA,CAAAA,CACV8D,SAAS,CAAC;AAAE,wBAAA,GAAG7D,IAAI;wBAAEE,UAAAA,EAAYJ,EAAAA;AAAIiB,wBAAAA,QAAAA,EAAU;AAAG,qBAAA,CAAA,CAClD0B,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,OAAAA,CAAAA,CAAAA,CAAAA;AAGlC,YAAA,CAAA,CAAA;AAEA,YAAA,MAAMmB,2BAA2BF,kBAAAA,CAAmBJ,IAAI,GAAGC,MAAM,CAACC,SAASN,MAAM;;YAGjF,OAAO;gBAAEvB,KAAAA,EAAOiC;AAAyB,aAAA;AAC3C,QAAA,CAAA;AAEA,QAAA,MAAMD,WACJ/D,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAkF,EAAS,EAAA;AAE3F,YAAA,MAAMe,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMkB,0BAAAA,CAAkBlC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;AAAEe,0BAAAA;AAAS,aAAA;AAEnC,YAAA,OAAOnB,MAAAA,CACJK,SAAS,CAACF,GAAAA,CAAAA,CACV8D,SAAS,CAAC;AAAE,gBAAA,GAAG7C,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA,CACtC2C,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,QAAQC,EAAAA,CAAG,CAAA,CAAA,CAAA;AACzC,QAAA,CAAA;AAEA,QAAA,MAAMmB,cACJjE,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAqF,EAAS,EAAA;AAE9F,YAAA,MAAMe,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMkB,0BAAAA,CAAkBlC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;AAAEe,0BAAAA;AAAS,aAAA;AAEnC,YAAA,OAAOnB,MAAAA,CACJK,SAAS,CAACF,GAAAA,CAAAA,CACVgE,YAAY,CAAC;AAAE,gBAAA,GAAG/C,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA,CACzC2C,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,QAAQC,EAAAA,CAAG,CAAA,CAAA,CAAA;AACzC,QAAA,CAAA;AAEA,QAAA,MAAMoB,mBAAAA,CAAAA,CAAoBlE,EAAU,EAAEC,GAAoB,EAAEQ,MAAc,EAAA;AACxE,YAAA,MAAM,YAAEQ,UAAQ,EAAEkD,YAAY,EAAE,GAAGC,kCAAAA,CAA0BnE,GAAAA,CAAAA;AAE7D,YAAA,IAAI,CAACkE,YAAAA,EAAc;gBACjB,OAAOE,0CAAAA;AACT,YAAA;AAEA,YAAA,MAAMC,WAAW,MAAMxE,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKF,OAAO,CAAC;gBAAEK,UAAAA,EAAYJ,EAAAA;AAAIiB,0BAAAA,UAAAA;AAAUR,gBAAAA;AAAO,aAAA,CAAA;AACxF,YAAA,IAAI,CAAC6D,QAAAA,EAAU;gBACb,OAAOD,0CAAAA;AACT,YAAA;YAEA,OAAOE,oBAAAA,CAAezE,QAAQwE,QAAAA,EAAUrE,GAAAA,CAAAA;AAC1C,QAAA,CAAA;AAEA,QAAA,MAAMuE,8BAAAA,CAAAA,CACJtB,WAAmC,EACnCjD,GAAuB,EACvBQ,MAAyB,EAAA;AAEzB,YAAA,MAAM,YAAEQ,UAAQ,EAAEkD,YAAY,EAAE,GAAGC,kCAAAA,CAA0BnE,GAAAA,CAAAA;AAE7D,YAAA,IAAI,CAACkE,YAAAA,EAAc;gBACjB,OAAO,CAAA;AACT,YAAA;AAEA,YAAA,MAAMM,WAAW,MAAM3E,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKe,QAAQ,CAAC;AACpDC,0BAAAA,UAAAA;gBACAyD,OAAAA,EAAS;oBAAEtE,UAAAA,EAAY;wBAAEM,GAAAA,EAAKwC;AAAY;AAAE,iBAAA;AAC5CzC,gBAAAA,MAAAA;gBACA2B,MAAAA,EAAQ;AACV,aAAA,CAAA;AAEA,YAAA,MAAMuC,MAAAA,GAAS,MAAM9C,OAAAA,CAAQC,GAAG,CAC9B2C,QAAAA,CAASpB,GAAG,CAAC,CAACuB,MAAAA,GAAqBL,oBAAAA,CAAezE,MAAAA,EAAQ8E,MAAAA,EAAQ3E,GAAAA,CAAAA,CAAAA,CAAAA;AAGpE,YAAA,OAAO0E,MAAAA,CAAOE,MAAM,CAClB,CAACjD,KAAAA,EAAOkD,YAAAA,GACNlD,KAAAA,GAAQkD,YAAAA,CAAaC,oBAAoB,GAAGD,YAAAA,CAAaE,aAAa,EACxE,CAAA,CAAA;AAEJ,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { omit, pipe } from 'lodash/fp';
|
|
2
|
-
import {
|
|
2
|
+
import { contentTypes, pagination } from '@strapi/utils';
|
|
3
3
|
import { getDeepPopulateDraftCount, buildDeepPopulate, getDeepPopulate } from './utils/populate.mjs';
|
|
4
|
+
import { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations.mjs';
|
|
4
5
|
import { sumDraftCounts } from './utils/draft.mjs';
|
|
5
6
|
|
|
6
|
-
const { ApplicationError } = errors;
|
|
7
7
|
const { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;
|
|
8
8
|
const omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);
|
|
9
9
|
const omitIdField = omit('id');
|
|
@@ -198,10 +198,7 @@ const documentManager = ({ strapi })=>{
|
|
|
198
198
|
async countDraftRelations (id, uid, locale) {
|
|
199
199
|
const { populate, hasRelations } = getDeepPopulateDraftCount(uid);
|
|
200
200
|
if (!hasRelations) {
|
|
201
|
-
return
|
|
202
|
-
unpublishedRelations: 0,
|
|
203
|
-
draftM2mLinks: 0
|
|
204
|
-
};
|
|
201
|
+
return EMPTY_DRAFT_RELATION_COUNTS;
|
|
205
202
|
}
|
|
206
203
|
const document = await strapi.documents(uid).findOne({
|
|
207
204
|
documentId: id,
|
|
@@ -209,7 +206,7 @@ const documentManager = ({ strapi })=>{
|
|
|
209
206
|
locale
|
|
210
207
|
});
|
|
211
208
|
if (!document) {
|
|
212
|
-
|
|
209
|
+
return EMPTY_DRAFT_RELATION_COUNTS;
|
|
213
210
|
}
|
|
214
211
|
return sumDraftCounts(strapi, document, uid);
|
|
215
212
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(['id', 'documentId'], body),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return { unpublishedRelations: 0, draftM2mLinks: 0 };\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","unpublishedRelations","draftM2mLinks","document","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\n\nimport { contentTypes, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(['id', 'documentId'], body),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","document","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const EMPTY_DRAFT_RELATION_COUNTS = {
|
|
4
|
+
unpublishedRelations: 0,
|
|
5
|
+
draftM2mLinks: 0
|
|
6
|
+
};
|
|
3
7
|
/**
|
|
4
8
|
* Bidirectional manyToMany links share a join-table row and are kept on publish; they become
|
|
5
9
|
* visible on the live site once the related entry is published. xToOne-style links are stripped.
|
|
6
10
|
*/ const isBidirectionalManyToMany = (attribute)=>attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);
|
|
7
11
|
|
|
12
|
+
exports.EMPTY_DRAFT_RELATION_COUNTS = EMPTY_DRAFT_RELATION_COUNTS;
|
|
8
13
|
exports.isBidirectionalManyToMany = isBidirectionalManyToMany;
|
|
9
14
|
//# sourceMappingURL=draft-relations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-relations.js","sources":["../../../../server/src/services/utils/draft-relations.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\ntype RelationAttribute = Schema.Attribute.Relation & {\n target?: string;\n inversedBy?: string;\n mappedBy?: string;\n};\n\nexport interface DraftRelationCounts {\n unpublishedRelations: number;\n draftM2mLinks: number;\n}\n\nexport const EMPTY_DRAFT_RELATION_COUNTS: DraftRelationCounts = {\n unpublishedRelations: 0,\n draftM2mLinks: 0,\n};\n\n/**\n * Bidirectional manyToMany links share a join-table row and are kept on publish; they become\n * visible on the live site once the related entry is published. xToOne-style links are stripped.\n */\nexport const isBidirectionalManyToMany = (attribute: RelationAttribute) =>\n attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);\n\nexport const mergeDraftRelationCounts = (\n left: DraftRelationCounts,\n right: DraftRelationCounts\n): DraftRelationCounts => ({\n unpublishedRelations: left.unpublishedRelations + right.unpublishedRelations,\n draftM2mLinks: left.draftM2mLinks + right.draftM2mLinks,\n});\n"],"names":["isBidirectionalManyToMany","attribute","relation","Boolean","inversedBy","mappedBy"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"draft-relations.js","sources":["../../../../server/src/services/utils/draft-relations.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\ntype RelationAttribute = Schema.Attribute.Relation & {\n target?: string;\n inversedBy?: string;\n mappedBy?: string;\n};\n\nexport interface DraftRelationCounts {\n unpublishedRelations: number;\n draftM2mLinks: number;\n}\n\nexport const EMPTY_DRAFT_RELATION_COUNTS: DraftRelationCounts = {\n unpublishedRelations: 0,\n draftM2mLinks: 0,\n};\n\n/**\n * Bidirectional manyToMany links share a join-table row and are kept on publish; they become\n * visible on the live site once the related entry is published. xToOne-style links are stripped.\n */\nexport const isBidirectionalManyToMany = (attribute: RelationAttribute) =>\n attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);\n\nexport const mergeDraftRelationCounts = (\n left: DraftRelationCounts,\n right: DraftRelationCounts\n): DraftRelationCounts => ({\n unpublishedRelations: left.unpublishedRelations + right.unpublishedRelations,\n draftM2mLinks: left.draftM2mLinks + right.draftM2mLinks,\n});\n"],"names":["EMPTY_DRAFT_RELATION_COUNTS","unpublishedRelations","draftM2mLinks","isBidirectionalManyToMany","attribute","relation","Boolean","inversedBy","mappedBy"],"mappings":";;MAaaA,2BAAAA,GAAmD;IAC9DC,oBAAAA,EAAsB,CAAA;IACtBC,aAAAA,EAAe;AACjB;AAEA;;;AAGC,IACM,MAAMC,yBAAAA,GAA4B,CAACC,YACxCA,SAAAA,CAAUC,QAAQ,KAAK,YAAA,IAAgBC,QAAQF,SAAAA,CAAUG,UAAU,IAAIH,SAAAA,CAAUI,QAAQ;;;;;"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
const EMPTY_DRAFT_RELATION_COUNTS = {
|
|
2
|
+
unpublishedRelations: 0,
|
|
3
|
+
draftM2mLinks: 0
|
|
4
|
+
};
|
|
1
5
|
/**
|
|
2
6
|
* Bidirectional manyToMany links share a join-table row and are kept on publish; they become
|
|
3
7
|
* visible on the live site once the related entry is published. xToOne-style links are stripped.
|
|
4
8
|
*/ const isBidirectionalManyToMany = (attribute)=>attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);
|
|
5
9
|
|
|
6
|
-
export { isBidirectionalManyToMany };
|
|
10
|
+
export { EMPTY_DRAFT_RELATION_COUNTS, isBidirectionalManyToMany };
|
|
7
11
|
//# sourceMappingURL=draft-relations.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-relations.mjs","sources":["../../../../server/src/services/utils/draft-relations.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\ntype RelationAttribute = Schema.Attribute.Relation & {\n target?: string;\n inversedBy?: string;\n mappedBy?: string;\n};\n\nexport interface DraftRelationCounts {\n unpublishedRelations: number;\n draftM2mLinks: number;\n}\n\nexport const EMPTY_DRAFT_RELATION_COUNTS: DraftRelationCounts = {\n unpublishedRelations: 0,\n draftM2mLinks: 0,\n};\n\n/**\n * Bidirectional manyToMany links share a join-table row and are kept on publish; they become\n * visible on the live site once the related entry is published. xToOne-style links are stripped.\n */\nexport const isBidirectionalManyToMany = (attribute: RelationAttribute) =>\n attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);\n\nexport const mergeDraftRelationCounts = (\n left: DraftRelationCounts,\n right: DraftRelationCounts\n): DraftRelationCounts => ({\n unpublishedRelations: left.unpublishedRelations + right.unpublishedRelations,\n draftM2mLinks: left.draftM2mLinks + right.draftM2mLinks,\n});\n"],"names":["isBidirectionalManyToMany","attribute","relation","Boolean","inversedBy","mappedBy"],"mappings":"
|
|
1
|
+
{"version":3,"file":"draft-relations.mjs","sources":["../../../../server/src/services/utils/draft-relations.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\ntype RelationAttribute = Schema.Attribute.Relation & {\n target?: string;\n inversedBy?: string;\n mappedBy?: string;\n};\n\nexport interface DraftRelationCounts {\n unpublishedRelations: number;\n draftM2mLinks: number;\n}\n\nexport const EMPTY_DRAFT_RELATION_COUNTS: DraftRelationCounts = {\n unpublishedRelations: 0,\n draftM2mLinks: 0,\n};\n\n/**\n * Bidirectional manyToMany links share a join-table row and are kept on publish; they become\n * visible on the live site once the related entry is published. xToOne-style links are stripped.\n */\nexport const isBidirectionalManyToMany = (attribute: RelationAttribute) =>\n attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);\n\nexport const mergeDraftRelationCounts = (\n left: DraftRelationCounts,\n right: DraftRelationCounts\n): DraftRelationCounts => ({\n unpublishedRelations: left.unpublishedRelations + right.unpublishedRelations,\n draftM2mLinks: left.draftM2mLinks + right.draftM2mLinks,\n});\n"],"names":["EMPTY_DRAFT_RELATION_COUNTS","unpublishedRelations","draftM2mLinks","isBidirectionalManyToMany","attribute","relation","Boolean","inversedBy","mappedBy"],"mappings":"MAaaA,2BAAAA,GAAmD;IAC9DC,oBAAAA,EAAsB,CAAA;IACtBC,aAAAA,EAAe;AACjB;AAEA;;;AAGC,IACM,MAAMC,yBAAAA,GAA4B,CAACC,YACxCA,SAAAA,CAAUC,QAAQ,KAAK,YAAA,IAAgBC,QAAQF,SAAAA,CAAUG,UAAU,IAAIH,SAAAA,CAAUI,QAAQ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/collection-types.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"collection-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/collection-types.ts"],"names":[],"mappings":";cAuTkB,GAAG;iBAmIA,GAAG;gBA2DJ,GAAG;gBA0BH,GAAG;eAYJ,GAAG;mBA4CC,GAAG;gBAmBN,GAAG;IAoCrB;;;OAGG;iBACgB,GAAG;+BA+FW,GAAG;qBA4Bb,GAAG;uBA8CD,GAAG;mBAyCP,GAAG;iBAyDL,GAAG;oBAwCA,GAAG;6BAgDM,GAAG;wCA2DQ,GAAG;;AA1uB/C,wBAqwBE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/single-types.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"single-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/single-types.ts"],"names":[],"mappings":";cA+FkB,GAAG;wBAgDO,GAAG;gBAYX,GAAG;iBAsCF,GAAG;mBAiDD,GAAG;iBAiDL,GAAG;6BAiCS,GAAG;;AAtOpC,wBAkRE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAM2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAM2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAagzB,CAAC;sBAAgE,CAAC;2BAA8C,CAAC;;;;;;;;;;;;;sBAAsvH,CAAC;;;;;wBAAkZ,CAAC;;;;;;;wBAAkkD,CAAC;;;wBAAgd,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAAlhK,CAAC;;;;;;;0BAAg4B,CAAC;;;;;;;uBAAw2B,SAAS;;;;;;0BAA5d,CAAC;;;;;;;;;;;;0BAAmvB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAHnlI,CAAA;;;;;;sBAGw5B,CAAC;;;;;;sBAAy7C,CAAC;;;;;AAXv1E,wBAUE"}
|
|
@@ -2,7 +2,9 @@ import type { Modules, UID } from '@strapi/types';
|
|
|
2
2
|
import type { GetMetadataOptions } from '../services/document-metadata';
|
|
3
3
|
/**
|
|
4
4
|
* Converts a Strapi content-type UID into a safe MCP tool-name segment.
|
|
5
|
-
* `api::article.article` → `article`; `
|
|
5
|
+
* `api::article.article` → `article`; `api::writer.editor` → `writer_editor` (the api name and the
|
|
6
|
+
* content-type name differ, so both are kept to stay unique within the api);
|
|
7
|
+
* `plugin::i18n.locale` → `plugin-i18n_locale`.
|
|
6
8
|
*/
|
|
7
9
|
export declare const slugifyUidForMcpToolName: (uid: string) => string;
|
|
8
10
|
type McpPermissionChecker = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GAAI,KAAK,MAAM,KAAG,MAStD,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpE,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAC9B,mBAAmB,oBAAoB,EACvC,KAAK,GAAG,CAAC,WAAW,EACpB,KAAK,OAAO,EACZ,OAAO,kBAAkB,KACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAejC,CAAC;AAEF,0GAA0G;AAC1G,eAAO,MAAM,EAAE,GACb,mBAAmB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzC,OAAO,CAAC,GAAG,CAAC,oBAGb,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,KAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAiBvC,CAAC"}
|