@strapi/content-manager 5.29.0 → 5.30.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 (199) hide show
  1. package/dist/admin/components/ComponentIcon.js +3 -0
  2. package/dist/admin/components/ComponentIcon.js.map +1 -1
  3. package/dist/admin/components/ComponentIcon.mjs +3 -0
  4. package/dist/admin/components/ComponentIcon.mjs.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  6. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  7. package/dist/admin/components/RelativeTime.js.map +1 -1
  8. package/dist/admin/components/RelativeTime.mjs.map +1 -1
  9. package/dist/admin/components/Widgets.js.map +1 -1
  10. package/dist/admin/components/Widgets.mjs.map +1 -1
  11. package/dist/admin/content-manager.js.map +1 -1
  12. package/dist/admin/content-manager.mjs.map +1 -1
  13. package/dist/admin/history/components/HistoryAction.js.map +1 -1
  14. package/dist/admin/history/components/HistoryAction.mjs.map +1 -1
  15. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  16. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  17. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  18. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  19. package/dist/admin/history/components/VersionsList.js.map +1 -1
  20. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  21. package/dist/admin/history/pages/History.js.map +1 -1
  22. package/dist/admin/history/pages/History.mjs.map +1 -1
  23. package/dist/admin/history/services/historyVersion.js.map +1 -1
  24. package/dist/admin/history/services/historyVersion.mjs.map +1 -1
  25. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  26. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  27. package/dist/admin/hooks/useDocumentActions.js +24 -5
  28. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  29. package/dist/admin/hooks/useDocumentActions.mjs +24 -5
  30. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  31. package/dist/admin/index.js.map +1 -1
  32. package/dist/admin/index.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/DocumentActions.js +5 -3
  34. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/DocumentActions.mjs +5 -3
  36. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/DocumentStatus.js.map +1 -1
  38. package/dist/admin/pages/EditView/components/DocumentStatus.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  40. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +66 -2
  42. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +66 -2
  44. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.js.map +1 -1
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  50. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.js.map +1 -1
  52. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Modifiers.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js +7 -3
  54. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs +7 -3
  56. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  58. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  60. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  62. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  64. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +1 -0
  66. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +1 -0
  68. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  70. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/UID.js +2 -1
  72. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +2 -1
  74. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  76. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  78. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  80. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.js.map +1 -1
  82. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.mjs.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.js.map +1 -1
  84. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.mjs.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  86. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  87. package/dist/admin/pages/EditView/components/Header.js +10 -5
  88. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/Header.mjs +10 -5
  90. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  91. package/dist/admin/pages/EditView/components/InputRenderer.js +12 -11
  92. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  93. package/dist/admin/pages/EditView/components/InputRenderer.mjs +12 -11
  94. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  95. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  96. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  97. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  98. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  99. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  100. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
  101. package/dist/admin/pages/ListConfiguration/components/Header.js.map +1 -1
  102. package/dist/admin/pages/ListConfiguration/components/Header.mjs.map +1 -1
  103. package/dist/admin/pages/ListView/ListViewPage.js +0 -2
  104. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  105. package/dist/admin/pages/ListView/ListViewPage.mjs +0 -2
  106. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  107. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js.map +1 -1
  108. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs.map +1 -1
  109. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  110. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  111. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  112. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  113. package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
  114. package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
  115. package/dist/admin/preview/services/preview.js.map +1 -1
  116. package/dist/admin/preview/services/preview.mjs.map +1 -1
  117. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  118. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  119. package/dist/admin/preview/utils/previewScript.js.map +1 -1
  120. package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
  121. package/dist/admin/router.js.map +1 -1
  122. package/dist/admin/router.mjs.map +1 -1
  123. package/dist/admin/services/api.js +2 -1
  124. package/dist/admin/services/api.js.map +1 -1
  125. package/dist/admin/services/api.mjs +2 -1
  126. package/dist/admin/services/api.mjs.map +1 -1
  127. package/dist/admin/services/documents.js +10 -2
  128. package/dist/admin/services/documents.js.map +1 -1
  129. package/dist/admin/services/documents.mjs +10 -2
  130. package/dist/admin/services/documents.mjs.map +1 -1
  131. package/dist/admin/services/homepage.js.map +1 -1
  132. package/dist/admin/services/homepage.mjs.map +1 -1
  133. package/dist/admin/services/relations.js.map +1 -1
  134. package/dist/admin/services/relations.mjs.map +1 -1
  135. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  136. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/links.d.ts +2 -0
  137. package/dist/admin/src/pages/EditView/components/Header.d.ts +12 -1
  138. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  139. package/dist/admin/src/services/api.d.ts +1 -1
  140. package/dist/admin/src/services/components.d.ts +2 -2
  141. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  142. package/dist/admin/src/services/documents.d.ts +16 -16
  143. package/dist/admin/src/services/homepage.d.ts +1 -1
  144. package/dist/admin/src/services/init.d.ts +1 -1
  145. package/dist/admin/src/services/relations.d.ts +2 -2
  146. package/dist/admin/src/services/uid.d.ts +3 -3
  147. package/dist/admin/translations/fr.json.js +1 -1
  148. package/dist/admin/translations/fr.json.mjs +1 -1
  149. package/dist/admin/utils/translations.js.map +1 -1
  150. package/dist/admin/utils/translations.mjs.map +1 -1
  151. package/dist/admin/utils/urls.js.map +1 -1
  152. package/dist/admin/utils/urls.mjs.map +1 -1
  153. package/dist/admin/utils/users.js.map +1 -1
  154. package/dist/admin/utils/users.mjs.map +1 -1
  155. package/dist/admin/utils/validation.js.map +1 -1
  156. package/dist/admin/utils/validation.mjs.map +1 -1
  157. package/dist/server/controllers/collection-types.js +2 -1
  158. package/dist/server/controllers/collection-types.js.map +1 -1
  159. package/dist/server/controllers/collection-types.mjs +2 -1
  160. package/dist/server/controllers/collection-types.mjs.map +1 -1
  161. package/dist/server/controllers/relations.js.map +1 -1
  162. package/dist/server/controllers/relations.mjs.map +1 -1
  163. package/dist/server/controllers/single-types.js.map +1 -1
  164. package/dist/server/controllers/single-types.mjs.map +1 -1
  165. package/dist/server/controllers/validation/dimensions.js.map +1 -1
  166. package/dist/server/controllers/validation/dimensions.mjs.map +1 -1
  167. package/dist/server/controllers/validation/index.js.map +1 -1
  168. package/dist/server/controllers/validation/index.mjs.map +1 -1
  169. package/dist/server/history/utils.js.map +1 -1
  170. package/dist/server/history/utils.mjs.map +1 -1
  171. package/dist/server/homepage/services/homepage.js.map +1 -1
  172. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  173. package/dist/server/middlewares/routing.js.map +1 -1
  174. package/dist/server/middlewares/routing.mjs.map +1 -1
  175. package/dist/server/preview/services/preview-config.js +8 -33
  176. package/dist/server/preview/services/preview-config.js.map +1 -1
  177. package/dist/server/preview/services/preview-config.mjs +9 -34
  178. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  179. package/dist/server/preview/services/preview.js.map +1 -1
  180. package/dist/server/preview/services/preview.mjs.map +1 -1
  181. package/dist/server/preview/utils.js.map +1 -1
  182. package/dist/server/preview/utils.mjs.map +1 -1
  183. package/dist/server/services/configuration.js.map +1 -1
  184. package/dist/server/services/configuration.mjs.map +1 -1
  185. package/dist/server/services/document-metadata.js +23 -1
  186. package/dist/server/services/document-metadata.js.map +1 -1
  187. package/dist/server/services/document-metadata.mjs +23 -1
  188. package/dist/server/services/document-metadata.mjs.map +1 -1
  189. package/dist/server/services/field-sizes.js.map +1 -1
  190. package/dist/server/services/field-sizes.mjs.map +1 -1
  191. package/dist/server/services/uid.js.map +1 -1
  192. package/dist/server/services/uid.mjs.map +1 -1
  193. package/dist/server/services/utils/store.js.map +1 -1
  194. package/dist/server/services/utils/store.mjs.map +1 -1
  195. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  196. package/dist/server/src/controllers/single-types.d.ts.map +1 -1
  197. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  198. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  199. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"collection-types.mjs","sources":["../../../server/src/controllers/collection-types.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\n\nimport { setCreatorFields, async, errors } from '@strapi/utils';\nimport type { Modules, UID } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { validateBulkActionInput } from './validation';\nimport { getProhibitedCloningFields, excludeNotCreatableFields } from './utils/clone';\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { formatDocumentWithMetadata } from './utils/metadata';\n\ntype Options = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\n/**\n * Create a new document.\n *\n * @param ctx - Koa context\n * @param opts - Options\n * @param opts.populate - Populate options of the returned document.\n * By default documentManager will populate all relations.\n */\nconst createDocument = async (ctx: any, opts?: Options) => {\n const { userAbility, user } = ctx.state;\n const { model } = ctx.params;\n const { body } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const pickPermittedFields = permissionChecker.sanitizeCreateInput;\n const setCreator = setCreatorFields({ user });\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n const sanitizedBody = await sanitizeFn(body);\n\n const { locale, status } = await getDocumentLocaleAndStatus(body, model);\n\n return documentManager.create(model, {\n data: sanitizedBody as any,\n locale,\n status,\n populate: opts?.populate,\n });\n\n // TODO: Revert the creation if create permission conditions are not met\n // if (permissionChecker.cannot.create(document)) {\n // throw new errors.ForbiddenError();\n // }\n};\n\n/**\n * Update a document version.\n * - If the document version exists, it will be updated.\n * - If the document version does not exist, a new document locale will be created.\n * By default documentManager will populate all relations.\n *\n * @param ctx - Koa context\n * @param opts - Options\n * @param opts.populate - Populate options of the returned document\n */\nconst updateDocument = async (ctx: any, opts?: Options) => {\n const { userAbility, user } = ctx.state;\n const { id, model } = ctx.params;\n const { body } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n // Populate necessary fields to check permissions\n const permissionQuery = await permissionChecker.sanitizedQuery.update(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, documentExists] = await Promise.all([\n documentManager.findOne(id, model, { populate, locale, status: 'draft' }),\n documentManager.exists(model, id),\n ]);\n\n if (!documentExists) {\n throw new errors.NotFoundError();\n }\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 pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n const sanitizedBody = await sanitizeFn(body);\n\n return documentManager.update(documentVersion?.documentId || id, 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 documentMetadata = getService('document-metadata');\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\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .populateDeep(1)\n .countRelations({ toOne: false, toMany: true })\n .build();\n\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const { results: documents, pagination } = await documentManager.findPage(\n { ...permissionQuery, populate, locale, status },\n model\n );\n\n // TODO: Skip this part if not necessary (if D&P disabled or columns not displayed in the view)\n const documentsAvailableStatus = await documentMetadata.getManyAvailableStatus(\n model,\n documents\n );\n\n const setStatus = (document: any) => {\n // Available status of document\n const availableStatuses = documentsAvailableStatus.filter(\n (d: any) => d.documentId === document.documentId\n );\n // Compute document version status\n document.status = documentMetadata.getStatus(document, availableStatuses);\n return document;\n };\n\n const results = await async.map(\n documents,\n async.pipe(permissionChecker.sanitizeOutput, setStatus)\n );\n\n ctx.body = {\n results,\n pagination,\n };\n },\n\n async findOne(ctx: any) {\n const { userAbility } = ctx.state;\n const { model, id } = ctx.params;\n\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(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);\n\n const version = await documentManager.findOne(id, model, {\n populate,\n locale,\n status,\n });\n\n if (!version) {\n // Check if document exists\n const exists = await documentManager.exists(model, id);\n if (!exists) {\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 TODO: fix\n { documentId: id, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n\n ctx.body = { data: {}, meta };\n\n return;\n }\n\n // if the user has condition that needs populated content, it's not applied because entity don't have relations populated\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n // TODO: Count populated relations by permissions\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async create(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 [totalEntries, document] = await Promise.all([\n strapi.db.query(model).count(),\n createDocument(ctx),\n ]);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.status = 201;\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument, {\n // Empty metadata as it's not relevant for a new document\n availableLocales: false,\n availableStatus: false,\n });\n\n if (totalEntries === 0) {\n strapi.telemetry.send('didCreateFirstContentTypeEntry', {\n eventProperties: { model },\n });\n }\n },\n\n async update(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 updatedVersion = await updateDocument(ctx);\n\n const sanitizedVersion = await permissionChecker.sanitizeOutput(updatedVersion);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedVersion);\n },\n\n async clone(ctx: any) {\n const { userAbility, user } = ctx.state;\n const { model, sourceId: id } = ctx.params;\n const { body } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.create(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n const document = await documentManager.findOne(id, model, {\n populate,\n locale,\n status: 'draft',\n });\n\n if (!document) {\n return ctx.notFound();\n }\n\n const pickPermittedFields = permissionChecker.sanitizeCreateInput;\n const setCreator = setCreatorFields({ user });\n const excludeNotCreatable = excludeNotCreatableFields(model, permissionChecker);\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any, excludeNotCreatable);\n const sanitizedBody = await sanitizeFn(body);\n\n const clonedDocument = await documentManager.clone(document.documentId, sanitizedBody, model);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(clonedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument, {\n // Empty metadata as it's not relevant for a new document\n availableLocales: false,\n availableStatus: false,\n });\n },\n\n async autoClone(ctx: any) {\n const { model } = ctx.params;\n\n // Check if the model has fields that prevent auto cloning\n const prohibitedFields = getProhibitedCloningFields(model);\n\n if (prohibitedFields.length > 0) {\n return ctx.badRequest(\n 'Entity could not be cloned as it has unique and/or relational fields. ' +\n 'Please edit those fields manually and save to complete the cloning.',\n {\n prohibitedFields,\n }\n );\n }\n\n await this.clone(ctx);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { id, model } = ctx.params;\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 permissionQuery = await permissionChecker.sanitizedQuery.delete(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);\n\n // Find locales to delete\n const documentLocales = await documentManager.findLocales(id, model, { populate, locale });\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 result = await documentManager.delete(id, model, { locale });\n\n ctx.body = await permissionChecker.sanitizeOutput(result);\n },\n\n /**\n * Publish a document version.\n * Supports creating/saving a document and publishing it in one request.\n */\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n // If id does not exist, the document has to be created\n const { id, model } = ctx.params;\n const { body } = 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 // Create or update document\n const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n let document: any;\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n /**\n * Publish can be called on two scenarios:\n * 1. Create a new document and publish it in one request\n * 2. Update an existing document and publish it in one request\n *\n * Based on user permissions:\n * 1. User cannot create a document, but can publish\n * Action will be forbidden as user cannot create a document\n * 2. User can update and publish a document\n * Action will be allowed, but document will not be updated, only published with the latest draft\n */\n const isCreate = isNil(id);\n if (isCreate) {\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n document = await createDocument(ctx, { populate });\n }\n\n const isUpdate = !isCreate;\n if (isUpdate) {\n // check if the document exists\n const documentExists = await documentManager.exists(model, id);\n\n if (!documentExists) {\n throw new errors.NotFoundError('Document not found');\n }\n\n // check the document version\n document = await documentManager.findOne(id!, model, { populate, locale });\n\n if (!document) {\n // update and publish the new version\n if (\n permissionChecker.cannot.create({ locale }) ||\n permissionChecker.cannot.publish({ locale })\n ) {\n throw new errors.ForbiddenError();\n }\n document = await updateDocument(ctx);\n } else if (permissionChecker.can.update(document)) {\n await updateDocument(ctx);\n }\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, model, {\n locale,\n // TODO: Allow setting creator fields on publish\n // data: setCreatorFields({ user, isEdition: true })({}),\n });\n\n if (!publishResult || publishResult.length === 0) {\n throw new errors.NotFoundError('Document not found or already published.');\n }\n\n return publishResult[0];\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async bulkPublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body } = ctx.request;\n const { documentIds } = body;\n\n await validateBulkActionInput(body);\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 permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model, {\n allowMultipleLocales: true,\n });\n\n const entityPromises = documentIds.map((documentId: any) =>\n documentManager.findLocales(documentId, model, { populate, locale, isPublished: false })\n );\n const entities = (await Promise.all(entityPromises)).flat();\n\n for (const entity of entities) {\n if (!entity) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.publish(entity)) {\n return ctx.forbidden();\n }\n }\n\n const count = await documentManager.publishMany(model, documentIds, locale);\n ctx.body = { count };\n },\n\n async bulkUnpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body } = ctx.request;\n const { documentIds } = body;\n\n await validateBulkActionInput(body);\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 const { locale } = await getDocumentLocaleAndStatus(body, model, {\n allowMultipleLocales: true,\n });\n\n const entityPromises = documentIds.map((documentId: any) =>\n documentManager.findLocales(documentId, model, { locale, isPublished: true })\n );\n const entities = (await Promise.all(entityPromises)).flat();\n\n for (const entity of entities) {\n if (!entity) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.publish(entity)) {\n return ctx.forbidden();\n }\n }\n\n const entitiesIds = entities.map((document) => document.documentId);\n\n const { count } = await documentManager.unpublishMany(entitiesIds, model, { locale });\n\n ctx.body = { count };\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { id, model } = ctx.params;\n const {\n body: { discardDraft, ...body },\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 permissionQuery = await permissionChecker.sanitizedQuery.unpublish(ctx.query);\n\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n // TODO allow multiple locales for bulk locale unpublish\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n const document = await documentManager.findOne(id, model, {\n populate,\n locale,\n status: 'published',\n });\n\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\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 { id, model } = ctx.params;\n const { body } = 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 permissionQuery = await permissionChecker.sanitizedQuery.discard(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n const document = await documentManager.findOne(id, model, {\n populate,\n locale,\n status: 'published',\n });\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 bulkDelete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query, body } = ctx.request;\n const { documentIds } = body;\n\n await validateBulkActionInput(body);\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 permissionQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const documentLocales = await documentManager.findLocales(documentIds, 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 // We filter out documentsIds that maybe doesn't exist in a specific locale\n const localeDocumentsIds = documentLocales.map((document) => document.documentId);\n\n const { count } = await documentManager.deleteMany(localeDocumentsIds, model, { locale });\n\n ctx.body = { count };\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model, id } = ctx.params;\n\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(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);\n const entity = await documentManager.findOne(id, model, { populate, locale, status });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.read(entity)) {\n return ctx.forbidden();\n }\n\n const number = await documentManager.countDraftRelations(id, model, locale);\n\n return {\n data: number,\n };\n },\n\n async countManyEntriesDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const ids = ctx.request.query.documentIds as string[];\n const locale = ctx.request.query.locale as string[];\n const { model } = ctx.params;\n\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 documents = await documentManager.findMany(\n {\n filters: {\n documentId: ids,\n },\n locale,\n },\n model\n );\n\n if (!documents) {\n return ctx.notFound();\n }\n\n const number = await documentManager.countManyEntriesDraftRelations(ids, model, locale);\n\n return {\n data: number,\n };\n },\n};\n"],"names":["createDocument","ctx","opts","userAbility","user","state","model","params","body","request","documentManager","getService","permissionChecker","create","cannot","errors","ForbiddenError","pickPermittedFields","sanitizeCreateInput","setCreator","setCreatorFields","sanitizeFn","async","pipe","sanitizedBody","locale","status","getDocumentLocaleAndStatus","data","populate","updateDocument","id","update","permissionQuery","sanitizedQuery","query","populateFromQuery","build","documentVersion","documentExists","Promise","all","findOne","exists","NotFoundError","sanitizeUpdateInput","isEdition","documentId","find","documentMetadata","read","forbidden","populateDeep","countRelations","toOne","toMany","results","documents","pagination","findPage","documentsAvailableStatus","getManyAvailableStatus","setStatus","document","availableStatuses","filter","d","getStatus","map","sanitizeOutput","Infinity","version","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","totalEntries","strapi","db","count","telemetry","send","eventProperties","updatedVersion","sanitizedVersion","clone","sourceId","excludeNotCreatable","excludeNotCreatableFields","clonedDocument","autoClone","prohibitedFields","getProhibitedCloningFields","length","badRequest","delete","documentLocales","findLocales","result","publish","publishedDocument","transaction","isCreate","isNil","isUpdate","can","publishResult","bulkPublish","documentIds","validateBulkActionInput","allowMultipleLocales","entityPromises","isPublished","entities","flat","entity","publishMany","bulkUnpublish","unpublish","entitiesIds","unpublishMany","discardDraft","discard","bulkDelete","localeDocumentsIds","deleteMany","countDraftRelations","number","countManyEntriesDraftRelations","ids","findMany","filters"],"mappings":"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"}
1
+ {"version":3,"file":"collection-types.mjs","sources":["../../../server/src/controllers/collection-types.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\n\nimport { setCreatorFields, async, errors } from '@strapi/utils';\nimport type { Modules, UID } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { validateBulkActionInput } from './validation';\nimport { getProhibitedCloningFields, excludeNotCreatableFields } from './utils/clone';\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { formatDocumentWithMetadata } from './utils/metadata';\n\ntype Options = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\n/**\n * Create a new document.\n *\n * @param ctx - Koa context\n * @param opts - Options\n * @param opts.populate - Populate options of the returned document.\n * By default documentManager will populate all relations.\n */\nconst createDocument = async (ctx: any, opts?: Options) => {\n const { userAbility, user } = ctx.state;\n const { model } = ctx.params;\n const { body } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const pickPermittedFields = permissionChecker.sanitizeCreateInput;\n const setCreator = setCreatorFields({ user });\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n const sanitizedBody = await sanitizeFn(body);\n\n const { locale, status } = await getDocumentLocaleAndStatus(body, model);\n\n return documentManager.create(model, {\n data: sanitizedBody as any,\n locale,\n status,\n populate: opts?.populate,\n });\n\n // TODO: Revert the creation if create permission conditions are not met\n // if (permissionChecker.cannot.create(document)) {\n // throw new errors.ForbiddenError();\n // }\n};\n\n/**\n * Update a document version.\n * - If the document version exists, it will be updated.\n * - If the document version does not exist, a new document locale will be created.\n * By default documentManager will populate all relations.\n *\n * @param ctx - Koa context\n * @param opts - Options\n * @param opts.populate - Populate options of the returned document\n */\nconst updateDocument = async (ctx: any, opts?: Options) => {\n const { userAbility, user } = ctx.state;\n const { id, model } = ctx.params;\n const { body } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n // Populate necessary fields to check permissions\n const permissionQuery = await permissionChecker.sanitizedQuery.update(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, documentExists] = await Promise.all([\n documentManager.findOne(id, model, { populate, locale, status: 'draft' }),\n documentManager.exists(model, id),\n ]);\n\n if (!documentExists) {\n throw new errors.NotFoundError();\n }\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 pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n const sanitizedBody = await sanitizeFn(body);\n\n const updatedDocument = await documentManager.update(documentVersion?.documentId || id, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n\n return updatedDocument;\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 documentMetadata = getService('document-metadata');\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\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .populateDeep(1)\n .countRelations({ toOne: false, toMany: true })\n .build();\n\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const { results: documents, pagination } = await documentManager.findPage(\n { ...permissionQuery, populate, locale, status },\n model\n );\n\n // TODO: Skip this part if not necessary (if D&P disabled or columns not displayed in the view)\n const documentsAvailableStatus = await documentMetadata.getManyAvailableStatus(\n model,\n documents\n );\n\n const setStatus = (document: any) => {\n // Available status of document\n const availableStatuses = documentsAvailableStatus.filter(\n (d: any) => d.documentId === document.documentId\n );\n // Compute document version status\n document.status = documentMetadata.getStatus(document, availableStatuses);\n return document;\n };\n\n const results = await async.map(\n documents,\n async.pipe(permissionChecker.sanitizeOutput, setStatus)\n );\n\n ctx.body = {\n results,\n pagination,\n };\n },\n\n async findOne(ctx: any) {\n const { userAbility } = ctx.state;\n const { model, id } = ctx.params;\n\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(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);\n\n const version = await documentManager.findOne(id, model, {\n populate,\n locale,\n status,\n });\n\n if (!version) {\n // Check if document exists\n const exists = await documentManager.exists(model, id);\n if (!exists) {\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 TODO: fix\n { documentId: id, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n\n ctx.body = { data: {}, meta };\n\n return;\n }\n\n // if the user has condition that needs populated content, it's not applied because entity don't have relations populated\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n // TODO: Count populated relations by permissions\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async create(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 [totalEntries, document] = await Promise.all([\n strapi.db.query(model).count(),\n createDocument(ctx),\n ]);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.status = 201;\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument, {\n // Empty metadata as it's not relevant for a new document\n availableLocales: false,\n availableStatus: false,\n });\n\n if (totalEntries === 0) {\n strapi.telemetry.send('didCreateFirstContentTypeEntry', {\n eventProperties: { model },\n });\n }\n },\n\n async update(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 updatedVersion = await updateDocument(ctx);\n\n const sanitizedVersion = await permissionChecker.sanitizeOutput(updatedVersion);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedVersion);\n },\n\n async clone(ctx: any) {\n const { userAbility, user } = ctx.state;\n const { model, sourceId: id } = ctx.params;\n const { body } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.create(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n const document = await documentManager.findOne(id, model, {\n populate,\n locale,\n status: 'draft',\n });\n\n if (!document) {\n return ctx.notFound();\n }\n\n const pickPermittedFields = permissionChecker.sanitizeCreateInput;\n const setCreator = setCreatorFields({ user });\n const excludeNotCreatable = excludeNotCreatableFields(model, permissionChecker);\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any, excludeNotCreatable);\n const sanitizedBody = await sanitizeFn(body);\n\n const clonedDocument = await documentManager.clone(document.documentId, sanitizedBody, model);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(clonedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument, {\n // Empty metadata as it's not relevant for a new document\n availableLocales: false,\n availableStatus: false,\n });\n },\n\n async autoClone(ctx: any) {\n const { model } = ctx.params;\n\n // Check if the model has fields that prevent auto cloning\n const prohibitedFields = getProhibitedCloningFields(model);\n\n if (prohibitedFields.length > 0) {\n return ctx.badRequest(\n 'Entity could not be cloned as it has unique and/or relational fields. ' +\n 'Please edit those fields manually and save to complete the cloning.',\n {\n prohibitedFields,\n }\n );\n }\n\n await this.clone(ctx);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { id, model } = ctx.params;\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 permissionQuery = await permissionChecker.sanitizedQuery.delete(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);\n\n // Find locales to delete\n const documentLocales = await documentManager.findLocales(id, model, { populate, locale });\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 result = await documentManager.delete(id, model, { locale });\n\n ctx.body = await permissionChecker.sanitizeOutput(result);\n },\n\n /**\n * Publish a document version.\n * Supports creating/saving a document and publishing it in one request.\n */\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n // If id does not exist, the document has to be created\n const { id, model } = ctx.params;\n const { body } = 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 // Create or update document\n const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n let document: any;\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n /**\n * Publish can be called on two scenarios:\n * 1. Create a new document and publish it in one request\n * 2. Update an existing document and publish it in one request\n *\n * Based on user permissions:\n * 1. User cannot create a document, but can publish\n * Action will be forbidden as user cannot create a document\n * 2. User can update and publish a document\n * Action will be allowed, but document will not be updated, only published with the latest draft\n */\n const isCreate = isNil(id);\n if (isCreate) {\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n document = await createDocument(ctx, { populate });\n }\n\n const isUpdate = !isCreate;\n if (isUpdate) {\n // check if the document exists\n const documentExists = await documentManager.exists(model, id);\n\n if (!documentExists) {\n throw new errors.NotFoundError('Document not found');\n }\n\n // check the document version\n document = await documentManager.findOne(id!, model, { populate, locale });\n\n if (!document) {\n // update and publish the new version\n if (\n permissionChecker.cannot.create({ locale }) ||\n permissionChecker.cannot.publish({ locale })\n ) {\n throw new errors.ForbiddenError();\n }\n document = await updateDocument(ctx);\n } else if (permissionChecker.can.update(document)) {\n await updateDocument(ctx);\n }\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, model, {\n locale,\n // TODO: Allow setting creator fields on publish\n // data: setCreatorFields({ user, isEdition: true })({}),\n });\n\n if (!publishResult || publishResult.length === 0) {\n throw new errors.NotFoundError('Document not found or already published.');\n }\n\n return publishResult[0];\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async bulkPublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body } = ctx.request;\n const { documentIds } = body;\n\n await validateBulkActionInput(body);\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 permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model, {\n allowMultipleLocales: true,\n });\n\n const entityPromises = documentIds.map((documentId: any) =>\n documentManager.findLocales(documentId, model, { populate, locale, isPublished: false })\n );\n const entities = (await Promise.all(entityPromises)).flat();\n\n for (const entity of entities) {\n if (!entity) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.publish(entity)) {\n return ctx.forbidden();\n }\n }\n\n const count = await documentManager.publishMany(model, documentIds, locale);\n ctx.body = { count };\n },\n\n async bulkUnpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body } = ctx.request;\n const { documentIds } = body;\n\n await validateBulkActionInput(body);\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 const { locale } = await getDocumentLocaleAndStatus(body, model, {\n allowMultipleLocales: true,\n });\n\n const entityPromises = documentIds.map((documentId: any) =>\n documentManager.findLocales(documentId, model, { locale, isPublished: true })\n );\n const entities = (await Promise.all(entityPromises)).flat();\n\n for (const entity of entities) {\n if (!entity) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.publish(entity)) {\n return ctx.forbidden();\n }\n }\n\n const entitiesIds = entities.map((document) => document.documentId);\n\n const { count } = await documentManager.unpublishMany(entitiesIds, model, { locale });\n\n ctx.body = { count };\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { id, model } = ctx.params;\n const {\n body: { discardDraft, ...body },\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 permissionQuery = await permissionChecker.sanitizedQuery.unpublish(ctx.query);\n\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n // TODO allow multiple locales for bulk locale unpublish\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n const document = await documentManager.findOne(id, model, {\n populate,\n locale,\n status: 'published',\n });\n\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\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 { id, model } = ctx.params;\n const { body } = 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 permissionQuery = await permissionChecker.sanitizedQuery.discard(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n const document = await documentManager.findOne(id, model, {\n populate,\n locale,\n status: 'published',\n });\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 bulkDelete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query, body } = ctx.request;\n const { documentIds } = body;\n\n await validateBulkActionInput(body);\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 permissionQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const documentLocales = await documentManager.findLocales(documentIds, 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 // We filter out documentsIds that maybe doesn't exist in a specific locale\n const localeDocumentsIds = documentLocales.map((document) => document.documentId);\n\n const { count } = await documentManager.deleteMany(localeDocumentsIds, model, { locale });\n\n ctx.body = { count };\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model, id } = ctx.params;\n\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(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);\n const entity = await documentManager.findOne(id, model, { populate, locale, status });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.read(entity)) {\n return ctx.forbidden();\n }\n\n const number = await documentManager.countDraftRelations(id, model, locale);\n\n return {\n data: number,\n };\n },\n\n async countManyEntriesDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const ids = ctx.request.query.documentIds as string[];\n const locale = ctx.request.query.locale as string[];\n const { model } = ctx.params;\n\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 documents = await documentManager.findMany(\n {\n filters: {\n documentId: ids,\n },\n locale,\n },\n model\n );\n\n if (!documents) {\n return ctx.notFound();\n }\n\n const number = await documentManager.countManyEntriesDraftRelations(ids, model, locale);\n\n return {\n data: number,\n };\n },\n};\n"],"names":["createDocument","ctx","opts","userAbility","user","state","model","params","body","request","documentManager","getService","permissionChecker","create","cannot","errors","ForbiddenError","pickPermittedFields","sanitizeCreateInput","setCreator","setCreatorFields","sanitizeFn","async","pipe","sanitizedBody","locale","status","getDocumentLocaleAndStatus","data","populate","updateDocument","id","update","permissionQuery","sanitizedQuery","query","populateFromQuery","build","documentVersion","documentExists","Promise","all","findOne","exists","NotFoundError","sanitizeUpdateInput","isEdition","updatedDocument","documentId","find","documentMetadata","read","forbidden","populateDeep","countRelations","toOne","toMany","results","documents","pagination","findPage","documentsAvailableStatus","getManyAvailableStatus","setStatus","document","availableStatuses","filter","d","getStatus","map","sanitizeOutput","Infinity","version","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","totalEntries","strapi","db","count","telemetry","send","eventProperties","updatedVersion","sanitizedVersion","clone","sourceId","excludeNotCreatable","excludeNotCreatableFields","clonedDocument","autoClone","prohibitedFields","getProhibitedCloningFields","length","badRequest","delete","documentLocales","findLocales","result","publish","publishedDocument","transaction","isCreate","isNil","isUpdate","can","publishResult","bulkPublish","documentIds","validateBulkActionInput","allowMultipleLocales","entityPromises","isPublished","entities","flat","entity","publishMany","bulkUnpublish","unpublish","entitiesIds","unpublishMany","discardDraft","discard","bulkDelete","localeDocumentsIds","deleteMany","countDraftRelations","number","countManyEntriesDraftRelations","ids","findMany","filters"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relations.js","sources":["../../../server/src/controllers/relations.ts"],"sourcesContent":["import { prop, uniq, uniqBy, concat, flow, isEmpty } from 'lodash/fp';\n\nimport { isOperatorOfType, contentTypes, relations, errors } from '@strapi/utils';\nimport type { Data, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { validateFindAvailable, validateFindExisting } from './validation/relations';\nimport { isListable } from '../services/utils/configuration/attributes';\n\nconst { PUBLISHED_AT_ATTRIBUTE, UPDATED_AT_ATTRIBUTE } = contentTypes.constants;\n\ninterface RelationEntity {\n id: Data.ID;\n documentId: Modules.Documents.ID;\n updatedAt: string | Date;\n publishedAt?: string | Date;\n [key: string]: unknown;\n}\n\nconst addFiltersClause = (params: any, filtersClause: any) => {\n params.filters = params.filters || {};\n params.filters.$and = params.filters.$and || [];\n params.filters.$and.push(filtersClause);\n};\n\nconst sanitizeMainField = (model: any, mainField: any, userAbility: any) => {\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: model.uid,\n });\n\n // Whether the main field can be displayed or not, regardless of permissions.\n const isMainFieldListable = isListable(model, mainField);\n // Whether the user has the permission to access the model's main field (using RBAC abilities)\n const canReadMainField = permissionChecker.can.read(null, mainField);\n\n if (!isMainFieldListable || !canReadMainField) {\n // Default to 'documentId' if the actual main field shouldn't be displayed\n return 'documentId';\n }\n\n // Edge cases\n\n // 1. Enforce 'name' as the main field for users and permissions' roles\n if (model.uid === 'plugin::users-permissions.role') {\n return 'name';\n }\n\n return mainField;\n};\n\n/**\n *\n * All relations sent to this function should have the same status or no status\n */\nconst addStatusToRelations = async (targetUid: UID.Schema, relations: RelationEntity[]) => {\n if (!contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {\n return relations;\n }\n\n const documentMetadata = getService('document-metadata');\n\n if (!relations.length) {\n return relations;\n }\n\n const firstRelation = relations[0];\n\n const filters: any = {\n documentId: { $in: relations.map((r) => r.documentId) },\n // NOTE: find the \"opposite\" status\n publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true },\n };\n\n const availableStatus = await strapi.query(targetUid).findMany({\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n filters,\n });\n\n return relations.map((relation: RelationEntity) => {\n const availableStatuses = availableStatus.filter(\n (availableDocument: RelationEntity) =>\n availableDocument.documentId === relation.documentId &&\n (relation.locale ? availableDocument.locale === relation.locale : true)\n );\n\n return {\n ...relation,\n status: documentMetadata.getStatus(relation, availableStatuses),\n };\n });\n};\n\nconst getPublishedAtClause = (status: string, uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n\n /**\n * If dp is disabled, ignore the filter\n */\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return {};\n }\n\n // Prioritize the draft status in case it's not provided\n return status === 'published' ? { $notNull: true } : { $null: true };\n};\n\nconst validateLocale = (sourceUid: UID.Schema, targetUid: UID.ContentType, locale?: string) => {\n const sourceModel = strapi.getModel(sourceUid);\n const targetModel = strapi.getModel(targetUid);\n\n const isLocalized = strapi.plugin('i18n').service('content-types').isLocalizedContentType;\n const isSourceLocalized = isLocalized(sourceModel);\n const isTargetLocalized = isLocalized(targetModel);\n\n return {\n locale,\n isSourceLocalized,\n isTargetLocalized,\n };\n};\n\nconst validateStatus = (\n sourceUid: UID.Schema,\n status?: Modules.Documents.Params.PublicationStatus.Kind\n) => {\n const sourceModel = strapi.getModel(sourceUid);\n\n const isDP = contentTypes.hasDraftAndPublish;\n const isSourceDP = isDP(sourceModel);\n\n // Default to draft if not set\n if (!isSourceDP && sourceModel.modelType === 'contentType') {\n return { status: undefined };\n }\n\n switch (status) {\n case 'published':\n return { status: 'published' };\n default:\n // Assign to draft if the status is not valid\n return { status: 'draft' };\n }\n};\n\nexport default {\n async extractAndValidateRequestInfo(ctx: any, id?: Data.ID) {\n const { userAbility } = ctx.state;\n const { model, targetField } = ctx.params;\n\n const sourceSchema = strapi.getModel(model);\n if (!sourceSchema) {\n throw new errors.ValidationError(`The model ${model} doesn't exist`);\n }\n\n const attribute: any = sourceSchema.attributes[targetField];\n if (!attribute || attribute.type !== 'relation') {\n throw new errors.ValidationError(\n `The relational field ${targetField} doesn't exist on ${model}`\n );\n }\n\n const sourceUid = model;\n const targetUid = attribute.target;\n\n const { locale, isSourceLocalized, isTargetLocalized } = validateLocale(\n sourceUid,\n targetUid,\n ctx.request?.query?.locale\n );\n const { status } = validateStatus(sourceUid, ctx.request?.query?.status);\n\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model,\n });\n\n const isComponent = sourceSchema.modelType === 'component';\n if (!isComponent) {\n if (permissionChecker.cannot.read(null, targetField)) {\n return ctx.forbidden();\n }\n }\n\n let entryId: string | number | null = null;\n\n if (id) {\n const where: Record<string, any> = {};\n\n if (!isComponent) {\n where.documentId = id;\n\n if (status) {\n where.publishedAt = getPublishedAtClause(status, sourceUid);\n }\n\n if (locale && isSourceLocalized) {\n where.locale = locale;\n }\n } else {\n // If the source is a component, we only need to filter by the\n // component's entity id\n where.id = id;\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const currentEntity = await strapi.db.query(model).findOne({\n where,\n populate,\n });\n\n // We need to check if the entity exists\n // and if the user has the permission to read it in this way\n // There may be multiple entities (publication states) under this\n // documentId + locale. We only need to check if one exists\n if (!currentEntity) {\n throw new errors.NotFoundError();\n }\n\n if (!isComponent) {\n if (permissionChecker.cannot.read(currentEntity, targetField)) {\n throw new errors.ForbiddenError();\n }\n }\n\n entryId = currentEntity.id;\n }\n\n const modelConfig = isComponent\n ? await getService('components').findConfiguration(sourceSchema)\n : await getService('content-types').findConfiguration(sourceSchema);\n\n const targetSchema = strapi.getModel(targetUid);\n\n const mainField = flow(\n prop(`metadatas.${targetField}.edit.mainField`),\n (mainField) => mainField || 'id',\n (mainField) => sanitizeMainField(targetSchema, mainField, userAbility)\n )(modelConfig);\n\n const fieldsToSelect = uniq([\n mainField,\n PUBLISHED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n 'documentId',\n ]);\n\n if (isTargetLocalized) {\n fieldsToSelect.push('locale');\n }\n\n return {\n entryId,\n locale,\n status,\n attribute,\n fieldsToSelect,\n mainField,\n source: { schema: sourceSchema, isLocalized: isSourceLocalized },\n target: { schema: targetSchema, isLocalized: isTargetLocalized },\n sourceSchema,\n targetSchema,\n targetField,\n };\n },\n\n /**\n * Used to find new relations to add in a relational field.\n *\n * Component and document relations are dealt a bit differently (they don't have a document_id).\n */\n async findAvailable(ctx: any) {\n const { id } = ctx.request.query;\n\n await validateFindAvailable(ctx.request.query);\n\n const {\n locale,\n status,\n targetField,\n fieldsToSelect,\n mainField,\n source: {\n schema: { uid: sourceUid, modelType: sourceModelType },\n isLocalized: isSourceLocalized,\n },\n target: {\n schema: { uid: targetUid },\n isLocalized: isTargetLocalized,\n },\n } = await this.extractAndValidateRequestInfo(ctx, id);\n\n const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;\n\n const permissionChecker = getService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: targetUid,\n });\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n const queryParams = {\n sort: mainField,\n // cannot select other fields as the user may not have the permissions\n fields: fieldsToSelect,\n ...permissionQuery,\n };\n\n // If no status is requested, we find all the draft relations and later update them\n // with the latest available status\n addFiltersClause(queryParams, {\n publishedAt: getPublishedAtClause(status, targetUid),\n });\n\n // We will only filter by locale if the target content type is localized\n const filterByLocale = isTargetLocalized && locale;\n if (filterByLocale) {\n addFiltersClause(queryParams, { locale });\n }\n\n if (id) {\n /**\n * Exclude the relations that are already related to the source\n *\n * We also optionally filter the target relations by the requested\n * status and locale if provided.\n */\n const subQuery = strapi.db.queryBuilder(sourceUid);\n\n // The alias refers to the DB table of the target content type model\n const alias = subQuery.getAlias();\n\n const where: Record<string, any> = {\n [`${alias}.id`]: { $notNull: true },\n [`${alias}.document_id`]: { $notNull: true },\n };\n\n /**\n * Content Types -> Specify document id\n * Components -> Specify entity id (they don't have a document id)\n */\n if (sourceModelType === 'contentType') {\n where.document_id = id;\n } else {\n where.id = id;\n }\n\n // Add the status and locale filters if they are provided\n const publishedAt = getPublishedAtClause(status, targetUid);\n if (!isEmpty(publishedAt)) {\n where[`${alias}.published_at`] = publishedAt;\n }\n\n // If target has localization we need to filter by locale\n if (isTargetLocalized && locale) {\n where[`${alias}.locale`] = locale;\n }\n\n if (isSourceLocalized && locale) {\n where.locale = locale;\n }\n\n /**\n * UI can provide a list of ids to omit,\n * those are the relations user set in the UI but has not persisted.\n * We don't want to include them in the available relations.\n */\n if ((idsToInclude?.length ?? 0) !== 0) {\n where[`${alias}.id`].$notIn = idsToInclude;\n }\n\n const knexSubQuery = subQuery\n .where(where)\n .join({ alias, targetField })\n .select(`${alias}.id`)\n .getKnexQuery();\n\n addFiltersClause(queryParams, {\n id: { $notIn: knexSubQuery },\n });\n }\n\n /**\n * Apply a filter to the mainField based on the search query and filter operator\n * searching should be allowed only on mainField for permission reasons\n */\n if (_q) {\n const _filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n addFiltersClause(queryParams, { [mainField]: { [_filter]: _q } });\n }\n\n if (idsToOmit?.length > 0) {\n // If we have ids to omit, we should filter them out\n addFiltersClause(queryParams, {\n id: { $notIn: uniq(idsToOmit) },\n });\n }\n\n const dbQuery = strapi.get('query-params').transform(targetUid, queryParams);\n\n const res = await strapi.db.query(targetUid).findPage(dbQuery);\n\n ctx.body = {\n ...res,\n results: await addStatusToRelations(targetUid, res.results),\n };\n },\n\n async findExisting(ctx: any) {\n const { userAbility } = ctx.state;\n const { id } = ctx.params;\n\n await validateFindExisting(ctx.request.query);\n\n const {\n entryId,\n attribute,\n targetField,\n fieldsToSelect,\n status,\n source: { schema: sourceSchema },\n target: { schema: targetSchema },\n } = await this.extractAndValidateRequestInfo(ctx, id);\n\n const { uid: sourceUid } = sourceSchema;\n const { uid: targetUid } = targetSchema;\n\n const permissionQuery = await getService('permission-checker')\n .create({ userAbility, model: targetUid })\n .sanitizedQuery.read({ fields: fieldsToSelect });\n\n /**\n * loadPages can not be used for single relations,\n * this unifies the loading regardless of it's type\n *\n * NOTE: Relations need to be loaded using any db.query method\n * to ensure the proper ordering is applied\n */\n const dbQuery = strapi.db.query(sourceUid);\n const loadRelations = relations.isAnyToMany(attribute)\n ? (...args: Parameters<typeof dbQuery.loadPages>) => dbQuery.loadPages(...args)\n : (...args: Parameters<typeof dbQuery.load>) =>\n dbQuery\n .load(...args)\n // Ensure response is an array\n .then((res) => ({ results: res ? [res] : [] }));\n\n const filters: {\n publishedAt?: Record<string, any>;\n } = {};\n\n if (sourceSchema?.options?.draftAndPublish || sourceSchema?.modelType === 'component') {\n if (targetSchema?.options?.draftAndPublish) {\n if (status === 'published') {\n filters.publishedAt = { $notNull: true };\n } else {\n filters.publishedAt = { $null: true };\n }\n }\n } else if (targetSchema?.options?.draftAndPublish) {\n // NOTE: we must return the drafts as some targets might not have a published version yet\n filters.publishedAt = { $null: true };\n }\n\n /**\n * If user does not have access to specific relations (custom conditions),\n * only the ids of the relations are returned.\n *\n * - First query loads all the ids.\n * - Second one also loads the main field, and excludes forbidden relations.\n *\n * The response contains the union of the two queries.\n */\n const res = await loadRelations({ id: entryId }, targetField, {\n select: ['id', 'documentId', 'locale', 'publishedAt', 'updatedAt'],\n ordering: 'desc',\n page: ctx.request.query.page,\n pageSize: ctx.request.query.pageSize,\n filters,\n });\n\n /**\n * Add all ids to load in permissionQuery\n * If any of the relations are not accessible, the permissionQuery will exclude them\n */\n const loadedIds = res.results.map((item: any) => item.id);\n addFiltersClause(permissionQuery, { id: { $in: loadedIds } });\n\n /**\n * Load the relations with the main field, the sanitized permission query\n * will exclude the relations the user does not have access to.\n *\n * Pagination is not necessary as the permissionQuery contains the ids to load.\n */\n const sanitizedRes = await loadRelations({ id: entryId }, targetField, {\n ...strapi.get('query-params').transform(targetUid, permissionQuery),\n ordering: 'desc',\n });\n\n // NOTE: the order is very import to make sure sanitized relations are kept in priority\n const relationsUnion = uniqBy('id', concat(sanitizedRes.results, res.results));\n\n ctx.body = {\n pagination: res.pagination || {\n page: 1,\n pageCount: 1,\n pageSize: 10,\n total: relationsUnion.length,\n },\n results: await addStatusToRelations(targetUid, relationsUnion),\n };\n },\n};\n"],"names":["PUBLISHED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","contentTypes","constants","addFiltersClause","params","filtersClause","filters","$and","push","sanitizeMainField","model","mainField","userAbility","permissionChecker","getService","create","uid","isMainFieldListable","isListable","canReadMainField","can","read","addStatusToRelations","targetUid","relations","hasDraftAndPublish","strapi","getModel","documentMetadata","length","firstRelation","documentId","$in","map","r","publishedAt","$null","$notNull","availableStatus","query","findMany","select","relation","availableStatuses","filter","availableDocument","locale","status","getStatus","getPublishedAtClause","validateLocale","sourceUid","sourceModel","targetModel","isLocalized","plugin","service","isLocalizedContentType","isSourceLocalized","isTargetLocalized","validateStatus","isDP","isSourceDP","modelType","undefined","extractAndValidateRequestInfo","ctx","id","state","targetField","sourceSchema","errors","ValidationError","attribute","attributes","type","target","request","isComponent","cannot","forbidden","entryId","where","permissionQuery","sanitizedQuery","populate","populateFromQuery","build","currentEntity","db","findOne","NotFoundError","ForbiddenError","modelConfig","findConfiguration","targetSchema","flow","prop","fieldsToSelect","uniq","source","schema","findAvailable","validateFindAvailable","sourceModelType","idsToOmit","idsToInclude","_q","queryParams","sort","fields","filterByLocale","subQuery","queryBuilder","alias","getAlias","document_id","isEmpty","$notIn","knexSubQuery","join","getKnexQuery","_filter","isOperatorOfType","dbQuery","get","transform","res","findPage","body","results","findExisting","validateFindExisting","loadRelations","isAnyToMany","args","loadPages","load","then","options","draftAndPublish","ordering","page","pageSize","loadedIds","item","sanitizedRes","relationsUnion","uniqBy","concat","pagination","pageCount","total"],"mappings":"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"}
1
+ {"version":3,"file":"relations.js","sources":["../../../server/src/controllers/relations.ts"],"sourcesContent":["import { prop, uniq, uniqBy, concat, flow, isEmpty } from 'lodash/fp';\n\nimport { isOperatorOfType, contentTypes, relations, errors } from '@strapi/utils';\nimport type { Data, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { validateFindAvailable, validateFindExisting } from './validation/relations';\nimport { isListable } from '../services/utils/configuration/attributes';\n\nconst { PUBLISHED_AT_ATTRIBUTE, UPDATED_AT_ATTRIBUTE } = contentTypes.constants;\n\ninterface RelationEntity {\n id: Data.ID;\n documentId: Modules.Documents.ID;\n updatedAt: string | Date;\n publishedAt?: string | Date;\n [key: string]: unknown;\n}\n\nconst addFiltersClause = (params: any, filtersClause: any) => {\n params.filters = params.filters || {};\n params.filters.$and = params.filters.$and || [];\n params.filters.$and.push(filtersClause);\n};\n\nconst sanitizeMainField = (model: any, mainField: any, userAbility: any) => {\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: model.uid,\n });\n\n // Whether the main field can be displayed or not, regardless of permissions.\n const isMainFieldListable = isListable(model, mainField);\n // Whether the user has the permission to access the model's main field (using RBAC abilities)\n const canReadMainField = permissionChecker.can.read(null, mainField);\n\n if (!isMainFieldListable || !canReadMainField) {\n // Default to 'documentId' if the actual main field shouldn't be displayed\n return 'documentId';\n }\n\n // Edge cases\n\n // 1. Enforce 'name' as the main field for users and permissions' roles\n if (model.uid === 'plugin::users-permissions.role') {\n return 'name';\n }\n\n return mainField;\n};\n\n/**\n *\n * All relations sent to this function should have the same status or no status\n */\nconst addStatusToRelations = async (targetUid: UID.Schema, relations: RelationEntity[]) => {\n if (!contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {\n return relations;\n }\n\n const documentMetadata = getService('document-metadata');\n\n if (!relations.length) {\n return relations;\n }\n\n const firstRelation = relations[0];\n\n const filters: any = {\n documentId: { $in: relations.map((r) => r.documentId) },\n // NOTE: find the \"opposite\" status\n publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true },\n };\n\n const availableStatus = await strapi.query(targetUid).findMany({\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n filters,\n });\n\n return relations.map((relation: RelationEntity) => {\n const availableStatuses = availableStatus.filter(\n (availableDocument: RelationEntity) =>\n availableDocument.documentId === relation.documentId &&\n (relation.locale ? availableDocument.locale === relation.locale : true)\n );\n\n return {\n ...relation,\n status: documentMetadata.getStatus(relation, availableStatuses),\n };\n });\n};\n\nconst getPublishedAtClause = (status: string, uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n\n /**\n * If dp is disabled, ignore the filter\n */\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return {};\n }\n\n // Prioritize the draft status in case it's not provided\n return status === 'published' ? { $notNull: true } : { $null: true };\n};\n\nconst validateLocale = (sourceUid: UID.Schema, targetUid: UID.ContentType, locale?: string) => {\n const sourceModel = strapi.getModel(sourceUid);\n const targetModel = strapi.getModel(targetUid);\n\n const isLocalized = strapi.plugin('i18n').service('content-types').isLocalizedContentType;\n const isSourceLocalized = isLocalized(sourceModel);\n const isTargetLocalized = isLocalized(targetModel);\n\n return {\n locale,\n isSourceLocalized,\n isTargetLocalized,\n };\n};\n\nconst validateStatus = (\n sourceUid: UID.Schema,\n status?: Modules.Documents.Params.PublicationStatus.Kind\n) => {\n const sourceModel = strapi.getModel(sourceUid);\n\n const isDP = contentTypes.hasDraftAndPublish;\n const isSourceDP = isDP(sourceModel);\n\n // Default to draft if not set\n if (!isSourceDP && sourceModel.modelType === 'contentType') {\n return { status: undefined };\n }\n\n switch (status) {\n case 'published':\n return { status: 'published' };\n default:\n // Assign to draft if the status is not valid\n return { status: 'draft' };\n }\n};\n\nexport default {\n async extractAndValidateRequestInfo(ctx: any, id?: Data.ID) {\n const { userAbility } = ctx.state;\n const { model, targetField } = ctx.params;\n\n const sourceSchema = strapi.getModel(model);\n if (!sourceSchema) {\n throw new errors.ValidationError(`The model ${model} doesn't exist`);\n }\n\n const attribute: any = sourceSchema.attributes[targetField];\n if (!attribute || attribute.type !== 'relation') {\n throw new errors.ValidationError(\n `The relational field ${targetField} doesn't exist on ${model}`\n );\n }\n\n const sourceUid = model;\n const targetUid = attribute.target;\n\n const { locale, isSourceLocalized, isTargetLocalized } = validateLocale(\n sourceUid,\n targetUid,\n ctx.request?.query?.locale\n );\n const { status } = validateStatus(sourceUid, ctx.request?.query?.status);\n\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model,\n });\n\n const isComponent = sourceSchema.modelType === 'component';\n if (!isComponent) {\n if (permissionChecker.cannot.read(null, targetField)) {\n return ctx.forbidden();\n }\n }\n\n let entryId: string | number | null = null;\n\n if (id) {\n const where: Record<string, any> = {};\n\n if (!isComponent) {\n where.documentId = id;\n\n if (status) {\n where.publishedAt = getPublishedAtClause(status, sourceUid);\n }\n\n if (locale && isSourceLocalized) {\n where.locale = locale;\n }\n } else {\n // If the source is a component, we only need to filter by the\n // component's entity id\n where.id = id;\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const currentEntity = await strapi.db.query(model).findOne({\n where,\n populate,\n });\n\n // We need to check if the entity exists\n // and if the user has the permission to read it in this way\n // There may be multiple entities (publication states) under this\n // documentId + locale. We only need to check if one exists\n if (!currentEntity) {\n throw new errors.NotFoundError();\n }\n\n if (!isComponent) {\n if (permissionChecker.cannot.read(currentEntity, targetField)) {\n throw new errors.ForbiddenError();\n }\n }\n\n entryId = currentEntity.id;\n }\n\n const modelConfig = isComponent\n ? await getService('components').findConfiguration(sourceSchema)\n : await getService('content-types').findConfiguration(sourceSchema);\n\n const targetSchema = strapi.getModel(targetUid);\n\n const mainField = flow(\n prop(`metadatas.${targetField}.edit.mainField`),\n (mainField) => mainField || 'id',\n (mainField) => sanitizeMainField(targetSchema, mainField, userAbility)\n )(modelConfig);\n\n const fieldsToSelect = uniq([\n mainField,\n PUBLISHED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n 'documentId',\n ]);\n\n if (isTargetLocalized) {\n fieldsToSelect.push('locale');\n }\n\n return {\n entryId,\n locale,\n status,\n attribute,\n fieldsToSelect,\n mainField,\n source: { schema: sourceSchema, isLocalized: isSourceLocalized },\n target: { schema: targetSchema, isLocalized: isTargetLocalized },\n sourceSchema,\n targetSchema,\n targetField,\n };\n },\n\n /**\n * Used to find new relations to add in a relational field.\n *\n * Component and document relations are dealt a bit differently (they don't have a document_id).\n */\n async findAvailable(ctx: any) {\n const { id } = ctx.request.query;\n\n await validateFindAvailable(ctx.request.query);\n\n const {\n locale,\n status,\n targetField,\n fieldsToSelect,\n mainField,\n source: {\n schema: { uid: sourceUid, modelType: sourceModelType },\n isLocalized: isSourceLocalized,\n },\n target: {\n schema: { uid: targetUid },\n isLocalized: isTargetLocalized,\n },\n } = await this.extractAndValidateRequestInfo(ctx, id);\n\n const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;\n\n const permissionChecker = getService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: targetUid,\n });\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n const queryParams = {\n sort: mainField,\n // cannot select other fields as the user may not have the permissions\n fields: fieldsToSelect,\n ...permissionQuery,\n };\n\n // If no status is requested, we find all the draft relations and later update them\n // with the latest available status\n addFiltersClause(queryParams, {\n publishedAt: getPublishedAtClause(status, targetUid),\n });\n\n // We will only filter by locale if the target content type is localized\n const filterByLocale = isTargetLocalized && locale;\n if (filterByLocale) {\n addFiltersClause(queryParams, { locale });\n }\n\n if (id) {\n /**\n * Exclude the relations that are already related to the source\n *\n * We also optionally filter the target relations by the requested\n * status and locale if provided.\n */\n const subQuery = strapi.db.queryBuilder(sourceUid);\n\n // The alias refers to the DB table of the target content type model\n const alias = subQuery.getAlias();\n\n const where: Record<string, any> = {\n [`${alias}.id`]: { $notNull: true },\n [`${alias}.document_id`]: { $notNull: true },\n };\n\n /**\n * Content Types -> Specify document id\n * Components -> Specify entity id (they don't have a document id)\n */\n if (sourceModelType === 'contentType') {\n where.document_id = id;\n } else {\n where.id = id;\n }\n\n // Add the status and locale filters if they are provided\n const publishedAt = getPublishedAtClause(status, targetUid);\n if (!isEmpty(publishedAt)) {\n where[`${alias}.published_at`] = publishedAt;\n }\n\n // If target has localization we need to filter by locale\n if (isTargetLocalized && locale) {\n where[`${alias}.locale`] = locale;\n }\n\n if (isSourceLocalized && locale) {\n where.locale = locale;\n }\n\n /**\n * UI can provide a list of ids to omit,\n * those are the relations user set in the UI but has not persisted.\n * We don't want to include them in the available relations.\n */\n if ((idsToInclude?.length ?? 0) !== 0) {\n where[`${alias}.id`].$notIn = idsToInclude;\n }\n\n const knexSubQuery = subQuery\n .where(where)\n .join({ alias, targetField })\n .select(`${alias}.id`)\n .getKnexQuery();\n\n addFiltersClause(queryParams, {\n id: { $notIn: knexSubQuery },\n });\n }\n\n /**\n * Apply a filter to the mainField based on the search query and filter operator\n * searching should be allowed only on mainField for permission reasons\n */\n if (_q) {\n const _filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n addFiltersClause(queryParams, { [mainField]: { [_filter]: _q } });\n }\n\n if (idsToOmit?.length > 0) {\n // If we have ids to omit, we should filter them out\n addFiltersClause(queryParams, {\n id: { $notIn: uniq(idsToOmit) },\n });\n }\n\n const dbQuery = strapi.get('query-params').transform(targetUid, queryParams);\n\n const res = await strapi.db.query(targetUid).findPage(dbQuery);\n\n ctx.body = {\n ...res,\n results: await addStatusToRelations(targetUid, res.results),\n };\n },\n\n async findExisting(ctx: any) {\n const { userAbility } = ctx.state;\n const { id } = ctx.params;\n\n await validateFindExisting(ctx.request.query);\n\n const {\n entryId,\n attribute,\n targetField,\n fieldsToSelect,\n status,\n source: { schema: sourceSchema },\n target: { schema: targetSchema },\n } = await this.extractAndValidateRequestInfo(ctx, id);\n\n const { uid: sourceUid } = sourceSchema;\n const { uid: targetUid } = targetSchema;\n\n const permissionQuery = await getService('permission-checker')\n .create({ userAbility, model: targetUid })\n .sanitizedQuery.read({ fields: fieldsToSelect });\n\n /**\n * loadPages can not be used for single relations,\n * this unifies the loading regardless of it's type\n *\n * NOTE: Relations need to be loaded using any db.query method\n * to ensure the proper ordering is applied\n */\n const dbQuery = strapi.db.query(sourceUid);\n const loadRelations = relations.isAnyToMany(attribute)\n ? (...args: Parameters<typeof dbQuery.loadPages>) => dbQuery.loadPages(...args)\n : (...args: Parameters<typeof dbQuery.load>) =>\n dbQuery\n .load(...args)\n // Ensure response is an array\n .then((res) => ({ results: res ? [res] : [] }));\n\n const filters: {\n publishedAt?: Record<string, any>;\n } = {};\n\n if (sourceSchema?.options?.draftAndPublish || sourceSchema?.modelType === 'component') {\n if (targetSchema?.options?.draftAndPublish) {\n if (status === 'published') {\n filters.publishedAt = { $notNull: true };\n } else {\n filters.publishedAt = { $null: true };\n }\n }\n } else if (targetSchema?.options?.draftAndPublish) {\n // NOTE: we must return the drafts as some targets might not have a published version yet\n filters.publishedAt = { $null: true };\n }\n\n /**\n * If user does not have access to specific relations (custom conditions),\n * only the ids of the relations are returned.\n *\n * - First query loads all the ids.\n * - Second one also loads the main field, and excludes forbidden relations.\n *\n * The response contains the union of the two queries.\n */\n const res = await loadRelations({ id: entryId }, targetField, {\n select: ['id', 'documentId', 'locale', 'publishedAt', 'updatedAt'],\n ordering: 'desc',\n page: ctx.request.query.page,\n pageSize: ctx.request.query.pageSize,\n filters,\n });\n\n /**\n * Add all ids to load in permissionQuery\n * If any of the relations are not accessible, the permissionQuery will exclude them\n */\n const loadedIds = res.results.map((item: any) => item.id);\n addFiltersClause(permissionQuery, { id: { $in: loadedIds } });\n\n /**\n * Load the relations with the main field, the sanitized permission query\n * will exclude the relations the user does not have access to.\n *\n * Pagination is not necessary as the permissionQuery contains the ids to load.\n */\n const sanitizedRes = await loadRelations({ id: entryId }, targetField, {\n ...strapi.get('query-params').transform(targetUid, permissionQuery),\n ordering: 'desc',\n });\n\n // NOTE: the order is very import to make sure sanitized relations are kept in priority\n const relationsUnion = uniqBy('id', concat(sanitizedRes.results, res.results));\n\n ctx.body = {\n pagination: res.pagination || {\n page: 1,\n pageCount: 1,\n pageSize: 10,\n total: relationsUnion.length,\n },\n results: await addStatusToRelations(targetUid, relationsUnion),\n };\n },\n};\n"],"names":["PUBLISHED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","contentTypes","constants","addFiltersClause","params","filtersClause","filters","$and","push","sanitizeMainField","model","mainField","userAbility","permissionChecker","getService","create","uid","isMainFieldListable","isListable","canReadMainField","can","read","addStatusToRelations","targetUid","relations","hasDraftAndPublish","strapi","getModel","documentMetadata","length","firstRelation","documentId","$in","map","r","publishedAt","$null","$notNull","availableStatus","query","findMany","select","relation","availableStatuses","filter","availableDocument","locale","status","getStatus","getPublishedAtClause","validateLocale","sourceUid","sourceModel","targetModel","isLocalized","plugin","service","isLocalizedContentType","isSourceLocalized","isTargetLocalized","validateStatus","isDP","isSourceDP","modelType","undefined","extractAndValidateRequestInfo","ctx","id","state","targetField","sourceSchema","errors","ValidationError","attribute","attributes","type","target","request","isComponent","cannot","forbidden","entryId","where","permissionQuery","sanitizedQuery","populate","populateFromQuery","build","currentEntity","db","findOne","NotFoundError","ForbiddenError","modelConfig","findConfiguration","targetSchema","flow","prop","fieldsToSelect","uniq","source","schema","findAvailable","validateFindAvailable","sourceModelType","idsToOmit","idsToInclude","_q","queryParams","sort","fields","filterByLocale","subQuery","queryBuilder","alias","getAlias","document_id","isEmpty","$notIn","knexSubQuery","join","getKnexQuery","_filter","isOperatorOfType","dbQuery","get","transform","res","findPage","body","results","findExisting","validateFindExisting","loadRelations","isAnyToMany","args","loadPages","load","then","options","draftAndPublish","ordering","page","pageSize","loadedIds","item","sanitizedRes","relationsUnion","uniqBy","concat","pagination","pageCount","total"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relations.mjs","sources":["../../../server/src/controllers/relations.ts"],"sourcesContent":["import { prop, uniq, uniqBy, concat, flow, isEmpty } from 'lodash/fp';\n\nimport { isOperatorOfType, contentTypes, relations, errors } from '@strapi/utils';\nimport type { Data, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { validateFindAvailable, validateFindExisting } from './validation/relations';\nimport { isListable } from '../services/utils/configuration/attributes';\n\nconst { PUBLISHED_AT_ATTRIBUTE, UPDATED_AT_ATTRIBUTE } = contentTypes.constants;\n\ninterface RelationEntity {\n id: Data.ID;\n documentId: Modules.Documents.ID;\n updatedAt: string | Date;\n publishedAt?: string | Date;\n [key: string]: unknown;\n}\n\nconst addFiltersClause = (params: any, filtersClause: any) => {\n params.filters = params.filters || {};\n params.filters.$and = params.filters.$and || [];\n params.filters.$and.push(filtersClause);\n};\n\nconst sanitizeMainField = (model: any, mainField: any, userAbility: any) => {\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: model.uid,\n });\n\n // Whether the main field can be displayed or not, regardless of permissions.\n const isMainFieldListable = isListable(model, mainField);\n // Whether the user has the permission to access the model's main field (using RBAC abilities)\n const canReadMainField = permissionChecker.can.read(null, mainField);\n\n if (!isMainFieldListable || !canReadMainField) {\n // Default to 'documentId' if the actual main field shouldn't be displayed\n return 'documentId';\n }\n\n // Edge cases\n\n // 1. Enforce 'name' as the main field for users and permissions' roles\n if (model.uid === 'plugin::users-permissions.role') {\n return 'name';\n }\n\n return mainField;\n};\n\n/**\n *\n * All relations sent to this function should have the same status or no status\n */\nconst addStatusToRelations = async (targetUid: UID.Schema, relations: RelationEntity[]) => {\n if (!contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {\n return relations;\n }\n\n const documentMetadata = getService('document-metadata');\n\n if (!relations.length) {\n return relations;\n }\n\n const firstRelation = relations[0];\n\n const filters: any = {\n documentId: { $in: relations.map((r) => r.documentId) },\n // NOTE: find the \"opposite\" status\n publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true },\n };\n\n const availableStatus = await strapi.query(targetUid).findMany({\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n filters,\n });\n\n return relations.map((relation: RelationEntity) => {\n const availableStatuses = availableStatus.filter(\n (availableDocument: RelationEntity) =>\n availableDocument.documentId === relation.documentId &&\n (relation.locale ? availableDocument.locale === relation.locale : true)\n );\n\n return {\n ...relation,\n status: documentMetadata.getStatus(relation, availableStatuses),\n };\n });\n};\n\nconst getPublishedAtClause = (status: string, uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n\n /**\n * If dp is disabled, ignore the filter\n */\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return {};\n }\n\n // Prioritize the draft status in case it's not provided\n return status === 'published' ? { $notNull: true } : { $null: true };\n};\n\nconst validateLocale = (sourceUid: UID.Schema, targetUid: UID.ContentType, locale?: string) => {\n const sourceModel = strapi.getModel(sourceUid);\n const targetModel = strapi.getModel(targetUid);\n\n const isLocalized = strapi.plugin('i18n').service('content-types').isLocalizedContentType;\n const isSourceLocalized = isLocalized(sourceModel);\n const isTargetLocalized = isLocalized(targetModel);\n\n return {\n locale,\n isSourceLocalized,\n isTargetLocalized,\n };\n};\n\nconst validateStatus = (\n sourceUid: UID.Schema,\n status?: Modules.Documents.Params.PublicationStatus.Kind\n) => {\n const sourceModel = strapi.getModel(sourceUid);\n\n const isDP = contentTypes.hasDraftAndPublish;\n const isSourceDP = isDP(sourceModel);\n\n // Default to draft if not set\n if (!isSourceDP && sourceModel.modelType === 'contentType') {\n return { status: undefined };\n }\n\n switch (status) {\n case 'published':\n return { status: 'published' };\n default:\n // Assign to draft if the status is not valid\n return { status: 'draft' };\n }\n};\n\nexport default {\n async extractAndValidateRequestInfo(ctx: any, id?: Data.ID) {\n const { userAbility } = ctx.state;\n const { model, targetField } = ctx.params;\n\n const sourceSchema = strapi.getModel(model);\n if (!sourceSchema) {\n throw new errors.ValidationError(`The model ${model} doesn't exist`);\n }\n\n const attribute: any = sourceSchema.attributes[targetField];\n if (!attribute || attribute.type !== 'relation') {\n throw new errors.ValidationError(\n `The relational field ${targetField} doesn't exist on ${model}`\n );\n }\n\n const sourceUid = model;\n const targetUid = attribute.target;\n\n const { locale, isSourceLocalized, isTargetLocalized } = validateLocale(\n sourceUid,\n targetUid,\n ctx.request?.query?.locale\n );\n const { status } = validateStatus(sourceUid, ctx.request?.query?.status);\n\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model,\n });\n\n const isComponent = sourceSchema.modelType === 'component';\n if (!isComponent) {\n if (permissionChecker.cannot.read(null, targetField)) {\n return ctx.forbidden();\n }\n }\n\n let entryId: string | number | null = null;\n\n if (id) {\n const where: Record<string, any> = {};\n\n if (!isComponent) {\n where.documentId = id;\n\n if (status) {\n where.publishedAt = getPublishedAtClause(status, sourceUid);\n }\n\n if (locale && isSourceLocalized) {\n where.locale = locale;\n }\n } else {\n // If the source is a component, we only need to filter by the\n // component's entity id\n where.id = id;\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const currentEntity = await strapi.db.query(model).findOne({\n where,\n populate,\n });\n\n // We need to check if the entity exists\n // and if the user has the permission to read it in this way\n // There may be multiple entities (publication states) under this\n // documentId + locale. We only need to check if one exists\n if (!currentEntity) {\n throw new errors.NotFoundError();\n }\n\n if (!isComponent) {\n if (permissionChecker.cannot.read(currentEntity, targetField)) {\n throw new errors.ForbiddenError();\n }\n }\n\n entryId = currentEntity.id;\n }\n\n const modelConfig = isComponent\n ? await getService('components').findConfiguration(sourceSchema)\n : await getService('content-types').findConfiguration(sourceSchema);\n\n const targetSchema = strapi.getModel(targetUid);\n\n const mainField = flow(\n prop(`metadatas.${targetField}.edit.mainField`),\n (mainField) => mainField || 'id',\n (mainField) => sanitizeMainField(targetSchema, mainField, userAbility)\n )(modelConfig);\n\n const fieldsToSelect = uniq([\n mainField,\n PUBLISHED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n 'documentId',\n ]);\n\n if (isTargetLocalized) {\n fieldsToSelect.push('locale');\n }\n\n return {\n entryId,\n locale,\n status,\n attribute,\n fieldsToSelect,\n mainField,\n source: { schema: sourceSchema, isLocalized: isSourceLocalized },\n target: { schema: targetSchema, isLocalized: isTargetLocalized },\n sourceSchema,\n targetSchema,\n targetField,\n };\n },\n\n /**\n * Used to find new relations to add in a relational field.\n *\n * Component and document relations are dealt a bit differently (they don't have a document_id).\n */\n async findAvailable(ctx: any) {\n const { id } = ctx.request.query;\n\n await validateFindAvailable(ctx.request.query);\n\n const {\n locale,\n status,\n targetField,\n fieldsToSelect,\n mainField,\n source: {\n schema: { uid: sourceUid, modelType: sourceModelType },\n isLocalized: isSourceLocalized,\n },\n target: {\n schema: { uid: targetUid },\n isLocalized: isTargetLocalized,\n },\n } = await this.extractAndValidateRequestInfo(ctx, id);\n\n const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;\n\n const permissionChecker = getService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: targetUid,\n });\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n const queryParams = {\n sort: mainField,\n // cannot select other fields as the user may not have the permissions\n fields: fieldsToSelect,\n ...permissionQuery,\n };\n\n // If no status is requested, we find all the draft relations and later update them\n // with the latest available status\n addFiltersClause(queryParams, {\n publishedAt: getPublishedAtClause(status, targetUid),\n });\n\n // We will only filter by locale if the target content type is localized\n const filterByLocale = isTargetLocalized && locale;\n if (filterByLocale) {\n addFiltersClause(queryParams, { locale });\n }\n\n if (id) {\n /**\n * Exclude the relations that are already related to the source\n *\n * We also optionally filter the target relations by the requested\n * status and locale if provided.\n */\n const subQuery = strapi.db.queryBuilder(sourceUid);\n\n // The alias refers to the DB table of the target content type model\n const alias = subQuery.getAlias();\n\n const where: Record<string, any> = {\n [`${alias}.id`]: { $notNull: true },\n [`${alias}.document_id`]: { $notNull: true },\n };\n\n /**\n * Content Types -> Specify document id\n * Components -> Specify entity id (they don't have a document id)\n */\n if (sourceModelType === 'contentType') {\n where.document_id = id;\n } else {\n where.id = id;\n }\n\n // Add the status and locale filters if they are provided\n const publishedAt = getPublishedAtClause(status, targetUid);\n if (!isEmpty(publishedAt)) {\n where[`${alias}.published_at`] = publishedAt;\n }\n\n // If target has localization we need to filter by locale\n if (isTargetLocalized && locale) {\n where[`${alias}.locale`] = locale;\n }\n\n if (isSourceLocalized && locale) {\n where.locale = locale;\n }\n\n /**\n * UI can provide a list of ids to omit,\n * those are the relations user set in the UI but has not persisted.\n * We don't want to include them in the available relations.\n */\n if ((idsToInclude?.length ?? 0) !== 0) {\n where[`${alias}.id`].$notIn = idsToInclude;\n }\n\n const knexSubQuery = subQuery\n .where(where)\n .join({ alias, targetField })\n .select(`${alias}.id`)\n .getKnexQuery();\n\n addFiltersClause(queryParams, {\n id: { $notIn: knexSubQuery },\n });\n }\n\n /**\n * Apply a filter to the mainField based on the search query and filter operator\n * searching should be allowed only on mainField for permission reasons\n */\n if (_q) {\n const _filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n addFiltersClause(queryParams, { [mainField]: { [_filter]: _q } });\n }\n\n if (idsToOmit?.length > 0) {\n // If we have ids to omit, we should filter them out\n addFiltersClause(queryParams, {\n id: { $notIn: uniq(idsToOmit) },\n });\n }\n\n const dbQuery = strapi.get('query-params').transform(targetUid, queryParams);\n\n const res = await strapi.db.query(targetUid).findPage(dbQuery);\n\n ctx.body = {\n ...res,\n results: await addStatusToRelations(targetUid, res.results),\n };\n },\n\n async findExisting(ctx: any) {\n const { userAbility } = ctx.state;\n const { id } = ctx.params;\n\n await validateFindExisting(ctx.request.query);\n\n const {\n entryId,\n attribute,\n targetField,\n fieldsToSelect,\n status,\n source: { schema: sourceSchema },\n target: { schema: targetSchema },\n } = await this.extractAndValidateRequestInfo(ctx, id);\n\n const { uid: sourceUid } = sourceSchema;\n const { uid: targetUid } = targetSchema;\n\n const permissionQuery = await getService('permission-checker')\n .create({ userAbility, model: targetUid })\n .sanitizedQuery.read({ fields: fieldsToSelect });\n\n /**\n * loadPages can not be used for single relations,\n * this unifies the loading regardless of it's type\n *\n * NOTE: Relations need to be loaded using any db.query method\n * to ensure the proper ordering is applied\n */\n const dbQuery = strapi.db.query(sourceUid);\n const loadRelations = relations.isAnyToMany(attribute)\n ? (...args: Parameters<typeof dbQuery.loadPages>) => dbQuery.loadPages(...args)\n : (...args: Parameters<typeof dbQuery.load>) =>\n dbQuery\n .load(...args)\n // Ensure response is an array\n .then((res) => ({ results: res ? [res] : [] }));\n\n const filters: {\n publishedAt?: Record<string, any>;\n } = {};\n\n if (sourceSchema?.options?.draftAndPublish || sourceSchema?.modelType === 'component') {\n if (targetSchema?.options?.draftAndPublish) {\n if (status === 'published') {\n filters.publishedAt = { $notNull: true };\n } else {\n filters.publishedAt = { $null: true };\n }\n }\n } else if (targetSchema?.options?.draftAndPublish) {\n // NOTE: we must return the drafts as some targets might not have a published version yet\n filters.publishedAt = { $null: true };\n }\n\n /**\n * If user does not have access to specific relations (custom conditions),\n * only the ids of the relations are returned.\n *\n * - First query loads all the ids.\n * - Second one also loads the main field, and excludes forbidden relations.\n *\n * The response contains the union of the two queries.\n */\n const res = await loadRelations({ id: entryId }, targetField, {\n select: ['id', 'documentId', 'locale', 'publishedAt', 'updatedAt'],\n ordering: 'desc',\n page: ctx.request.query.page,\n pageSize: ctx.request.query.pageSize,\n filters,\n });\n\n /**\n * Add all ids to load in permissionQuery\n * If any of the relations are not accessible, the permissionQuery will exclude them\n */\n const loadedIds = res.results.map((item: any) => item.id);\n addFiltersClause(permissionQuery, { id: { $in: loadedIds } });\n\n /**\n * Load the relations with the main field, the sanitized permission query\n * will exclude the relations the user does not have access to.\n *\n * Pagination is not necessary as the permissionQuery contains the ids to load.\n */\n const sanitizedRes = await loadRelations({ id: entryId }, targetField, {\n ...strapi.get('query-params').transform(targetUid, permissionQuery),\n ordering: 'desc',\n });\n\n // NOTE: the order is very import to make sure sanitized relations are kept in priority\n const relationsUnion = uniqBy('id', concat(sanitizedRes.results, res.results));\n\n ctx.body = {\n pagination: res.pagination || {\n page: 1,\n pageCount: 1,\n pageSize: 10,\n total: relationsUnion.length,\n },\n results: await addStatusToRelations(targetUid, relationsUnion),\n };\n },\n};\n"],"names":["PUBLISHED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","contentTypes","constants","addFiltersClause","params","filtersClause","filters","$and","push","sanitizeMainField","model","mainField","userAbility","permissionChecker","getService","create","uid","isMainFieldListable","isListable","canReadMainField","can","read","addStatusToRelations","targetUid","relations","hasDraftAndPublish","strapi","getModel","documentMetadata","length","firstRelation","documentId","$in","map","r","publishedAt","$null","$notNull","availableStatus","query","findMany","select","relation","availableStatuses","filter","availableDocument","locale","status","getStatus","getPublishedAtClause","validateLocale","sourceUid","sourceModel","targetModel","isLocalized","plugin","service","isLocalizedContentType","isSourceLocalized","isTargetLocalized","validateStatus","isDP","isSourceDP","modelType","undefined","extractAndValidateRequestInfo","ctx","id","state","targetField","sourceSchema","errors","ValidationError","attribute","attributes","type","target","request","isComponent","cannot","forbidden","entryId","where","permissionQuery","sanitizedQuery","populate","populateFromQuery","build","currentEntity","db","findOne","NotFoundError","ForbiddenError","modelConfig","findConfiguration","targetSchema","flow","prop","fieldsToSelect","uniq","source","schema","findAvailable","validateFindAvailable","sourceModelType","idsToOmit","idsToInclude","_q","queryParams","sort","fields","filterByLocale","subQuery","queryBuilder","alias","getAlias","document_id","isEmpty","$notIn","knexSubQuery","join","getKnexQuery","_filter","isOperatorOfType","dbQuery","get","transform","res","findPage","body","results","findExisting","validateFindExisting","loadRelations","isAnyToMany","args","loadPages","load","then","options","draftAndPublish","ordering","page","pageSize","loadedIds","item","sanitizedRes","relationsUnion","uniqBy","concat","pagination","pageCount","total"],"mappings":";;;;;;AASA,MAAM,EAAEA,sBAAsB,EAAEC,oBAAoB,EAAE,GAAGC,aAAaC,SAAS;AAU/E,MAAMC,gBAAAA,GAAmB,CAACC,MAAaC,EAAAA,aAAAA,GAAAA;AACrCD,IAAAA,MAAAA,CAAOE,OAAO,GAAGF,MAAOE,CAAAA,OAAO,IAAI,EAAC;IACpCF,MAAOE,CAAAA,OAAO,CAACC,IAAI,GAAGH,OAAOE,OAAO,CAACC,IAAI,IAAI,EAAE;AAC/CH,IAAAA,MAAAA,CAAOE,OAAO,CAACC,IAAI,CAACC,IAAI,CAACH,aAAAA,CAAAA;AAC3B,CAAA;AAEA,MAAMI,iBAAAA,GAAoB,CAACC,KAAAA,EAAYC,SAAgBC,EAAAA,WAAAA,GAAAA;AACrD,IAAA,MAAMC,iBAAoBC,GAAAA,UAAAA,CAAW,oBAAsBC,CAAAA,CAAAA,MAAM,CAAC;AAChEH,QAAAA,WAAAA;AACAF,QAAAA,KAAAA,EAAOA,MAAMM;AACf,KAAA,CAAA;;IAGA,MAAMC,mBAAAA,GAAsBC,WAAWR,KAAOC,EAAAA,SAAAA,CAAAA;;AAE9C,IAAA,MAAMQ,mBAAmBN,iBAAkBO,CAAAA,GAAG,CAACC,IAAI,CAAC,IAAMV,EAAAA,SAAAA,CAAAA;IAE1D,IAAI,CAACM,mBAAuB,IAAA,CAACE,gBAAkB,EAAA;;QAE7C,OAAO,YAAA;AACT;;;IAKA,IAAIT,KAAAA,CAAMM,GAAG,KAAK,gCAAkC,EAAA;QAClD,OAAO,MAAA;AACT;IAEA,OAAOL,SAAAA;AACT,CAAA;AAEA;;;IAIA,MAAMW,oBAAuB,GAAA,OAAOC,SAAuBC,EAAAA,SAAAA,GAAAA;AACzD,IAAA,IAAI,CAACvB,YAAawB,CAAAA,kBAAkB,CAACC,MAAOC,CAAAA,QAAQ,CAACJ,SAAa,CAAA,CAAA,EAAA;QAChE,OAAOC,SAAAA;AACT;AAEA,IAAA,MAAMI,mBAAmBd,UAAW,CAAA,mBAAA,CAAA;IAEpC,IAAI,CAACU,SAAUK,CAAAA,MAAM,EAAE;QACrB,OAAOL,SAAAA;AACT;IAEA,MAAMM,aAAAA,GAAgBN,SAAS,CAAC,CAAE,CAAA;AAElC,IAAA,MAAMlB,OAAe,GAAA;QACnByB,UAAY,EAAA;AAAEC,YAAAA,GAAAA,EAAKR,UAAUS,GAAG,CAAC,CAACC,CAAAA,GAAMA,EAAEH,UAAU;AAAE,SAAA;;QAEtDI,WAAaL,EAAAA,aAAAA,CAAcK,WAAW,KAAK,IAAO,GAAA;YAAEC,KAAO,EAAA;SAAS,GAAA;YAAEC,QAAU,EAAA;AAAK;AACvF,KAAA;AAEA,IAAA,MAAMC,kBAAkB,MAAMZ,MAAAA,CAAOa,KAAK,CAAChB,SAAAA,CAAAA,CAAWiB,QAAQ,CAAC;QAC7DC,MAAQ,EAAA;AAAC,YAAA,IAAA;AAAM,YAAA,YAAA;AAAc,YAAA,QAAA;AAAU,YAAA,WAAA;AAAa,YAAA,WAAA;AAAa,YAAA;AAAc,SAAA;AAC/EnC,QAAAA;AACF,KAAA,CAAA;IAEA,OAAOkB,SAAAA,CAAUS,GAAG,CAAC,CAACS,QAAAA,GAAAA;QACpB,MAAMC,iBAAAA,GAAoBL,gBAAgBM,MAAM,CAC9C,CAACC,iBACCA,GAAAA,iBAAAA,CAAkBd,UAAU,KAAKW,QAASX,CAAAA,UAAU,KACnDW,QAAAA,CAASI,MAAM,GAAGD,iBAAAA,CAAkBC,MAAM,KAAKJ,QAAAA,CAASI,MAAM,GAAG,IAAG,CAAA,CAAA;QAGzE,OAAO;AACL,YAAA,GAAGJ,QAAQ;YACXK,MAAQnB,EAAAA,gBAAAA,CAAiBoB,SAAS,CAACN,QAAUC,EAAAA,iBAAAA;AAC/C,SAAA;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMM,oBAAAA,GAAuB,CAACF,MAAgB/B,EAAAA,GAAAA,GAAAA;IAC5C,MAAMN,KAAAA,GAAQgB,MAAOC,CAAAA,QAAQ,CAACX,GAAAA,CAAAA;AAE9B;;AAEC,MACD,IAAI,CAACN,KAAAA,IAAS,CAACT,YAAawB,CAAAA,kBAAkB,CAACf,KAAQ,CAAA,EAAA;AACrD,QAAA,OAAO,EAAC;AACV;;AAGA,IAAA,OAAOqC,WAAW,WAAc,GAAA;QAAEV,QAAU,EAAA;KAAS,GAAA;QAAED,KAAO,EAAA;AAAK,KAAA;AACrE,CAAA;AAEA,MAAMc,cAAAA,GAAiB,CAACC,SAAAA,EAAuB5B,SAA4BuB,EAAAA,MAAAA,GAAAA;IACzE,MAAMM,WAAAA,GAAc1B,MAAOC,CAAAA,QAAQ,CAACwB,SAAAA,CAAAA;IACpC,MAAME,WAAAA,GAAc3B,MAAOC,CAAAA,QAAQ,CAACJ,SAAAA,CAAAA;IAEpC,MAAM+B,WAAAA,GAAc5B,OAAO6B,MAAM,CAAC,QAAQC,OAAO,CAAC,iBAAiBC,sBAAsB;AACzF,IAAA,MAAMC,oBAAoBJ,WAAYF,CAAAA,WAAAA,CAAAA;AACtC,IAAA,MAAMO,oBAAoBL,WAAYD,CAAAA,WAAAA,CAAAA;IAEtC,OAAO;AACLP,QAAAA,MAAAA;AACAY,QAAAA,iBAAAA;AACAC,QAAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAMC,cAAAA,GAAiB,CACrBT,SACAJ,EAAAA,MAAAA,GAAAA;IAEA,MAAMK,WAAAA,GAAc1B,MAAOC,CAAAA,QAAQ,CAACwB,SAAAA,CAAAA;IAEpC,MAAMU,IAAAA,GAAO5D,aAAawB,kBAAkB;AAC5C,IAAA,MAAMqC,aAAaD,IAAKT,CAAAA,WAAAA,CAAAA;;AAGxB,IAAA,IAAI,CAACU,UAAAA,IAAcV,WAAYW,CAAAA,SAAS,KAAK,aAAe,EAAA;QAC1D,OAAO;YAAEhB,MAAQiB,EAAAA;AAAU,SAAA;AAC7B;IAEA,OAAQjB,MAAAA;QACN,KAAK,WAAA;YACH,OAAO;gBAAEA,MAAQ,EAAA;AAAY,aAAA;AAC/B,QAAA;;YAEE,OAAO;gBAAEA,MAAQ,EAAA;AAAQ,aAAA;AAC7B;AACF,CAAA;AAEA,gBAAe;IACb,MAAMkB,6BAAAA,CAAAA,CAA8BC,GAAQ,EAAEC,EAAY,EAAA;AACxD,QAAA,MAAM,EAAEvD,WAAW,EAAE,GAAGsD,IAAIE,KAAK;AACjC,QAAA,MAAM,EAAE1D,KAAK,EAAE2D,WAAW,EAAE,GAAGH,IAAI9D,MAAM;QAEzC,MAAMkE,YAAAA,GAAe5C,MAAOC,CAAAA,QAAQ,CAACjB,KAAAA,CAAAA;AACrC,QAAA,IAAI,CAAC4D,YAAc,EAAA;YACjB,MAAM,IAAIC,OAAOC,eAAe,CAAC,CAAC,UAAU,EAAE9D,KAAM,CAAA,cAAc,CAAC,CAAA;AACrE;AAEA,QAAA,MAAM+D,SAAiBH,GAAAA,YAAAA,CAAaI,UAAU,CAACL,WAAY,CAAA;AAC3D,QAAA,IAAI,CAACI,SAAAA,IAAaA,SAAUE,CAAAA,IAAI,KAAK,UAAY,EAAA;YAC/C,MAAM,IAAIJ,MAAOC,CAAAA,eAAe,CAC9B,CAAC,qBAAqB,EAAEH,WAAY,CAAA,kBAAkB,EAAE3D,KAAAA,CAAM,CAAC,CAAA;AAEnE;AAEA,QAAA,MAAMyC,SAAYzC,GAAAA,KAAAA;QAClB,MAAMa,SAAAA,GAAYkD,UAAUG,MAAM;AAElC,QAAA,MAAM,EAAE9B,MAAM,EAAEY,iBAAiB,EAAEC,iBAAiB,EAAE,GAAGT,cAAAA,CACvDC,SACA5B,EAAAA,SAAAA,EACA2C,GAAIW,CAAAA,OAAO,EAAEtC,KAAOO,EAAAA,MAAAA,CAAAA;QAEtB,MAAM,EAAEC,MAAM,EAAE,GAAGa,eAAeT,SAAWe,EAAAA,GAAAA,CAAIW,OAAO,EAAEtC,KAAOQ,EAAAA,MAAAA,CAAAA;AAEjE,QAAA,MAAMlC,iBAAoBC,GAAAA,UAAAA,CAAW,oBAAsBC,CAAAA,CAAAA,MAAM,CAAC;AAChEH,YAAAA,WAAAA;AACAF,YAAAA;AACF,SAAA,CAAA;QAEA,MAAMoE,WAAAA,GAAcR,YAAaP,CAAAA,SAAS,KAAK,WAAA;AAC/C,QAAA,IAAI,CAACe,WAAa,EAAA;AAChB,YAAA,IAAIjE,kBAAkBkE,MAAM,CAAC1D,IAAI,CAAC,MAAMgD,WAAc,CAAA,EAAA;AACpD,gBAAA,OAAOH,IAAIc,SAAS,EAAA;AACtB;AACF;AAEA,QAAA,IAAIC,OAAkC,GAAA,IAAA;AAEtC,QAAA,IAAId,EAAI,EAAA;AACN,YAAA,MAAMe,QAA6B,EAAC;AAEpC,YAAA,IAAI,CAACJ,WAAa,EAAA;AAChBI,gBAAAA,KAAAA,CAAMnD,UAAU,GAAGoC,EAAAA;AAEnB,gBAAA,IAAIpB,MAAQ,EAAA;oBACVmC,KAAM/C,CAAAA,WAAW,GAAGc,oBAAAA,CAAqBF,MAAQI,EAAAA,SAAAA,CAAAA;AACnD;AAEA,gBAAA,IAAIL,UAAUY,iBAAmB,EAAA;AAC/BwB,oBAAAA,KAAAA,CAAMpC,MAAM,GAAGA,MAAAA;AACjB;aACK,MAAA;;;AAGLoC,gBAAAA,KAAAA,CAAMf,EAAE,GAAGA,EAAAA;AACb;YAEA,MAAMgB,eAAAA,GAAkB,MAAMtE,iBAAkBuE,CAAAA,cAAc,CAAC/D,IAAI,CAAC6C,IAAI3B,KAAK,CAAA;YAC7E,MAAM8C,QAAAA,GAAW,MAAMvE,UAAW,CAAA,kBAAA,CAAA,CAAoBJ,OACnD4E,iBAAiB,CAACH,iBAClBI,KAAK,EAAA;YAER,MAAMC,aAAAA,GAAgB,MAAM9D,MAAO+D,CAAAA,EAAE,CAAClD,KAAK,CAAC7B,KAAOgF,CAAAA,CAAAA,OAAO,CAAC;AACzDR,gBAAAA,KAAAA;AACAG,gBAAAA;AACF,aAAA,CAAA;;;;;AAMA,YAAA,IAAI,CAACG,aAAe,EAAA;gBAClB,MAAM,IAAIjB,OAAOoB,aAAa,EAAA;AAChC;AAEA,YAAA,IAAI,CAACb,WAAa,EAAA;AAChB,gBAAA,IAAIjE,kBAAkBkE,MAAM,CAAC1D,IAAI,CAACmE,eAAenB,WAAc,CAAA,EAAA;oBAC7D,MAAM,IAAIE,OAAOqB,cAAc,EAAA;AACjC;AACF;AAEAX,YAAAA,OAAAA,GAAUO,cAAcrB,EAAE;AAC5B;AAEA,QAAA,MAAM0B,WAAcf,GAAAA,WAAAA,GAChB,MAAMhE,UAAAA,CAAW,YAAcgF,CAAAA,CAAAA,iBAAiB,CAACxB,YAAAA,CAAAA,GACjD,MAAMxD,UAAAA,CAAW,eAAiBgF,CAAAA,CAAAA,iBAAiB,CAACxB,YAAAA,CAAAA;QAExD,MAAMyB,YAAAA,GAAerE,MAAOC,CAAAA,QAAQ,CAACJ,SAAAA,CAAAA;AAErC,QAAA,MAAMZ,YAAYqF,IAChBC,CAAAA,IAAAA,CAAK,CAAC,UAAU,EAAE5B,YAAY,eAAe,CAAC,GAC9C,CAAC1D,SAAAA,GAAcA,aAAa,IAC5B,EAAA,CAACA,YAAcF,iBAAkBsF,CAAAA,YAAAA,EAAcpF,WAAWC,WAC1DiF,CAAAA,CAAAA,CAAAA,WAAAA,CAAAA;AAEF,QAAA,MAAMK,iBAAiBC,IAAK,CAAA;AAC1BxF,YAAAA,SAAAA;AACAZ,YAAAA,sBAAAA;AACAC,YAAAA,oBAAAA;AACA,YAAA;AACD,SAAA,CAAA;AAED,QAAA,IAAI2D,iBAAmB,EAAA;AACrBuC,YAAAA,cAAAA,CAAe1F,IAAI,CAAC,QAAA,CAAA;AACtB;QAEA,OAAO;AACLyE,YAAAA,OAAAA;AACAnC,YAAAA,MAAAA;AACAC,YAAAA,MAAAA;AACA0B,YAAAA,SAAAA;AACAyB,YAAAA,cAAAA;AACAvF,YAAAA,SAAAA;YACAyF,MAAQ,EAAA;gBAAEC,MAAQ/B,EAAAA,YAAAA;gBAAchB,WAAaI,EAAAA;AAAkB,aAAA;YAC/DkB,MAAQ,EAAA;gBAAEyB,MAAQN,EAAAA,YAAAA;gBAAczC,WAAaK,EAAAA;AAAkB,aAAA;AAC/DW,YAAAA,YAAAA;AACAyB,YAAAA,YAAAA;AACA1B,YAAAA;AACF,SAAA;AACF,KAAA;AAEA;;;;MAKA,MAAMiC,eAAcpC,GAAQ,EAAA;AAC1B,QAAA,MAAM,EAAEC,EAAE,EAAE,GAAGD,GAAIW,CAAAA,OAAO,CAACtC,KAAK;AAEhC,QAAA,MAAMgE,qBAAsBrC,CAAAA,GAAAA,CAAIW,OAAO,CAACtC,KAAK,CAAA;QAE7C,MAAM,EACJO,MAAM,EACNC,MAAM,EACNsB,WAAW,EACX6B,cAAc,EACdvF,SAAS,EACTyF,MAAQ,EAAA,EACNC,QAAQ,EAAErF,GAAAA,EAAKmC,SAAS,EAAEY,SAAAA,EAAWyC,eAAe,EAAE,EACtDlD,aAAaI,iBAAiB,EAC/B,EACDkB,MAAQ,EAAA,EACNyB,QAAQ,EAAErF,GAAAA,EAAKO,SAAS,EAAE,EAC1B+B,aAAaK,iBAAiB,EAC/B,EACF,GAAG,MAAM,IAAI,CAACM,6BAA6B,CAACC,GAAKC,EAAAA,EAAAA,CAAAA;AAElD,QAAA,MAAM,EAAEsC,SAAS,EAAEC,YAAY,EAAEC,EAAE,EAAE,GAAGpE,KAAO,EAAA,GAAG2B,GAAIW,CAAAA,OAAO,CAACtC,KAAK;AAEnE,QAAA,MAAM1B,iBAAoBC,GAAAA,UAAAA,CAAW,oBAAsBC,CAAAA,CAAAA,MAAM,CAAC;YAChEH,WAAasD,EAAAA,GAAAA,CAAIE,KAAK,CAACxD,WAAW;YAClCF,KAAOa,EAAAA;AACT,SAAA,CAAA;AACA,QAAA,MAAM4D,kBAAkB,MAAMtE,iBAAAA,CAAkBuE,cAAc,CAAC/D,IAAI,CAACkB,KAAAA,CAAAA;AAEpE,QAAA,MAAMqE,WAAc,GAAA;YAClBC,IAAMlG,EAAAA,SAAAA;;YAENmG,MAAQZ,EAAAA,cAAAA;AACR,YAAA,GAAGf;AACL,SAAA;;;AAIAhF,QAAAA,gBAAAA,CAAiByG,WAAa,EAAA;AAC5BzE,YAAAA,WAAAA,EAAac,qBAAqBF,MAAQxB,EAAAA,SAAAA;AAC5C,SAAA,CAAA;;AAGA,QAAA,MAAMwF,iBAAiBpD,iBAAqBb,IAAAA,MAAAA;AAC5C,QAAA,IAAIiE,cAAgB,EAAA;AAClB5G,YAAAA,gBAAAA,CAAiByG,WAAa,EAAA;AAAE9D,gBAAAA;AAAO,aAAA,CAAA;AACzC;AAEA,QAAA,IAAIqB,EAAI,EAAA;AACN;;;;;AAKC,UACD,MAAM6C,QAAWtF,GAAAA,MAAAA,CAAO+D,EAAE,CAACwB,YAAY,CAAC9D,SAAAA,CAAAA;;YAGxC,MAAM+D,KAAAA,GAAQF,SAASG,QAAQ,EAAA;AAE/B,YAAA,MAAMjC,KAA6B,GAAA;AACjC,gBAAA,CAAC,CAAC,EAAEgC,KAAAA,CAAM,GAAG,CAAC,GAAG;oBAAE7E,QAAU,EAAA;AAAK,iBAAA;AAClC,gBAAA,CAAC,CAAC,EAAE6E,KAAAA,CAAM,YAAY,CAAC,GAAG;oBAAE7E,QAAU,EAAA;AAAK;AAC7C,aAAA;AAEA;;;UAIA,IAAImE,oBAAoB,aAAe,EAAA;AACrCtB,gBAAAA,KAAAA,CAAMkC,WAAW,GAAGjD,EAAAA;aACf,MAAA;AACLe,gBAAAA,KAAAA,CAAMf,EAAE,GAAGA,EAAAA;AACb;;YAGA,MAAMhC,WAAAA,GAAcc,qBAAqBF,MAAQxB,EAAAA,SAAAA,CAAAA;YACjD,IAAI,CAAC8F,QAAQlF,WAAc,CAAA,EAAA;AACzB+C,gBAAAA,KAAK,CAAC,CAAC,EAAEgC,MAAM,aAAa,CAAC,CAAC,GAAG/E,WAAAA;AACnC;;AAGA,YAAA,IAAIwB,qBAAqBb,MAAQ,EAAA;AAC/BoC,gBAAAA,KAAK,CAAC,CAAC,EAAEgC,MAAM,OAAO,CAAC,CAAC,GAAGpE,MAAAA;AAC7B;AAEA,YAAA,IAAIY,qBAAqBZ,MAAQ,EAAA;AAC/BoC,gBAAAA,KAAAA,CAAMpC,MAAM,GAAGA,MAAAA;AACjB;AAEA;;;;AAIC,UACD,IAAI,CAAC4D,cAAc7E,MAAU,IAAA,CAAA,MAAO,CAAG,EAAA;gBACrCqD,KAAK,CAAC,CAAC,EAAEgC,KAAAA,CAAM,GAAG,CAAC,CAAC,CAACI,MAAM,GAAGZ,YAAAA;AAChC;AAEA,YAAA,MAAMa,eAAeP,QAClB9B,CAAAA,KAAK,CAACA,KAAAA,CAAAA,CACNsC,IAAI,CAAC;AAAEN,gBAAAA,KAAAA;AAAO7C,gBAAAA;aACd5B,CAAAA,CAAAA,MAAM,CAAC,CAAC,EAAEyE,MAAM,GAAG,CAAC,EACpBO,YAAY,EAAA;AAEftH,YAAAA,gBAAAA,CAAiByG,WAAa,EAAA;gBAC5BzC,EAAI,EAAA;oBAAEmD,MAAQC,EAAAA;AAAa;AAC7B,aAAA,CAAA;AACF;AAEA;;;AAGC,QACD,IAAIZ,EAAI,EAAA;YACN,MAAMe,OAAAA,GAAUC,iBAAiB,OAASpF,EAAAA,KAAAA,CAAMmF,OAAO,CAAInF,GAAAA,KAAAA,CAAMmF,OAAO,GAAG,YAAA;AAC3EvH,YAAAA,gBAAAA,CAAiByG,WAAa,EAAA;AAAE,gBAAA,CAACjG,YAAY;AAAE,oBAAA,CAAC+G,UAAUf;AAAG;AAAE,aAAA,CAAA;AACjE;QAEA,IAAIF,SAAAA,EAAW5E,SAAS,CAAG,EAAA;;AAEzB1B,YAAAA,gBAAAA,CAAiByG,WAAa,EAAA;gBAC5BzC,EAAI,EAAA;AAAEmD,oBAAAA,MAAAA,EAAQnB,IAAKM,CAAAA,SAAAA;AAAW;AAChC,aAAA,CAAA;AACF;AAEA,QAAA,MAAMmB,UAAUlG,MAAOmG,CAAAA,GAAG,CAAC,cAAgBC,CAAAA,CAAAA,SAAS,CAACvG,SAAWqF,EAAAA,WAAAA,CAAAA;QAEhE,MAAMmB,GAAAA,GAAM,MAAMrG,MAAO+D,CAAAA,EAAE,CAAClD,KAAK,CAAChB,SAAWyG,CAAAA,CAAAA,QAAQ,CAACJ,OAAAA,CAAAA;AAEtD1D,QAAAA,GAAAA,CAAI+D,IAAI,GAAG;AACT,YAAA,GAAGF,GAAG;AACNG,YAAAA,OAAAA,EAAS,MAAM5G,oBAAAA,CAAqBC,SAAWwG,EAAAA,GAAAA,CAAIG,OAAO;AAC5D,SAAA;AACF,KAAA;AAEA,IAAA,MAAMC,cAAajE,GAAQ,EAAA;AACzB,QAAA,MAAM,EAAEtD,WAAW,EAAE,GAAGsD,IAAIE,KAAK;AACjC,QAAA,MAAM,EAAED,EAAE,EAAE,GAAGD,IAAI9D,MAAM;AAEzB,QAAA,MAAMgI,oBAAqBlE,CAAAA,GAAAA,CAAIW,OAAO,CAACtC,KAAK,CAAA;AAE5C,QAAA,MAAM,EACJ0C,OAAO,EACPR,SAAS,EACTJ,WAAW,EACX6B,cAAc,EACdnD,MAAM,EACNqD,MAAAA,EAAQ,EAAEC,MAAAA,EAAQ/B,YAAY,EAAE,EAChCM,MAAAA,EAAQ,EAAEyB,MAAAA,EAAQN,YAAY,EAAE,EACjC,GAAG,MAAM,IAAI,CAAC9B,6BAA6B,CAACC,GAAKC,EAAAA,EAAAA,CAAAA;AAElD,QAAA,MAAM,EAAEnD,GAAAA,EAAKmC,SAAS,EAAE,GAAGmB,YAAAA;AAC3B,QAAA,MAAM,EAAEtD,GAAAA,EAAKO,SAAS,EAAE,GAAGwE,YAAAA;AAE3B,QAAA,MAAMZ,eAAkB,GAAA,MAAMrE,UAAW,CAAA,oBAAA,CAAA,CACtCC,MAAM,CAAC;AAAEH,YAAAA,WAAAA;YAAaF,KAAOa,EAAAA;SAC7B6D,CAAAA,CAAAA,cAAc,CAAC/D,IAAI,CAAC;YAAEyF,MAAQZ,EAAAA;AAAe,SAAA,CAAA;AAEhD;;;;;;AAMC,QACD,MAAM0B,OAAUlG,GAAAA,MAAAA,CAAO+D,EAAE,CAAClD,KAAK,CAACY,SAAAA,CAAAA;AAChC,QAAA,MAAMkF,gBAAgB7G,WAAU8G,CAAAA,WAAW,CAAC7D,SACxC,CAAA,GAAA,CAAC,GAAG8D,IAA+CX,GAAAA,OAAAA,CAAQY,SAAS,CAAID,GAAAA,IAAAA,CAAAA,GACxE,CAAC,GAAGA,IAAAA,GACFX,QACGa,IAAI,CAAA,GAAIF,KACT;aACCG,IAAI,CAAC,CAACX,GAAAA,IAAS;AAAEG,oBAAAA,OAAAA,EAASH,GAAM,GAAA;AAACA,wBAAAA;AAAI,qBAAA,GAAG;iBAAG,CAAA,CAAA;AAEpD,QAAA,MAAMzH,UAEF,EAAC;AAEL,QAAA,IAAIgE,YAAcqE,EAAAA,OAAAA,EAASC,eAAmBtE,IAAAA,YAAAA,EAAcP,cAAc,WAAa,EAAA;YACrF,IAAIgC,YAAAA,EAAc4C,SAASC,eAAiB,EAAA;AAC1C,gBAAA,IAAI7F,WAAW,WAAa,EAAA;AAC1BzC,oBAAAA,OAAAA,CAAQ6B,WAAW,GAAG;wBAAEE,QAAU,EAAA;AAAK,qBAAA;iBAClC,MAAA;AACL/B,oBAAAA,OAAAA,CAAQ6B,WAAW,GAAG;wBAAEC,KAAO,EAAA;AAAK,qBAAA;AACtC;AACF;SACK,MAAA,IAAI2D,YAAc4C,EAAAA,OAAAA,EAASC,eAAiB,EAAA;;AAEjDtI,YAAAA,OAAAA,CAAQ6B,WAAW,GAAG;gBAAEC,KAAO,EAAA;AAAK,aAAA;AACtC;AAEA;;;;;;;;QASA,MAAM2F,GAAM,GAAA,MAAMM,aAAc,CAAA;YAAElE,EAAIc,EAAAA;AAAQ,SAAA,EAAGZ,WAAa,EAAA;YAC5D5B,MAAQ,EAAA;AAAC,gBAAA,IAAA;AAAM,gBAAA,YAAA;AAAc,gBAAA,QAAA;AAAU,gBAAA,aAAA;AAAe,gBAAA;AAAY,aAAA;YAClEoG,QAAU,EAAA,MAAA;AACVC,YAAAA,IAAAA,EAAM5E,GAAIW,CAAAA,OAAO,CAACtC,KAAK,CAACuG,IAAI;AAC5BC,YAAAA,QAAAA,EAAU7E,GAAIW,CAAAA,OAAO,CAACtC,KAAK,CAACwG,QAAQ;AACpCzI,YAAAA;AACF,SAAA,CAAA;AAEA;;;QAIA,MAAM0I,SAAYjB,GAAAA,GAAAA,CAAIG,OAAO,CAACjG,GAAG,CAAC,CAACgH,IAAcA,GAAAA,IAAAA,CAAK9E,EAAE,CAAA;AACxDhE,QAAAA,gBAAAA,CAAiBgF,eAAiB,EAAA;YAAEhB,EAAI,EAAA;gBAAEnC,GAAKgH,EAAAA;AAAU;AAAE,SAAA,CAAA;AAE3D;;;;;QAMA,MAAME,YAAe,GAAA,MAAMb,aAAc,CAAA;YAAElE,EAAIc,EAAAA;AAAQ,SAAA,EAAGZ,WAAa,EAAA;AACrE,YAAA,GAAG3C,OAAOmG,GAAG,CAAC,gBAAgBC,SAAS,CAACvG,WAAW4D,eAAgB,CAAA;YACnE0D,QAAU,EAAA;AACZ,SAAA,CAAA;;QAGA,MAAMM,cAAAA,GAAiBC,OAAO,IAAMC,EAAAA,MAAAA,CAAOH,aAAahB,OAAO,EAAEH,IAAIG,OAAO,CAAA,CAAA;AAE5EhE,QAAAA,GAAAA,CAAI+D,IAAI,GAAG;YACTqB,UAAYvB,EAAAA,GAAAA,CAAIuB,UAAU,IAAI;gBAC5BR,IAAM,EAAA,CAAA;gBACNS,SAAW,EAAA,CAAA;gBACXR,QAAU,EAAA,EAAA;AACVS,gBAAAA,KAAAA,EAAOL,eAAetH;AACxB,aAAA;YACAqG,OAAS,EAAA,MAAM5G,qBAAqBC,SAAW4H,EAAAA,cAAAA;AACjD,SAAA;AACF;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"relations.mjs","sources":["../../../server/src/controllers/relations.ts"],"sourcesContent":["import { prop, uniq, uniqBy, concat, flow, isEmpty } from 'lodash/fp';\n\nimport { isOperatorOfType, contentTypes, relations, errors } from '@strapi/utils';\nimport type { Data, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { validateFindAvailable, validateFindExisting } from './validation/relations';\nimport { isListable } from '../services/utils/configuration/attributes';\n\nconst { PUBLISHED_AT_ATTRIBUTE, UPDATED_AT_ATTRIBUTE } = contentTypes.constants;\n\ninterface RelationEntity {\n id: Data.ID;\n documentId: Modules.Documents.ID;\n updatedAt: string | Date;\n publishedAt?: string | Date;\n [key: string]: unknown;\n}\n\nconst addFiltersClause = (params: any, filtersClause: any) => {\n params.filters = params.filters || {};\n params.filters.$and = params.filters.$and || [];\n params.filters.$and.push(filtersClause);\n};\n\nconst sanitizeMainField = (model: any, mainField: any, userAbility: any) => {\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: model.uid,\n });\n\n // Whether the main field can be displayed or not, regardless of permissions.\n const isMainFieldListable = isListable(model, mainField);\n // Whether the user has the permission to access the model's main field (using RBAC abilities)\n const canReadMainField = permissionChecker.can.read(null, mainField);\n\n if (!isMainFieldListable || !canReadMainField) {\n // Default to 'documentId' if the actual main field shouldn't be displayed\n return 'documentId';\n }\n\n // Edge cases\n\n // 1. Enforce 'name' as the main field for users and permissions' roles\n if (model.uid === 'plugin::users-permissions.role') {\n return 'name';\n }\n\n return mainField;\n};\n\n/**\n *\n * All relations sent to this function should have the same status or no status\n */\nconst addStatusToRelations = async (targetUid: UID.Schema, relations: RelationEntity[]) => {\n if (!contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {\n return relations;\n }\n\n const documentMetadata = getService('document-metadata');\n\n if (!relations.length) {\n return relations;\n }\n\n const firstRelation = relations[0];\n\n const filters: any = {\n documentId: { $in: relations.map((r) => r.documentId) },\n // NOTE: find the \"opposite\" status\n publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true },\n };\n\n const availableStatus = await strapi.query(targetUid).findMany({\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n filters,\n });\n\n return relations.map((relation: RelationEntity) => {\n const availableStatuses = availableStatus.filter(\n (availableDocument: RelationEntity) =>\n availableDocument.documentId === relation.documentId &&\n (relation.locale ? availableDocument.locale === relation.locale : true)\n );\n\n return {\n ...relation,\n status: documentMetadata.getStatus(relation, availableStatuses),\n };\n });\n};\n\nconst getPublishedAtClause = (status: string, uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n\n /**\n * If dp is disabled, ignore the filter\n */\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return {};\n }\n\n // Prioritize the draft status in case it's not provided\n return status === 'published' ? { $notNull: true } : { $null: true };\n};\n\nconst validateLocale = (sourceUid: UID.Schema, targetUid: UID.ContentType, locale?: string) => {\n const sourceModel = strapi.getModel(sourceUid);\n const targetModel = strapi.getModel(targetUid);\n\n const isLocalized = strapi.plugin('i18n').service('content-types').isLocalizedContentType;\n const isSourceLocalized = isLocalized(sourceModel);\n const isTargetLocalized = isLocalized(targetModel);\n\n return {\n locale,\n isSourceLocalized,\n isTargetLocalized,\n };\n};\n\nconst validateStatus = (\n sourceUid: UID.Schema,\n status?: Modules.Documents.Params.PublicationStatus.Kind\n) => {\n const sourceModel = strapi.getModel(sourceUid);\n\n const isDP = contentTypes.hasDraftAndPublish;\n const isSourceDP = isDP(sourceModel);\n\n // Default to draft if not set\n if (!isSourceDP && sourceModel.modelType === 'contentType') {\n return { status: undefined };\n }\n\n switch (status) {\n case 'published':\n return { status: 'published' };\n default:\n // Assign to draft if the status is not valid\n return { status: 'draft' };\n }\n};\n\nexport default {\n async extractAndValidateRequestInfo(ctx: any, id?: Data.ID) {\n const { userAbility } = ctx.state;\n const { model, targetField } = ctx.params;\n\n const sourceSchema = strapi.getModel(model);\n if (!sourceSchema) {\n throw new errors.ValidationError(`The model ${model} doesn't exist`);\n }\n\n const attribute: any = sourceSchema.attributes[targetField];\n if (!attribute || attribute.type !== 'relation') {\n throw new errors.ValidationError(\n `The relational field ${targetField} doesn't exist on ${model}`\n );\n }\n\n const sourceUid = model;\n const targetUid = attribute.target;\n\n const { locale, isSourceLocalized, isTargetLocalized } = validateLocale(\n sourceUid,\n targetUid,\n ctx.request?.query?.locale\n );\n const { status } = validateStatus(sourceUid, ctx.request?.query?.status);\n\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model,\n });\n\n const isComponent = sourceSchema.modelType === 'component';\n if (!isComponent) {\n if (permissionChecker.cannot.read(null, targetField)) {\n return ctx.forbidden();\n }\n }\n\n let entryId: string | number | null = null;\n\n if (id) {\n const where: Record<string, any> = {};\n\n if (!isComponent) {\n where.documentId = id;\n\n if (status) {\n where.publishedAt = getPublishedAtClause(status, sourceUid);\n }\n\n if (locale && isSourceLocalized) {\n where.locale = locale;\n }\n } else {\n // If the source is a component, we only need to filter by the\n // component's entity id\n where.id = id;\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query);\n const populate = await getService('populate-builder')(model)\n .populateFromQuery(permissionQuery)\n .build();\n\n const currentEntity = await strapi.db.query(model).findOne({\n where,\n populate,\n });\n\n // We need to check if the entity exists\n // and if the user has the permission to read it in this way\n // There may be multiple entities (publication states) under this\n // documentId + locale. We only need to check if one exists\n if (!currentEntity) {\n throw new errors.NotFoundError();\n }\n\n if (!isComponent) {\n if (permissionChecker.cannot.read(currentEntity, targetField)) {\n throw new errors.ForbiddenError();\n }\n }\n\n entryId = currentEntity.id;\n }\n\n const modelConfig = isComponent\n ? await getService('components').findConfiguration(sourceSchema)\n : await getService('content-types').findConfiguration(sourceSchema);\n\n const targetSchema = strapi.getModel(targetUid);\n\n const mainField = flow(\n prop(`metadatas.${targetField}.edit.mainField`),\n (mainField) => mainField || 'id',\n (mainField) => sanitizeMainField(targetSchema, mainField, userAbility)\n )(modelConfig);\n\n const fieldsToSelect = uniq([\n mainField,\n PUBLISHED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n 'documentId',\n ]);\n\n if (isTargetLocalized) {\n fieldsToSelect.push('locale');\n }\n\n return {\n entryId,\n locale,\n status,\n attribute,\n fieldsToSelect,\n mainField,\n source: { schema: sourceSchema, isLocalized: isSourceLocalized },\n target: { schema: targetSchema, isLocalized: isTargetLocalized },\n sourceSchema,\n targetSchema,\n targetField,\n };\n },\n\n /**\n * Used to find new relations to add in a relational field.\n *\n * Component and document relations are dealt a bit differently (they don't have a document_id).\n */\n async findAvailable(ctx: any) {\n const { id } = ctx.request.query;\n\n await validateFindAvailable(ctx.request.query);\n\n const {\n locale,\n status,\n targetField,\n fieldsToSelect,\n mainField,\n source: {\n schema: { uid: sourceUid, modelType: sourceModelType },\n isLocalized: isSourceLocalized,\n },\n target: {\n schema: { uid: targetUid },\n isLocalized: isTargetLocalized,\n },\n } = await this.extractAndValidateRequestInfo(ctx, id);\n\n const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;\n\n const permissionChecker = getService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: targetUid,\n });\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n const queryParams = {\n sort: mainField,\n // cannot select other fields as the user may not have the permissions\n fields: fieldsToSelect,\n ...permissionQuery,\n };\n\n // If no status is requested, we find all the draft relations and later update them\n // with the latest available status\n addFiltersClause(queryParams, {\n publishedAt: getPublishedAtClause(status, targetUid),\n });\n\n // We will only filter by locale if the target content type is localized\n const filterByLocale = isTargetLocalized && locale;\n if (filterByLocale) {\n addFiltersClause(queryParams, { locale });\n }\n\n if (id) {\n /**\n * Exclude the relations that are already related to the source\n *\n * We also optionally filter the target relations by the requested\n * status and locale if provided.\n */\n const subQuery = strapi.db.queryBuilder(sourceUid);\n\n // The alias refers to the DB table of the target content type model\n const alias = subQuery.getAlias();\n\n const where: Record<string, any> = {\n [`${alias}.id`]: { $notNull: true },\n [`${alias}.document_id`]: { $notNull: true },\n };\n\n /**\n * Content Types -> Specify document id\n * Components -> Specify entity id (they don't have a document id)\n */\n if (sourceModelType === 'contentType') {\n where.document_id = id;\n } else {\n where.id = id;\n }\n\n // Add the status and locale filters if they are provided\n const publishedAt = getPublishedAtClause(status, targetUid);\n if (!isEmpty(publishedAt)) {\n where[`${alias}.published_at`] = publishedAt;\n }\n\n // If target has localization we need to filter by locale\n if (isTargetLocalized && locale) {\n where[`${alias}.locale`] = locale;\n }\n\n if (isSourceLocalized && locale) {\n where.locale = locale;\n }\n\n /**\n * UI can provide a list of ids to omit,\n * those are the relations user set in the UI but has not persisted.\n * We don't want to include them in the available relations.\n */\n if ((idsToInclude?.length ?? 0) !== 0) {\n where[`${alias}.id`].$notIn = idsToInclude;\n }\n\n const knexSubQuery = subQuery\n .where(where)\n .join({ alias, targetField })\n .select(`${alias}.id`)\n .getKnexQuery();\n\n addFiltersClause(queryParams, {\n id: { $notIn: knexSubQuery },\n });\n }\n\n /**\n * Apply a filter to the mainField based on the search query and filter operator\n * searching should be allowed only on mainField for permission reasons\n */\n if (_q) {\n const _filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n addFiltersClause(queryParams, { [mainField]: { [_filter]: _q } });\n }\n\n if (idsToOmit?.length > 0) {\n // If we have ids to omit, we should filter them out\n addFiltersClause(queryParams, {\n id: { $notIn: uniq(idsToOmit) },\n });\n }\n\n const dbQuery = strapi.get('query-params').transform(targetUid, queryParams);\n\n const res = await strapi.db.query(targetUid).findPage(dbQuery);\n\n ctx.body = {\n ...res,\n results: await addStatusToRelations(targetUid, res.results),\n };\n },\n\n async findExisting(ctx: any) {\n const { userAbility } = ctx.state;\n const { id } = ctx.params;\n\n await validateFindExisting(ctx.request.query);\n\n const {\n entryId,\n attribute,\n targetField,\n fieldsToSelect,\n status,\n source: { schema: sourceSchema },\n target: { schema: targetSchema },\n } = await this.extractAndValidateRequestInfo(ctx, id);\n\n const { uid: sourceUid } = sourceSchema;\n const { uid: targetUid } = targetSchema;\n\n const permissionQuery = await getService('permission-checker')\n .create({ userAbility, model: targetUid })\n .sanitizedQuery.read({ fields: fieldsToSelect });\n\n /**\n * loadPages can not be used for single relations,\n * this unifies the loading regardless of it's type\n *\n * NOTE: Relations need to be loaded using any db.query method\n * to ensure the proper ordering is applied\n */\n const dbQuery = strapi.db.query(sourceUid);\n const loadRelations = relations.isAnyToMany(attribute)\n ? (...args: Parameters<typeof dbQuery.loadPages>) => dbQuery.loadPages(...args)\n : (...args: Parameters<typeof dbQuery.load>) =>\n dbQuery\n .load(...args)\n // Ensure response is an array\n .then((res) => ({ results: res ? [res] : [] }));\n\n const filters: {\n publishedAt?: Record<string, any>;\n } = {};\n\n if (sourceSchema?.options?.draftAndPublish || sourceSchema?.modelType === 'component') {\n if (targetSchema?.options?.draftAndPublish) {\n if (status === 'published') {\n filters.publishedAt = { $notNull: true };\n } else {\n filters.publishedAt = { $null: true };\n }\n }\n } else if (targetSchema?.options?.draftAndPublish) {\n // NOTE: we must return the drafts as some targets might not have a published version yet\n filters.publishedAt = { $null: true };\n }\n\n /**\n * If user does not have access to specific relations (custom conditions),\n * only the ids of the relations are returned.\n *\n * - First query loads all the ids.\n * - Second one also loads the main field, and excludes forbidden relations.\n *\n * The response contains the union of the two queries.\n */\n const res = await loadRelations({ id: entryId }, targetField, {\n select: ['id', 'documentId', 'locale', 'publishedAt', 'updatedAt'],\n ordering: 'desc',\n page: ctx.request.query.page,\n pageSize: ctx.request.query.pageSize,\n filters,\n });\n\n /**\n * Add all ids to load in permissionQuery\n * If any of the relations are not accessible, the permissionQuery will exclude them\n */\n const loadedIds = res.results.map((item: any) => item.id);\n addFiltersClause(permissionQuery, { id: { $in: loadedIds } });\n\n /**\n * Load the relations with the main field, the sanitized permission query\n * will exclude the relations the user does not have access to.\n *\n * Pagination is not necessary as the permissionQuery contains the ids to load.\n */\n const sanitizedRes = await loadRelations({ id: entryId }, targetField, {\n ...strapi.get('query-params').transform(targetUid, permissionQuery),\n ordering: 'desc',\n });\n\n // NOTE: the order is very import to make sure sanitized relations are kept in priority\n const relationsUnion = uniqBy('id', concat(sanitizedRes.results, res.results));\n\n ctx.body = {\n pagination: res.pagination || {\n page: 1,\n pageCount: 1,\n pageSize: 10,\n total: relationsUnion.length,\n },\n results: await addStatusToRelations(targetUid, relationsUnion),\n };\n },\n};\n"],"names":["PUBLISHED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","contentTypes","constants","addFiltersClause","params","filtersClause","filters","$and","push","sanitizeMainField","model","mainField","userAbility","permissionChecker","getService","create","uid","isMainFieldListable","isListable","canReadMainField","can","read","addStatusToRelations","targetUid","relations","hasDraftAndPublish","strapi","getModel","documentMetadata","length","firstRelation","documentId","$in","map","r","publishedAt","$null","$notNull","availableStatus","query","findMany","select","relation","availableStatuses","filter","availableDocument","locale","status","getStatus","getPublishedAtClause","validateLocale","sourceUid","sourceModel","targetModel","isLocalized","plugin","service","isLocalizedContentType","isSourceLocalized","isTargetLocalized","validateStatus","isDP","isSourceDP","modelType","undefined","extractAndValidateRequestInfo","ctx","id","state","targetField","sourceSchema","errors","ValidationError","attribute","attributes","type","target","request","isComponent","cannot","forbidden","entryId","where","permissionQuery","sanitizedQuery","populate","populateFromQuery","build","currentEntity","db","findOne","NotFoundError","ForbiddenError","modelConfig","findConfiguration","targetSchema","flow","prop","fieldsToSelect","uniq","source","schema","findAvailable","validateFindAvailable","sourceModelType","idsToOmit","idsToInclude","_q","queryParams","sort","fields","filterByLocale","subQuery","queryBuilder","alias","getAlias","document_id","isEmpty","$notIn","knexSubQuery","join","getKnexQuery","_filter","isOperatorOfType","dbQuery","get","transform","res","findPage","body","results","findExisting","validateFindExisting","loadRelations","isAnyToMany","args","loadPages","load","then","options","draftAndPublish","ordering","page","pageSize","loadedIds","item","sanitizedRes","relationsUnion","uniqBy","concat","pagination","pageCount","total"],"mappings":"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"}