@strapi/content-manager 5.61.1 → 5.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
  6. package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
  7. package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
  8. package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
  9. package/dist/admin/history/components/VersionInputRenderer.js +7 -2
  10. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  11. package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
  12. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  13. package/dist/admin/hooks/useContentManagerInitData.js +27 -8
  14. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  15. package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
  16. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocument.js +11 -13
  18. package/dist/admin/hooks/useDocument.js.map +1 -1
  19. package/dist/admin/hooks/useDocument.mjs +11 -13
  20. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  21. package/dist/admin/hooks/useI18nFieldLock.js +169 -0
  22. package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
  23. package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
  24. package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
  25. package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
  26. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  27. package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
  28. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
  29. package/dist/admin/index.js +5 -0
  30. package/dist/admin/index.js.map +1 -1
  31. package/dist/admin/index.mjs +2 -0
  32. package/dist/admin/index.mjs.map +1 -1
  33. package/dist/admin/modules/app.js +8 -1
  34. package/dist/admin/modules/app.js.map +1 -1
  35. package/dist/admin/modules/app.mjs +8 -2
  36. package/dist/admin/modules/app.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/EditViewPage.js +129 -127
  38. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  39. package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
  40. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
  42. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
  44. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
  53. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
  54. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
  55. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
  56. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
  57. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
  58. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
  59. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
  60. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
  61. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
  62. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
  64. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
  66. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
  68. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
  74. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
  76. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
  78. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
  79. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
  80. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
  81. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
  82. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
  84. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
  86. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
  88. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
  96. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
  100. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
  102. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
  106. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
  108. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  109. package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
  110. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  111. package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
  112. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  113. package/dist/admin/pages/EditView/utils/data.js +14 -9
  114. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  115. package/dist/admin/pages/EditView/utils/data.mjs +14 -9
  116. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  117. package/dist/admin/pages/EditView/utils/forms.js +34 -0
  118. package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
  119. package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
  120. package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
  121. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
  122. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  123. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
  124. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
  125. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
  126. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  127. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
  128. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
  129. package/dist/admin/pages/ListView/ListViewPage.js +11 -2
  130. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  131. package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
  132. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  133. package/dist/admin/pages/ListView/components/Filters.js +15 -5
  134. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  135. package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
  136. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  137. package/dist/admin/preview/components/InputPopover.js +18 -8
  138. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  139. package/dist/admin/preview/components/InputPopover.mjs +19 -9
  140. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  141. package/dist/admin/preview/pages/Preview.js +5 -16
  142. package/dist/admin/preview/pages/Preview.js.map +1 -1
  143. package/dist/admin/preview/pages/Preview.mjs +5 -16
  144. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  145. package/dist/admin/preview/utils/fieldUtils.js +2 -0
  146. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  147. package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
  148. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  149. package/dist/admin/services/api.js +2 -1
  150. package/dist/admin/services/api.js.map +1 -1
  151. package/dist/admin/services/api.mjs +2 -1
  152. package/dist/admin/services/api.mjs.map +1 -1
  153. package/dist/admin/services/documents.js +21 -1
  154. package/dist/admin/services/documents.js.map +1 -1
  155. package/dist/admin/services/documents.mjs +21 -2
  156. package/dist/admin/services/documents.mjs.map +1 -1
  157. package/dist/admin/services/relations.js +47 -1
  158. package/dist/admin/services/relations.js.map +1 -1
  159. package/dist/admin/services/relations.mjs +47 -2
  160. package/dist/admin/services/relations.mjs.map +1 -1
  161. package/dist/admin/src/exports.d.ts +2 -0
  162. package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
  163. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
  164. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  165. package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
  166. package/dist/admin/src/modules/app.d.ts +4 -1
  167. package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
  168. package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
  169. package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
  170. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
  171. package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
  172. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
  173. package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
  174. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
  175. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
  176. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
  177. package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
  178. package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
  179. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  180. package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
  181. package/dist/admin/src/services/api.d.ts +1 -1
  182. package/dist/admin/src/services/components.d.ts +2 -2
  183. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  184. package/dist/admin/src/services/documents.d.ts +25 -21
  185. package/dist/admin/src/services/homepage.d.ts +1 -1
  186. package/dist/admin/src/services/init.d.ts +1 -1
  187. package/dist/admin/src/services/relations.d.ts +5 -3
  188. package/dist/admin/src/services/uid.d.ts +3 -3
  189. package/dist/admin/translations/en.json.js +41 -0
  190. package/dist/admin/translations/en.json.js.map +1 -1
  191. package/dist/admin/translations/en.json.mjs +41 -0
  192. package/dist/admin/translations/en.json.mjs.map +1 -1
  193. package/dist/server/controllers/relations.js +4 -2
  194. package/dist/server/controllers/relations.js.map +1 -1
  195. package/dist/server/controllers/relations.mjs +4 -2
  196. package/dist/server/controllers/relations.mjs.map +1 -1
  197. package/dist/server/controllers/utils/metadata.js +3 -1
  198. package/dist/server/controllers/utils/metadata.js.map +1 -1
  199. package/dist/server/controllers/utils/metadata.mjs +3 -1
  200. package/dist/server/controllers/utils/metadata.mjs.map +1 -1
  201. package/dist/server/history/services/utils.js +3 -1
  202. package/dist/server/history/services/utils.js.map +1 -1
  203. package/dist/server/history/services/utils.mjs +3 -1
  204. package/dist/server/history/services/utils.mjs.map +1 -1
  205. package/dist/server/homepage/services/homepage-query-utils.js +14 -0
  206. package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
  207. package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
  208. package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
  209. package/dist/server/homepage/services/homepage.js +1 -1
  210. package/dist/server/homepage/services/homepage.js.map +1 -1
  211. package/dist/server/homepage/services/homepage.mjs +2 -2
  212. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  213. package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
  214. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
  215. package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
  216. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
  217. package/dist/server/mcp/schemas/output-schemas.js +2 -1
  218. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  219. package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
  220. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  221. package/dist/server/services/document-manager.js +3 -2
  222. package/dist/server/services/document-manager.js.map +1 -1
  223. package/dist/server/services/document-manager.mjs +3 -2
  224. package/dist/server/services/document-manager.mjs.map +1 -1
  225. package/dist/server/services/document-metadata.js +92 -4
  226. package/dist/server/services/document-metadata.js.map +1 -1
  227. package/dist/server/services/document-metadata.mjs +92 -4
  228. package/dist/server/services/document-metadata.mjs.map +1 -1
  229. package/dist/server/services/permission-checker.js +20 -8
  230. package/dist/server/services/permission-checker.js.map +1 -1
  231. package/dist/server/services/permission-checker.mjs +20 -8
  232. package/dist/server/services/permission-checker.mjs.map +1 -1
  233. package/dist/server/services/uid.js +2 -1
  234. package/dist/server/services/uid.js.map +1 -1
  235. package/dist/server/services/uid.mjs +2 -1
  236. package/dist/server/services/uid.mjs.map +1 -1
  237. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  238. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  239. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  240. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  241. package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
  242. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  243. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  244. package/dist/server/src/index.d.ts +21 -7
  245. package/dist/server/src/index.d.ts.map +1 -1
  246. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  247. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  248. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  249. package/dist/server/src/services/document-metadata.d.ts +5 -1
  250. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  251. package/dist/server/src/services/index.d.ts +21 -7
  252. package/dist/server/src/services/index.d.ts.map +1 -1
  253. package/dist/server/src/services/permission-checker.d.ts +6 -5
  254. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  255. package/dist/server/src/services/uid.d.ts.map +1 -1
  256. package/dist/shared/contracts/collection-types.d.ts +7 -0
  257. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  258. package/dist/shared/contracts/single-types.d.ts +4 -0
  259. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  260. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"relations.js","sources":["../../../server/src/controllers/relations.ts"],"sourcesContent":["import { property, uniq, uniqBy, concat, flow, isEmpty } from 'lodash';\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';\nimport { indexByDocumentId } from './utils/document-status';\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\n/**\n * Fields every relation returned by findExisting carries, whatever the user's permissions.\n */\nconst RELATION_BASE_FIELDS = ['id', 'documentId', 'locale', 'publishedAt', 'updatedAt'];\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.db.query(targetUid).findMany({\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n filters,\n });\n\n const statusByDocumentId = indexByDocumentId(availableStatus);\n\n return relations.map((relation: RelationEntity) => {\n const candidates = statusByDocumentId.get(relation.documentId as string) || [];\n const availableStatuses = relation.locale\n ? candidates.filter((c) => c.locale === relation.locale)\n : candidates;\n\n return {\n ...relation,\n status: documentMetadata.getStatus(relation, availableStatuses),\n };\n });\n};\n\nconst getPublishedAtClause = (status: string | undefined, 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 // Without a localization provider, neither side is localized\n const isSourceLocalized = strapi.localization.isLocalizedContentType(sourceModel);\n const isTargetLocalized = strapi.localization.isLocalizedContentType(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 // Morph-to relations (morphToOne, morphToMany) have no single target model\n if (attribute.target === undefined) {\n throw new errors.ValidationError(\n `The relational field ${targetField} on ${model} has no target 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 throw new errors.ForbiddenError();\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 property(`metadatas.${targetField}.edit.mainField`),\n (mainField) => mainField || 'id',\n (mainField) => sanitizeMainField(targetSchema, mainField, userAbility)\n )(modelConfig);\n\n const fieldsToSelect = [\n ...new Set([mainField, PUBLISHED_AT_ATTRIBUTE, UPDATED_AT_ATTRIBUTE, '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 {\n idsToOmit,\n idsToInclude,\n // `_q` is the public query parameter name; keep the alias grep-able.\n _q: search,\n ...query\n } = 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\n const sourcePublishedAt = getPublishedAtClause(status, sourceUid);\n if (!isEmpty(sourcePublishedAt)) {\n where.published_at = sourcePublishedAt;\n }\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 (search) {\n const filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n addFiltersClause(queryParams, { [mainField]: { [filter]: search } });\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: [...new Set(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 const pageParams = {\n page: ctx.request.query.page,\n pageSize: ctx.request.query.pageSize,\n };\n\n const defaultPagination = (total: number) => ({ page: 1, pageCount: 1, pageSize: 10, total });\n\n /**\n * The permission query only carries row-level conditions when the user's read permission on\n * the target has conditions (e.g. \"only entries I created\"). Without them it only restricts\n * the fields, so a single load returns exactly what the two-step flow below would: the\n * relations of the page with the fields the user is allowed to read.\n */\n if (isEmpty(permissionQuery.filters)) {\n const { select } = strapi.get('query-params').transform(targetUid, permissionQuery);\n const permittedFields = Array.isArray(select) ? select : [];\n\n const res = await loadRelations({ id: entryId }, targetField, {\n select: uniq([...RELATION_BASE_FIELDS, ...permittedFields]),\n ordering: 'desc',\n ...pageParams,\n filters,\n });\n\n ctx.body = {\n pagination: res.pagination || defaultPagination(res.results.length),\n results: await addStatusToRelations(targetUid, res.results),\n };\n\n return;\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: RELATION_BASE_FIELDS,\n ordering: 'desc',\n ...pageParams,\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 important to make sure sanitized relations are kept in priority\n const relationsUnion = uniqBy(concat(sanitizedRes.results, res.results), 'id');\n\n ctx.body = {\n pagination: res.pagination || defaultPagination(relationsUnion.length),\n results: await addStatusToRelations(targetUid, relationsUnion),\n };\n },\n};\n"],"names":["PUBLISHED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","contentTypes","constants","RELATION_BASE_FIELDS","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","db","query","findMany","select","statusByDocumentId","indexByDocumentId","relation","candidates","get","availableStatuses","locale","filter","c","status","getStatus","getPublishedAtClause","validateLocale","sourceUid","sourceModel","targetModel","isSourceLocalized","localization","isLocalizedContentType","isTargetLocalized","validateStatus","isDP","isSourceDP","modelType","undefined","extractAndValidateRequestInfo","ctx","id","state","targetField","sourceSchema","errors","ValidationError","attribute","attributes","type","target","request","isComponent","cannot","ForbiddenError","entryId","where","permissionQuery","sanitizedQuery","populate","populateFromQuery","build","currentEntity","findOne","NotFoundError","modelConfig","findConfiguration","targetSchema","flow","property","fieldsToSelect","Set","source","schema","isLocalized","findAvailable","validateFindAvailable","sourceModelType","idsToOmit","idsToInclude","_q","search","queryParams","sort","fields","filterByLocale","subQuery","queryBuilder","alias","getAlias","document_id","sourcePublishedAt","isEmpty","published_at","$notIn","knexSubQuery","join","getKnexQuery","isOperatorOfType","_filter","dbQuery","transform","res","findPage","body","results","findExisting","validateFindExisting","loadRelations","isAnyToMany","args","loadPages","load","then","options","draftAndPublish","pageParams","page","pageSize","defaultPagination","total","pageCount","permittedFields","Array","isArray","uniq","ordering","pagination","loadedIds","item","sanitizedRes","relationsUnion","uniqBy","concat"],"mappings":"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"}
1
+ {"version":3,"file":"relations.js","sources":["../../../server/src/controllers/relations.ts"],"sourcesContent":["import { property, uniq, uniqBy, concat, flow, isEmpty } from 'lodash';\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';\nimport { indexByDocumentId } from './utils/document-status';\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\n/**\n * Fields every relation returned by findExisting carries, whatever the user's permissions.\n */\nconst RELATION_BASE_FIELDS = ['id', 'documentId', 'locale', 'publishedAt', 'updatedAt'];\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.db.query(targetUid).findMany({\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n filters,\n });\n\n const statusByDocumentId = indexByDocumentId(availableStatus);\n\n return relations.map((relation: RelationEntity) => {\n const candidates = statusByDocumentId.get(relation.documentId as string) || [];\n const availableStatuses = relation.locale\n ? candidates.filter((c) => c.locale === relation.locale)\n : candidates;\n\n return {\n ...relation,\n status: documentMetadata.getStatus(relation, availableStatuses),\n };\n });\n};\n\nconst getPublishedAtClause = (status: string | undefined, 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 // Without a localization provider, neither side is localized\n const isSourceLocalized = strapi.localization.isLocalizedContentType(sourceModel);\n const isTargetLocalized = strapi.localization.isLocalizedContentType(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 // Morph-to relations (morphToOne, morphToMany) have no single target model.\n // `attribute` is still `any` here: the `in` check prepares the narrowing for the strict types\n // branch, where `attribute` is typed and only the relations that declare a target pass it.\n if (!('target' in attribute) || attribute.target === undefined) {\n throw new errors.ValidationError(\n `The relational field ${targetField} on ${model} has no target 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 throw new errors.ForbiddenError();\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 property(`metadatas.${targetField}.edit.mainField`),\n (mainField) => mainField || 'id',\n (mainField) => sanitizeMainField(targetSchema, mainField, userAbility)\n )(modelConfig);\n\n const fieldsToSelect = [\n ...new Set([mainField, PUBLISHED_AT_ATTRIBUTE, UPDATED_AT_ATTRIBUTE, '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 {\n idsToOmit,\n idsToInclude,\n // `_q` is the public query parameter name; keep the alias grep-able.\n _q: search,\n ...query\n } = 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\n const sourcePublishedAt = getPublishedAtClause(status, sourceUid);\n if (!isEmpty(sourcePublishedAt)) {\n where.published_at = sourcePublishedAt;\n }\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 (search) {\n const filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n addFiltersClause(queryParams, { [mainField]: { [filter]: search } });\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: [...new Set(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 const pageParams = {\n page: ctx.request.query.page,\n pageSize: ctx.request.query.pageSize,\n };\n\n const defaultPagination = (total: number) => ({ page: 1, pageCount: 1, pageSize: 10, total });\n\n /**\n * The permission query only carries row-level conditions when the user's read permission on\n * the target has conditions (e.g. \"only entries I created\"). Without them it only restricts\n * the fields, so a single load returns exactly what the two-step flow below would: the\n * relations of the page with the fields the user is allowed to read.\n */\n if (isEmpty(permissionQuery.filters)) {\n const { select } = strapi.get('query-params').transform(targetUid, permissionQuery);\n const permittedFields = Array.isArray(select) ? select : [];\n\n const res = await loadRelations({ id: entryId }, targetField, {\n select: uniq([...RELATION_BASE_FIELDS, ...permittedFields]),\n ordering: 'desc',\n ...pageParams,\n filters,\n });\n\n ctx.body = {\n pagination: res.pagination || defaultPagination(res.results.length),\n results: await addStatusToRelations(targetUid, res.results),\n };\n\n return;\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: RELATION_BASE_FIELDS,\n ordering: 'desc',\n ...pageParams,\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 important to make sure sanitized relations are kept in priority\n const relationsUnion = uniqBy(concat(sanitizedRes.results, res.results), 'id');\n\n ctx.body = {\n pagination: res.pagination || defaultPagination(relationsUnion.length),\n results: await addStatusToRelations(targetUid, relationsUnion),\n };\n },\n};\n"],"names":["PUBLISHED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","contentTypes","constants","RELATION_BASE_FIELDS","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","db","query","findMany","select","statusByDocumentId","indexByDocumentId","relation","candidates","get","availableStatuses","locale","filter","c","status","getStatus","getPublishedAtClause","validateLocale","sourceUid","sourceModel","targetModel","isSourceLocalized","localization","isLocalizedContentType","isTargetLocalized","validateStatus","isDP","isSourceDP","modelType","undefined","extractAndValidateRequestInfo","ctx","id","state","targetField","sourceSchema","errors","ValidationError","attribute","attributes","type","target","request","isComponent","cannot","ForbiddenError","entryId","where","permissionQuery","sanitizedQuery","populate","populateFromQuery","build","currentEntity","findOne","NotFoundError","modelConfig","findConfiguration","targetSchema","flow","property","fieldsToSelect","Set","source","schema","isLocalized","findAvailable","validateFindAvailable","sourceModelType","idsToOmit","idsToInclude","_q","search","queryParams","sort","fields","filterByLocale","subQuery","queryBuilder","alias","getAlias","document_id","sourcePublishedAt","isEmpty","published_at","$notIn","knexSubQuery","join","getKnexQuery","isOperatorOfType","_filter","dbQuery","transform","res","findPage","body","results","findExisting","validateFindExisting","loadRelations","isAnyToMany","args","loadPages","load","then","options","draftAndPublish","pageParams","page","pageSize","defaultPagination","total","pageCount","permittedFields","Array","isArray","uniq","ordering","pagination","loadedIds","item","sanitizedRes","relationsUnion","uniqBy","concat"],"mappings":"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"}
@@ -144,8 +144,10 @@ var relations = {
144
144
  if (!attribute || attribute.type !== 'relation') {
145
145
  throw new errors.ValidationError(`The relational field ${targetField} doesn't exist on ${model}`);
146
146
  }
147
- // Morph-to relations (morphToOne, morphToMany) have no single target model
148
- if (attribute.target === undefined) {
147
+ // Morph-to relations (morphToOne, morphToMany) have no single target model.
148
+ // `attribute` is still `any` here: the `in` check prepares the narrowing for the strict types
149
+ // branch, where `attribute` is typed and only the relations that declare a target pass it.
150
+ if (!('target' in attribute) || attribute.target === undefined) {
149
151
  throw new errors.ValidationError(`The relational field ${targetField} on ${model} has no target model`);
150
152
  }
151
153
  const sourceUid = model;
@@ -1 +1 @@
1
- {"version":3,"file":"relations.mjs","sources":["../../../server/src/controllers/relations.ts"],"sourcesContent":["import { property, uniq, uniqBy, concat, flow, isEmpty } from 'lodash';\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';\nimport { indexByDocumentId } from './utils/document-status';\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\n/**\n * Fields every relation returned by findExisting carries, whatever the user's permissions.\n */\nconst RELATION_BASE_FIELDS = ['id', 'documentId', 'locale', 'publishedAt', 'updatedAt'];\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.db.query(targetUid).findMany({\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n filters,\n });\n\n const statusByDocumentId = indexByDocumentId(availableStatus);\n\n return relations.map((relation: RelationEntity) => {\n const candidates = statusByDocumentId.get(relation.documentId as string) || [];\n const availableStatuses = relation.locale\n ? candidates.filter((c) => c.locale === relation.locale)\n : candidates;\n\n return {\n ...relation,\n status: documentMetadata.getStatus(relation, availableStatuses),\n };\n });\n};\n\nconst getPublishedAtClause = (status: string | undefined, 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 // Without a localization provider, neither side is localized\n const isSourceLocalized = strapi.localization.isLocalizedContentType(sourceModel);\n const isTargetLocalized = strapi.localization.isLocalizedContentType(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 // Morph-to relations (morphToOne, morphToMany) have no single target model\n if (attribute.target === undefined) {\n throw new errors.ValidationError(\n `The relational field ${targetField} on ${model} has no target 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 throw new errors.ForbiddenError();\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 property(`metadatas.${targetField}.edit.mainField`),\n (mainField) => mainField || 'id',\n (mainField) => sanitizeMainField(targetSchema, mainField, userAbility)\n )(modelConfig);\n\n const fieldsToSelect = [\n ...new Set([mainField, PUBLISHED_AT_ATTRIBUTE, UPDATED_AT_ATTRIBUTE, '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 {\n idsToOmit,\n idsToInclude,\n // `_q` is the public query parameter name; keep the alias grep-able.\n _q: search,\n ...query\n } = 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\n const sourcePublishedAt = getPublishedAtClause(status, sourceUid);\n if (!isEmpty(sourcePublishedAt)) {\n where.published_at = sourcePublishedAt;\n }\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 (search) {\n const filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n addFiltersClause(queryParams, { [mainField]: { [filter]: search } });\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: [...new Set(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 const pageParams = {\n page: ctx.request.query.page,\n pageSize: ctx.request.query.pageSize,\n };\n\n const defaultPagination = (total: number) => ({ page: 1, pageCount: 1, pageSize: 10, total });\n\n /**\n * The permission query only carries row-level conditions when the user's read permission on\n * the target has conditions (e.g. \"only entries I created\"). Without them it only restricts\n * the fields, so a single load returns exactly what the two-step flow below would: the\n * relations of the page with the fields the user is allowed to read.\n */\n if (isEmpty(permissionQuery.filters)) {\n const { select } = strapi.get('query-params').transform(targetUid, permissionQuery);\n const permittedFields = Array.isArray(select) ? select : [];\n\n const res = await loadRelations({ id: entryId }, targetField, {\n select: uniq([...RELATION_BASE_FIELDS, ...permittedFields]),\n ordering: 'desc',\n ...pageParams,\n filters,\n });\n\n ctx.body = {\n pagination: res.pagination || defaultPagination(res.results.length),\n results: await addStatusToRelations(targetUid, res.results),\n };\n\n return;\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: RELATION_BASE_FIELDS,\n ordering: 'desc',\n ...pageParams,\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 important to make sure sanitized relations are kept in priority\n const relationsUnion = uniqBy(concat(sanitizedRes.results, res.results), 'id');\n\n ctx.body = {\n pagination: res.pagination || defaultPagination(relationsUnion.length),\n results: await addStatusToRelations(targetUid, relationsUnion),\n };\n },\n};\n"],"names":["PUBLISHED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","contentTypes","constants","RELATION_BASE_FIELDS","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","db","query","findMany","select","statusByDocumentId","indexByDocumentId","relation","candidates","get","availableStatuses","locale","filter","c","status","getStatus","getPublishedAtClause","validateLocale","sourceUid","sourceModel","targetModel","isSourceLocalized","localization","isLocalizedContentType","isTargetLocalized","validateStatus","isDP","isSourceDP","modelType","undefined","extractAndValidateRequestInfo","ctx","id","state","targetField","sourceSchema","errors","ValidationError","attribute","attributes","type","target","request","isComponent","cannot","ForbiddenError","entryId","where","permissionQuery","sanitizedQuery","populate","populateFromQuery","build","currentEntity","findOne","NotFoundError","modelConfig","findConfiguration","targetSchema","flow","property","fieldsToSelect","Set","source","schema","isLocalized","findAvailable","validateFindAvailable","sourceModelType","idsToOmit","idsToInclude","_q","search","queryParams","sort","fields","filterByLocale","subQuery","queryBuilder","alias","getAlias","document_id","sourcePublishedAt","isEmpty","published_at","$notIn","knexSubQuery","join","getKnexQuery","isOperatorOfType","_filter","dbQuery","transform","res","findPage","body","results","findExisting","validateFindExisting","loadRelations","isAnyToMany","args","loadPages","load","then","options","draftAndPublish","pageParams","page","pageSize","defaultPagination","total","pageCount","permittedFields","Array","isArray","uniq","ordering","pagination","loadedIds","item","sanitizedRes","relationsUnion","uniqBy","concat"],"mappings":"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"}
1
+ {"version":3,"file":"relations.mjs","sources":["../../../server/src/controllers/relations.ts"],"sourcesContent":["import { property, uniq, uniqBy, concat, flow, isEmpty } from 'lodash';\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';\nimport { indexByDocumentId } from './utils/document-status';\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\n/**\n * Fields every relation returned by findExisting carries, whatever the user's permissions.\n */\nconst RELATION_BASE_FIELDS = ['id', 'documentId', 'locale', 'publishedAt', 'updatedAt'];\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.db.query(targetUid).findMany({\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n filters,\n });\n\n const statusByDocumentId = indexByDocumentId(availableStatus);\n\n return relations.map((relation: RelationEntity) => {\n const candidates = statusByDocumentId.get(relation.documentId as string) || [];\n const availableStatuses = relation.locale\n ? candidates.filter((c) => c.locale === relation.locale)\n : candidates;\n\n return {\n ...relation,\n status: documentMetadata.getStatus(relation, availableStatuses),\n };\n });\n};\n\nconst getPublishedAtClause = (status: string | undefined, 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 // Without a localization provider, neither side is localized\n const isSourceLocalized = strapi.localization.isLocalizedContentType(sourceModel);\n const isTargetLocalized = strapi.localization.isLocalizedContentType(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 // Morph-to relations (morphToOne, morphToMany) have no single target model.\n // `attribute` is still `any` here: the `in` check prepares the narrowing for the strict types\n // branch, where `attribute` is typed and only the relations that declare a target pass it.\n if (!('target' in attribute) || attribute.target === undefined) {\n throw new errors.ValidationError(\n `The relational field ${targetField} on ${model} has no target 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 throw new errors.ForbiddenError();\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 property(`metadatas.${targetField}.edit.mainField`),\n (mainField) => mainField || 'id',\n (mainField) => sanitizeMainField(targetSchema, mainField, userAbility)\n )(modelConfig);\n\n const fieldsToSelect = [\n ...new Set([mainField, PUBLISHED_AT_ATTRIBUTE, UPDATED_AT_ATTRIBUTE, '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 {\n idsToOmit,\n idsToInclude,\n // `_q` is the public query parameter name; keep the alias grep-able.\n _q: search,\n ...query\n } = 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\n const sourcePublishedAt = getPublishedAtClause(status, sourceUid);\n if (!isEmpty(sourcePublishedAt)) {\n where.published_at = sourcePublishedAt;\n }\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 (search) {\n const filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n addFiltersClause(queryParams, { [mainField]: { [filter]: search } });\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: [...new Set(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 const pageParams = {\n page: ctx.request.query.page,\n pageSize: ctx.request.query.pageSize,\n };\n\n const defaultPagination = (total: number) => ({ page: 1, pageCount: 1, pageSize: 10, total });\n\n /**\n * The permission query only carries row-level conditions when the user's read permission on\n * the target has conditions (e.g. \"only entries I created\"). Without them it only restricts\n * the fields, so a single load returns exactly what the two-step flow below would: the\n * relations of the page with the fields the user is allowed to read.\n */\n if (isEmpty(permissionQuery.filters)) {\n const { select } = strapi.get('query-params').transform(targetUid, permissionQuery);\n const permittedFields = Array.isArray(select) ? select : [];\n\n const res = await loadRelations({ id: entryId }, targetField, {\n select: uniq([...RELATION_BASE_FIELDS, ...permittedFields]),\n ordering: 'desc',\n ...pageParams,\n filters,\n });\n\n ctx.body = {\n pagination: res.pagination || defaultPagination(res.results.length),\n results: await addStatusToRelations(targetUid, res.results),\n };\n\n return;\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: RELATION_BASE_FIELDS,\n ordering: 'desc',\n ...pageParams,\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 important to make sure sanitized relations are kept in priority\n const relationsUnion = uniqBy(concat(sanitizedRes.results, res.results), 'id');\n\n ctx.body = {\n pagination: res.pagination || defaultPagination(relationsUnion.length),\n results: await addStatusToRelations(targetUid, relationsUnion),\n };\n },\n};\n"],"names":["PUBLISHED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","contentTypes","constants","RELATION_BASE_FIELDS","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","db","query","findMany","select","statusByDocumentId","indexByDocumentId","relation","candidates","get","availableStatuses","locale","filter","c","status","getStatus","getPublishedAtClause","validateLocale","sourceUid","sourceModel","targetModel","isSourceLocalized","localization","isLocalizedContentType","isTargetLocalized","validateStatus","isDP","isSourceDP","modelType","undefined","extractAndValidateRequestInfo","ctx","id","state","targetField","sourceSchema","errors","ValidationError","attribute","attributes","type","target","request","isComponent","cannot","ForbiddenError","entryId","where","permissionQuery","sanitizedQuery","populate","populateFromQuery","build","currentEntity","findOne","NotFoundError","modelConfig","findConfiguration","targetSchema","flow","property","fieldsToSelect","Set","source","schema","isLocalized","findAvailable","validateFindAvailable","sourceModelType","idsToOmit","idsToInclude","_q","search","queryParams","sort","fields","filterByLocale","subQuery","queryBuilder","alias","getAlias","document_id","sourcePublishedAt","isEmpty","published_at","$notIn","knexSubQuery","join","getKnexQuery","isOperatorOfType","_filter","dbQuery","transform","res","findPage","body","results","findExisting","validateFindExisting","loadRelations","isAnyToMany","args","loadPages","load","then","options","draftAndPublish","pageParams","page","pageSize","defaultPagination","total","pageCount","permittedFields","Array","isArray","uniq","ordering","pagination","loadedIds","item","sanitizedRes","relationsUnion","uniqBy","concat"],"mappings":"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"}
@@ -9,6 +9,7 @@ var index = require('../../utils/index.js');
9
9
  */ const formatDocumentWithMetadata = async (permissionChecker, uid, document, opts = {})=>{
10
10
  const documentMetadata = index.getService('document-metadata');
11
11
  const serviceOutput = await documentMetadata.formatDocumentWithMetadata(uid, document, opts);
12
+ const { defaultLocale } = serviceOutput.meta;
12
13
  let { meta: { availableLocales, availableStatus } } = serviceOutput;
13
14
  const metadataSanitizer = permissionChecker.sanitizeOutput;
14
15
  availableLocales = await strapiUtils.async.map(availableLocales, async (localeDocument)=>metadataSanitizer(localeDocument));
@@ -17,7 +18,8 @@ var index = require('../../utils/index.js');
17
18
  ...serviceOutput,
18
19
  meta: {
19
20
  availableLocales,
20
- availableStatus
21
+ availableStatus,
22
+ defaultLocale
21
23
  }
22
24
  };
23
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sources":["../../../../server/src/controllers/utils/metadata.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport { getService } from '../../utils';\n\nimport { DocumentVersion, GetMetadataOptions } from '../../services/document-metadata';\n\nimport type {\n AvailableLocaleDocument,\n AvailableStatusDocument,\n} from '../../../../shared/contracts/collection-types';\n\n/**\n * Format a document with metadata. Making sure the metadata response is\n * correctly sanitized for the current user\n */\nexport const formatDocumentWithMetadata = async (\n permissionChecker: any,\n uid: UID.ContentType,\n document: DocumentVersion,\n opts: GetMetadataOptions = {}\n) => {\n const documentMetadata = getService('document-metadata');\n\n const serviceOutput = await documentMetadata.formatDocumentWithMetadata(uid, document, opts);\n\n let {\n meta: { availableLocales, availableStatus },\n } = serviceOutput;\n\n const metadataSanitizer = permissionChecker.sanitizeOutput;\n\n availableLocales = await async.map(\n availableLocales,\n async (localeDocument: AvailableLocaleDocument) => metadataSanitizer(localeDocument)\n );\n\n availableStatus = await async.map(\n availableStatus,\n async (statusDocument: AvailableStatusDocument) => metadataSanitizer(statusDocument)\n );\n\n return {\n ...serviceOutput,\n meta: {\n availableLocales,\n availableStatus,\n },\n };\n};\n"],"names":["formatDocumentWithMetadata","permissionChecker","uid","document","opts","documentMetadata","getService","serviceOutput","meta","availableLocales","availableStatus","metadataSanitizer","sanitizeOutput","async","map","localeDocument","statusDocument"],"mappings":";;;;;AAYA;;;UAIaA,0BAAAA,GAA6B,OACxCC,mBACAC,GAAAA,EACAC,QAAAA,EACAC,IAAAA,GAA2B,EAAE,GAAA;AAE7B,IAAA,MAAMC,mBAAmBC,gBAAAA,CAAW,mBAAA,CAAA;AAEpC,IAAA,MAAMC,gBAAgB,MAAMF,gBAAAA,CAAiBL,0BAA0B,CAACE,KAAKC,QAAAA,EAAUC,IAAAA,CAAAA;IAEvF,IAAI,EACFI,MAAM,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,EAC5C,GAAGH,aAAAA;IAEJ,MAAMI,iBAAAA,GAAoBV,kBAAkBW,cAAc;AAE1DH,IAAAA,gBAAAA,GAAmB,MAAMI,iBAAAA,CAAMC,GAAG,CAChCL,gBAAAA,EACA,OAAOM,iBAA4CJ,iBAAAA,CAAkBI,cAAAA,CAAAA,CAAAA;AAGvEL,IAAAA,eAAAA,GAAkB,MAAMG,iBAAAA,CAAMC,GAAG,CAC/BJ,eAAAA,EACA,OAAOM,iBAA4CL,iBAAAA,CAAkBK,cAAAA,CAAAA,CAAAA;IAGvE,OAAO;AACL,QAAA,GAAGT,aAAa;QAChBC,IAAAA,EAAM;AACJC,YAAAA,gBAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"metadata.js","sources":["../../../../server/src/controllers/utils/metadata.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport { getService } from '../../utils';\n\nimport { DocumentVersion, GetMetadataOptions } from '../../services/document-metadata';\n\nimport type {\n AvailableLocaleDocument,\n AvailableStatusDocument,\n} from '../../../../shared/contracts/collection-types';\n\n/**\n * Format a document with metadata. Making sure the metadata response is\n * correctly sanitized for the current user\n */\nexport const formatDocumentWithMetadata = async (\n permissionChecker: any,\n uid: UID.ContentType,\n document: DocumentVersion,\n opts: GetMetadataOptions = {}\n) => {\n const documentMetadata = getService('document-metadata');\n\n const serviceOutput = await documentMetadata.formatDocumentWithMetadata(uid, document, opts);\n\n const { defaultLocale } = serviceOutput.meta;\n let {\n meta: { availableLocales, availableStatus },\n } = serviceOutput;\n\n const metadataSanitizer = permissionChecker.sanitizeOutput;\n\n availableLocales = await async.map(\n availableLocales,\n async (localeDocument: AvailableLocaleDocument) => metadataSanitizer(localeDocument)\n );\n\n availableStatus = await async.map(\n availableStatus,\n async (statusDocument: AvailableStatusDocument) => metadataSanitizer(statusDocument)\n );\n\n return {\n ...serviceOutput,\n meta: {\n availableLocales,\n availableStatus,\n defaultLocale,\n },\n };\n};\n"],"names":["formatDocumentWithMetadata","permissionChecker","uid","document","opts","documentMetadata","getService","serviceOutput","defaultLocale","meta","availableLocales","availableStatus","metadataSanitizer","sanitizeOutput","async","map","localeDocument","statusDocument"],"mappings":";;;;;AAYA;;;UAIaA,0BAAAA,GAA6B,OACxCC,mBACAC,GAAAA,EACAC,QAAAA,EACAC,IAAAA,GAA2B,EAAE,GAAA;AAE7B,IAAA,MAAMC,mBAAmBC,gBAAAA,CAAW,mBAAA,CAAA;AAEpC,IAAA,MAAMC,gBAAgB,MAAMF,gBAAAA,CAAiBL,0BAA0B,CAACE,KAAKC,QAAAA,EAAUC,IAAAA,CAAAA;AAEvF,IAAA,MAAM,EAAEI,aAAa,EAAE,GAAGD,cAAcE,IAAI;IAC5C,IAAI,EACFA,MAAM,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,EAC5C,GAAGJ,aAAAA;IAEJ,MAAMK,iBAAAA,GAAoBX,kBAAkBY,cAAc;AAE1DH,IAAAA,gBAAAA,GAAmB,MAAMI,iBAAAA,CAAMC,GAAG,CAChCL,gBAAAA,EACA,OAAOM,iBAA4CJ,iBAAAA,CAAkBI,cAAAA,CAAAA,CAAAA;AAGvEL,IAAAA,eAAAA,GAAkB,MAAMG,iBAAAA,CAAMC,GAAG,CAC/BJ,eAAAA,EACA,OAAOM,iBAA4CL,iBAAAA,CAAkBK,cAAAA,CAAAA,CAAAA;IAGvE,OAAO;AACL,QAAA,GAAGV,aAAa;QAChBE,IAAAA,EAAM;AACJC,YAAAA,gBAAAA;AACAC,YAAAA,eAAAA;AACAH,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
@@ -7,6 +7,7 @@ import { getService } from '../../utils/index.mjs';
7
7
  */ const formatDocumentWithMetadata = async (permissionChecker, uid, document, opts = {})=>{
8
8
  const documentMetadata = getService('document-metadata');
9
9
  const serviceOutput = await documentMetadata.formatDocumentWithMetadata(uid, document, opts);
10
+ const { defaultLocale } = serviceOutput.meta;
10
11
  let { meta: { availableLocales, availableStatus } } = serviceOutput;
11
12
  const metadataSanitizer = permissionChecker.sanitizeOutput;
12
13
  availableLocales = await async.map(availableLocales, async (localeDocument)=>metadataSanitizer(localeDocument));
@@ -15,7 +16,8 @@ import { getService } from '../../utils/index.mjs';
15
16
  ...serviceOutput,
16
17
  meta: {
17
18
  availableLocales,
18
- availableStatus
19
+ availableStatus,
20
+ defaultLocale
19
21
  }
20
22
  };
21
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.mjs","sources":["../../../../server/src/controllers/utils/metadata.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport { getService } from '../../utils';\n\nimport { DocumentVersion, GetMetadataOptions } from '../../services/document-metadata';\n\nimport type {\n AvailableLocaleDocument,\n AvailableStatusDocument,\n} from '../../../../shared/contracts/collection-types';\n\n/**\n * Format a document with metadata. Making sure the metadata response is\n * correctly sanitized for the current user\n */\nexport const formatDocumentWithMetadata = async (\n permissionChecker: any,\n uid: UID.ContentType,\n document: DocumentVersion,\n opts: GetMetadataOptions = {}\n) => {\n const documentMetadata = getService('document-metadata');\n\n const serviceOutput = await documentMetadata.formatDocumentWithMetadata(uid, document, opts);\n\n let {\n meta: { availableLocales, availableStatus },\n } = serviceOutput;\n\n const metadataSanitizer = permissionChecker.sanitizeOutput;\n\n availableLocales = await async.map(\n availableLocales,\n async (localeDocument: AvailableLocaleDocument) => metadataSanitizer(localeDocument)\n );\n\n availableStatus = await async.map(\n availableStatus,\n async (statusDocument: AvailableStatusDocument) => metadataSanitizer(statusDocument)\n );\n\n return {\n ...serviceOutput,\n meta: {\n availableLocales,\n availableStatus,\n },\n };\n};\n"],"names":["formatDocumentWithMetadata","permissionChecker","uid","document","opts","documentMetadata","getService","serviceOutput","meta","availableLocales","availableStatus","metadataSanitizer","sanitizeOutput","async","map","localeDocument","statusDocument"],"mappings":";;;AAYA;;;UAIaA,0BAAAA,GAA6B,OACxCC,mBACAC,GAAAA,EACAC,QAAAA,EACAC,IAAAA,GAA2B,EAAE,GAAA;AAE7B,IAAA,MAAMC,mBAAmBC,UAAAA,CAAW,mBAAA,CAAA;AAEpC,IAAA,MAAMC,gBAAgB,MAAMF,gBAAAA,CAAiBL,0BAA0B,CAACE,KAAKC,QAAAA,EAAUC,IAAAA,CAAAA;IAEvF,IAAI,EACFI,MAAM,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,EAC5C,GAAGH,aAAAA;IAEJ,MAAMI,iBAAAA,GAAoBV,kBAAkBW,cAAc;AAE1DH,IAAAA,gBAAAA,GAAmB,MAAMI,KAAAA,CAAMC,GAAG,CAChCL,gBAAAA,EACA,OAAOM,iBAA4CJ,iBAAAA,CAAkBI,cAAAA,CAAAA,CAAAA;AAGvEL,IAAAA,eAAAA,GAAkB,MAAMG,KAAAA,CAAMC,GAAG,CAC/BJ,eAAAA,EACA,OAAOM,iBAA4CL,iBAAAA,CAAkBK,cAAAA,CAAAA,CAAAA;IAGvE,OAAO;AACL,QAAA,GAAGT,aAAa;QAChBC,IAAAA,EAAM;AACJC,YAAAA,gBAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"metadata.mjs","sources":["../../../../server/src/controllers/utils/metadata.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport { getService } from '../../utils';\n\nimport { DocumentVersion, GetMetadataOptions } from '../../services/document-metadata';\n\nimport type {\n AvailableLocaleDocument,\n AvailableStatusDocument,\n} from '../../../../shared/contracts/collection-types';\n\n/**\n * Format a document with metadata. Making sure the metadata response is\n * correctly sanitized for the current user\n */\nexport const formatDocumentWithMetadata = async (\n permissionChecker: any,\n uid: UID.ContentType,\n document: DocumentVersion,\n opts: GetMetadataOptions = {}\n) => {\n const documentMetadata = getService('document-metadata');\n\n const serviceOutput = await documentMetadata.formatDocumentWithMetadata(uid, document, opts);\n\n const { defaultLocale } = serviceOutput.meta;\n let {\n meta: { availableLocales, availableStatus },\n } = serviceOutput;\n\n const metadataSanitizer = permissionChecker.sanitizeOutput;\n\n availableLocales = await async.map(\n availableLocales,\n async (localeDocument: AvailableLocaleDocument) => metadataSanitizer(localeDocument)\n );\n\n availableStatus = await async.map(\n availableStatus,\n async (statusDocument: AvailableStatusDocument) => metadataSanitizer(statusDocument)\n );\n\n return {\n ...serviceOutput,\n meta: {\n availableLocales,\n availableStatus,\n defaultLocale,\n },\n };\n};\n"],"names":["formatDocumentWithMetadata","permissionChecker","uid","document","opts","documentMetadata","getService","serviceOutput","defaultLocale","meta","availableLocales","availableStatus","metadataSanitizer","sanitizeOutput","async","map","localeDocument","statusDocument"],"mappings":";;;AAYA;;;UAIaA,0BAAAA,GAA6B,OACxCC,mBACAC,GAAAA,EACAC,QAAAA,EACAC,IAAAA,GAA2B,EAAE,GAAA;AAE7B,IAAA,MAAMC,mBAAmBC,UAAAA,CAAW,mBAAA,CAAA;AAEpC,IAAA,MAAMC,gBAAgB,MAAMF,gBAAAA,CAAiBL,0BAA0B,CAACE,KAAKC,QAAAA,EAAUC,IAAAA,CAAAA;AAEvF,IAAA,MAAM,EAAEI,aAAa,EAAE,GAAGD,cAAcE,IAAI;IAC5C,IAAI,EACFA,MAAM,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,EAC5C,GAAGJ,aAAAA;IAEJ,MAAMK,iBAAAA,GAAoBX,kBAAkBY,cAAc;AAE1DH,IAAAA,gBAAAA,GAAmB,MAAMI,KAAAA,CAAMC,GAAG,CAChCL,gBAAAA,EACA,OAAOM,iBAA4CJ,iBAAAA,CAAkBI,cAAAA,CAAAA,CAAAA;AAGvEL,IAAAA,eAAAA,GAAkB,MAAMG,KAAAA,CAAMC,GAAG,CAC/BJ,eAAAA,EACA,OAAOM,iBAA4CL,iBAAAA,CAAkBK,cAAAA,CAAAA,CAAAA;IAGvE,OAAO;AACL,QAAA,GAAGV,aAAa;QAChBE,IAAAA,EAAM;AACJC,YAAAA,gBAAAA;AACAC,YAAAA,eAAAA;AACAH,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
@@ -116,7 +116,9 @@ const createServiceUtils = ({ strapi })=>{
116
116
  };
117
117
  const getVersionStatus = async (contentTypeUid, document)=>{
118
118
  const documentMetadataService = strapi.plugin('content-manager').service('document-metadata');
119
- const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
119
+ const meta = await documentMetadataService.getMetadata(contentTypeUid, document, {
120
+ availableLocales: false
121
+ });
120
122
  return documentMetadataService.getStatus(document, meta.availableStatus);
121
123
  };
122
124
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../server/src/history/services/utils.ts"],"sourcesContent":["import { difference, omit } from 'lodash';\n\nimport { contentTypes } from '@strapi/utils';\nimport type { Core, Modules, Schema, Data, Struct, UID } from '@strapi/types';\n\nimport { FIELDS_TO_IGNORE } from '../constants';\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type { RelationResult } from '../../../../shared/contracts/relations';\n\nexport const DEFAULT_RETENTION_DAYS = 90;\n\n/**\n * The retention the history delete job applies, from the license's value and the admin setting.\n * Shared with the Plan card's resolver (../entitlements.ts) so the card shows this same figure.\n */\nexport const computeRetentionDays = (\n licenseRetentionDays: unknown,\n userRetentionDays: number | null | undefined\n): number => {\n if (licenseRetentionDays == null) {\n return userRetentionDays ?? DEFAULT_RETENTION_DAYS;\n }\n\n // The registry can ship the value as a numeric string\n const licenseDays = Number(licenseRetentionDays);\n\n // Allow users to override the license retention days, but not to increase it\n if (userRetentionDays && userRetentionDays < licenseDays) {\n return userRetentionDays;\n }\n\n // User didn't provide retention days value, use the license or fallback to default\n return Math.min(licenseDays, DEFAULT_RETENTION_DAYS);\n};\n\ntype RelationResponse = {\n results: RelationResult[];\n meta: { missingCount: number };\n};\n\nexport const createServiceUtils = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * @description\n * Get the difference between the version schema and the content type schema\n */\n const getSchemaAttributesDiff = (\n versionSchemaAttributes: CreateHistoryVersion['schema'],\n contentTypeSchemaAttributes: Struct.SchemaAttributes\n ) => {\n // Omit the same fields that were omitted when creating a history version\n const sanitizedContentTypeSchemaAttributes = omit(\n contentTypeSchemaAttributes,\n FIELDS_TO_IGNORE\n );\n\n const reduceDifferenceToAttributesObject = (\n diffKeys: string[],\n source: CreateHistoryVersion['schema']\n ) => {\n return diffKeys.reduce<CreateHistoryVersion['schema']>(\n (previousAttributesObject, diffKey) => {\n previousAttributesObject[diffKey] = source[diffKey];\n\n return previousAttributesObject;\n },\n {}\n );\n };\n\n const versionSchemaKeys = Object.keys(versionSchemaAttributes);\n const contentTypeSchemaAttributesKeys = Object.keys(sanitizedContentTypeSchemaAttributes);\n // The attribute is new if it's on the content type schema but not on the version schema\n const uniqueToContentType = difference(contentTypeSchemaAttributesKeys, versionSchemaKeys);\n const added = reduceDifferenceToAttributesObject(\n uniqueToContentType,\n sanitizedContentTypeSchemaAttributes\n );\n // The attribute was removed or renamed if it's on the version schema but not on the content type schema\n const uniqueToVersion = difference(versionSchemaKeys, contentTypeSchemaAttributesKeys);\n const removed = reduceDifferenceToAttributesObject(uniqueToVersion, versionSchemaAttributes);\n\n return { added, removed };\n };\n\n /**\n * @description\n * Gets the value to set for a relation when restoring a document\n * @returns\n * The relation if it exists or null\n */\n const getRelationRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[],\n attribute: Schema.Attribute.RelationWithTarget\n ) => {\n if (Array.isArray(versionRelationData)) {\n if (versionRelationData.length === 0) return versionRelationData;\n\n const existingAndMissingRelations = await Promise.all(\n versionRelationData.map((relation) => {\n return strapi.documents(attribute.target).findOne({\n documentId: relation.documentId,\n locale: relation.locale || undefined,\n });\n })\n );\n\n return existingAndMissingRelations.filter((relation) => relation !== null);\n }\n\n return strapi.documents(attribute.target).findOne({\n documentId: versionRelationData.documentId,\n locale: versionRelationData.locale || undefined,\n });\n };\n\n /**\n * @description\n * Gets the value to set for a media asset when restoring a document\n * @returns\n * The media asset if it exists or null\n */\n const getMediaRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[]\n ) => {\n if (Array.isArray(versionRelationData)) {\n const existingAndMissingMedias = await Promise.all(\n versionRelationData.map((media) => {\n return strapi.db.query('plugin::upload.file').findOne({ where: { id: media.id } });\n })\n );\n\n return existingAndMissingMedias.filter((media) => media != null);\n }\n\n return strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: versionRelationData.id } });\n };\n\n const getDefaultLocale = async () => strapi.localization.getDefaultLocale();\n\n const isLocalizedContentType = (model: Schema.ContentType) =>\n strapi.localization.isLocalizedContentType(model);\n\n /**\n *\n * @description\n * Creates a dictionary of all locales available\n */\n const getLocaleDictionary = async (): Promise<{\n [key: string]: { name: string; code: string };\n }> => {\n const locales = await strapi.localization.getLocales();\n\n return locales.reduce<\n Record<string, NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>>\n >((acc, locale) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n }, {});\n };\n\n /**\n *\n * @description\n * Gets the number of retention days defined on the license or configured by the user\n */\n const getRetentionDays = () => {\n const featureConfig = strapi.ee.features.get('cms-content-history');\n\n return computeRetentionDays(\n typeof featureConfig === 'object' ? featureConfig?.options?.retentionDays : undefined,\n strapi.config.get('admin.history.retentionDays')\n );\n };\n\n const getVersionStatus = async (\n contentTypeUid: HistoryVersions.CreateHistoryVersion['contentType'],\n document: Modules.Documents.AnyDocument | null\n ) => {\n const documentMetadataService = strapi.plugin('content-manager').service('document-metadata');\n const meta = await documentMetadataService.getMetadata(contentTypeUid, document);\n\n return documentMetadataService.getStatus(document, meta.availableStatus);\n };\n\n /**\n * Lists all the fields of a component, excepts those that will be populated.\n * The goal is to exclude the ID, because when restoring a component,\n * referencing an ID for a component db row that was deleted creates an error.\n * So we never store component IDs to ensure they're re-created while restoring a version.\n */\n const getComponentFields = (componentUID: UID.Component): string[] => {\n return Object.entries(strapi.getModel(componentUID).attributes).reduce<string[]>(\n (fieldsAcc, [key, attribute]) => {\n if (!['relation', 'media', 'component', 'dynamiczone'].includes(attribute.type)) {\n fieldsAcc.push(key);\n }\n\n return fieldsAcc;\n },\n []\n );\n };\n\n /**\n * @description\n * Creates a populate object that looks for all the relations that need\n * to be saved in history, and populates only the fields needed to later retrieve the content.\n *\n * @param uid - The content type UID\n * @param useDatabaseSyntax - Whether to use the database syntax for populate, defaults to false\n */\n const getDeepPopulate = (uid: UID.Schema, useDatabaseSyntax = false) => {\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n const fieldSelector = useDatabaseSyntax ? 'select' : 'fields';\n\n return attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n const isVisible = contentTypes.isVisibleAttribute(model, attributeName);\n if (isVisible) {\n acc[attributeName] = { [fieldSelector]: ['documentId', 'locale', 'publishedAt'] };\n }\n break;\n }\n\n case 'media': {\n acc[attributeName] = { [fieldSelector]: ['id'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component);\n acc[attributeName] = {\n populate,\n [fieldSelector]: getComponentFields(attribute.component),\n };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = {\n populate: getDeepPopulate(componentUID),\n [fieldSelector]: getComponentFields(componentUID),\n };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n };\n\n /**\n * @description\n * Builds a response object for relations containing the related data and a count of missing relations\n */\n const buildMediaResponse = async (values: { id: Data.ID }[]): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n\n const relatedEntry = await strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: entry.id } });\n\n if (relatedEntry) {\n currentRelationData.results.push(relatedEntry);\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n /**\n * @description\n * Builds a response object for media containing the media assets data and a count of missing media assets\n */\n const buildRelationReponse = async (\n values: {\n documentId: string;\n locale: string | null;\n }[],\n attributeSchema: Schema.Attribute.RelationWithTarget\n ): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n const relatedEntry = await strapi\n .documents(attributeSchema.target)\n .findOne({ documentId: entry.documentId, locale: entry.locale || undefined });\n\n if (relatedEntry) {\n currentRelationData.results.push({\n ...relatedEntry,\n status: await getVersionStatus(attributeSchema.target, relatedEntry),\n });\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n return {\n getSchemaAttributesDiff,\n getRelationRestoreValue,\n getMediaRestoreValue,\n getDefaultLocale,\n isLocalizedContentType,\n getLocaleDictionary,\n getRetentionDays,\n getVersionStatus,\n getDeepPopulate,\n buildMediaResponse,\n buildRelationReponse,\n };\n};\n"],"names":["DEFAULT_RETENTION_DAYS","computeRetentionDays","licenseRetentionDays","userRetentionDays","licenseDays","Number","Math","min","createServiceUtils","strapi","getSchemaAttributesDiff","versionSchemaAttributes","contentTypeSchemaAttributes","sanitizedContentTypeSchemaAttributes","omit","FIELDS_TO_IGNORE","reduceDifferenceToAttributesObject","diffKeys","source","reduce","previousAttributesObject","diffKey","versionSchemaKeys","Object","keys","contentTypeSchemaAttributesKeys","uniqueToContentType","difference","added","uniqueToVersion","removed","getRelationRestoreValue","versionRelationData","attribute","Array","isArray","length","existingAndMissingRelations","Promise","all","map","relation","documents","target","findOne","documentId","locale","undefined","filter","getMediaRestoreValue","existingAndMissingMedias","media","db","query","where","id","getDefaultLocale","localization","isLocalizedContentType","model","getLocaleDictionary","locales","getLocales","acc","code","name","getRetentionDays","featureConfig","ee","features","get","options","retentionDays","config","getVersionStatus","contentTypeUid","document","documentMetadataService","plugin","service","meta","getMetadata","getStatus","availableStatus","getComponentFields","componentUID","entries","getModel","attributes","fieldsAcc","key","includes","type","push","getDeepPopulate","uid","useDatabaseSyntax","fieldSelector","attributeName","isMorphRelation","toLowerCase","startsWith","isVisible","contentTypes","isVisibleAttribute","populate","component","populatedComponents","components","on","buildMediaResponse","values","slice","currentRelationDataPromise","entry","currentRelationData","relatedEntry","results","missingCount","resolve","buildRelationReponse","attributeSchema","status"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../server/src/history/services/utils.ts"],"sourcesContent":["import { difference, omit } from 'lodash';\n\nimport { contentTypes } from '@strapi/utils';\nimport type { Core, Modules, Schema, Data, Struct, UID } from '@strapi/types';\n\nimport { FIELDS_TO_IGNORE } from '../constants';\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type { RelationResult } from '../../../../shared/contracts/relations';\n\nexport const DEFAULT_RETENTION_DAYS = 90;\n\n/**\n * The retention the history delete job applies, from the license's value and the admin setting.\n * Shared with the Plan card's resolver (../entitlements.ts) so the card shows this same figure.\n */\nexport const computeRetentionDays = (\n licenseRetentionDays: unknown,\n userRetentionDays: number | null | undefined\n): number => {\n if (licenseRetentionDays == null) {\n return userRetentionDays ?? DEFAULT_RETENTION_DAYS;\n }\n\n // The registry can ship the value as a numeric string\n const licenseDays = Number(licenseRetentionDays);\n\n // Allow users to override the license retention days, but not to increase it\n if (userRetentionDays && userRetentionDays < licenseDays) {\n return userRetentionDays;\n }\n\n // User didn't provide retention days value, use the license or fallback to default\n return Math.min(licenseDays, DEFAULT_RETENTION_DAYS);\n};\n\ntype RelationResponse = {\n results: RelationResult[];\n meta: { missingCount: number };\n};\n\nexport const createServiceUtils = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * @description\n * Get the difference between the version schema and the content type schema\n */\n const getSchemaAttributesDiff = (\n versionSchemaAttributes: CreateHistoryVersion['schema'],\n contentTypeSchemaAttributes: Struct.SchemaAttributes\n ) => {\n // Omit the same fields that were omitted when creating a history version\n const sanitizedContentTypeSchemaAttributes = omit(\n contentTypeSchemaAttributes,\n FIELDS_TO_IGNORE\n );\n\n const reduceDifferenceToAttributesObject = (\n diffKeys: string[],\n source: CreateHistoryVersion['schema']\n ) => {\n return diffKeys.reduce<CreateHistoryVersion['schema']>(\n (previousAttributesObject, diffKey) => {\n previousAttributesObject[diffKey] = source[diffKey];\n\n return previousAttributesObject;\n },\n {}\n );\n };\n\n const versionSchemaKeys = Object.keys(versionSchemaAttributes);\n const contentTypeSchemaAttributesKeys = Object.keys(sanitizedContentTypeSchemaAttributes);\n // The attribute is new if it's on the content type schema but not on the version schema\n const uniqueToContentType = difference(contentTypeSchemaAttributesKeys, versionSchemaKeys);\n const added = reduceDifferenceToAttributesObject(\n uniqueToContentType,\n sanitizedContentTypeSchemaAttributes\n );\n // The attribute was removed or renamed if it's on the version schema but not on the content type schema\n const uniqueToVersion = difference(versionSchemaKeys, contentTypeSchemaAttributesKeys);\n const removed = reduceDifferenceToAttributesObject(uniqueToVersion, versionSchemaAttributes);\n\n return { added, removed };\n };\n\n /**\n * @description\n * Gets the value to set for a relation when restoring a document\n * @returns\n * The relation if it exists or null\n */\n const getRelationRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[],\n attribute: Schema.Attribute.RelationWithTarget\n ) => {\n if (Array.isArray(versionRelationData)) {\n if (versionRelationData.length === 0) return versionRelationData;\n\n const existingAndMissingRelations = await Promise.all(\n versionRelationData.map((relation) => {\n return strapi.documents(attribute.target).findOne({\n documentId: relation.documentId,\n locale: relation.locale || undefined,\n });\n })\n );\n\n return existingAndMissingRelations.filter((relation) => relation !== null);\n }\n\n return strapi.documents(attribute.target).findOne({\n documentId: versionRelationData.documentId,\n locale: versionRelationData.locale || undefined,\n });\n };\n\n /**\n * @description\n * Gets the value to set for a media asset when restoring a document\n * @returns\n * The media asset if it exists or null\n */\n const getMediaRestoreValue = async (\n versionRelationData: Modules.Documents.AnyDocument | Modules.Documents.AnyDocument[]\n ) => {\n if (Array.isArray(versionRelationData)) {\n const existingAndMissingMedias = await Promise.all(\n versionRelationData.map((media) => {\n return strapi.db.query('plugin::upload.file').findOne({ where: { id: media.id } });\n })\n );\n\n return existingAndMissingMedias.filter((media) => media != null);\n }\n\n return strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: versionRelationData.id } });\n };\n\n const getDefaultLocale = async () => strapi.localization.getDefaultLocale();\n\n const isLocalizedContentType = (model: Schema.ContentType) =>\n strapi.localization.isLocalizedContentType(model);\n\n /**\n *\n * @description\n * Creates a dictionary of all locales available\n */\n const getLocaleDictionary = async (): Promise<{\n [key: string]: { name: string; code: string };\n }> => {\n const locales = await strapi.localization.getLocales();\n\n return locales.reduce<\n Record<string, NonNullable<HistoryVersions.HistoryVersionDataResponse['locale']>>\n >((acc, locale) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n }, {});\n };\n\n /**\n *\n * @description\n * Gets the number of retention days defined on the license or configured by the user\n */\n const getRetentionDays = () => {\n const featureConfig = strapi.ee.features.get('cms-content-history');\n\n return computeRetentionDays(\n typeof featureConfig === 'object' ? featureConfig?.options?.retentionDays : undefined,\n strapi.config.get('admin.history.retentionDays')\n );\n };\n\n const getVersionStatus = async (\n contentTypeUid: HistoryVersions.CreateHistoryVersion['contentType'],\n document: Modules.Documents.AnyDocument | null\n ) => {\n const documentMetadataService = strapi.plugin('content-manager').service('document-metadata');\n const meta = await documentMetadataService.getMetadata(contentTypeUid, document, {\n availableLocales: false,\n });\n\n return documentMetadataService.getStatus(document, meta.availableStatus);\n };\n\n /**\n * Lists all the fields of a component, excepts those that will be populated.\n * The goal is to exclude the ID, because when restoring a component,\n * referencing an ID for a component db row that was deleted creates an error.\n * So we never store component IDs to ensure they're re-created while restoring a version.\n */\n const getComponentFields = (componentUID: UID.Component): string[] => {\n return Object.entries(strapi.getModel(componentUID).attributes).reduce<string[]>(\n (fieldsAcc, [key, attribute]) => {\n if (!['relation', 'media', 'component', 'dynamiczone'].includes(attribute.type)) {\n fieldsAcc.push(key);\n }\n\n return fieldsAcc;\n },\n []\n );\n };\n\n /**\n * @description\n * Creates a populate object that looks for all the relations that need\n * to be saved in history, and populates only the fields needed to later retrieve the content.\n *\n * @param uid - The content type UID\n * @param useDatabaseSyntax - Whether to use the database syntax for populate, defaults to false\n */\n const getDeepPopulate = (uid: UID.Schema, useDatabaseSyntax = false) => {\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n const fieldSelector = useDatabaseSyntax ? 'select' : 'fields';\n\n return attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n const isVisible = contentTypes.isVisibleAttribute(model, attributeName);\n if (isVisible) {\n acc[attributeName] = { [fieldSelector]: ['documentId', 'locale', 'publishedAt'] };\n }\n break;\n }\n\n case 'media': {\n acc[attributeName] = { [fieldSelector]: ['id'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component);\n acc[attributeName] = {\n populate,\n [fieldSelector]: getComponentFields(attribute.component),\n };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = {\n populate: getDeepPopulate(componentUID),\n [fieldSelector]: getComponentFields(componentUID),\n };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n };\n\n /**\n * @description\n * Builds a response object for relations containing the related data and a count of missing relations\n */\n const buildMediaResponse = async (values: { id: Data.ID }[]): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n\n const relatedEntry = await strapi.db\n .query('plugin::upload.file')\n .findOne({ where: { id: entry.id } });\n\n if (relatedEntry) {\n currentRelationData.results.push(relatedEntry);\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n /**\n * @description\n * Builds a response object for media containing the media assets data and a count of missing media assets\n */\n const buildRelationReponse = async (\n values: {\n documentId: string;\n locale: string | null;\n }[],\n attributeSchema: Schema.Attribute.RelationWithTarget\n ): Promise<RelationResponse> => {\n return (\n values\n // Until we implement proper pagination, limit relations to an arbitrary amount\n .slice(0, 25)\n .reduce(\n async (currentRelationDataPromise, entry) => {\n const currentRelationData = await currentRelationDataPromise;\n\n // Entry can be null if it's a toOne relation\n if (!entry) {\n return currentRelationData;\n }\n const relatedEntry = await strapi\n .documents(attributeSchema.target)\n .findOne({ documentId: entry.documentId, locale: entry.locale || undefined });\n\n if (relatedEntry) {\n currentRelationData.results.push({\n ...relatedEntry,\n status: await getVersionStatus(attributeSchema.target, relatedEntry),\n });\n } else {\n // The related content has been deleted\n currentRelationData.meta.missingCount += 1;\n }\n\n return currentRelationData;\n },\n Promise.resolve<RelationResponse>({\n results: [],\n meta: { missingCount: 0 },\n })\n )\n );\n };\n\n return {\n getSchemaAttributesDiff,\n getRelationRestoreValue,\n getMediaRestoreValue,\n getDefaultLocale,\n isLocalizedContentType,\n getLocaleDictionary,\n getRetentionDays,\n getVersionStatus,\n getDeepPopulate,\n buildMediaResponse,\n buildRelationReponse,\n };\n};\n"],"names":["DEFAULT_RETENTION_DAYS","computeRetentionDays","licenseRetentionDays","userRetentionDays","licenseDays","Number","Math","min","createServiceUtils","strapi","getSchemaAttributesDiff","versionSchemaAttributes","contentTypeSchemaAttributes","sanitizedContentTypeSchemaAttributes","omit","FIELDS_TO_IGNORE","reduceDifferenceToAttributesObject","diffKeys","source","reduce","previousAttributesObject","diffKey","versionSchemaKeys","Object","keys","contentTypeSchemaAttributesKeys","uniqueToContentType","difference","added","uniqueToVersion","removed","getRelationRestoreValue","versionRelationData","attribute","Array","isArray","length","existingAndMissingRelations","Promise","all","map","relation","documents","target","findOne","documentId","locale","undefined","filter","getMediaRestoreValue","existingAndMissingMedias","media","db","query","where","id","getDefaultLocale","localization","isLocalizedContentType","model","getLocaleDictionary","locales","getLocales","acc","code","name","getRetentionDays","featureConfig","ee","features","get","options","retentionDays","config","getVersionStatus","contentTypeUid","document","documentMetadataService","plugin","service","meta","getMetadata","availableLocales","getStatus","availableStatus","getComponentFields","componentUID","entries","getModel","attributes","fieldsAcc","key","includes","type","push","getDeepPopulate","uid","useDatabaseSyntax","fieldSelector","attributeName","isMorphRelation","toLowerCase","startsWith","isVisible","contentTypes","isVisibleAttribute","populate","component","populatedComponents","components","on","buildMediaResponse","values","slice","currentRelationDataPromise","entry","currentRelationData","relatedEntry","results","missingCount","resolve","buildRelationReponse","attributeSchema","status"],"mappings":"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"}
@@ -114,7 +114,9 @@ const createServiceUtils = ({ strapi })=>{
114
114
  };
115
115
  const getVersionStatus = async (contentTypeUid, document)=>{
116
116
  const documentMetadataService = strapi.plugin('content-manager').service('document-metadata');
117
- const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
117
+ const meta = await documentMetadataService.getMetadata(contentTypeUid, document, {
118
+ availableLocales: false
119
+ });
118
120
  return documentMetadataService.getStatus(document, meta.availableStatus);
119
121
  };
120
122
  /**