@strapi/content-manager 5.46.1 → 5.47.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.
Files changed (156) hide show
  1. package/dist/admin/history/components/VersionInputRenderer.js +63 -25
  2. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  3. package/dist/admin/history/components/VersionInputRenderer.mjs +62 -26
  4. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  5. package/dist/admin/hooks/useDocument.js +82 -2
  6. package/dist/admin/hooks/useDocument.js.map +1 -1
  7. package/dist/admin/hooks/useDocument.mjs +82 -2
  8. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/EditViewPage.js +3 -2
  10. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  11. package/dist/admin/pages/EditView/EditViewPage.mjs +3 -2
  12. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  13. package/dist/admin/pages/EditView/components/DocumentActions.js +6 -3
  14. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  15. package/dist/admin/pages/EditView/components/DocumentActions.mjs +6 -3
  16. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +4 -1
  18. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +4 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +4 -4
  22. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +4 -4
  24. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  25. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +27 -1
  26. package/dist/admin/translations/sk.json.js +175 -9
  27. package/dist/admin/translations/sk.json.js.map +1 -1
  28. package/dist/admin/translations/sk.json.mjs +175 -9
  29. package/dist/admin/translations/sk.json.mjs.map +1 -1
  30. package/dist/admin/utils/relations.js +4 -0
  31. package/dist/admin/utils/relations.js.map +1 -1
  32. package/dist/admin/utils/relations.mjs +4 -0
  33. package/dist/admin/utils/relations.mjs.map +1 -1
  34. package/dist/server/bootstrap.js +4 -0
  35. package/dist/server/bootstrap.js.map +1 -1
  36. package/dist/server/bootstrap.mjs +4 -0
  37. package/dist/server/bootstrap.mjs.map +1 -1
  38. package/dist/server/controllers/collection-types.js +9 -5
  39. package/dist/server/controllers/collection-types.js.map +1 -1
  40. package/dist/server/controllers/collection-types.mjs +10 -6
  41. package/dist/server/controllers/collection-types.mjs.map +1 -1
  42. package/dist/server/homepage/services/homepage.js +21 -16
  43. package/dist/server/homepage/services/homepage.js.map +1 -1
  44. package/dist/server/homepage/services/homepage.mjs +21 -16
  45. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  46. package/dist/server/mcp/derive-content-type-mcp-tools.js +524 -0
  47. package/dist/server/mcp/derive-content-type-mcp-tools.js.map +1 -0
  48. package/dist/server/mcp/derive-content-type-mcp-tools.mjs +518 -0
  49. package/dist/server/mcp/derive-content-type-mcp-tools.mjs.map +1 -0
  50. package/dist/server/mcp/handlers/collection-handlers.js +404 -0
  51. package/dist/server/mcp/handlers/collection-handlers.js.map +1 -0
  52. package/dist/server/mcp/handlers/collection-handlers.mjs +395 -0
  53. package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -0
  54. package/dist/server/mcp/handlers/constants.js +10 -0
  55. package/dist/server/mcp/handlers/constants.js.map +1 -0
  56. package/dist/server/mcp/handlers/constants.mjs +6 -0
  57. package/dist/server/mcp/handlers/constants.mjs.map +1 -0
  58. package/dist/server/mcp/handlers/single-type-handlers.js +344 -0
  59. package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -0
  60. package/dist/server/mcp/handlers/single-type-handlers.mjs +336 -0
  61. package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -0
  62. package/dist/server/mcp/permissions.js +138 -0
  63. package/dist/server/mcp/permissions.js.map +1 -0
  64. package/dist/server/mcp/permissions.mjs +131 -0
  65. package/dist/server/mcp/permissions.mjs.map +1 -0
  66. package/dist/server/mcp/register-content-manager-mcp-tools.js +30 -0
  67. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -0
  68. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +28 -0
  69. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -0
  70. package/dist/server/mcp/schemas/blocks-schema.js +124 -0
  71. package/dist/server/mcp/schemas/blocks-schema.js.map +1 -0
  72. package/dist/server/mcp/schemas/blocks-schema.mjs +122 -0
  73. package/dist/server/mcp/schemas/blocks-schema.mjs.map +1 -0
  74. package/dist/server/mcp/schemas/data-schema.js +252 -0
  75. package/dist/server/mcp/schemas/data-schema.js.map +1 -0
  76. package/dist/server/mcp/schemas/data-schema.mjs +248 -0
  77. package/dist/server/mcp/schemas/data-schema.mjs.map +1 -0
  78. package/dist/server/mcp/schemas/filters-schema.js +111 -0
  79. package/dist/server/mcp/schemas/filters-schema.js.map +1 -0
  80. package/dist/server/mcp/schemas/filters-schema.mjs +107 -0
  81. package/dist/server/mcp/schemas/filters-schema.mjs.map +1 -0
  82. package/dist/server/mcp/schemas/input-schemas.js +18 -0
  83. package/dist/server/mcp/schemas/input-schemas.js.map +1 -0
  84. package/dist/server/mcp/schemas/input-schemas.mjs +13 -0
  85. package/dist/server/mcp/schemas/input-schemas.mjs.map +1 -0
  86. package/dist/server/mcp/schemas/output-schemas.js +48 -0
  87. package/dist/server/mcp/schemas/output-schemas.js.map +1 -0
  88. package/dist/server/mcp/schemas/output-schemas.mjs +44 -0
  89. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -0
  90. package/dist/server/mcp/schemas/sort-schema.js +80 -0
  91. package/dist/server/mcp/schemas/sort-schema.js.map +1 -0
  92. package/dist/server/mcp/schemas/sort-schema.mjs +76 -0
  93. package/dist/server/mcp/schemas/sort-schema.mjs.map +1 -0
  94. package/dist/server/mcp/utils.js +43 -0
  95. package/dist/server/mcp/utils.js.map +1 -0
  96. package/dist/server/mcp/utils.mjs +39 -0
  97. package/dist/server/mcp/utils.mjs.map +1 -0
  98. package/dist/server/services/document-metadata.js +32 -3
  99. package/dist/server/services/document-metadata.js.map +1 -1
  100. package/dist/server/services/document-metadata.mjs +32 -3
  101. package/dist/server/services/document-metadata.mjs.map +1 -1
  102. package/dist/server/services/index.js +1 -1
  103. package/dist/server/services/index.js.map +1 -1
  104. package/dist/server/services/permission-checker.js +4 -1
  105. package/dist/server/services/permission-checker.js.map +1 -1
  106. package/dist/server/services/permission-checker.mjs +1 -1
  107. package/dist/server/services/permission-checker.mjs.map +1 -1
  108. package/dist/server/services/utils/populate.js +3 -3
  109. package/dist/server/services/utils/populate.js.map +1 -1
  110. package/dist/server/services/utils/populate.mjs +3 -3
  111. package/dist/server/services/utils/populate.mjs.map +1 -1
  112. package/dist/server/src/bootstrap.d.ts.map +1 -1
  113. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  114. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  115. package/dist/server/src/index.d.ts +3 -3
  116. package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts +12 -0
  117. package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts.map +1 -0
  118. package/dist/server/src/mcp/handlers/collection-handlers.d.ts +69 -0
  119. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -0
  120. package/dist/server/src/mcp/handlers/constants.d.ts +4 -0
  121. package/dist/server/src/mcp/handlers/constants.d.ts.map +1 -0
  122. package/dist/server/src/mcp/handlers/index.d.ts +3 -0
  123. package/dist/server/src/mcp/handlers/index.d.ts.map +1 -0
  124. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts +66 -0
  125. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -0
  126. package/dist/server/src/mcp/permissions.d.ts +49 -0
  127. package/dist/server/src/mcp/permissions.d.ts.map +1 -0
  128. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +8 -0
  129. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -0
  130. package/dist/server/src/mcp/schemas/blocks-schema.d.ts +8 -0
  131. package/dist/server/src/mcp/schemas/blocks-schema.d.ts.map +1 -0
  132. package/dist/server/src/mcp/schemas/data-schema.d.ts +36 -0
  133. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -0
  134. package/dist/server/src/mcp/schemas/filters-schema.d.ts +22 -0
  135. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -0
  136. package/dist/server/src/mcp/schemas/index.d.ts +7 -0
  137. package/dist/server/src/mcp/schemas/index.d.ts.map +1 -0
  138. package/dist/server/src/mcp/schemas/input-schemas.d.ts +10 -0
  139. package/dist/server/src/mcp/schemas/input-schemas.d.ts.map +1 -0
  140. package/dist/server/src/mcp/schemas/output-schemas.d.ts +18 -0
  141. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -0
  142. package/dist/server/src/mcp/schemas/sort-schema.d.ts +24 -0
  143. package/dist/server/src/mcp/schemas/sort-schema.d.ts.map +1 -0
  144. package/dist/server/src/mcp/types.d.ts +31 -0
  145. package/dist/server/src/mcp/types.d.ts.map +1 -0
  146. package/dist/server/src/mcp/utils.d.ts +21 -0
  147. package/dist/server/src/mcp/utils.d.ts.map +1 -0
  148. package/dist/server/src/services/document-metadata.d.ts +11 -1
  149. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  150. package/dist/server/src/services/index.d.ts +3 -3
  151. package/dist/server/src/services/permission-checker.d.ts +13 -3
  152. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  153. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  154. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  155. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  156. package/package.json +10 -8
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/services/homepage.ts"],"sourcesContent":["/* eslint-disable func-names */\nimport type { Core, Modules, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport type {\n GetCountDocuments,\n GetRecentDocuments,\n RecentDocument,\n} from '../../../../shared/contracts/homepage';\n\nconst createHomepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const MAX_DOCUMENTS = 4;\n\n const metadataService = strapi.plugin('content-manager').service('document-metadata');\n const permissionService = strapi.admin.services.permission;\n\n type ContentTypeConfiguration = {\n uid: RecentDocument['contentTypeUid'];\n settings: { mainField: string };\n };\n const getConfiguration = async (\n contentTypeUids: RecentDocument['contentTypeUid'][]\n ): Promise<ContentTypeConfiguration[]> => {\n /**\n * Don't use the strapi.store util because we need to make\n * more precise queries than exact key matches, in order to make as few queries as possible.\n */\n const coreStore = strapi.db.query('strapi::core-store');\n const rawConfigurations = await coreStore.findMany({\n where: {\n key: {\n $in: contentTypeUids.map(\n (contentType) => `plugin_content_manager_configuration_content_types::${contentType}`\n ),\n },\n },\n });\n\n return rawConfigurations.map((rawConfiguration) => {\n return JSON.parse(rawConfiguration.value);\n });\n };\n\n const getPermittedContentTypes = async () => {\n const readPermissions: Modules.Permissions.PermissionRule[] = await permissionService.findMany({\n where: {\n role: { users: { id: strapi.requestContext.get()?.state?.user.id } },\n action: 'plugin::content-manager.explorer.read',\n },\n });\n\n return readPermissions\n .map((permission) => permission.subject)\n .filter(Boolean) as RecentDocument['contentTypeUid'][];\n };\n\n type ContentTypeMeta = {\n fields: string[];\n mainField: string;\n contentType: Schema.ContentType;\n hasDraftAndPublish: boolean;\n uid: RecentDocument['contentTypeUid'];\n };\n\n const getContentTypesMeta = (\n allowedContentTypeUids: RecentDocument['contentTypeUid'][],\n configurations: ContentTypeConfiguration[]\n ): ContentTypeMeta[] => {\n return allowedContentTypeUids.map((uid) => {\n const configuration = configurations.find((config) => config.uid === uid);\n const contentType = strapi.contentType(uid);\n const fields = ['documentId', 'updatedAt'];\n\n // Add fields required to get the status if D&P is enabled\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n if (hasDraftAndPublish) {\n fields.push('publishedAt');\n }\n\n // Only add the main field if it's defined\n if (configuration?.settings.mainField) {\n fields.push(configuration.settings.mainField);\n }\n\n // Only add locale if it's localized\n const isLocalized = (contentType.pluginOptions?.i18n as any)?.localized;\n if (isLocalized) {\n fields.push('locale');\n }\n\n return {\n fields,\n mainField: configuration!.settings.mainField,\n contentType,\n hasDraftAndPublish,\n uid,\n };\n });\n };\n\n const formatDocuments = (\n documents: Modules.Documents.AnyDocument[],\n meta: ContentTypeMeta,\n populate?: string[]\n ) => {\n return documents.map((document) => {\n const additionalFields =\n populate?.reduce(\n (acc, key) => {\n acc[key] = document[key];\n return acc;\n },\n {} as Record<string, any>\n ) || {};\n return {\n documentId: document.documentId,\n locale: document.locale ?? null,\n updatedAt: new Date(document.updatedAt),\n title: document[meta.mainField ?? 'documentId'],\n publishedAt:\n meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,\n contentTypeUid: meta.uid,\n contentTypeDisplayName: meta.contentType.info.displayName,\n kind: meta.contentType.kind,\n ...additionalFields,\n };\n });\n };\n\n const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');\n const getPermissionChecker = (uid: string) =>\n permissionCheckerService.create({\n userAbility: strapi.requestContext.get()?.state.userAbility,\n model: uid,\n });\n\n return {\n async addStatusToDocuments(documents: RecentDocument[]): Promise<RecentDocument[]> {\n return Promise.all(\n documents.map(async (recentDocument) => {\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(\n strapi.contentType(recentDocument.contentTypeUid)\n );\n /**\n * Tries to query the other version of the document if draft and publish is enabled,\n * so that we know when to give the \"modified\" status.\n */\n const { availableStatus } = await metadataService.getMetadata(\n recentDocument.contentTypeUid,\n recentDocument,\n {\n availableStatus: hasDraftAndPublish,\n availableLocales: false,\n }\n );\n const status: RecentDocument['status'] = metadataService.getStatus(\n recentDocument,\n availableStatus\n );\n\n return {\n ...recentDocument,\n status: hasDraftAndPublish ? status : undefined,\n };\n })\n );\n },\n\n async queryLastDocuments(\n additionalQueryParams?: Record<string, unknown>,\n draftAndPublishOnly?: boolean\n ): Promise<RecentDocument[]> {\n const permittedContentTypes = await getPermittedContentTypes();\n const allowedContentTypeUids = draftAndPublishOnly\n ? permittedContentTypes.filter((uid) => {\n return contentTypes.hasDraftAndPublish(strapi.contentType(uid));\n })\n : permittedContentTypes;\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n fields: meta.fields,\n ...additionalQueryParams,\n locale: '*',\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n const populate = additionalQueryParams?.populate as string[];\n\n return formatDocuments(docs, meta, populate);\n })\n );\n\n return recentDocuments\n .flat()\n .sort((a, b) => {\n switch (additionalQueryParams?.sort) {\n case 'publishedAt:desc':\n if (!a.publishedAt || !b.publishedAt) return 0;\n return b.publishedAt.valueOf() - a.publishedAt.valueOf();\n case 'publishedAt:asc':\n if (!a.publishedAt || !b.publishedAt) return 0;\n return a.publishedAt.valueOf() - b.publishedAt.valueOf();\n case 'updatedAt:desc':\n if (!a.updatedAt || !b.updatedAt) return 0;\n return b.updatedAt.valueOf() - a.updatedAt.valueOf();\n case 'updatedAt:asc':\n if (!a.updatedAt || !b.updatedAt) return 0;\n return a.updatedAt.valueOf() - b.updatedAt.valueOf();\n default:\n return 0;\n }\n })\n .slice(0, MAX_DOCUMENTS);\n },\n\n async getRecentlyPublishedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const recentlyPublishedDocuments = await this.queryLastDocuments(\n {\n sort: 'publishedAt:desc',\n status: 'published',\n },\n true\n );\n\n return this.addStatusToDocuments(recentlyPublishedDocuments);\n },\n\n async getRecentlyUpdatedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const recentlyUpdatedDocuments = await this.queryLastDocuments({\n sort: 'updatedAt:desc',\n });\n\n return this.addStatusToDocuments(recentlyUpdatedDocuments);\n },\n\n async getCountDocuments(): Promise<GetCountDocuments.Response['data']> {\n const permittedContentTypes = await getPermittedContentTypes();\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(permittedContentTypes);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(permittedContentTypes, configurations);\n\n const countDocuments = {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const strapiDBConnection = strapi.db.connection;\n const tableName = strapi.contentType(meta.uid).collectionName;\n if (tableName) {\n if (meta.hasDraftAndPublish) {\n const draftDocuments = await strapiDBConnection(tableName)\n .whereNull('published_at')\n .whereIn('document_id', function () {\n this.select('document_id')\n .from(tableName)\n .groupBy('document_id')\n .havingRaw('COUNT(*) = 1');\n })\n .count('* as count')\n .first();\n countDocuments.draft += Number(draftDocuments?.count) || 0;\n }\n\n const publishedDocuments = meta.hasDraftAndPublish\n ? await strapiDBConnection(tableName)\n .countDistinct('draft.document_id as count')\n .from(`${tableName} as draft`)\n .join(`${tableName} as published`, function () {\n this.on('draft.document_id', '=', 'published.document_id')\n .andOn('draft.updated_at', '=', 'published.updated_at')\n .andOnNull('draft.published_at')\n .andOnNotNull('published.published_at');\n })\n .first()\n : await strapiDBConnection(tableName)\n .countDistinct('document_id as count')\n .from(`${tableName}`)\n .first();\n countDocuments.published += Number(publishedDocuments?.count) || 0;\n\n if (meta.hasDraftAndPublish) {\n const modifiedDocuments = await strapiDBConnection(tableName)\n .select('draft.document_id')\n .from(`${tableName} as draft`)\n .join(`${tableName} as published`, function () {\n this.on('draft.document_id', '=', 'published.document_id')\n .andOn('draft.updated_at', '!=', 'published.updated_at')\n .andOnNull('draft.published_at')\n .andOnNotNull('published.published_at');\n })\n .countDistinct('draft.document_id as count')\n .groupBy('draft.document_id')\n .first();\n countDocuments.modified += Number(modifiedDocuments?.count) || 0;\n }\n }\n })\n );\n\n return countDocuments;\n },\n };\n};\n\nexport { createHomepageService };\n"],"names":["createHomepageService","strapi","MAX_DOCUMENTS","metadataService","plugin","service","permissionService","admin","services","permission","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","contentType","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","subject","filter","Boolean","getContentTypesMeta","allowedContentTypeUids","configurations","uid","configuration","find","config","fields","hasDraftAndPublish","contentTypes","push","settings","mainField","isLocalized","pluginOptions","i18n","localized","formatDocuments","documents","meta","populate","document","additionalFields","reduce","acc","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","permissionCheckerService","getPermissionChecker","create","userAbility","model","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","undefined","queryLastDocuments","additionalQueryParams","draftAndPublishOnly","permittedContentTypes","contentTypesMeta","recentDocuments","permissionQuery","sanitizedQuery","read","limit","docs","flat","sort","a","b","valueOf","slice","getRecentlyPublishedDocuments","recentlyPublishedDocuments","getRecentlyUpdatedDocuments","recentlyUpdatedDocuments","getCountDocuments","countDocuments","draft","published","modified","strapiDBConnection","connection","tableName","collectionName","draftDocuments","whereNull","whereIn","select","from","groupBy","havingRaw","count","first","Number","publishedDocuments","countDistinct","join","on","andOn","andOnNull","andOnNotNull","modifiedDocuments"],"mappings":"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"}
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/services/homepage.ts"],"sourcesContent":["/* eslint-disable func-names */\nimport type { Core, Modules, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport type {\n GetCountDocuments,\n GetRecentDocuments,\n RecentDocument,\n} from '../../../../shared/contracts/homepage';\n\nconst createHomepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const MAX_DOCUMENTS = 4;\n\n const metadataService = strapi.plugin('content-manager').service('document-metadata');\n const permissionService = strapi.admin.services.permission;\n\n type ContentTypeConfiguration = {\n uid: RecentDocument['contentTypeUid'];\n settings: { mainField: string };\n };\n const getConfiguration = async (\n contentTypeUids: RecentDocument['contentTypeUid'][]\n ): Promise<ContentTypeConfiguration[]> => {\n /**\n * Don't use the strapi.store util because we need to make\n * more precise queries than exact key matches, in order to make as few queries as possible.\n */\n const coreStore = strapi.db.query('strapi::core-store');\n const rawConfigurations = await coreStore.findMany({\n where: {\n key: {\n $in: contentTypeUids.map(\n (contentType) => `plugin_content_manager_configuration_content_types::${contentType}`\n ),\n },\n },\n });\n\n return rawConfigurations.map((rawConfiguration) => {\n return JSON.parse(rawConfiguration.value);\n });\n };\n\n const getPermittedContentTypes = async () => {\n const readPermissions: Modules.Permissions.PermissionRule[] = await permissionService.findMany({\n where: {\n role: { users: { id: strapi.requestContext.get()?.state?.user.id } },\n action: 'plugin::content-manager.explorer.read',\n },\n });\n\n return readPermissions\n .map((permission) => permission.subject)\n .filter(Boolean) as RecentDocument['contentTypeUid'][];\n };\n\n type ContentTypeMeta = {\n fields: string[];\n mainField: string;\n contentType: Schema.ContentType;\n hasDraftAndPublish: boolean;\n uid: RecentDocument['contentTypeUid'];\n };\n\n const getContentTypesMeta = (\n allowedContentTypeUids: RecentDocument['contentTypeUid'][],\n configurations: ContentTypeConfiguration[]\n ): ContentTypeMeta[] => {\n return allowedContentTypeUids.map((uid) => {\n const configuration = configurations.find((config) => config.uid === uid);\n const contentType = strapi.contentType(uid);\n const fields = ['documentId', 'updatedAt'];\n\n // Add fields required to get the status if D&P is enabled\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n if (hasDraftAndPublish) {\n fields.push('publishedAt');\n }\n\n // Only add the main field if it's defined\n if (configuration?.settings.mainField) {\n fields.push(configuration.settings.mainField);\n }\n\n // Only add locale if it's localized\n const isLocalized = (contentType.pluginOptions?.i18n as any)?.localized;\n if (isLocalized) {\n fields.push('locale');\n }\n\n return {\n fields,\n mainField: configuration!.settings.mainField,\n contentType,\n hasDraftAndPublish,\n uid,\n };\n });\n };\n\n const formatDocuments = (\n documents: Modules.Documents.AnyDocument[],\n meta: ContentTypeMeta,\n populate?: string[]\n ) => {\n return documents.map((document) => {\n const additionalFields =\n populate?.reduce(\n (acc, key) => {\n acc[key] = document[key];\n return acc;\n },\n {} as Record<string, any>\n ) || {};\n return {\n documentId: document.documentId,\n locale: document.locale ?? null,\n updatedAt: new Date(document.updatedAt),\n title: document[meta.mainField ?? 'documentId'],\n publishedAt:\n meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,\n contentTypeUid: meta.uid,\n contentTypeDisplayName: meta.contentType.info.displayName,\n kind: meta.contentType.kind,\n ...additionalFields,\n };\n });\n };\n\n const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');\n const getPermissionChecker = (uid: string) =>\n permissionCheckerService.create({\n userAbility: strapi.requestContext.get()?.state.userAbility,\n model: uid,\n });\n\n return {\n async addStatusToDocuments(documents: RecentDocument[]): Promise<RecentDocument[]> {\n return Promise.all(\n documents.map(async (recentDocument) => {\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(\n strapi.contentType(recentDocument.contentTypeUid)\n );\n /**\n * Tries to query the other version of the document if draft and publish is enabled,\n * so that we know when to give the \"modified\" status.\n */\n const { availableStatus } = await metadataService.getMetadata(\n recentDocument.contentTypeUid,\n recentDocument,\n {\n availableStatus: hasDraftAndPublish,\n availableLocales: false,\n }\n );\n const status: RecentDocument['status'] = metadataService.getStatus(\n recentDocument,\n availableStatus\n );\n\n return {\n ...recentDocument,\n status: hasDraftAndPublish ? status : undefined,\n };\n })\n );\n },\n\n async queryLastDocuments(\n additionalQueryParams?: Record<string, unknown>,\n draftAndPublishOnly?: boolean\n ): Promise<RecentDocument[]> {\n const permittedContentTypes = await getPermittedContentTypes();\n const allowedContentTypeUids = draftAndPublishOnly\n ? permittedContentTypes.filter((uid) => {\n return contentTypes.hasDraftAndPublish(strapi.contentType(uid));\n })\n : permittedContentTypes;\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n fields: meta.fields,\n ...additionalQueryParams,\n locale: '*',\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n const populate = additionalQueryParams?.populate as string[];\n\n return formatDocuments(docs, meta, populate);\n })\n );\n\n return recentDocuments\n .flat()\n .sort((a, b) => {\n switch (additionalQueryParams?.sort) {\n case 'publishedAt:desc':\n if (!a.publishedAt || !b.publishedAt) return 0;\n return b.publishedAt.valueOf() - a.publishedAt.valueOf();\n case 'publishedAt:asc':\n if (!a.publishedAt || !b.publishedAt) return 0;\n return a.publishedAt.valueOf() - b.publishedAt.valueOf();\n case 'updatedAt:desc':\n if (!a.updatedAt || !b.updatedAt) return 0;\n return b.updatedAt.valueOf() - a.updatedAt.valueOf();\n case 'updatedAt:asc':\n if (!a.updatedAt || !b.updatedAt) return 0;\n return a.updatedAt.valueOf() - b.updatedAt.valueOf();\n default:\n return 0;\n }\n })\n .slice(0, MAX_DOCUMENTS);\n },\n\n async getRecentlyPublishedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const recentlyPublishedDocuments = await this.queryLastDocuments(\n {\n sort: 'publishedAt:desc',\n status: 'published',\n },\n true\n );\n\n return this.addStatusToDocuments(recentlyPublishedDocuments);\n },\n\n async getRecentlyUpdatedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const recentlyUpdatedDocuments = await this.queryLastDocuments({\n sort: 'updatedAt:desc',\n });\n\n return this.addStatusToDocuments(recentlyUpdatedDocuments);\n },\n\n async getCountDocuments(): Promise<GetCountDocuments.Response['data']> {\n const permittedContentTypes = await getPermittedContentTypes();\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(permittedContentTypes);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(permittedContentTypes, configurations);\n\n const countDocuments = {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const strapiDBConnection = strapi.db.connection;\n const tableName = strapi.contentType(meta.uid).collectionName;\n if (!tableName) return;\n\n if (!meta.hasDraftAndPublish) {\n const publishedDocuments = await strapiDBConnection(tableName)\n .countDistinct('document_id as count')\n .first();\n countDocuments.published += Number(publishedDocuments?.count) || 0;\n return;\n }\n\n // Classify each document_id into a single bucket (draft / published / modified)\n // in one pass. Replaces three separate self-join queries that scaled poorly on\n // large tables — see https://github.com/strapi/strapi/issues/25200.\n const classified = strapiDBConnection(tableName)\n .select('document_id')\n .select(\n strapiDBConnection.raw(\n `CASE\n WHEN MAX(CASE WHEN published_at IS NOT NULL THEN 1 ELSE 0 END) = 0\n THEN 'draft'\n WHEN MAX(CASE WHEN published_at IS NULL THEN updated_at END) =\n MAX(CASE WHEN published_at IS NOT NULL THEN updated_at END)\n THEN 'published'\n ELSE 'modified'\n END AS bucket`\n )\n )\n .groupBy('document_id');\n\n const counts = await strapiDBConnection\n .from(classified.as('classified'))\n .select(\n strapiDBConnection.raw(\n `COUNT(CASE WHEN bucket = 'draft' THEN 1 END) AS draft,\n COUNT(CASE WHEN bucket = 'published' THEN 1 END) AS published,\n COUNT(CASE WHEN bucket = 'modified' THEN 1 END) AS modified`\n )\n )\n .first();\n\n countDocuments.draft += Number(counts?.draft) || 0;\n countDocuments.published += Number(counts?.published) || 0;\n countDocuments.modified += Number(counts?.modified) || 0;\n })\n );\n\n return countDocuments;\n },\n };\n};\n\nexport { createHomepageService };\n"],"names":["createHomepageService","strapi","MAX_DOCUMENTS","metadataService","plugin","service","permissionService","admin","services","permission","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","contentType","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","subject","filter","Boolean","getContentTypesMeta","allowedContentTypeUids","configurations","uid","configuration","find","config","fields","hasDraftAndPublish","contentTypes","push","settings","mainField","isLocalized","pluginOptions","i18n","localized","formatDocuments","documents","meta","populate","document","additionalFields","reduce","acc","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","permissionCheckerService","getPermissionChecker","create","userAbility","model","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","undefined","queryLastDocuments","additionalQueryParams","draftAndPublishOnly","permittedContentTypes","contentTypesMeta","recentDocuments","permissionQuery","sanitizedQuery","read","limit","docs","flat","sort","a","b","valueOf","slice","getRecentlyPublishedDocuments","recentlyPublishedDocuments","getRecentlyUpdatedDocuments","recentlyUpdatedDocuments","getCountDocuments","countDocuments","draft","published","modified","strapiDBConnection","connection","tableName","collectionName","publishedDocuments","countDistinct","first","Number","count","classified","select","raw","groupBy","counts","from","as"],"mappings":"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"}
@@ -0,0 +1,524 @@
1
+ 'use strict';
2
+
3
+ var strapiUtils = require('@strapi/utils');
4
+ var permissionChecker = require('../services/permission-checker.js');
5
+ var utils = require('./utils.js');
6
+ var permissions = require('./permissions.js');
7
+ require('./schemas/blocks-schema.js');
8
+ var inputSchemas = require('./schemas/input-schemas.js');
9
+ var dataSchema = require('./schemas/data-schema.js');
10
+ var sortSchema = require('./schemas/sort-schema.js');
11
+ var filtersSchema = require('./schemas/filters-schema.js');
12
+ var outputSchemas = require('./schemas/output-schemas.js');
13
+ var collectionHandlers = require('./handlers/collection-handlers.js');
14
+ var singleTypeHandlers = require('./handlers/single-type-handlers.js');
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Collection-type tool-definition builder
18
+ // ---------------------------------------------------------------------------
19
+ /**
20
+ * Derives the full set of `DerivedTool` definitions for a single collection-type model.
21
+ * Produces list/get/create/update/delete tools, plus publish/unpublish/discard_draft
22
+ * when draft-and-publish is enabled. Each tool's input/output schema is resolved
23
+ * per-request so RBAC field and locale constraints are applied at call time.
24
+ */ const buildCollectionTools = (strapi, model, ctx)=>{
25
+ const uid = model.uid;
26
+ const slug = utils.slugifyUidForMcpToolName(uid);
27
+ const draftAndPublish = model.options?.draftAndPublish === true;
28
+ const { attributes } = model;
29
+ const runtimeLocaleSchema = permissions.buildLocaleSchema(ctx.localeCodes, ctx.defaultLocale);
30
+ const resolveReadFields = (context)=>permissions.getPermittedFields(strapi, context.userAbility, permissionChecker.ACTIONS.read, uid, attributes);
31
+ const resolveReadOutputSchema = (context)=>outputSchemas.buildDocumentOutputSchema(attributes, resolveReadFields(context));
32
+ const resolveListInputSchema = (context)=>{
33
+ const readFields = resolveReadFields(context);
34
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.read, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
35
+ return strapiUtils.z.object({
36
+ locale: localeSchema,
37
+ status: inputSchemas.statusSchema,
38
+ page: inputSchemas.pageSchema,
39
+ pageSize: inputSchemas.pageSizeSchema,
40
+ sort: sortSchema.buildSortSchema(attributes, readFields),
41
+ filters: filtersSchema.buildFiltersSchema(attributes, readFields)
42
+ });
43
+ };
44
+ const resolveGetInputSchema = (context)=>{
45
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.read, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
46
+ return strapiUtils.z.object({
47
+ documentId: inputSchemas.documentIdSchema,
48
+ locale: localeSchema,
49
+ status: inputSchemas.statusSchema
50
+ });
51
+ };
52
+ const resolveCreateInputSchema = (context)=>{
53
+ const writeFields = permissions.getPermittedFields(strapi, context.userAbility, permissionChecker.ACTIONS.create, uid, attributes);
54
+ const dataSchema$1 = dataSchema.buildDataSchema(strapi, model, attributes, writeFields);
55
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.create, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
56
+ return strapiUtils.z.object({
57
+ data: dataSchema$1,
58
+ locale: localeSchema
59
+ });
60
+ };
61
+ const resolveUpdateInputSchema = (context)=>{
62
+ const writeFields = permissions.getPermittedFields(strapi, context.userAbility, permissionChecker.ACTIONS.update, uid, attributes);
63
+ const dataSchema$1 = dataSchema.buildDataSchema(strapi, model, attributes, writeFields);
64
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.update, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
65
+ return strapiUtils.z.object({
66
+ documentId: inputSchemas.documentIdSchema,
67
+ data: dataSchema$1,
68
+ locale: localeSchema
69
+ });
70
+ };
71
+ const resolveDeleteInputSchema = (context)=>{
72
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.delete, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
73
+ return strapiUtils.z.object({
74
+ documentId: inputSchemas.documentIdSchema,
75
+ locale: localeSchema
76
+ });
77
+ };
78
+ const resolvePublishInputSchema = (context)=>{
79
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.publish, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
80
+ return strapiUtils.z.object({
81
+ documentId: inputSchemas.documentIdSchema,
82
+ locale: localeSchema
83
+ });
84
+ };
85
+ const resolveUnpublishInputSchema = (context)=>{
86
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.unpublish, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
87
+ return strapiUtils.z.object({
88
+ documentId: inputSchemas.documentIdSchema,
89
+ locale: localeSchema,
90
+ discardDraft: strapiUtils.z.boolean().optional().describe('Also discard the draft when unpublishing.')
91
+ });
92
+ };
93
+ const resolveDiscardDraftInputSchema = (context)=>{
94
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.discard, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
95
+ return strapiUtils.z.object({
96
+ documentId: inputSchemas.documentIdSchema,
97
+ locale: localeSchema
98
+ });
99
+ };
100
+ const tools = [
101
+ {
102
+ name: `list_${slug}`,
103
+ telemetry: {
104
+ source: 'content-manager',
105
+ name: 'list'
106
+ },
107
+ ...utils.describeTool({
108
+ apiID: model.apiID,
109
+ uid,
110
+ operation: 'list'
111
+ }),
112
+ auth: {
113
+ policies: [
114
+ {
115
+ action: permissionChecker.ACTIONS.read,
116
+ subject: uid
117
+ }
118
+ ]
119
+ },
120
+ resolveInputSchema: resolveListInputSchema,
121
+ resolveOutputSchema: (context)=>outputSchemas.buildListOutputSchema(attributes, resolveReadFields(context)),
122
+ createHandler: collectionHandlers.createCollectionListHandler(uid)
123
+ },
124
+ {
125
+ name: `get_${slug}`,
126
+ telemetry: {
127
+ source: 'content-manager',
128
+ name: 'get'
129
+ },
130
+ ...utils.describeTool({
131
+ apiID: model.apiID,
132
+ uid,
133
+ operation: 'get'
134
+ }),
135
+ auth: {
136
+ policies: [
137
+ {
138
+ action: permissionChecker.ACTIONS.read,
139
+ subject: uid
140
+ }
141
+ ]
142
+ },
143
+ resolveInputSchema: resolveGetInputSchema,
144
+ resolveOutputSchema: resolveReadOutputSchema,
145
+ createHandler: collectionHandlers.createCollectionGetHandler(uid)
146
+ },
147
+ {
148
+ name: `create_${slug}`,
149
+ telemetry: {
150
+ source: 'content-manager',
151
+ name: 'create'
152
+ },
153
+ ...utils.describeTool({
154
+ apiID: model.apiID,
155
+ uid,
156
+ operation: 'create'
157
+ }),
158
+ auth: {
159
+ policies: [
160
+ {
161
+ action: permissionChecker.ACTIONS.create,
162
+ subject: uid
163
+ }
164
+ ]
165
+ },
166
+ resolveInputSchema: resolveCreateInputSchema,
167
+ resolveOutputSchema: resolveReadOutputSchema,
168
+ createHandler: collectionHandlers.createCollectionCreateHandler(uid)
169
+ },
170
+ {
171
+ name: `update_${slug}`,
172
+ telemetry: {
173
+ source: 'content-manager',
174
+ name: 'update'
175
+ },
176
+ ...utils.describeTool({
177
+ apiID: model.apiID,
178
+ uid,
179
+ operation: 'update'
180
+ }),
181
+ auth: {
182
+ policies: [
183
+ {
184
+ action: permissionChecker.ACTIONS.update,
185
+ subject: uid
186
+ }
187
+ ]
188
+ },
189
+ resolveInputSchema: resolveUpdateInputSchema,
190
+ resolveOutputSchema: resolveReadOutputSchema,
191
+ createHandler: collectionHandlers.createCollectionUpdateHandler(uid)
192
+ },
193
+ {
194
+ name: `delete_${slug}`,
195
+ telemetry: {
196
+ source: 'content-manager',
197
+ name: 'delete'
198
+ },
199
+ ...utils.describeTool({
200
+ apiID: model.apiID,
201
+ uid,
202
+ operation: 'delete'
203
+ }),
204
+ auth: {
205
+ policies: [
206
+ {
207
+ action: permissionChecker.ACTIONS.delete,
208
+ subject: uid
209
+ }
210
+ ]
211
+ },
212
+ resolveInputSchema: resolveDeleteInputSchema,
213
+ resolveOutputSchema: (context)=>outputSchemas.buildDeleteOutputSchema(attributes, resolveReadFields(context)),
214
+ createHandler: collectionHandlers.createCollectionDeleteHandler(uid)
215
+ }
216
+ ];
217
+ if (draftAndPublish === true) {
218
+ tools.push({
219
+ name: `publish_${slug}`,
220
+ telemetry: {
221
+ source: 'content-manager',
222
+ name: 'publish'
223
+ },
224
+ ...utils.describeTool({
225
+ apiID: model.apiID,
226
+ uid,
227
+ operation: 'publish'
228
+ }),
229
+ auth: {
230
+ policies: [
231
+ {
232
+ action: permissionChecker.ACTIONS.publish,
233
+ subject: uid
234
+ }
235
+ ]
236
+ },
237
+ resolveInputSchema: resolvePublishInputSchema,
238
+ resolveOutputSchema: resolveReadOutputSchema,
239
+ createHandler: collectionHandlers.createCollectionPublishHandler(uid)
240
+ }, {
241
+ name: `unpublish_${slug}`,
242
+ telemetry: {
243
+ source: 'content-manager',
244
+ name: 'unpublish'
245
+ },
246
+ ...utils.describeTool({
247
+ apiID: model.apiID,
248
+ uid,
249
+ operation: 'unpublish'
250
+ }),
251
+ auth: {
252
+ policies: [
253
+ {
254
+ action: permissionChecker.ACTIONS.unpublish,
255
+ subject: uid
256
+ }
257
+ ]
258
+ },
259
+ resolveInputSchema: resolveUnpublishInputSchema,
260
+ resolveOutputSchema: resolveReadOutputSchema,
261
+ createHandler: collectionHandlers.createCollectionUnpublishHandler(uid)
262
+ }, {
263
+ name: `discard_${slug}_draft`,
264
+ telemetry: {
265
+ source: 'content-manager',
266
+ name: 'discard_draft'
267
+ },
268
+ ...utils.describeTool({
269
+ apiID: model.apiID,
270
+ uid,
271
+ operation: 'discard_draft'
272
+ }),
273
+ auth: {
274
+ policies: [
275
+ {
276
+ action: permissionChecker.ACTIONS.discard,
277
+ subject: uid
278
+ }
279
+ ]
280
+ },
281
+ resolveInputSchema: resolveDiscardDraftInputSchema,
282
+ resolveOutputSchema: resolveReadOutputSchema,
283
+ createHandler: collectionHandlers.createCollectionDiscardDraftHandler(uid)
284
+ });
285
+ }
286
+ return tools;
287
+ };
288
+ // ---------------------------------------------------------------------------
289
+ // Single-type tool-definition builder
290
+ // ---------------------------------------------------------------------------
291
+ /**
292
+ * Derives the full set of `DerivedTool` definitions for a single single-type model.
293
+ * Produces get/write/delete tools, plus publish/unpublish/discard_draft when
294
+ * draft-and-publish is enabled. Each tool's input/output schema is resolved
295
+ * per-request so RBAC field and locale constraints are applied at call time.
296
+ */ const buildSingleTypeTools = (strapi, model, ctx)=>{
297
+ const uid = model.uid;
298
+ const slug = utils.slugifyUidForMcpToolName(uid);
299
+ const draftAndPublish = model.options?.draftAndPublish === true;
300
+ const { attributes } = model;
301
+ const runtimeLocaleSchema = permissions.buildLocaleSchema(ctx.localeCodes, ctx.defaultLocale);
302
+ const resolveReadFields = (context)=>permissions.getPermittedFields(strapi, context.userAbility, permissionChecker.ACTIONS.read, uid, attributes);
303
+ const resolveReadOutputSchema = (context)=>outputSchemas.buildDocumentOutputSchema(attributes, resolveReadFields(context));
304
+ const resolveGetInputSchema = (context)=>{
305
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.read, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
306
+ return strapiUtils.z.object({
307
+ locale: localeSchema,
308
+ status: inputSchemas.statusSchema
309
+ });
310
+ };
311
+ const resolveWriteInputSchema = (context)=>{
312
+ const createFields = permissions.getPermittedFields(strapi, context.userAbility, permissionChecker.ACTIONS.create, uid, attributes);
313
+ const updateFields = permissions.getPermittedFields(strapi, context.userAbility, permissionChecker.ACTIONS.update, uid, attributes);
314
+ // null means all fields permitted; union of null with anything is null (all permitted)
315
+ const writeFields = createFields === null || updateFields === null ? null : new Set([
316
+ ...createFields,
317
+ ...updateFields
318
+ ]);
319
+ const dataSchema$1 = dataSchema.buildDataSchema(strapi, model, attributes, writeFields);
320
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.update, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
321
+ return strapiUtils.z.object({
322
+ data: dataSchema$1,
323
+ locale: localeSchema
324
+ });
325
+ };
326
+ const resolveDeleteInputSchema = (context)=>{
327
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.delete, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
328
+ return strapiUtils.z.object({
329
+ locale: localeSchema
330
+ });
331
+ };
332
+ const resolvePublishInputSchema = (context)=>{
333
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.publish, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
334
+ return strapiUtils.z.object({
335
+ locale: localeSchema
336
+ });
337
+ };
338
+ const resolveUnpublishInputSchema = (context)=>{
339
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.unpublish, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
340
+ return strapiUtils.z.object({
341
+ locale: localeSchema,
342
+ discardDraft: strapiUtils.z.boolean().optional().describe('Also discard the draft when unpublishing.')
343
+ });
344
+ };
345
+ const resolveDiscardDraftInputSchema = (context)=>{
346
+ const localeSchema = permissions.resolvePermittedLocaleSchema(strapi, context, permissionChecker.ACTIONS.discard, uid, ctx.localeCodes, ctx.defaultLocale, runtimeLocaleSchema);
347
+ return strapiUtils.z.object({
348
+ locale: localeSchema
349
+ });
350
+ };
351
+ const tools = [
352
+ {
353
+ name: `get_${slug}`,
354
+ telemetry: {
355
+ source: 'content-manager',
356
+ name: 'get'
357
+ },
358
+ ...utils.describeTool({
359
+ apiID: model.apiID,
360
+ uid,
361
+ operation: 'get'
362
+ }),
363
+ auth: {
364
+ policies: [
365
+ {
366
+ action: permissionChecker.ACTIONS.read,
367
+ subject: uid
368
+ }
369
+ ]
370
+ },
371
+ resolveInputSchema: resolveGetInputSchema,
372
+ resolveOutputSchema: resolveReadOutputSchema,
373
+ createHandler: singleTypeHandlers.createSingleGetHandler(uid)
374
+ },
375
+ {
376
+ name: `write_${slug}`,
377
+ telemetry: {
378
+ source: 'content-manager',
379
+ name: 'write'
380
+ },
381
+ ...utils.describeTool({
382
+ apiID: model.apiID,
383
+ uid,
384
+ operation: 'write'
385
+ }),
386
+ auth: {
387
+ policies: [
388
+ {
389
+ action: permissionChecker.ACTIONS.create,
390
+ subject: uid
391
+ },
392
+ {
393
+ action: permissionChecker.ACTIONS.update,
394
+ subject: uid
395
+ }
396
+ ]
397
+ },
398
+ resolveInputSchema: resolveWriteInputSchema,
399
+ resolveOutputSchema: resolveReadOutputSchema,
400
+ createHandler: singleTypeHandlers.createSingleWriteHandler(uid)
401
+ },
402
+ {
403
+ name: `delete_${slug}`,
404
+ telemetry: {
405
+ source: 'content-manager',
406
+ name: 'delete'
407
+ },
408
+ ...utils.describeTool({
409
+ apiID: model.apiID,
410
+ uid,
411
+ operation: 'delete'
412
+ }),
413
+ auth: {
414
+ policies: [
415
+ {
416
+ action: permissionChecker.ACTIONS.delete,
417
+ subject: uid
418
+ }
419
+ ]
420
+ },
421
+ resolveInputSchema: resolveDeleteInputSchema,
422
+ resolveOutputSchema: (context)=>outputSchemas.buildDeleteOutputSchema(attributes, resolveReadFields(context)),
423
+ createHandler: singleTypeHandlers.createSingleDeleteHandler(uid)
424
+ }
425
+ ];
426
+ if (draftAndPublish === true) {
427
+ tools.push({
428
+ name: `publish_${slug}`,
429
+ telemetry: {
430
+ source: 'content-manager',
431
+ name: 'publish'
432
+ },
433
+ ...utils.describeTool({
434
+ apiID: model.apiID,
435
+ uid,
436
+ operation: 'publish'
437
+ }),
438
+ auth: {
439
+ policies: [
440
+ {
441
+ action: permissionChecker.ACTIONS.publish,
442
+ subject: uid
443
+ }
444
+ ]
445
+ },
446
+ resolveInputSchema: resolvePublishInputSchema,
447
+ resolveOutputSchema: resolveReadOutputSchema,
448
+ createHandler: singleTypeHandlers.createSinglePublishHandler(uid)
449
+ }, {
450
+ name: `unpublish_${slug}`,
451
+ telemetry: {
452
+ source: 'content-manager',
453
+ name: 'unpublish'
454
+ },
455
+ ...utils.describeTool({
456
+ apiID: model.apiID,
457
+ uid,
458
+ operation: 'unpublish'
459
+ }),
460
+ auth: {
461
+ policies: [
462
+ {
463
+ action: permissionChecker.ACTIONS.unpublish,
464
+ subject: uid
465
+ }
466
+ ]
467
+ },
468
+ resolveInputSchema: resolveUnpublishInputSchema,
469
+ resolveOutputSchema: resolveReadOutputSchema,
470
+ createHandler: singleTypeHandlers.createSingleUnpublishHandler(uid)
471
+ }, {
472
+ name: `discard_${slug}_draft`,
473
+ telemetry: {
474
+ source: 'content-manager',
475
+ name: 'discard_draft'
476
+ },
477
+ ...utils.describeTool({
478
+ apiID: model.apiID,
479
+ uid,
480
+ operation: 'discard_draft'
481
+ }),
482
+ auth: {
483
+ policies: [
484
+ {
485
+ action: permissionChecker.ACTIONS.discard,
486
+ subject: uid
487
+ }
488
+ ]
489
+ },
490
+ resolveInputSchema: resolveDiscardDraftInputSchema,
491
+ resolveOutputSchema: resolveReadOutputSchema,
492
+ createHandler: singleTypeHandlers.createSingleDiscardDraftHandler(uid)
493
+ });
494
+ }
495
+ return tools;
496
+ };
497
+ // ---------------------------------------------------------------------------
498
+ // Main export
499
+ // ---------------------------------------------------------------------------
500
+ /**
501
+ * Builds MCP tool definitions for displayed content-manager models.
502
+ * Visibility is enforced separately via static auth on each tool and MCP session capability sync.
503
+ */ const deriveDisplayedContentTypeMcpToolDefinitions = (strapi, models, ctx = {
504
+ localeCodes: null,
505
+ defaultLocale: null
506
+ })=>{
507
+ const tools = [];
508
+ for (const model of models){
509
+ if (model.kind === 'collectionType') {
510
+ tools.push(...buildCollectionTools(strapi, model, ctx));
511
+ } else if (model.kind === 'singleType') {
512
+ tools.push(...buildSingleTypeTools(strapi, model, ctx));
513
+ }
514
+ }
515
+ return tools;
516
+ };
517
+
518
+ exports.slugifyUidForMcpToolName = utils.slugifyUidForMcpToolName;
519
+ exports.getComponentLeafPaths = permissions.getComponentLeafPaths;
520
+ exports.buildDataSchema = dataSchema.buildDataSchema;
521
+ exports.buildSortSchema = sortSchema.buildSortSchema;
522
+ exports.buildFiltersSchema = filtersSchema.buildFiltersSchema;
523
+ exports.deriveDisplayedContentTypeMcpToolDefinitions = deriveDisplayedContentTypeMcpToolDefinitions;
524
+ //# sourceMappingURL=derive-content-type-mcp-tools.js.map