@strapi/content-manager 5.56.0 → 5.58.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 (220) hide show
  1. package/dist/admin/components/ConfigurationForm/Form.js +3 -3
  2. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Form.mjs +2 -2
  4. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
  5. package/dist/admin/components/RelativeTime.js +9 -0
  6. package/dist/admin/components/RelativeTime.js.map +1 -1
  7. package/dist/admin/components/RelativeTime.mjs +10 -1
  8. package/dist/admin/components/RelativeTime.mjs.map +1 -1
  9. package/dist/admin/features/DocumentRBAC.js +0 -3
  10. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  11. package/dist/admin/features/DocumentRBAC.mjs +1 -4
  12. package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
  13. package/dist/admin/history/components/VersionContent.js +3 -3
  14. package/dist/admin/history/components/VersionContent.js.map +1 -1
  15. package/dist/admin/history/components/VersionContent.mjs +2 -2
  16. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  17. package/dist/admin/history/pages/History.js +2 -1
  18. package/dist/admin/history/pages/History.js.map +1 -1
  19. package/dist/admin/history/pages/History.mjs +3 -2
  20. package/dist/admin/history/pages/History.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/EditViewPage.js +2 -2
  22. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  23. package/dist/admin/pages/EditView/EditViewPage.mjs +2 -2
  24. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/DocumentActions.js +37 -2
  26. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  27. package/dist/admin/pages/EditView/components/DocumentActions.mjs +37 -3
  28. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +1 -0
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +1 -0
  32. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +3 -3
  34. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +2 -2
  36. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +30 -2
  38. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +31 -4
  40. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +40 -8
  42. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +41 -9
  44. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/utils/data.js +3 -3
  46. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  47. package/dist/admin/pages/EditView/utils/data.mjs +2 -2
  48. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  49. package/dist/admin/pages/ListView/ListViewPage.js +4 -3
  50. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  51. package/dist/admin/pages/ListView/ListViewPage.mjs +4 -3
  52. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  53. package/dist/admin/preview/pages/Preview.js +2 -1
  54. package/dist/admin/preview/pages/Preview.js.map +1 -1
  55. package/dist/admin/preview/pages/Preview.mjs +3 -2
  56. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  57. package/dist/admin/services/documents.js +3 -2
  58. package/dist/admin/services/documents.js.map +1 -1
  59. package/dist/admin/services/documents.mjs +2 -2
  60. package/dist/admin/services/documents.mjs.map +1 -1
  61. package/dist/admin/services/relations.js +3 -0
  62. package/dist/admin/services/relations.js.map +1 -1
  63. package/dist/admin/services/relations.mjs +3 -0
  64. package/dist/admin/services/relations.mjs.map +1 -1
  65. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +2 -1
  66. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +19 -2
  67. package/dist/admin/src/services/documents.d.ts +10 -2
  68. package/dist/admin/translations/en.json.js +2 -0
  69. package/dist/admin/translations/en.json.js.map +1 -1
  70. package/dist/admin/translations/en.json.mjs +2 -0
  71. package/dist/admin/translations/en.json.mjs.map +1 -1
  72. package/dist/admin/utils/validation.js +3 -3
  73. package/dist/admin/utils/validation.js.map +1 -1
  74. package/dist/admin/utils/validation.mjs +2 -2
  75. package/dist/admin/utils/validation.mjs.map +1 -1
  76. package/dist/server/controllers/collection-types.js +4 -4
  77. package/dist/server/controllers/collection-types.js.map +1 -1
  78. package/dist/server/controllers/collection-types.mjs +4 -4
  79. package/dist/server/controllers/collection-types.mjs.map +1 -1
  80. package/dist/server/controllers/content-types.js +5 -7
  81. package/dist/server/controllers/content-types.js.map +1 -1
  82. package/dist/server/controllers/content-types.mjs +5 -7
  83. package/dist/server/controllers/content-types.mjs.map +1 -1
  84. package/dist/server/controllers/relations.js +19 -15
  85. package/dist/server/controllers/relations.js.map +1 -1
  86. package/dist/server/controllers/relations.mjs +17 -13
  87. package/dist/server/controllers/relations.mjs.map +1 -1
  88. package/dist/server/controllers/utils/clone.js +3 -4
  89. package/dist/server/controllers/utils/clone.js.map +1 -1
  90. package/dist/server/controllers/utils/clone.mjs +4 -5
  91. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  92. package/dist/server/controllers/validation/index.js +1 -1
  93. package/dist/server/controllers/validation/index.mjs +1 -1
  94. package/dist/server/history/controllers/history-version.js +3 -3
  95. package/dist/server/history/controllers/history-version.js.map +1 -1
  96. package/dist/server/history/controllers/history-version.mjs +3 -3
  97. package/dist/server/history/controllers/history-version.mjs.map +1 -1
  98. package/dist/server/history/entitlements.js +26 -0
  99. package/dist/server/history/entitlements.js.map +1 -0
  100. package/dist/server/history/entitlements.mjs +24 -0
  101. package/dist/server/history/entitlements.mjs.map +1 -0
  102. package/dist/server/history/index.js +3 -0
  103. package/dist/server/history/index.js.map +1 -1
  104. package/dist/server/history/index.mjs +3 -0
  105. package/dist/server/history/index.mjs.map +1 -1
  106. package/dist/server/history/services/history.js +4 -4
  107. package/dist/server/history/services/history.js.map +1 -1
  108. package/dist/server/history/services/history.mjs +4 -4
  109. package/dist/server/history/services/history.mjs.map +1 -1
  110. package/dist/server/history/services/lifecycles.js +8 -8
  111. package/dist/server/history/services/lifecycles.js.map +1 -1
  112. package/dist/server/history/services/lifecycles.mjs +3 -3
  113. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  114. package/dist/server/history/services/utils.js +26 -18
  115. package/dist/server/history/services/utils.js.map +1 -1
  116. package/dist/server/history/services/utils.mjs +23 -17
  117. package/dist/server/history/services/utils.mjs.map +1 -1
  118. package/dist/server/mcp/permissions.js +2 -2
  119. package/dist/server/mcp/permissions.js.map +1 -1
  120. package/dist/server/mcp/permissions.mjs +2 -2
  121. package/dist/server/mcp/permissions.mjs.map +1 -1
  122. package/dist/server/mcp/register-content-manager-mcp-tools.js +7 -5
  123. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
  124. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +7 -5
  125. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
  126. package/dist/server/preview/controllers/previewScript.js +30 -15
  127. package/dist/server/preview/controllers/validation/preview.js +3 -3
  128. package/dist/server/preview/controllers/validation/preview.js.map +1 -1
  129. package/dist/server/preview/controllers/validation/preview.mjs +3 -3
  130. package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
  131. package/dist/server/services/components.js +3 -3
  132. package/dist/server/services/components.js.map +1 -1
  133. package/dist/server/services/components.mjs +3 -3
  134. package/dist/server/services/components.mjs.map +1 -1
  135. package/dist/server/services/content-structure.js +2 -2
  136. package/dist/server/services/content-structure.js.map +1 -1
  137. package/dist/server/services/content-structure.mjs +2 -2
  138. package/dist/server/services/content-structure.mjs.map +1 -1
  139. package/dist/server/services/content-types.js +3 -3
  140. package/dist/server/services/content-types.js.map +1 -1
  141. package/dist/server/services/content-types.mjs +3 -3
  142. package/dist/server/services/content-types.mjs.map +1 -1
  143. package/dist/server/services/data-mapper.js +3 -3
  144. package/dist/server/services/data-mapper.js.map +1 -1
  145. package/dist/server/services/data-mapper.mjs +3 -3
  146. package/dist/server/services/data-mapper.mjs.map +1 -1
  147. package/dist/server/services/document-manager.js +6 -6
  148. package/dist/server/services/document-manager.js.map +1 -1
  149. package/dist/server/services/document-manager.mjs +6 -6
  150. package/dist/server/services/document-manager.mjs.map +1 -1
  151. package/dist/server/services/document-metadata.js +29 -31
  152. package/dist/server/services/document-metadata.js.map +1 -1
  153. package/dist/server/services/document-metadata.mjs +29 -31
  154. package/dist/server/services/document-metadata.mjs.map +1 -1
  155. package/dist/server/services/metrics.js +3 -3
  156. package/dist/server/services/metrics.js.map +1 -1
  157. package/dist/server/services/metrics.mjs +3 -3
  158. package/dist/server/services/metrics.mjs.map +1 -1
  159. package/dist/server/services/permission-checker.js +2 -2
  160. package/dist/server/services/permission-checker.js.map +1 -1
  161. package/dist/server/services/permission-checker.mjs +1 -1
  162. package/dist/server/services/permission-checker.mjs.map +1 -1
  163. package/dist/server/services/permission.js +2 -3
  164. package/dist/server/services/permission.js.map +1 -1
  165. package/dist/server/services/permission.mjs +2 -3
  166. package/dist/server/services/permission.mjs.map +1 -1
  167. package/dist/server/services/populate-builder.js +4 -4
  168. package/dist/server/services/populate-builder.js.map +1 -1
  169. package/dist/server/services/populate-builder.mjs +4 -4
  170. package/dist/server/services/populate-builder.mjs.map +1 -1
  171. package/dist/server/services/utils/configuration/attributes.js +1 -2
  172. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  173. package/dist/server/services/utils/configuration/attributes.mjs +2 -3
  174. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  175. package/dist/server/services/utils/configuration/settings.js +4 -7
  176. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  177. package/dist/server/services/utils/configuration/settings.mjs +2 -5
  178. package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
  179. package/dist/server/services/utils/draft.js +8 -7
  180. package/dist/server/services/utils/draft.js.map +1 -1
  181. package/dist/server/services/utils/draft.mjs +6 -5
  182. package/dist/server/services/utils/draft.mjs.map +1 -1
  183. package/dist/server/services/utils/populate.js +10 -11
  184. package/dist/server/services/utils/populate.js.map +1 -1
  185. package/dist/server/services/utils/populate.mjs +9 -10
  186. package/dist/server/services/utils/populate.mjs.map +1 -1
  187. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  188. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  189. package/dist/server/src/history/entitlements.d.ts +9 -0
  190. package/dist/server/src/history/entitlements.d.ts.map +1 -0
  191. package/dist/server/src/history/index.d.ts.map +1 -1
  192. package/dist/server/src/history/services/utils.d.ts +8 -2
  193. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  194. package/dist/server/src/index.d.ts +1 -1
  195. package/dist/server/src/index.d.ts.map +1 -1
  196. package/dist/server/src/mcp/permissions.d.ts +1 -1
  197. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  198. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +3 -1
  199. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  200. package/dist/server/src/mcp/types.d.ts +2 -2
  201. package/dist/server/src/services/content-types.d.ts.map +1 -1
  202. package/dist/server/src/services/data-mapper.d.ts +1 -1
  203. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  204. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  205. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  206. package/dist/server/src/services/index.d.ts +1 -1
  207. package/dist/server/src/services/index.d.ts.map +1 -1
  208. package/dist/server/src/services/metrics.d.ts.map +1 -1
  209. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  210. package/dist/server/src/services/permission.d.ts.map +1 -1
  211. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  212. package/dist/server/src/services/utils/configuration/index.d.ts +10 -1
  213. package/dist/server/src/services/utils/configuration/index.d.ts.map +1 -1
  214. package/dist/server/src/services/utils/configuration/settings.d.ts +10 -1
  215. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  216. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  217. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  218. package/dist/shared/contracts/relations.d.ts +1 -0
  219. package/dist/shared/contracts/relations.d.ts.map +1 -1
  220. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"history-version.js","sources":["../../../../server/src/history/controllers/history-version.ts"],"sourcesContent":["import { async, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport { pick } from 'lodash/fp';\nimport { getService as getContentManagerService } from '../../utils';\nimport { getService } from '../utils';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport { validateRestoreVersion } from './validation/history-version';\n\n/**\n * Parses pagination params and makes sure they're within valid ranges\n */\nconst getValidPagination = ({ page, pageSize }: { page: any; pageSize: any }) => {\n let pageNumber = 1;\n let pageSizeNumber = 20;\n\n if (page) {\n const parsedPage = parseInt(page, 10);\n pageNumber = parseInt(page, 10);\n\n if (!Number.isNaN(parsedPage) && parsedPage >= 1) {\n pageNumber = parsedPage;\n }\n }\n\n if (pageSize) {\n const parsedPageSize = parseInt(pageSize, 10);\n\n if (!Number.isNaN(parsedPageSize) && parsedPageSize >= 1 && parsedPageSize <= 100) {\n pageSizeNumber = parsedPageSize;\n }\n }\n\n return { page: pageNumber, pageSize: pageSizeNumber };\n};\n\nconst createHistoryVersionController = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findMany(ctx) {\n const contentTypeUid = ctx.query.contentType as UID.ContentType;\n const isSingleType = strapi.getModel(contentTypeUid)?.kind === 'singleType';\n\n if (isSingleType && !contentTypeUid) {\n throw new errors.ForbiddenError('contentType is required');\n }\n\n if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {\n throw new errors.ForbiddenError('contentType and documentId are required');\n }\n\n /**\n * There are no permissions specifically for history versions,\n * but we need to check that the user can read the content type\n */\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: ctx.query.contentType,\n });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const query: HistoryVersions.GetHistoryVersions.Request['query'] =\n await permissionChecker.sanitizeQuery(ctx.query);\n\n const { results, pagination } = await getService(strapi, 'history').findVersionsPage({\n query: {\n ...query,\n ...getValidPagination({ page: query.page, pageSize: query.pageSize }),\n },\n state: { userAbility: ctx.state.userAbility },\n });\n\n const sanitizedResults = await async.map(\n results,\n async (version: HistoryVersions.HistoryVersionDataResponse & { locale: string }) => {\n return {\n ...version,\n data: await permissionChecker.sanitizeOutput(version.data),\n createdBy: version.createdBy\n ? pick(['id', 'firstname', 'lastname', 'username', 'email'], version.createdBy)\n : undefined,\n };\n }\n );\n\n return {\n data: sanitizedResults,\n meta: { pagination },\n };\n },\n\n async restoreVersion(ctx) {\n const request = ctx.request as unknown as HistoryVersions.RestoreHistoryVersion.Request;\n\n await validateRestoreVersion(request.body, 'contentType is required');\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: request.body.contentType,\n });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const restoredDocument = await getService(strapi, 'history').restoreVersion(\n request.params.versionId\n );\n\n return {\n data: { documentId: restoredDocument.documentId },\n } satisfies HistoryVersions.RestoreHistoryVersion.Response;\n },\n } satisfies Core.Controller;\n};\n\nexport { createHistoryVersionController };\n"],"names":["getValidPagination","page","pageSize","pageNumber","pageSizeNumber","parsedPage","parseInt","Number","isNaN","parsedPageSize","createHistoryVersionController","strapi","findMany","ctx","contentTypeUid","query","contentType","isSingleType","getModel","kind","errors","ForbiddenError","documentId","permissionChecker","getContentManagerService","create","userAbility","state","model","cannot","read","forbidden","sanitizeQuery","results","pagination","getService","findVersionsPage","sanitizedResults","async","map","version","data","sanitizeOutput","createdBy","pick","undefined","meta","restoreVersion","request","validateRestoreVersion","body","update","restoredDocument","params","versionId"],"mappings":";;;;;;;;AAQA;;AAEC,IACD,MAAMA,kBAAAA,GAAqB,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAgC,GAAA;AAC1E,IAAA,IAAIC,UAAAA,GAAa,CAAA;AACjB,IAAA,IAAIC,cAAAA,GAAiB,EAAA;AAErB,IAAA,IAAIH,IAAAA,EAAM;QACR,MAAMI,UAAAA,GAAaC,SAASL,IAAAA,EAAM,EAAA,CAAA;AAClCE,QAAAA,UAAAA,GAAaG,SAASL,IAAAA,EAAM,EAAA,CAAA;AAE5B,QAAA,IAAI,CAACM,MAAAA,CAAOC,KAAK,CAACH,UAAAA,CAAAA,IAAeA,cAAc,CAAA,EAAG;YAChDF,UAAAA,GAAaE,UAAAA;AACf,QAAA;AACF,IAAA;AAEA,IAAA,IAAIH,QAAAA,EAAU;QACZ,MAAMO,cAAAA,GAAiBH,SAASJ,QAAAA,EAAU,EAAA,CAAA;QAE1C,IAAI,CAACK,OAAOC,KAAK,CAACC,mBAAmBA,cAAAA,IAAkB,CAAA,IAAKA,kBAAkB,GAAA,EAAK;YACjFL,cAAAA,GAAiBK,cAAAA;AACnB,QAAA;AACF,IAAA;IAEA,OAAO;QAAER,IAAAA,EAAME,UAAAA;QAAYD,QAAAA,EAAUE;AAAe,KAAA;AACtD,CAAA;AAEA,MAAMM,8BAAAA,GAAiC,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACzE,OAAO;AACL,QAAA,MAAMC,UAASC,GAAG,EAAA;AAChB,YAAA,MAAMC,cAAAA,GAAiBD,GAAAA,CAAIE,KAAK,CAACC,WAAW;AAC5C,YAAA,MAAMC,YAAAA,GAAeN,MAAAA,CAAOO,QAAQ,CAACJ,iBAAiBK,IAAAA,KAAS,YAAA;YAE/D,IAAIF,YAAAA,IAAgB,CAACH,cAAAA,EAAgB;gBACnC,MAAM,IAAIM,kBAAAA,CAAOC,cAAc,CAAC,yBAAA,CAAA;AAClC,YAAA;YAEA,IAAI,CAACJ,YAAAA,KAAiB,CAACH,cAAAA,IAAkB,CAACD,GAAAA,CAAIE,KAAK,CAACO,UAAS,CAAA,EAAI;gBAC/D,MAAM,IAAIF,kBAAAA,CAAOC,cAAc,CAAC,yCAAA,CAAA;AAClC,YAAA;AAEA;;;AAGC,UACD,MAAME,iBAAAA,GAAoBC,gBAAAA,CAAyB,oBAAA,CAAA,CAAsBC,MAAM,CAAC;gBAC9EC,WAAAA,EAAab,GAAAA,CAAIc,KAAK,CAACD,WAAW;gBAClCE,KAAAA,EAAOf,GAAAA,CAAIE,KAAK,CAACC;AACnB,aAAA,CAAA;AAEA,YAAA,IAAIO,iBAAAA,CAAkBM,MAAM,CAACC,IAAI,EAAA,EAAI;AACnC,gBAAA,OAAOjB,IAAIkB,SAAS,EAAA;AACtB,YAAA;AAEA,YAAA,MAAMhB,QACJ,MAAMQ,iBAAAA,CAAkBS,aAAa,CAACnB,IAAIE,KAAK,CAAA;YAEjD,MAAM,EAAEkB,OAAO,EAAEC,UAAU,EAAE,GAAG,MAAMC,gBAAAA,CAAWxB,MAAAA,EAAQ,SAAA,CAAA,CAAWyB,gBAAgB,CAAC;gBACnFrB,KAAAA,EAAO;AACL,oBAAA,GAAGA,KAAK;AACR,oBAAA,GAAGf,kBAAAA,CAAmB;AAAEC,wBAAAA,IAAAA,EAAMc,MAAMd,IAAI;AAAEC,wBAAAA,QAAAA,EAAUa,MAAMb;qBAAS;AACrE,iBAAA;gBACAyB,KAAAA,EAAO;oBAAED,WAAAA,EAAab,GAAAA,CAAIc,KAAK,CAACD;AAAY;AAC9C,aAAA,CAAA;AAEA,YAAA,MAAMW,mBAAmB,MAAMC,iBAAAA,CAAMC,GAAG,CACtCN,SACA,OAAOO,OAAAA,GAAAA;gBACL,OAAO;AACL,oBAAA,GAAGA,OAAO;AACVC,oBAAAA,IAAAA,EAAM,MAAMlB,iBAAAA,CAAkBmB,cAAc,CAACF,QAAQC,IAAI,CAAA;oBACzDE,SAAAA,EAAWH,OAAAA,CAAQG,SAAS,GACxBC,OAAAA,CAAK;AAAC,wBAAA,IAAA;AAAM,wBAAA,WAAA;AAAa,wBAAA,UAAA;AAAY,wBAAA,UAAA;AAAY,wBAAA;qBAAQ,EAAEJ,OAAAA,CAAQG,SAAS,CAAA,GAC5EE;AACN,iBAAA;AACF,YAAA,CAAA,CAAA;YAGF,OAAO;gBACLJ,IAAAA,EAAMJ,gBAAAA;gBACNS,IAAAA,EAAM;AAAEZ,oBAAAA;AAAW;AACrB,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMa,gBAAelC,GAAG,EAAA;YACtB,MAAMmC,OAAAA,GAAUnC,IAAImC,OAAO;YAE3B,MAAMC,qCAAAA,CAAuBD,OAAAA,CAAQE,IAAI,EAAE,yBAAA,CAAA;AAE3C,YAAA,MAAM3B,iBAAAA,GAAoBC,gBAAAA,CAAyB,oBAAA,CAAA,CAAsBC,MAAM,CAAC;gBAC9EC,WAAAA,EAAab,GAAAA,CAAIc,KAAK,CAACD,WAAW;gBAClCE,KAAAA,EAAOoB,OAAAA,CAAQE,IAAI,CAAClC;AACtB,aAAA,CAAA;AAEA,YAAA,IAAIO,iBAAAA,CAAkBM,MAAM,CAACsB,MAAM,EAAA,EAAI;gBACrC,MAAM,IAAI/B,mBAAOC,cAAc,EAAA;AACjC,YAAA;YAEA,MAAM+B,gBAAAA,GAAmB,MAAMjB,gBAAAA,CAAWxB,MAAAA,EAAQ,SAAA,CAAA,CAAWoC,cAAc,CACzEC,OAAAA,CAAQK,MAAM,CAACC,SAAS,CAAA;YAG1B,OAAO;gBACLb,IAAAA,EAAM;AAAEnB,oBAAAA,UAAAA,EAAY8B,iBAAiB9B;AAAW;AAClD,aAAA;AACF,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"history-version.js","sources":["../../../../server/src/history/controllers/history-version.ts"],"sourcesContent":["import { async, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport { pick } from 'lodash';\n\nimport { getService as getContentManagerService } from '../../utils';\nimport { getService } from '../utils';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport { validateRestoreVersion } from './validation/history-version';\n\n/**\n * Parses pagination params and makes sure they're within valid ranges\n */\nconst getValidPagination = ({ page, pageSize }: { page: any; pageSize: any }) => {\n let pageNumber = 1;\n let pageSizeNumber = 20;\n\n if (page) {\n const parsedPage = parseInt(page, 10);\n pageNumber = parseInt(page, 10);\n\n if (!Number.isNaN(parsedPage) && parsedPage >= 1) {\n pageNumber = parsedPage;\n }\n }\n\n if (pageSize) {\n const parsedPageSize = parseInt(pageSize, 10);\n\n if (!Number.isNaN(parsedPageSize) && parsedPageSize >= 1 && parsedPageSize <= 100) {\n pageSizeNumber = parsedPageSize;\n }\n }\n\n return { page: pageNumber, pageSize: pageSizeNumber };\n};\n\nconst createHistoryVersionController = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findMany(ctx) {\n const contentTypeUid = ctx.query.contentType as UID.ContentType;\n const isSingleType = strapi.getModel(contentTypeUid)?.kind === 'singleType';\n\n if (isSingleType && !contentTypeUid) {\n throw new errors.ForbiddenError('contentType is required');\n }\n\n if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {\n throw new errors.ForbiddenError('contentType and documentId are required');\n }\n\n /**\n * There are no permissions specifically for history versions,\n * but we need to check that the user can read the content type\n */\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: ctx.query.contentType,\n });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const query: HistoryVersions.GetHistoryVersions.Request['query'] =\n await permissionChecker.sanitizeQuery(ctx.query);\n\n const { results, pagination } = await getService(strapi, 'history').findVersionsPage({\n query: {\n ...query,\n ...getValidPagination({ page: query.page, pageSize: query.pageSize }),\n },\n state: { userAbility: ctx.state.userAbility },\n });\n\n const sanitizedResults = await async.map(\n results,\n async (version: HistoryVersions.HistoryVersionDataResponse & { locale: string }) => {\n return {\n ...version,\n data: await permissionChecker.sanitizeOutput(version.data),\n createdBy: version.createdBy\n ? pick(version.createdBy, ['id', 'firstname', 'lastname', 'username', 'email'])\n : undefined,\n };\n }\n );\n\n return {\n data: sanitizedResults,\n meta: { pagination },\n };\n },\n\n async restoreVersion(ctx) {\n const request = ctx.request as unknown as HistoryVersions.RestoreHistoryVersion.Request;\n\n await validateRestoreVersion(request.body, 'contentType is required');\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: request.body.contentType,\n });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const restoredDocument = await getService(strapi, 'history').restoreVersion(\n request.params.versionId\n );\n\n return {\n data: { documentId: restoredDocument.documentId },\n } satisfies HistoryVersions.RestoreHistoryVersion.Response;\n },\n } satisfies Core.Controller;\n};\n\nexport { createHistoryVersionController };\n"],"names":["getValidPagination","page","pageSize","pageNumber","pageSizeNumber","parsedPage","parseInt","Number","isNaN","parsedPageSize","createHistoryVersionController","strapi","findMany","ctx","contentTypeUid","query","contentType","isSingleType","getModel","kind","errors","ForbiddenError","documentId","permissionChecker","getContentManagerService","create","userAbility","state","model","cannot","read","forbidden","sanitizeQuery","results","pagination","getService","findVersionsPage","sanitizedResults","async","map","version","data","sanitizeOutput","createdBy","pick","undefined","meta","restoreVersion","request","validateRestoreVersion","body","update","restoredDocument","params","versionId"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { errors, async } from '@strapi/utils';
2
- import { pick } from 'lodash/fp';
2
+ import { pick } from 'lodash';
3
3
  import { getService } from '../../utils/index.mjs';
4
4
  import { getService as getService$1 } from '../utils.mjs';
5
5
  import { validateRestoreVersion } from './validation/history-version.mjs';
@@ -65,13 +65,13 @@ const createHistoryVersionController = ({ strapi })=>{
65
65
  return {
66
66
  ...version,
67
67
  data: await permissionChecker.sanitizeOutput(version.data),
68
- createdBy: version.createdBy ? pick([
68
+ createdBy: version.createdBy ? pick(version.createdBy, [
69
69
  'id',
70
70
  'firstname',
71
71
  'lastname',
72
72
  'username',
73
73
  'email'
74
- ], version.createdBy) : undefined
74
+ ]) : undefined
75
75
  };
76
76
  });
77
77
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"history-version.mjs","sources":["../../../../server/src/history/controllers/history-version.ts"],"sourcesContent":["import { async, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport { pick } from 'lodash/fp';\nimport { getService as getContentManagerService } from '../../utils';\nimport { getService } from '../utils';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport { validateRestoreVersion } from './validation/history-version';\n\n/**\n * Parses pagination params and makes sure they're within valid ranges\n */\nconst getValidPagination = ({ page, pageSize }: { page: any; pageSize: any }) => {\n let pageNumber = 1;\n let pageSizeNumber = 20;\n\n if (page) {\n const parsedPage = parseInt(page, 10);\n pageNumber = parseInt(page, 10);\n\n if (!Number.isNaN(parsedPage) && parsedPage >= 1) {\n pageNumber = parsedPage;\n }\n }\n\n if (pageSize) {\n const parsedPageSize = parseInt(pageSize, 10);\n\n if (!Number.isNaN(parsedPageSize) && parsedPageSize >= 1 && parsedPageSize <= 100) {\n pageSizeNumber = parsedPageSize;\n }\n }\n\n return { page: pageNumber, pageSize: pageSizeNumber };\n};\n\nconst createHistoryVersionController = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findMany(ctx) {\n const contentTypeUid = ctx.query.contentType as UID.ContentType;\n const isSingleType = strapi.getModel(contentTypeUid)?.kind === 'singleType';\n\n if (isSingleType && !contentTypeUid) {\n throw new errors.ForbiddenError('contentType is required');\n }\n\n if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {\n throw new errors.ForbiddenError('contentType and documentId are required');\n }\n\n /**\n * There are no permissions specifically for history versions,\n * but we need to check that the user can read the content type\n */\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: ctx.query.contentType,\n });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const query: HistoryVersions.GetHistoryVersions.Request['query'] =\n await permissionChecker.sanitizeQuery(ctx.query);\n\n const { results, pagination } = await getService(strapi, 'history').findVersionsPage({\n query: {\n ...query,\n ...getValidPagination({ page: query.page, pageSize: query.pageSize }),\n },\n state: { userAbility: ctx.state.userAbility },\n });\n\n const sanitizedResults = await async.map(\n results,\n async (version: HistoryVersions.HistoryVersionDataResponse & { locale: string }) => {\n return {\n ...version,\n data: await permissionChecker.sanitizeOutput(version.data),\n createdBy: version.createdBy\n ? pick(['id', 'firstname', 'lastname', 'username', 'email'], version.createdBy)\n : undefined,\n };\n }\n );\n\n return {\n data: sanitizedResults,\n meta: { pagination },\n };\n },\n\n async restoreVersion(ctx) {\n const request = ctx.request as unknown as HistoryVersions.RestoreHistoryVersion.Request;\n\n await validateRestoreVersion(request.body, 'contentType is required');\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: request.body.contentType,\n });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const restoredDocument = await getService(strapi, 'history').restoreVersion(\n request.params.versionId\n );\n\n return {\n data: { documentId: restoredDocument.documentId },\n } satisfies HistoryVersions.RestoreHistoryVersion.Response;\n },\n } satisfies Core.Controller;\n};\n\nexport { createHistoryVersionController };\n"],"names":["getValidPagination","page","pageSize","pageNumber","pageSizeNumber","parsedPage","parseInt","Number","isNaN","parsedPageSize","createHistoryVersionController","strapi","findMany","ctx","contentTypeUid","query","contentType","isSingleType","getModel","kind","errors","ForbiddenError","documentId","permissionChecker","getContentManagerService","create","userAbility","state","model","cannot","read","forbidden","sanitizeQuery","results","pagination","getService","findVersionsPage","sanitizedResults","async","map","version","data","sanitizeOutput","createdBy","pick","undefined","meta","restoreVersion","request","validateRestoreVersion","body","update","restoredDocument","params","versionId"],"mappings":"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"}
1
+ {"version":3,"file":"history-version.mjs","sources":["../../../../server/src/history/controllers/history-version.ts"],"sourcesContent":["import { async, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport { pick } from 'lodash';\n\nimport { getService as getContentManagerService } from '../../utils';\nimport { getService } from '../utils';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport { validateRestoreVersion } from './validation/history-version';\n\n/**\n * Parses pagination params and makes sure they're within valid ranges\n */\nconst getValidPagination = ({ page, pageSize }: { page: any; pageSize: any }) => {\n let pageNumber = 1;\n let pageSizeNumber = 20;\n\n if (page) {\n const parsedPage = parseInt(page, 10);\n pageNumber = parseInt(page, 10);\n\n if (!Number.isNaN(parsedPage) && parsedPage >= 1) {\n pageNumber = parsedPage;\n }\n }\n\n if (pageSize) {\n const parsedPageSize = parseInt(pageSize, 10);\n\n if (!Number.isNaN(parsedPageSize) && parsedPageSize >= 1 && parsedPageSize <= 100) {\n pageSizeNumber = parsedPageSize;\n }\n }\n\n return { page: pageNumber, pageSize: pageSizeNumber };\n};\n\nconst createHistoryVersionController = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findMany(ctx) {\n const contentTypeUid = ctx.query.contentType as UID.ContentType;\n const isSingleType = strapi.getModel(contentTypeUid)?.kind === 'singleType';\n\n if (isSingleType && !contentTypeUid) {\n throw new errors.ForbiddenError('contentType is required');\n }\n\n if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {\n throw new errors.ForbiddenError('contentType and documentId are required');\n }\n\n /**\n * There are no permissions specifically for history versions,\n * but we need to check that the user can read the content type\n */\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: ctx.query.contentType,\n });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const query: HistoryVersions.GetHistoryVersions.Request['query'] =\n await permissionChecker.sanitizeQuery(ctx.query);\n\n const { results, pagination } = await getService(strapi, 'history').findVersionsPage({\n query: {\n ...query,\n ...getValidPagination({ page: query.page, pageSize: query.pageSize }),\n },\n state: { userAbility: ctx.state.userAbility },\n });\n\n const sanitizedResults = await async.map(\n results,\n async (version: HistoryVersions.HistoryVersionDataResponse & { locale: string }) => {\n return {\n ...version,\n data: await permissionChecker.sanitizeOutput(version.data),\n createdBy: version.createdBy\n ? pick(version.createdBy, ['id', 'firstname', 'lastname', 'username', 'email'])\n : undefined,\n };\n }\n );\n\n return {\n data: sanitizedResults,\n meta: { pagination },\n };\n },\n\n async restoreVersion(ctx) {\n const request = ctx.request as unknown as HistoryVersions.RestoreHistoryVersion.Request;\n\n await validateRestoreVersion(request.body, 'contentType is required');\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: request.body.contentType,\n });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const restoredDocument = await getService(strapi, 'history').restoreVersion(\n request.params.versionId\n );\n\n return {\n data: { documentId: restoredDocument.documentId },\n } satisfies HistoryVersions.RestoreHistoryVersion.Response;\n },\n } satisfies Core.Controller;\n};\n\nexport { createHistoryVersionController };\n"],"names":["getValidPagination","page","pageSize","pageNumber","pageSizeNumber","parsedPage","parseInt","Number","isNaN","parsedPageSize","createHistoryVersionController","strapi","findMany","ctx","contentTypeUid","query","contentType","isSingleType","getModel","kind","errors","ForbiddenError","documentId","permissionChecker","getContentManagerService","create","userAbility","state","model","cannot","read","forbidden","sanitizeQuery","results","pagination","getService","findVersionsPage","sanitizedResults","async","map","version","data","sanitizeOutput","createdBy","pick","undefined","meta","restoreVersion","request","validateRestoreVersion","body","update","restoredDocument","params","versionId"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var utils = require('./services/utils.js');
4
+
5
+ /**
6
+ * Reports the history retention the delete job uses for the Plan card and the debug dump. That
7
+ * caps an unconfigured instance at the default even when the license allows far more, so the
8
+ * card never promises retention the job does not keep. Registered whatever the boot-time license
9
+ * says, so a lapsed or later-renewed license still resolves.
10
+ */ const registerHistoryEntitlements = (strapi)=>{
11
+ strapi.ee.entitlements.register({
12
+ feature: 'cms-content-history',
13
+ limits: [
14
+ {
15
+ key: 'retentionDays',
16
+ unit: 'days',
17
+ get (feature) {
18
+ return utils.computeRetentionDays(typeof feature === 'object' ? feature.options?.retentionDays : undefined, strapi.config.get('admin.history.retentionDays'));
19
+ }
20
+ }
21
+ ]
22
+ });
23
+ };
24
+
25
+ exports.registerHistoryEntitlements = registerHistoryEntitlements;
26
+ //# sourceMappingURL=entitlements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlements.js","sources":["../../../server/src/history/entitlements.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { computeRetentionDays } from './services/utils';\n\n/**\n * Reports the history retention the delete job uses for the Plan card and the debug dump. That\n * caps an unconfigured instance at the default even when the license allows far more, so the\n * card never promises retention the job does not keep. Registered whatever the boot-time license\n * says, so a lapsed or later-renewed license still resolves.\n */\nexport const registerHistoryEntitlements = (strapi: Core.Strapi) => {\n strapi.ee.entitlements.register({\n feature: 'cms-content-history',\n limits: [\n {\n key: 'retentionDays',\n unit: 'days',\n get(feature) {\n return computeRetentionDays(\n typeof feature === 'object' ? feature.options?.retentionDays : undefined,\n strapi.config.get('admin.history.retentionDays')\n );\n },\n },\n ],\n });\n};\n"],"names":["registerHistoryEntitlements","strapi","ee","entitlements","register","feature","limits","key","unit","get","computeRetentionDays","options","retentionDays","undefined","config"],"mappings":";;;;AAIA;;;;;IAMO,MAAMA,2BAAAA,GAA8B,CAACC,MAAAA,GAAAA;AAC1CA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,YAAY,CAACC,QAAQ,CAAC;QAC9BC,OAAAA,EAAS,qBAAA;QACTC,MAAAA,EAAQ;AACN,YAAA;gBACEC,GAAAA,EAAK,eAAA;gBACLC,IAAAA,EAAM,MAAA;AACNC,gBAAAA,GAAAA,CAAAA,CAAIJ,OAAO,EAAA;AACT,oBAAA,OAAOK,0BAAAA,CACL,OAAOL,OAAAA,KAAY,QAAA,GAAWA,OAAAA,CAAQM,OAAO,EAAEC,aAAAA,GAAgBC,SAAAA,EAC/DZ,MAAAA,CAAOa,MAAM,CAACL,GAAG,CAAC,6BAAA,CAAA,CAAA;AAEtB,gBAAA;AACF;AACD;AACH,KAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,24 @@
1
+ import { computeRetentionDays } from './services/utils.mjs';
2
+
3
+ /**
4
+ * Reports the history retention the delete job uses for the Plan card and the debug dump. That
5
+ * caps an unconfigured instance at the default even when the license allows far more, so the
6
+ * card never promises retention the job does not keep. Registered whatever the boot-time license
7
+ * says, so a lapsed or later-renewed license still resolves.
8
+ */ const registerHistoryEntitlements = (strapi)=>{
9
+ strapi.ee.entitlements.register({
10
+ feature: 'cms-content-history',
11
+ limits: [
12
+ {
13
+ key: 'retentionDays',
14
+ unit: 'days',
15
+ get (feature) {
16
+ return computeRetentionDays(typeof feature === 'object' ? feature.options?.retentionDays : undefined, strapi.config.get('admin.history.retentionDays'));
17
+ }
18
+ }
19
+ ]
20
+ });
21
+ };
22
+
23
+ export { registerHistoryEntitlements };
24
+ //# sourceMappingURL=entitlements.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlements.mjs","sources":["../../../server/src/history/entitlements.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { computeRetentionDays } from './services/utils';\n\n/**\n * Reports the history retention the delete job uses for the Plan card and the debug dump. That\n * caps an unconfigured instance at the default even when the license allows far more, so the\n * card never promises retention the job does not keep. Registered whatever the boot-time license\n * says, so a lapsed or later-renewed license still resolves.\n */\nexport const registerHistoryEntitlements = (strapi: Core.Strapi) => {\n strapi.ee.entitlements.register({\n feature: 'cms-content-history',\n limits: [\n {\n key: 'retentionDays',\n unit: 'days',\n get(feature) {\n return computeRetentionDays(\n typeof feature === 'object' ? feature.options?.retentionDays : undefined,\n strapi.config.get('admin.history.retentionDays')\n );\n },\n },\n ],\n });\n};\n"],"names":["registerHistoryEntitlements","strapi","ee","entitlements","register","feature","limits","key","unit","get","computeRetentionDays","options","retentionDays","undefined","config"],"mappings":";;AAIA;;;;;IAMO,MAAMA,2BAAAA,GAA8B,CAACC,MAAAA,GAAAA;AAC1CA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,YAAY,CAACC,QAAQ,CAAC;QAC9BC,OAAAA,EAAS,qBAAA;QACTC,MAAAA,EAAQ;AACN,YAAA;gBACEC,GAAAA,EAAK,eAAA;gBACLC,IAAAA,EAAM,MAAA;AACNC,gBAAAA,GAAAA,CAAAA,CAAIJ,OAAO,EAAA;AACT,oBAAA,OAAOK,oBAAAA,CACL,OAAOL,OAAAA,KAAY,QAAA,GAAWA,OAAAA,CAAQM,OAAO,EAAEC,aAAAA,GAAgBC,SAAAA,EAC/DZ,MAAAA,CAAOa,MAAM,CAACL,GAAG,CAAC,6BAAA,CAAA,CAAA;AAEtB,gBAAA;AACF;AACD;AACH,KAAA,CAAA;AACF;;;;"}
@@ -5,6 +5,7 @@ var index$1 = require('./services/index.js');
5
5
  var index = require('./routes/index.js');
6
6
  var utils = require('./utils.js');
7
7
  var historyVersion = require('./models/history-version.js');
8
+ var entitlements = require('./entitlements.js');
8
9
 
9
10
  /**
10
11
  * Check once if the feature is enabled before loading it,
@@ -14,6 +15,7 @@ var historyVersion = require('./models/history-version.js');
14
15
  return {
15
16
  register ({ strapi: strapi1 }) {
16
17
  strapi1.get('models').add(historyVersion.historyVersion);
18
+ entitlements.registerHistoryEntitlements(strapi1);
17
19
  },
18
20
  bootstrap ({ strapi: strapi1 }) {
19
21
  // Start recording history and saving history versions
@@ -33,6 +35,7 @@ var historyVersion = require('./models/history-version.js');
33
35
  */ return {
34
36
  register ({ strapi: strapi1 }) {
35
37
  strapi1.get('models').add(historyVersion.historyVersion);
38
+ entitlements.registerHistoryEntitlements(strapi1);
36
39
  }
37
40
  };
38
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../server/src/history/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { controllers } from './controllers';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { getService } from './utils';\nimport { historyVersion } from './models/history-version';\n\n/**\n * Check once if the feature is enabled before loading it,\n * so that we can assume it is enabled in the other files.\n */\nconst getFeature = (): Partial<Plugin.LoadedPlugin> => {\n if (strapi.ee.features.isEnabled('cms-content-history')) {\n return {\n register({ strapi }) {\n strapi.get('models').add(historyVersion);\n },\n bootstrap({ strapi }) {\n // Start recording history and saving history versions\n getService(strapi, 'lifecycles').bootstrap();\n },\n destroy({ strapi }) {\n getService(strapi, 'lifecycles').destroy();\n },\n controllers,\n services,\n routes,\n };\n }\n\n /**\n * Keep registering the model to avoid losing the data if the feature is disabled,\n * or if the license expires.\n */\n return {\n register({ strapi }) {\n strapi.get('models').add(historyVersion);\n },\n };\n};\n\nexport default getFeature();\n"],"names":["getFeature","strapi","ee","features","isEnabled","register","get","add","historyVersion","bootstrap","getService","destroy","controllers","services","routes"],"mappings":";;;;;;;;AAOA;;;AAGC,IACD,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,IAAIC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,qBAAA,CAAA,EAAwB;QACvD,OAAO;YACLC,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAAE,EAAA;AACjBA,gBAAAA,OAAAA,CAAOK,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,6BAAAA,CAAAA;AAC3B,YAAA,CAAA;YACAC,SAAAA,CAAAA,CAAU,EAAER,MAAAA,EAAAA,OAAM,EAAE,EAAA;;gBAElBS,gBAAAA,CAAWT,OAAAA,EAAQ,cAAcQ,SAAS,EAAA;AAC5C,YAAA,CAAA;YACAE,OAAAA,CAAAA,CAAQ,EAAEV,MAAAA,EAAAA,OAAM,EAAE,EAAA;gBAChBS,gBAAAA,CAAWT,OAAAA,EAAQ,cAAcU,OAAO,EAAA;AAC1C,YAAA,CAAA;AACAC,yBAAAA,mBAAAA;AACAC,sBAAAA,gBAAAA;AACAC,oBAAAA;AACF,SAAA;AACF,IAAA;AAEA;;;AAGC,MACD,OAAO;QACLT,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAAE,EAAA;AACjBA,YAAAA,OAAAA,CAAOK,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,6BAAAA,CAAAA;AAC3B,QAAA;AACF,KAAA;AACF,CAAA;AAEA,cAAeR,UAAAA,EAAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/history/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { controllers } from './controllers';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { getService } from './utils';\nimport { historyVersion } from './models/history-version';\nimport { registerHistoryEntitlements } from './entitlements';\n\n/**\n * Check once if the feature is enabled before loading it,\n * so that we can assume it is enabled in the other files.\n */\nconst getFeature = (): Partial<Plugin.LoadedPlugin> => {\n if (strapi.ee.features.isEnabled('cms-content-history')) {\n return {\n register({ strapi }) {\n strapi.get('models').add(historyVersion);\n registerHistoryEntitlements(strapi);\n },\n bootstrap({ strapi }) {\n // Start recording history and saving history versions\n getService(strapi, 'lifecycles').bootstrap();\n },\n destroy({ strapi }) {\n getService(strapi, 'lifecycles').destroy();\n },\n controllers,\n services,\n routes,\n };\n }\n\n /**\n * Keep registering the model to avoid losing the data if the feature is disabled,\n * or if the license expires.\n */\n return {\n register({ strapi }) {\n strapi.get('models').add(historyVersion);\n registerHistoryEntitlements(strapi);\n },\n };\n};\n\nexport default getFeature();\n"],"names":["getFeature","strapi","ee","features","isEnabled","register","get","add","historyVersion","registerHistoryEntitlements","bootstrap","getService","destroy","controllers","services","routes"],"mappings":";;;;;;;;;AAQA;;;AAGC,IACD,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,IAAIC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,qBAAA,CAAA,EAAwB;QACvD,OAAO;YACLC,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAAE,EAAA;AACjBA,gBAAAA,OAAAA,CAAOK,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,6BAAAA,CAAAA;gBACzBC,wCAAAA,CAA4BR,OAAAA,CAAAA;AAC9B,YAAA,CAAA;YACAS,SAAAA,CAAAA,CAAU,EAAET,MAAAA,EAAAA,OAAM,EAAE,EAAA;;gBAElBU,gBAAAA,CAAWV,OAAAA,EAAQ,cAAcS,SAAS,EAAA;AAC5C,YAAA,CAAA;YACAE,OAAAA,CAAAA,CAAQ,EAAEX,MAAAA,EAAAA,OAAM,EAAE,EAAA;gBAChBU,gBAAAA,CAAWV,OAAAA,EAAQ,cAAcW,OAAO,EAAA;AAC1C,YAAA,CAAA;AACAC,yBAAAA,mBAAAA;AACAC,sBAAAA,gBAAAA;AACAC,oBAAAA;AACF,SAAA;AACF,IAAA;AAEA;;;AAGC,MACD,OAAO;QACLV,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAAE,EAAA;AACjBA,YAAAA,OAAAA,CAAOK,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,6BAAAA,CAAAA;YACzBC,wCAAAA,CAA4BR,OAAAA,CAAAA;AAC9B,QAAA;AACF,KAAA;AACF,CAAA;AAEA,cAAeD,UAAAA,EAAAA;;;;"}
@@ -3,6 +3,7 @@ import { services } from './services/index.mjs';
3
3
  import { routes } from './routes/index.mjs';
4
4
  import { getService } from './utils.mjs';
5
5
  import { historyVersion } from './models/history-version.mjs';
6
+ import { registerHistoryEntitlements } from './entitlements.mjs';
6
7
 
7
8
  /**
8
9
  * Check once if the feature is enabled before loading it,
@@ -12,6 +13,7 @@ import { historyVersion } from './models/history-version.mjs';
12
13
  return {
13
14
  register ({ strapi: strapi1 }) {
14
15
  strapi1.get('models').add(historyVersion);
16
+ registerHistoryEntitlements(strapi1);
15
17
  },
16
18
  bootstrap ({ strapi: strapi1 }) {
17
19
  // Start recording history and saving history versions
@@ -31,6 +33,7 @@ import { historyVersion } from './models/history-version.mjs';
31
33
  */ return {
32
34
  register ({ strapi: strapi1 }) {
33
35
  strapi1.get('models').add(historyVersion);
36
+ registerHistoryEntitlements(strapi1);
34
37
  }
35
38
  };
36
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../server/src/history/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { controllers } from './controllers';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { getService } from './utils';\nimport { historyVersion } from './models/history-version';\n\n/**\n * Check once if the feature is enabled before loading it,\n * so that we can assume it is enabled in the other files.\n */\nconst getFeature = (): Partial<Plugin.LoadedPlugin> => {\n if (strapi.ee.features.isEnabled('cms-content-history')) {\n return {\n register({ strapi }) {\n strapi.get('models').add(historyVersion);\n },\n bootstrap({ strapi }) {\n // Start recording history and saving history versions\n getService(strapi, 'lifecycles').bootstrap();\n },\n destroy({ strapi }) {\n getService(strapi, 'lifecycles').destroy();\n },\n controllers,\n services,\n routes,\n };\n }\n\n /**\n * Keep registering the model to avoid losing the data if the feature is disabled,\n * or if the license expires.\n */\n return {\n register({ strapi }) {\n strapi.get('models').add(historyVersion);\n },\n };\n};\n\nexport default getFeature();\n"],"names":["getFeature","strapi","ee","features","isEnabled","register","get","add","historyVersion","bootstrap","getService","destroy","controllers","services","routes"],"mappings":";;;;;;AAOA;;;AAGC,IACD,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,IAAIC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,qBAAA,CAAA,EAAwB;QACvD,OAAO;YACLC,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAAE,EAAA;AACjBA,gBAAAA,OAAAA,CAAOK,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,cAAAA,CAAAA;AAC3B,YAAA,CAAA;YACAC,SAAAA,CAAAA,CAAU,EAAER,MAAAA,EAAAA,OAAM,EAAE,EAAA;;gBAElBS,UAAAA,CAAWT,OAAAA,EAAQ,cAAcQ,SAAS,EAAA;AAC5C,YAAA,CAAA;YACAE,OAAAA,CAAAA,CAAQ,EAAEV,MAAAA,EAAAA,OAAM,EAAE,EAAA;gBAChBS,UAAAA,CAAWT,OAAAA,EAAQ,cAAcU,OAAO,EAAA;AAC1C,YAAA,CAAA;AACAC,YAAAA,WAAAA;AACAC,YAAAA,QAAAA;AACAC,YAAAA;AACF,SAAA;AACF,IAAA;AAEA;;;AAGC,MACD,OAAO;QACLT,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAAE,EAAA;AACjBA,YAAAA,OAAAA,CAAOK,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,cAAAA,CAAAA;AAC3B,QAAA;AACF,KAAA;AACF,CAAA;AAEA,cAAeR,UAAAA,EAAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/history/index.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport { controllers } from './controllers';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { getService } from './utils';\nimport { historyVersion } from './models/history-version';\nimport { registerHistoryEntitlements } from './entitlements';\n\n/**\n * Check once if the feature is enabled before loading it,\n * so that we can assume it is enabled in the other files.\n */\nconst getFeature = (): Partial<Plugin.LoadedPlugin> => {\n if (strapi.ee.features.isEnabled('cms-content-history')) {\n return {\n register({ strapi }) {\n strapi.get('models').add(historyVersion);\n registerHistoryEntitlements(strapi);\n },\n bootstrap({ strapi }) {\n // Start recording history and saving history versions\n getService(strapi, 'lifecycles').bootstrap();\n },\n destroy({ strapi }) {\n getService(strapi, 'lifecycles').destroy();\n },\n controllers,\n services,\n routes,\n };\n }\n\n /**\n * Keep registering the model to avoid losing the data if the feature is disabled,\n * or if the license expires.\n */\n return {\n register({ strapi }) {\n strapi.get('models').add(historyVersion);\n registerHistoryEntitlements(strapi);\n },\n };\n};\n\nexport default getFeature();\n"],"names":["getFeature","strapi","ee","features","isEnabled","register","get","add","historyVersion","registerHistoryEntitlements","bootstrap","getService","destroy","controllers","services","routes"],"mappings":";;;;;;;AAQA;;;AAGC,IACD,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,IAAIC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,qBAAA,CAAA,EAAwB;QACvD,OAAO;YACLC,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAAE,EAAA;AACjBA,gBAAAA,OAAAA,CAAOK,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,cAAAA,CAAAA;gBACzBC,2BAAAA,CAA4BR,OAAAA,CAAAA;AAC9B,YAAA,CAAA;YACAS,SAAAA,CAAAA,CAAU,EAAET,MAAAA,EAAAA,OAAM,EAAE,EAAA;;gBAElBU,UAAAA,CAAWV,OAAAA,EAAQ,cAAcS,SAAS,EAAA;AAC5C,YAAA,CAAA;YACAE,OAAAA,CAAAA,CAAQ,EAAEX,MAAAA,EAAAA,OAAM,EAAE,EAAA;gBAChBU,UAAAA,CAAWV,OAAAA,EAAQ,cAAcW,OAAO,EAAA;AAC1C,YAAA,CAAA;AACAC,YAAAA,WAAAA;AACAC,YAAAA,QAAAA;AACAC,YAAAA;AACF,SAAA;AACF,IAAA;AAEA;;;AAGC,MACD,OAAO;QACLV,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAAE,EAAA;AACjBA,YAAAA,OAAAA,CAAOK,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,cAAAA,CAAAA;YACzBC,2BAAAA,CAA4BR,OAAAA,CAAAA;AAC9B,QAAA;AACF,KAAA;AACF,CAAA;AAEA,cAAeD,UAAAA,EAAAA;;;;"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var strapiUtils = require('@strapi/utils');
4
- var fp = require('lodash/fp');
4
+ var _ = require('lodash');
5
5
  var constants = require('../constants.js');
6
6
  var utils = require('./utils.js');
7
7
  var index = require('../../utils/index.js');
@@ -168,7 +168,7 @@ const createHistoryService = ({ strapi })=>{
168
168
  structuredClone(version.data));
169
169
  // Remove the schema attributes history should ignore
170
170
  const schema = structuredClone(version.schema);
171
- schema.attributes = fp.omit(constants.FIELDS_TO_IGNORE, contentTypeSchemaAttributes);
171
+ schema.attributes = _.omit(contentTypeSchemaAttributes, constants.FIELDS_TO_IGNORE);
172
172
  const dataWithoutMissingRelations = await strapiUtils.traverseEntity(async (options, utils)=>{
173
173
  if (!options.attribute) return;
174
174
  if (options.attribute.type === 'component') {
@@ -200,10 +200,10 @@ const createHistoryService = ({ strapi })=>{
200
200
  schema,
201
201
  getModel: strapi.getModel.bind(strapi)
202
202
  }, dataWithoutAddedAttributes);
203
- const data = fp.omit([
203
+ const data = _.omit(dataWithoutMissingRelations, [
204
204
  'id',
205
205
  ...Object.keys(schemaDiff.removed)
206
- ], dataWithoutMissingRelations);
206
+ ]);
207
207
  const restoredDocument = await strapi.documents(version.contentType).update({
208
208
  documentId: version.relatedDocumentId,
209
209
  locale: version.locale,
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash/fp';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(['id', ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
1
+ {"version":3,"file":"history.js","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(contentTypeSchemaAttributes, FIELDS_TO_IGNORE);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(dataWithoutMissingRelations, ['id', ...Object.keys(schemaDiff.removed)]);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { traverseEntity, errors } from '@strapi/utils';
2
- import { omit } from 'lodash/fp';
2
+ import { omit } from 'lodash';
3
3
  import { HISTORY_VERSION_UID, FIELDS_TO_IGNORE } from '../constants.mjs';
4
4
  import { createServiceUtils } from './utils.mjs';
5
5
  import { getService } from '../../utils/index.mjs';
@@ -166,7 +166,7 @@ const createHistoryService = ({ strapi })=>{
166
166
  structuredClone(version.data));
167
167
  // Remove the schema attributes history should ignore
168
168
  const schema = structuredClone(version.schema);
169
- schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);
169
+ schema.attributes = omit(contentTypeSchemaAttributes, FIELDS_TO_IGNORE);
170
170
  const dataWithoutMissingRelations = await traverseEntity(async (options, utils)=>{
171
171
  if (!options.attribute) return;
172
172
  if (options.attribute.type === 'component') {
@@ -198,10 +198,10 @@ const createHistoryService = ({ strapi })=>{
198
198
  schema,
199
199
  getModel: strapi.getModel.bind(strapi)
200
200
  }, dataWithoutAddedAttributes);
201
- const data = omit([
201
+ const data = omit(dataWithoutMissingRelations, [
202
202
  'id',
203
203
  ...Object.keys(schemaDiff.removed)
204
- ], dataWithoutMissingRelations);
204
+ ]);
205
205
  const restoredDocument = await strapi.documents(version.contentType).update({
206
206
  documentId: version.relatedDocumentId,
207
207
  locale: version.locale,
@@ -1 +1 @@
1
- {"version":3,"file":"history.mjs","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash/fp';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(['id', ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
1
+ {"version":3,"file":"history.mjs","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(contentTypeSchemaAttributes, FIELDS_TO_IGNORE);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(dataWithoutMissingRelations, ['id', ...Object.keys(schemaDiff.removed)]);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var strapiUtils = require('@strapi/utils');
4
- var fp = require('lodash/fp');
5
- var utils$1 = require('../utils.js');
4
+ var _ = require('lodash');
5
+ var utils = require('../utils.js');
6
6
  var constants = require('../constants.js');
7
- var utils = require('./utils.js');
7
+ var utils$1 = require('./utils.js');
8
8
 
9
9
  /**
10
10
  * Filters out actions that should not create a history version.
@@ -51,7 +51,7 @@ var utils = require('./utils.js');
51
51
  return currentComponentSchemas;
52
52
  }, {});
53
53
  return {
54
- schema: fp.omit(constants.FIELDS_TO_IGNORE, attributesSchema),
54
+ schema: _.omit(attributesSchema, constants.FIELDS_TO_IGNORE),
55
55
  componentsSchemas
56
56
  };
57
57
  };
@@ -59,7 +59,7 @@ const createLifecyclesService = ({ strapi: strapi1 })=>{
59
59
  const state = {
60
60
  isInitialized: false
61
61
  };
62
- const serviceUtils = utils.createServiceUtils({
62
+ const serviceUtils = utils$1.createServiceUtils({
63
63
  strapi: strapi1
64
64
  });
65
65
  const { persistTablesWithPrefix } = strapi1.service('admin::persist-tables');
@@ -80,7 +80,7 @@ const createLifecyclesService = ({ strapi: strapi1 })=>{
80
80
  const documentId = context.action === 'create' || context.action === 'clone' ? result.documentId : context.params.documentId;
81
81
  // Apply default locale if not available in the request
82
82
  const defaultLocale = await serviceUtils.getDefaultLocale();
83
- const locales = fp.castArray(context.params?.locale || defaultLocale);
83
+ const locales = _.castArray(context.params?.locale || defaultLocale);
84
84
  if (!locales.length) {
85
85
  return result;
86
86
  }
@@ -111,9 +111,9 @@ const createLifecyclesService = ({ strapi: strapi1 })=>{
111
111
  onCommit(async ()=>{
112
112
  for (const entry of localeEntries){
113
113
  const status = await serviceUtils.getVersionStatus(uid, entry);
114
- await utils$1.getService(strapi1, 'history').createVersion({
114
+ await utils.getService(strapi1, 'history').createVersion({
115
115
  contentType: uid,
116
- data: fp.omit(constants.FIELDS_TO_IGNORE, entry),
116
+ data: _.omit(entry, constants.FIELDS_TO_IGNORE),
117
117
  relatedDocumentId: documentId,
118
118
  locale: entry.locale,
119
119
  status,