@strapi/content-manager 0.0.0-next.883f4fcabd28de02b78b7b00a70e33cd2d151d05 → 0.0.0-next.88e2effa81cb9544dd09eb0536e39c3fed6ef4c9

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 (383) hide show
  1. package/dist/admin/components/ConfigurationForm/EditFieldForm.js +1 -1
  2. package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs +1 -1
  4. package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/Fields.js +304 -205
  6. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Fields.mjs +309 -211
  8. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  9. package/dist/admin/components/ConfigurationForm/Form.js +1 -1
  10. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  11. package/dist/admin/components/ConfigurationForm/Form.mjs +3 -3
  12. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
  13. package/dist/admin/components/DragPreviews/CardDragPreview.js +3 -1
  14. package/dist/admin/components/DragPreviews/CardDragPreview.js.map +1 -1
  15. package/dist/admin/components/DragPreviews/CardDragPreview.mjs +3 -1
  16. package/dist/admin/components/DragPreviews/CardDragPreview.mjs.map +1 -1
  17. package/dist/admin/components/DragPreviews/ComponentDragPreview.js +3 -1
  18. package/dist/admin/components/DragPreviews/ComponentDragPreview.js.map +1 -1
  19. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs +3 -1
  20. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs.map +1 -1
  21. package/dist/admin/components/DragPreviews/RelationDragPreview.js +3 -1
  22. package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -1
  23. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs +3 -1
  24. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -1
  25. package/dist/admin/components/LeftMenu.js +94 -50
  26. package/dist/admin/components/LeftMenu.js.map +1 -1
  27. package/dist/admin/components/LeftMenu.mjs +97 -53
  28. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  29. package/dist/admin/components/Widgets.js +287 -11
  30. package/dist/admin/components/Widgets.js.map +1 -1
  31. package/dist/admin/components/Widgets.mjs +270 -14
  32. package/dist/admin/components/Widgets.mjs.map +1 -1
  33. package/dist/admin/history/components/VersionContent.js +24 -3
  34. package/dist/admin/history/components/VersionContent.js.map +1 -1
  35. package/dist/admin/history/components/VersionContent.mjs +25 -4
  36. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  37. package/dist/admin/history/components/VersionHeader.js +7 -0
  38. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  39. package/dist/admin/history/components/VersionHeader.mjs +8 -1
  40. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  41. package/dist/admin/history/components/VersionsList.js +1 -1
  42. package/dist/admin/history/components/VersionsList.js.map +1 -1
  43. package/dist/admin/history/components/VersionsList.mjs +1 -1
  44. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  45. package/dist/admin/history/pages/History.js +7 -7
  46. package/dist/admin/history/pages/History.js.map +1 -1
  47. package/dist/admin/history/pages/History.mjs +7 -7
  48. package/dist/admin/history/pages/History.mjs.map +1 -1
  49. package/dist/admin/hooks/useDocumentActions.js +7 -6
  50. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  51. package/dist/admin/hooks/useDocumentActions.mjs +8 -7
  52. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  53. package/dist/admin/index.js +47 -8
  54. package/dist/admin/index.js.map +1 -1
  55. package/dist/admin/index.mjs +47 -9
  56. package/dist/admin/index.mjs.map +1 -1
  57. package/dist/admin/layout.js +28 -33
  58. package/dist/admin/layout.js.map +1 -1
  59. package/dist/admin/layout.mjs +29 -15
  60. package/dist/admin/layout.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/EditViewPage.js +98 -77
  62. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  63. package/dist/admin/pages/EditView/EditViewPage.mjs +100 -79
  64. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/Blocker.js +18 -0
  66. package/dist/admin/pages/EditView/components/Blocker.js.map +1 -0
  67. package/dist/admin/pages/EditView/components/Blocker.mjs +16 -0
  68. package/dist/admin/pages/EditView/components/Blocker.mjs.map +1 -0
  69. package/dist/admin/pages/EditView/components/DocumentActions.js +104 -70
  70. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/DocumentActions.mjs +106 -72
  72. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +66 -2
  74. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +66 -2
  76. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
  78. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
  80. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +54 -14
  82. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +55 -15
  84. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +2 -2
  86. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +2 -2
  88. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +2 -2
  90. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +2 -2
  92. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js +7 -3
  94. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs +7 -3
  96. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +12 -1
  98. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +13 -2
  100. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +15 -3
  102. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +16 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +1 -2
  106. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +1 -2
  108. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  109. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +22 -8
  110. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  111. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +24 -10
  112. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  113. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +1 -0
  114. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  115. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +1 -0
  116. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  117. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +160 -107
  118. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  119. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +163 -110
  120. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  121. package/dist/admin/pages/EditView/components/FormInputs/UID.js +6 -3
  122. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  123. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +6 -3
  124. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  125. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
  126. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  127. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
  128. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  129. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +2 -2
  130. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  131. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +2 -2
  132. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  133. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
  134. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  135. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
  136. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  137. package/dist/admin/pages/EditView/components/FormLayout.js +58 -33
  138. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  139. package/dist/admin/pages/EditView/components/FormLayout.mjs +59 -33
  140. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  141. package/dist/admin/pages/EditView/components/Header.js +85 -25
  142. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  143. package/dist/admin/pages/EditView/components/Header.mjs +87 -27
  144. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  145. package/dist/admin/pages/EditView/components/InputRenderer.js +20 -7
  146. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  147. package/dist/admin/pages/EditView/components/InputRenderer.mjs +20 -7
  148. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  149. package/dist/admin/pages/EditView/utils/data.js +128 -0
  150. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  151. package/dist/admin/pages/EditView/utils/data.mjs +128 -1
  152. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  153. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +1 -0
  154. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  155. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +1 -0
  156. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  157. package/dist/admin/pages/ListView/ListViewPage.js +227 -132
  158. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  159. package/dist/admin/pages/ListView/ListViewPage.mjs +229 -134
  160. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  161. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
  162. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  163. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
  164. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  165. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +12 -2
  166. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  167. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +12 -2
  168. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  169. package/dist/admin/pages/ListView/components/Filters.js +8 -2
  170. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  171. package/dist/admin/pages/ListView/components/Filters.mjs +8 -2
  172. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  173. package/dist/admin/pages/ListView/components/TableActions.js +13 -3
  174. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  175. package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
  176. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  177. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +5 -2
  178. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
  179. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +5 -2
  180. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
  181. package/dist/admin/preview/components/InputPopover.js +189 -0
  182. package/dist/admin/preview/components/InputPopover.js.map +1 -0
  183. package/dist/admin/preview/components/InputPopover.mjs +167 -0
  184. package/dist/admin/preview/components/InputPopover.mjs.map +1 -0
  185. package/dist/admin/preview/components/PreviewHeader.js +0 -1
  186. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  187. package/dist/admin/preview/components/PreviewHeader.mjs +0 -1
  188. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  189. package/dist/admin/preview/components/PreviewSidePanel.js +31 -4
  190. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
  191. package/dist/admin/preview/components/PreviewSidePanel.mjs +32 -5
  192. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
  193. package/dist/admin/preview/hooks/usePreviewInputManager.js +77 -0
  194. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -0
  195. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +56 -0
  196. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -0
  197. package/dist/admin/preview/pages/Preview.js +178 -74
  198. package/dist/admin/preview/pages/Preview.js.map +1 -1
  199. package/dist/admin/preview/pages/Preview.mjs +180 -76
  200. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  201. package/dist/admin/preview/utils/constants.js +56 -0
  202. package/dist/admin/preview/utils/constants.js.map +1 -0
  203. package/dist/admin/preview/utils/constants.mjs +52 -0
  204. package/dist/admin/preview/utils/constants.mjs.map +1 -0
  205. package/dist/admin/preview/utils/fieldUtils.js +107 -0
  206. package/dist/admin/preview/utils/fieldUtils.js.map +1 -0
  207. package/dist/admin/preview/utils/fieldUtils.mjs +102 -0
  208. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -0
  209. package/dist/admin/preview/utils/getSendMessage.js +22 -0
  210. package/dist/admin/preview/utils/getSendMessage.js.map +1 -0
  211. package/dist/admin/preview/utils/getSendMessage.mjs +20 -0
  212. package/dist/admin/preview/utils/getSendMessage.mjs.map +1 -0
  213. package/dist/admin/preview/utils/previewScript.js +534 -0
  214. package/dist/admin/preview/utils/previewScript.js.map +1 -0
  215. package/dist/admin/preview/utils/previewScript.mjs +532 -0
  216. package/dist/admin/preview/utils/previewScript.mjs.map +1 -0
  217. package/dist/admin/services/api.js +5 -1
  218. package/dist/admin/services/api.js.map +1 -1
  219. package/dist/admin/services/api.mjs +5 -1
  220. package/dist/admin/services/api.mjs.map +1 -1
  221. package/dist/admin/services/documents.js +59 -17
  222. package/dist/admin/services/documents.js.map +1 -1
  223. package/dist/admin/services/documents.mjs +59 -17
  224. package/dist/admin/services/documents.mjs.map +1 -1
  225. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
  226. package/dist/admin/src/components/LeftMenu.d.ts +3 -1
  227. package/dist/admin/src/components/Widgets.d.ts +8 -3
  228. package/dist/admin/src/exports.d.ts +1 -0
  229. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  230. package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
  231. package/dist/admin/src/pages/EditView/components/Blocker.d.ts +5 -0
  232. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/links.d.ts +2 -0
  233. package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
  234. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +7 -10
  235. package/dist/admin/src/pages/EditView/components/Header.d.ts +4 -0
  236. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  237. package/dist/admin/src/pages/EditView/utils/data.d.ts +19 -1
  238. package/dist/admin/src/preview/components/InputPopover.d.ts +6 -0
  239. package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +5 -0
  240. package/dist/admin/src/preview/pages/Preview.d.ts +12 -0
  241. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  242. package/dist/admin/src/preview/utils/constants.d.ts +55 -0
  243. package/dist/admin/src/preview/utils/fieldUtils.d.ts +22 -0
  244. package/dist/admin/src/preview/utils/getSendMessage.d.ts +11 -0
  245. package/dist/admin/src/preview/utils/previewScript.d.ts +24 -0
  246. package/dist/admin/src/services/api.d.ts +1 -1
  247. package/dist/admin/src/services/components.d.ts +2 -2
  248. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  249. package/dist/admin/src/services/documents.d.ts +23 -17
  250. package/dist/admin/src/services/homepage.d.ts +1 -1
  251. package/dist/admin/src/services/init.d.ts +1 -1
  252. package/dist/admin/src/services/relations.d.ts +2 -2
  253. package/dist/admin/src/services/uid.d.ts +3 -3
  254. package/dist/admin/src/utils/api.d.ts +1 -1
  255. package/dist/admin/src/utils/validation.d.ts +1 -0
  256. package/dist/admin/translations/en.json.js +13 -0
  257. package/dist/admin/translations/en.json.js.map +1 -1
  258. package/dist/admin/translations/en.json.mjs +13 -0
  259. package/dist/admin/translations/en.json.mjs.map +1 -1
  260. package/dist/admin/translations/es.json.js +6 -2
  261. package/dist/admin/translations/es.json.js.map +1 -1
  262. package/dist/admin/translations/es.json.mjs +6 -2
  263. package/dist/admin/translations/es.json.mjs.map +1 -1
  264. package/dist/admin/translations/fr.json.js +11 -2
  265. package/dist/admin/translations/fr.json.js.map +1 -1
  266. package/dist/admin/translations/fr.json.mjs +11 -2
  267. package/dist/admin/translations/fr.json.mjs.map +1 -1
  268. package/dist/admin/utils/api.js +1 -1
  269. package/dist/admin/utils/api.js.map +1 -1
  270. package/dist/admin/utils/api.mjs +1 -1
  271. package/dist/admin/utils/api.mjs.map +1 -1
  272. package/dist/admin/utils/validation.js +19 -7
  273. package/dist/admin/utils/validation.js.map +1 -1
  274. package/dist/admin/utils/validation.mjs +19 -7
  275. package/dist/admin/utils/validation.mjs.map +1 -1
  276. package/dist/server/controllers/collection-types.js +2 -1
  277. package/dist/server/controllers/collection-types.js.map +1 -1
  278. package/dist/server/controllers/collection-types.mjs +2 -1
  279. package/dist/server/controllers/collection-types.mjs.map +1 -1
  280. package/dist/server/controllers/content-types.js +11 -1
  281. package/dist/server/controllers/content-types.js.map +1 -1
  282. package/dist/server/controllers/content-types.mjs +11 -1
  283. package/dist/server/controllers/content-types.mjs.map +1 -1
  284. package/dist/server/controllers/relations.js +8 -6
  285. package/dist/server/controllers/relations.js.map +1 -1
  286. package/dist/server/controllers/relations.mjs +8 -6
  287. package/dist/server/controllers/relations.mjs.map +1 -1
  288. package/dist/server/controllers/single-types.js.map +1 -1
  289. package/dist/server/controllers/single-types.mjs.map +1 -1
  290. package/dist/server/controllers/validation/index.js +14 -2
  291. package/dist/server/controllers/validation/index.js.map +1 -1
  292. package/dist/server/controllers/validation/index.mjs +14 -2
  293. package/dist/server/controllers/validation/index.mjs.map +1 -1
  294. package/dist/server/history/services/lifecycles.js +20 -19
  295. package/dist/server/history/services/lifecycles.js.map +1 -1
  296. package/dist/server/history/services/lifecycles.mjs +20 -19
  297. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  298. package/dist/server/homepage/controllers/homepage.js +5 -0
  299. package/dist/server/homepage/controllers/homepage.js.map +1 -1
  300. package/dist/server/homepage/controllers/homepage.mjs +5 -0
  301. package/dist/server/homepage/controllers/homepage.mjs.map +1 -1
  302. package/dist/server/homepage/routes/homepage.js +11 -0
  303. package/dist/server/homepage/routes/homepage.js.map +1 -1
  304. package/dist/server/homepage/routes/homepage.mjs +11 -0
  305. package/dist/server/homepage/routes/homepage.mjs.map +1 -1
  306. package/dist/server/homepage/services/homepage.js +86 -46
  307. package/dist/server/homepage/services/homepage.js.map +1 -1
  308. package/dist/server/homepage/services/homepage.mjs +86 -46
  309. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  310. package/dist/server/preview/services/preview-config.js +11 -32
  311. package/dist/server/preview/services/preview-config.js.map +1 -1
  312. package/dist/server/preview/services/preview-config.mjs +12 -33
  313. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  314. package/dist/server/preview/services/preview.js +4 -0
  315. package/dist/server/preview/services/preview.js.map +1 -1
  316. package/dist/server/preview/services/preview.mjs +4 -0
  317. package/dist/server/preview/services/preview.mjs.map +1 -1
  318. package/dist/server/services/data-mapper.js +4 -1
  319. package/dist/server/services/data-mapper.js.map +1 -1
  320. package/dist/server/services/data-mapper.mjs +4 -1
  321. package/dist/server/services/data-mapper.mjs.map +1 -1
  322. package/dist/server/services/document-manager.js +8 -1
  323. package/dist/server/services/document-manager.js.map +1 -1
  324. package/dist/server/services/document-manager.mjs +8 -1
  325. package/dist/server/services/document-manager.mjs.map +1 -1
  326. package/dist/server/services/document-metadata.js +3 -1
  327. package/dist/server/services/document-metadata.js.map +1 -1
  328. package/dist/server/services/document-metadata.mjs +3 -1
  329. package/dist/server/services/document-metadata.mjs.map +1 -1
  330. package/dist/server/services/utils/configuration/attributes.js +1 -1
  331. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  332. package/dist/server/services/utils/configuration/attributes.mjs +1 -1
  333. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  334. package/dist/server/services/utils/configuration/layouts.js +1 -1
  335. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  336. package/dist/server/services/utils/configuration/layouts.mjs +1 -1
  337. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
  338. package/dist/server/services/utils/configuration/metadatas.js +8 -0
  339. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  340. package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
  341. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
  342. package/dist/server/services/utils/populate.js +11 -0
  343. package/dist/server/services/utils/populate.js.map +1 -1
  344. package/dist/server/services/utils/populate.mjs +11 -0
  345. package/dist/server/services/utils/populate.mjs.map +1 -1
  346. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  347. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  348. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  349. package/dist/server/src/controllers/single-types.d.ts.map +1 -1
  350. package/dist/server/src/controllers/validation/index.d.ts +6 -1
  351. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  352. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  353. package/dist/server/src/homepage/controllers/homepage.d.ts +2 -1
  354. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  355. package/dist/server/src/homepage/index.d.ts +7 -0
  356. package/dist/server/src/homepage/index.d.ts.map +1 -1
  357. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -1
  358. package/dist/server/src/homepage/services/homepage.d.ts +4 -1
  359. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  360. package/dist/server/src/homepage/services/index.d.ts +7 -0
  361. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  362. package/dist/server/src/index.d.ts +8 -0
  363. package/dist/server/src/index.d.ts.map +1 -1
  364. package/dist/server/src/preview/services/index.d.ts +1 -0
  365. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  366. package/dist/server/src/preview/services/preview-config.d.ts +1 -0
  367. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  368. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  369. package/dist/server/src/preview/utils.d.ts +1 -0
  370. package/dist/server/src/preview/utils.d.ts.map +1 -1
  371. package/dist/server/src/services/data-mapper.d.ts +1 -0
  372. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  373. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  374. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  375. package/dist/server/src/services/index.d.ts +8 -0
  376. package/dist/server/src/services/index.d.ts.map +1 -1
  377. package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
  378. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  379. package/dist/shared/contracts/collection-types.d.ts +0 -1
  380. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  381. package/dist/shared/contracts/homepage.d.ts +13 -0
  382. package/dist/shared/contracts/homepage.d.ts.map +1 -1
  383. package/package.json +11 -9
@@ -1 +1 @@
1
- {"version":3,"file":"single-types.mjs","sources":["../../../server/src/controllers/single-types.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { setCreatorFields, async, errors } from '@strapi/utils';\n\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { getService } from '../utils';\nimport { formatDocumentWithMetadata } from './utils/metadata';\n\ntype OptionsWithPopulate = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\nconst buildPopulateFromQuery = async (query: any, model: any) => {\n return getService('populate-builder')(model)\n .populateFromQuery(query)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n};\n\nconst findDocument = async (query: any, uid: UID.SingleType, opts: any = {}) => {\n const documentManager = getService('document-manager');\n const populate = await buildPopulateFromQuery(query, uid);\n\n return (\n documentManager\n .findMany({ ...opts, populate }, uid)\n // Return the first document found\n .then((documents: any) => documents[0])\n );\n};\n\nconst createOrUpdateDocument = async (ctx: any, opts?: OptionsWithPopulate) => {\n const { user, userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n findDocument(sanitizedQuery, model, { locale, status: 'draft' }),\n // Find the first document to check if it exists\n strapi.db.query(model).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n const pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n\n // If version is not found, but document exists,\n // the intent is to create a new document locale\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedBody = await sanitizeFn(body);\n\n if (!documentId) {\n return documentManager.create(model, {\n data: sanitizedBody,\n ...sanitizedQuery,\n locale,\n });\n }\n\n return documentManager.update(documentId, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n};\n\nexport default {\n async find(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const version = await findDocument(permissionQuery, model, { locale, status });\n\n // allow user with create permission to know a single type is not created\n if (!version) {\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n // Check if document exists\n const document = await strapi.db.query(model).findOne({});\n\n if (!document) {\n return ctx.notFound();\n }\n\n // If the requested locale doesn't exist, return an empty response\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n model,\n // @ts-expect-error - fix types\n { documentId: document.documentId, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n ctx.body = { data: {}, meta };\n return;\n }\n\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async createOrUpdate(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const document = await createOrUpdateDocument(ctx);\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.delete()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n const documentLocales = await documentManager.findLocales(undefined, model, {\n populate,\n locale,\n });\n\n if (documentLocales.length === 0) {\n return ctx.notFound();\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n return ctx.forbidden();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales.at(0).documentId, model, {\n locale,\n });\n\n ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n },\n\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.publish()) {\n return ctx.forbidden();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n const document = await createOrUpdateDocument(ctx, { populate });\n\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const { locale } = await getDocumentLocaleAndStatus(document, model);\n const publishResult = await documentManager.publish(document.documentId, model, { locale });\n\n return publishResult.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const {\n body: { discardDraft, ...body },\n query = {},\n } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.unpublish()) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale });\n\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n await strapi.db.transaction(async () => {\n if (discardDraft) {\n await documentManager.discardDraft(document.documentId, model, { locale });\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.unpublish(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n });\n },\n\n async discard(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale, status: 'published' });\n\n // Can not discard a document that is not published\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.discardDraft(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query } = ctx.request;\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const document = await findDocument({}, model);\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.read(document)) {\n return ctx.forbidden();\n }\n\n const number = await documentManager.countDraftRelations(document.documentId, model, locale);\n\n return {\n data: number,\n };\n },\n};\n"],"names":["buildPopulateFromQuery","query","model","getService","populateFromQuery","populateDeep","Infinity","countRelations","build","findDocument","uid","opts","documentManager","populate","findMany","then","documents","createOrUpdateDocument","ctx","user","userAbility","state","params","body","request","permissionChecker","create","cannot","update","errors","ForbiddenError","sanitizedQuery","locale","getDocumentLocaleAndStatus","documentVersion","otherDocumentVersion","Promise","all","status","strapi","db","findOne","select","documentId","pickPermittedFields","sanitizeUpdateInput","sanitizeCreateInput","setCreator","setCreatorFields","isEdition","sanitizeFn","async","pipe","sanitizedBody","data","find","read","forbidden","permissionQuery","version","document","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","sanitizeOutput","createOrUpdate","delete","documentLocales","findLocales","undefined","length","deletedEntity","at","publish","publishedDocument","transaction","NotFoundError","publishResult","unpublish","discardDraft","discard","countDraftRelations","number"],"mappings":"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"}
1
+ {"version":3,"file":"single-types.mjs","sources":["../../../server/src/controllers/single-types.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { setCreatorFields, async, errors } from '@strapi/utils';\n\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { getService } from '../utils';\nimport { formatDocumentWithMetadata } from './utils/metadata';\n\ntype OptionsWithPopulate = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\nconst buildPopulateFromQuery = async (query: any, model: any) => {\n return getService('populate-builder')(model)\n .populateFromQuery(query)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n};\n\nconst findDocument = async (query: any, uid: UID.SingleType, opts: any = {}) => {\n const documentManager = getService('document-manager');\n const populate = await buildPopulateFromQuery(query, uid);\n\n return (\n documentManager\n .findMany({ ...opts, populate }, uid)\n // Return the first document found\n .then((documents: any) => documents[0])\n );\n};\n\nconst createOrUpdateDocument = async (ctx: any, opts?: OptionsWithPopulate) => {\n const { user, userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n findDocument(sanitizedQuery, model, { locale, status: 'draft' }),\n // Find the first document to check if it exists\n strapi.db.query(model).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n const pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n\n // If version is not found, but document exists,\n // the intent is to create a new document locale\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedBody = await sanitizeFn(body);\n\n if (!documentId) {\n return documentManager.create(model, {\n data: sanitizedBody,\n ...sanitizedQuery,\n locale,\n });\n }\n\n return documentManager.update(documentId, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n};\n\nexport default {\n async find(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const version = await findDocument(permissionQuery, model, { locale, status });\n\n // allow user with create permission to know a single type is not created\n if (!version) {\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n // Check if document exists\n const document = await strapi.db.query(model).findOne({});\n\n if (!document) {\n return ctx.notFound();\n }\n\n // If the requested locale doesn't exist, return an empty response\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n model,\n // @ts-expect-error - fix types\n { documentId: document.documentId, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n ctx.body = { data: {}, meta };\n return;\n }\n\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async createOrUpdate(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const document = await createOrUpdateDocument(ctx);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.delete()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n const documentLocales = await documentManager.findLocales(undefined, model, {\n populate,\n locale,\n });\n\n if (documentLocales.length === 0) {\n return ctx.notFound();\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n return ctx.forbidden();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales.at(0).documentId, model, {\n locale,\n });\n\n ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n },\n\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.publish()) {\n return ctx.forbidden();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n const document = await createOrUpdateDocument(ctx, { populate });\n\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const { locale } = await getDocumentLocaleAndStatus(document, model);\n const publishResult = await documentManager.publish(document.documentId, model, { locale });\n\n return publishResult.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const {\n body: { discardDraft, ...body },\n query = {},\n } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.unpublish()) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale });\n\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n await strapi.db.transaction(async () => {\n if (discardDraft) {\n await documentManager.discardDraft(document.documentId, model, { locale });\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.unpublish(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n });\n },\n\n async discard(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale, status: 'published' });\n\n // Can not discard a document that is not published\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.discardDraft(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query } = ctx.request;\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const document = await findDocument({}, model);\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.read(document)) {\n return ctx.forbidden();\n }\n\n const number = await documentManager.countDraftRelations(document.documentId, model, locale);\n\n return {\n data: number,\n };\n },\n};\n"],"names":["buildPopulateFromQuery","query","model","getService","populateFromQuery","populateDeep","Infinity","countRelations","build","findDocument","uid","opts","documentManager","populate","findMany","then","documents","createOrUpdateDocument","ctx","user","userAbility","state","params","body","request","permissionChecker","create","cannot","update","errors","ForbiddenError","sanitizedQuery","locale","getDocumentLocaleAndStatus","documentVersion","otherDocumentVersion","Promise","all","status","strapi","db","findOne","select","documentId","pickPermittedFields","sanitizeUpdateInput","sanitizeCreateInput","setCreator","setCreatorFields","isEdition","sanitizeFn","async","pipe","sanitizedBody","data","find","read","forbidden","permissionQuery","version","document","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","sanitizeOutput","createOrUpdate","delete","documentLocales","findLocales","undefined","length","deletedEntity","at","publish","publishedDocument","transaction","NotFoundError","publishResult","unpublish","discardDraft","discard","countDraftRelations","number"],"mappings":"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"}
@@ -25,7 +25,9 @@ const generateUIDInputSchema = strapiUtils.yup.object({
25
25
  const checkUIDAvailabilityInputSchema = strapiUtils.yup.object({
26
26
  contentTypeUID: strapiUtils.yup.string().required(),
27
27
  field: strapiUtils.yup.string().required(),
28
- value: strapiUtils.yup.string().matches(/^[A-Za-z0-9-_.~]*$/).required()
28
+ value: strapiUtils.yup.string().required().test('isValueMatchingRegex', `\${path} must match the custom regex or the default one "/^[A-Za-z0-9-_.~]*$/"`, function(value, context) {
29
+ return value === '' || (context.options.context?.regex ? new RegExp(context.options?.context.regex).test(value) : /^[A-Za-z0-9-_.~]*$/.test(value));
30
+ })
29
31
  });
30
32
  const validateUIDField = (contentTypeUID, field)=>{
31
33
  const model = strapi.contentTypes[contentTypeUID];
@@ -46,7 +48,17 @@ const validateUIDField = (contentTypeUID, field)=>{
46
48
  const validateKind = strapiUtils.validateYupSchema(kindSchema);
47
49
  const validateBulkActionInput = strapiUtils.validateYupSchema(bulkActionInputSchema);
48
50
  const validateGenerateUIDInput = strapiUtils.validateYupSchema(generateUIDInputSchema);
49
- const validateCheckUIDAvailabilityInput = strapiUtils.validateYupSchema(checkUIDAvailabilityInputSchema);
51
+ const validateCheckUIDAvailabilityInput = (body)=>{
52
+ const options = {};
53
+ const contentType = body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;
54
+ if (contentType?.attributes[body.field] && `regex` in contentType.attributes[body.field] && contentType.attributes[body.field].regex) {
55
+ options.context = {
56
+ regex: (contentType?.attributes[body.field]).regex
57
+ };
58
+ }
59
+ const validator = strapiUtils.validateYupSchema(checkUIDAvailabilityInputSchema, options);
60
+ return validator(body);
61
+ };
50
62
 
51
63
  exports.validateBulkActionInput = validateBulkActionInput;
52
64
  exports.validateCheckUIDAvailabilityInput = validateCheckUIDAvailabilityInput;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .matches(/^[A-Za-z0-9-_.~]*$/)\n .required(),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = validateYupSchema(checkUIDAvailabilityInputSchema);\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","matches","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput"],"mappings":";;;;;;;;AAIA,MAAM,EAAEA,eAAe,EAAEC,eAAe,EAAE,GAAGC,kBAAAA;AAC7C,MAAMC,KAAQ,GAAA;AAAC,IAAA,YAAA;AAAc,IAAA;AAAiB,CAAA;AAE9C;;IAGA,MAAMC,aAAaC,eAAIC,CAAAA,MAAM,GAAGC,KAAK,CAACJ,OAAOK,QAAQ,EAAA;AAErD,MAAMC,qBAAAA,GAAwBJ,eAC3BK,CAAAA,MAAM,CAAC;IACNC,WAAaN,EAAAA,eAAAA,CAAIO,KAAK,EAAA,CAAGC,EAAE,CAACR,eAAIS,CAAAA,QAAQ,EAAIC,CAAAA,CAAAA,GAAG,CAAC,CAAA,CAAA,CAAGC,QAAQ;AAC7D,CAAA,CAAA,CACCA,QAAQ,EAAA;AAEX,MAAMC,sBAAAA,GAAyBZ,eAAIK,CAAAA,MAAM,CAAC;IACxCQ,cAAgBb,EAAAA,eAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IACrCG,KAAOd,EAAAA,eAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IAC5BI,IAAMf,EAAAA,eAAAA,CAAIK,MAAM,EAAA,CAAGM,QAAQ;AAC7B,CAAA,CAAA;AAEA,MAAMK,+BAAAA,GAAkChB,eAAIK,CAAAA,MAAM,CAAC;IACjDQ,cAAgBb,EAAAA,eAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IACrCG,KAAOd,EAAAA,eAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;AAC5BM,IAAAA,KAAAA,EAAOjB,gBACJC,MAAM,EAAA,CACNiB,OAAO,CAAC,sBACRP,QAAQ;AACb,CAAA,CAAA;AAEMQ,MAAAA,gBAAAA,GAAmB,CAACN,cAAqBC,EAAAA,KAAAA,GAAAA;AAC7C,IAAA,MAAMM,KAAQC,GAAAA,MAAAA,CAAOC,YAAY,CAACT,cAAe,CAAA;AAEjD,IAAA,IAAI,CAACO,KAAO,EAAA;AACV,QAAA,MAAM,IAAIxB,eAAgB,CAAA,uBAAA,CAAA;AAC5B;AAEA,IAAA,IACE,CAAC2B,CAAAA,CAAEC,GAAG,CAACJ,KAAO,EAAA;AAAC,QAAA,YAAA;AAAcN,QAAAA;KAAM,CACnCS,IAAAA,CAAAA,CAAEE,GAAG,CAACL,KAAO,EAAA;AAAC,QAAA,YAAA;AAAcN,QAAAA,KAAAA;AAAO,QAAA;AAAO,KAAA,CAAA,KAAM,KAChD,EAAA;AACA,QAAA,MAAM,IAAIlB,eAAgB,CAAA,CAAC,EAAEkB,KAAAA,CAAM,kCAAkC,CAAC,CAAA;AACxE;AACF;AAcA,MAAMY,eAAeC,6BAAkB5B,CAAAA,UAAAA;AACvC,MAAM6B,0BAA0BD,6BAAkBvB,CAAAA,qBAAAA;AAClD,MAAMyB,2BAA2BF,6BAAkBf,CAAAA,sBAAAA;AACnD,MAAMkB,oCAAoCH,6BAAkBX,CAAAA,+BAAAA;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport { ValidateOptions } from 'yup/lib/types';\nimport { TestContext } from 'yup';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .required()\n .test(\n 'isValueMatchingRegex',\n `\\${path} must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n function (value, context: TestContext<{ regex?: string }>) {\n return (\n value === '' ||\n (context.options.context?.regex\n ? new RegExp(context.options?.context.regex).test(value as string)\n : /^[A-Za-z0-9-_.~]*$/.test(value as string))\n );\n }\n ),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n const options: ValidateOptions<{ regex?: string }> = {};\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n options.context = {\n regex: (contentType?.attributes[body.field] as Schema.Attribute.UID).regex,\n };\n }\n\n const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);\n\n return validator(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","test","context","options","regex","RegExp","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","validator"],"mappings":"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"}
@@ -23,7 +23,9 @@ const generateUIDInputSchema = yup.object({
23
23
  const checkUIDAvailabilityInputSchema = yup.object({
24
24
  contentTypeUID: yup.string().required(),
25
25
  field: yup.string().required(),
26
- value: yup.string().matches(/^[A-Za-z0-9-_.~]*$/).required()
26
+ value: yup.string().required().test('isValueMatchingRegex', `\${path} must match the custom regex or the default one "/^[A-Za-z0-9-_.~]*$/"`, function(value, context) {
27
+ return value === '' || (context.options.context?.regex ? new RegExp(context.options?.context.regex).test(value) : /^[A-Za-z0-9-_.~]*$/.test(value));
28
+ })
27
29
  });
28
30
  const validateUIDField = (contentTypeUID, field)=>{
29
31
  const model = strapi.contentTypes[contentTypeUID];
@@ -44,7 +46,17 @@ const validateUIDField = (contentTypeUID, field)=>{
44
46
  const validateKind = validateYupSchema(kindSchema);
45
47
  const validateBulkActionInput = validateYupSchema(bulkActionInputSchema);
46
48
  const validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);
47
- const validateCheckUIDAvailabilityInput = validateYupSchema(checkUIDAvailabilityInputSchema);
49
+ const validateCheckUIDAvailabilityInput = (body)=>{
50
+ const options = {};
51
+ const contentType = body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;
52
+ if (contentType?.attributes[body.field] && `regex` in contentType.attributes[body.field] && contentType.attributes[body.field].regex) {
53
+ options.context = {
54
+ regex: (contentType?.attributes[body.field]).regex
55
+ };
56
+ }
57
+ const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);
58
+ return validator(body);
59
+ };
48
60
 
49
61
  export { validateBulkActionInput, validateCheckUIDAvailabilityInput, validateGenerateUIDInput, validateKind, validateUIDField };
50
62
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .matches(/^[A-Za-z0-9-_.~]*$/)\n .required(),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = validateYupSchema(checkUIDAvailabilityInputSchema);\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","matches","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput"],"mappings":";;;;;;AAIA,MAAM,EAAEA,eAAe,EAAEC,eAAe,EAAE,GAAGC,MAAAA;AAC7C,MAAMC,KAAQ,GAAA;AAAC,IAAA,YAAA;AAAc,IAAA;AAAiB,CAAA;AAE9C;;IAGA,MAAMC,aAAaC,GAAIC,CAAAA,MAAM,GAAGC,KAAK,CAACJ,OAAOK,QAAQ,EAAA;AAErD,MAAMC,qBAAAA,GAAwBJ,GAC3BK,CAAAA,MAAM,CAAC;IACNC,WAAaN,EAAAA,GAAAA,CAAIO,KAAK,EAAA,CAAGC,EAAE,CAACR,GAAIS,CAAAA,QAAQ,EAAIC,CAAAA,CAAAA,GAAG,CAAC,CAAA,CAAA,CAAGC,QAAQ;AAC7D,CAAA,CAAA,CACCA,QAAQ,EAAA;AAEX,MAAMC,sBAAAA,GAAyBZ,GAAIK,CAAAA,MAAM,CAAC;IACxCQ,cAAgBb,EAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IACrCG,KAAOd,EAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IAC5BI,IAAMf,EAAAA,GAAAA,CAAIK,MAAM,EAAA,CAAGM,QAAQ;AAC7B,CAAA,CAAA;AAEA,MAAMK,+BAAAA,GAAkChB,GAAIK,CAAAA,MAAM,CAAC;IACjDQ,cAAgBb,EAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IACrCG,KAAOd,EAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;AAC5BM,IAAAA,KAAAA,EAAOjB,IACJC,MAAM,EAAA,CACNiB,OAAO,CAAC,sBACRP,QAAQ;AACb,CAAA,CAAA;AAEMQ,MAAAA,gBAAAA,GAAmB,CAACN,cAAqBC,EAAAA,KAAAA,GAAAA;AAC7C,IAAA,MAAMM,KAAQC,GAAAA,MAAAA,CAAOC,YAAY,CAACT,cAAe,CAAA;AAEjD,IAAA,IAAI,CAACO,KAAO,EAAA;AACV,QAAA,MAAM,IAAIxB,eAAgB,CAAA,uBAAA,CAAA;AAC5B;AAEA,IAAA,IACE,CAAC2B,CAAAA,CAAEC,GAAG,CAACJ,KAAO,EAAA;AAAC,QAAA,YAAA;AAAcN,QAAAA;KAAM,CACnCS,IAAAA,CAAAA,CAAEE,GAAG,CAACL,KAAO,EAAA;AAAC,QAAA,YAAA;AAAcN,QAAAA,KAAAA;AAAO,QAAA;AAAO,KAAA,CAAA,KAAM,KAChD,EAAA;AACA,QAAA,MAAM,IAAIlB,eAAgB,CAAA,CAAC,EAAEkB,KAAAA,CAAM,kCAAkC,CAAC,CAAA;AACxE;AACF;AAcA,MAAMY,eAAeC,iBAAkB5B,CAAAA,UAAAA;AACvC,MAAM6B,0BAA0BD,iBAAkBvB,CAAAA,qBAAAA;AAClD,MAAMyB,2BAA2BF,iBAAkBf,CAAAA,sBAAAA;AACnD,MAAMkB,oCAAoCH,iBAAkBX,CAAAA,+BAAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport { ValidateOptions } from 'yup/lib/types';\nimport { TestContext } from 'yup';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .required()\n .test(\n 'isValueMatchingRegex',\n `\\${path} must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n function (value, context: TestContext<{ regex?: string }>) {\n return (\n value === '' ||\n (context.options.context?.regex\n ? new RegExp(context.options?.context.regex).test(value as string)\n : /^[A-Za-z0-9-_.~]*$/.test(value as string))\n );\n }\n ),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n const options: ValidateOptions<{ regex?: string }> = {};\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n options.context = {\n regex: (contentType?.attributes[body.field] as Schema.Attribute.UID).regex,\n };\n }\n\n const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);\n\n return validator(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","test","context","options","regex","RegExp","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","validator"],"mappings":"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"}
@@ -2,7 +2,6 @@
2
2
 
3
3
  var strapiUtils = require('@strapi/utils');
4
4
  var fp = require('lodash/fp');
5
- var nodeSchedule = require('node-schedule');
6
5
  var utils$1 = require('../utils.js');
7
6
  var constants = require('../constants.js');
8
7
  var utils = require('./utils.js');
@@ -58,7 +57,6 @@ var utils = require('./utils.js');
58
57
  };
59
58
  const createLifecyclesService = ({ strapi: strapi1 })=>{
60
59
  const state = {
61
- deleteExpiredJob: null,
62
60
  isInitialized: false
63
61
  };
64
62
  const serviceUtils = utils.createServiceUtils({
@@ -127,27 +125,30 @@ const createLifecyclesService = ({ strapi: strapi1 })=>{
127
125
  return result;
128
126
  });
129
127
  // Schedule a job to delete expired history versions every day at midnight
130
- state.deleteExpiredJob = nodeSchedule.scheduleJob('historyDaily', '0 0 * * *', ()=>{
131
- const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;
132
- const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
133
- strapi1.db.query(constants.HISTORY_VERSION_UID).deleteMany({
134
- where: {
135
- created_at: {
136
- $lt: expirationDate
137
- }
138
- }
139
- }).catch((error)=>{
140
- if (error instanceof Error) {
141
- strapi1.log.error('Error deleting expired history versions', error.message);
142
- }
143
- });
128
+ strapi1.cron.add({
129
+ deleteHistoryDaily: {
130
+ async task () {
131
+ const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;
132
+ const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
133
+ strapi1.db.query(constants.HISTORY_VERSION_UID).deleteMany({
134
+ where: {
135
+ created_at: {
136
+ $lt: expirationDate
137
+ }
138
+ }
139
+ }).catch((error)=>{
140
+ if (error instanceof Error) {
141
+ strapi1.log.error('Error deleting expired history versions', error.message);
142
+ }
143
+ });
144
+ },
145
+ options: '0 0 * * *'
146
+ }
144
147
  });
145
148
  state.isInitialized = true;
146
149
  },
147
150
  async destroy () {
148
- if (state.deleteExpiredJob) {
149
- state.deleteExpiredJob.cancel();
150
- }
151
+ strapi1.cron.remove('deleteHistoryDaily');
151
152
  }
152
153
  };
153
154
  };
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.js","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { scheduleJob } from 'node-schedule';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n deleteExpiredJob: ReturnType<typeof scheduleJob> | null;\n isInitialized: boolean;\n } = {\n deleteExpiredJob: null,\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n state.deleteExpiredJob = scheduleJob('historyDaily', '0 0 * * *', () => {\n const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n strapi.db\n .query(HISTORY_VERSION_UID)\n .deleteMany({\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n })\n .catch((error) => {\n if (error instanceof Error) {\n strapi.log.error('Error deleting expired history versions', error.message);\n }\n });\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n if (state.deleteExpiredJob) {\n state.deleteExpiredJob.cancel();\n }\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","deleteExpiredJob","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","scheduleJob","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","HISTORY_VERSION_UID","deleteMany","created_at","$lt","catch","error","Error","log","message","destroy","cancel"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycles.js","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n strapi.db\n .query(HISTORY_VERSION_UID)\n .deleteMany({\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n })\n .catch((error) => {\n if (error instanceof Error) {\n strapi.log.error('Error deleting expired history versions', error.message);\n }\n });\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","HISTORY_VERSION_UID","deleteMany","created_at","$lt","catch","error","Error","log","message","options","destroy","remove"],"mappings":";;;;;;;;AAWA;;IAGA,MAAMA,6BAA6B,CACjCC,OAAAA,GAAAA;;IAMA,IAAI,CAACC,OAAOC,cAAc,CAACC,GAAG,EAAIC,EAAAA,OAAAA,CAAQC,GAAIC,CAAAA,UAAAA,CAAW,kBAAqB,CAAA,EAAA;QAC5E,OAAO,KAAA;AACT;;IAGA,IACEN,OAAAA,CAAQO,MAAM,KAAK,QAAA,IACnBP,QAAQO,MAAM,KAAK,QACnBP,IAAAA,OAAAA,CAAQO,MAAM,KAAK,WACnBP,OAAQO,CAAAA,MAAM,KAAK,SAAA,IACnBP,OAAQO,CAAAA,MAAM,KAAK,WACnBP,IAAAA,OAAAA,CAAQO,MAAM,KAAK,cACnB,EAAA;QACA,OAAO,KAAA;AACT;AAEA;;;;;AAKC,MACD,IACEP,OAAAA,CAAQO,MAAM,KAAK,QACnBN,IAAAA,MAAAA,CAAOC,cAAc,CAACC,GAAG,EAAA,EAAIC,OAAQC,CAAAA,GAAAA,CAAIG,SAAS,kBAClD,CAAA,EAAA;QACA,OAAO,KAAA;AACT;;IAGA,IAAI,CAACR,QAAQS,WAAW,CAACC,GAAG,CAACJ,UAAU,CAAC,OAAU,CAAA,EAAA;QAChD,OAAO,KAAA;AACT;IAEA,OAAO,IAAA;AACT,CAAA;AAEA;;;;IAKA,MAAMK,aAAa,CAACD,GAAAA,GAAAA;AAClB,IAAA,MAAME,gBAAmBX,GAAAA,MAAAA,CAAOY,QAAQ,CAACH,KAAKI,UAAU;;IAGxD,MAAMC,iBAAAA,GAAoBC,OAAOC,IAAI,CAACL,kBAAkBM,MAAM,CAC5D,CAACC,uBAAyBC,EAAAA,GAAAA,GAAAA;QACxB,MAAMC,WAAAA,GAAcT,gBAAgB,CAACQ,GAAI,CAAA;QAEzC,IAAIC,WAAAA,CAAYC,IAAI,KAAK,WAAa,EAAA;AACpC,YAAA,MAAMC,kBAAkBtB,MAAOY,CAAAA,QAAQ,CAACQ,WAAYG,CAAAA,SAAS,EAAEV,UAAU;YACzE,OAAO;AACL,gBAAA,GAAGK,uBAAuB;gBAC1B,CAACE,WAAAA,CAAYG,SAAS,GAAGD;AAC3B,aAAA;AACF;;QAGA,OAAOJ,uBAAAA;AACT,KAAA,EACA,EAAC,CAAA;IAGH,OAAO;AACLM,QAAAA,MAAAA,EAAQC,QAAKC,0BAAkBf,EAAAA,gBAAAA,CAAAA;AAC/BG,QAAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAMa,uBAA0B,GAAA,CAAC,EAAE3B,MAAAA,EAAAA,OAAM,EAA2B,GAAA;AAClE,IAAA,MAAM4B,KAEF,GAAA;QACFC,aAAe,EAAA;AACjB,KAAA;AAEA,IAAA,MAAMC,eAAeC,wBAAmB,CAAA;QAAE/B,MAAAA,EAAAA;AAAO,KAAA,CAAA;AACjD,IAAA,MAAM,EAAEgC,uBAAuB,EAAE,GAAGhC,OAAAA,CAAOiC,OAAO,CAAC,uBAAA,CAAA;IAEnD,OAAO;QACL,MAAMC,SAAAA,CAAAA,GAAAA;;YAEJ,IAAIN,KAAAA,CAAMC,aAAa,EAAE;AACvB,gBAAA;AACF;;AAGA,YAAA,MAAMG,uBAAwB,CAAA,yBAAA,CAAA;AAE9BhC,YAAAA,OAAAA,CAAOmC,SAAS,CAACC,GAAG,CAAC,OAAOrC,OAASsC,EAAAA,IAAAA,GAAAA;AACnC,gBAAA,MAAMC,SAAU,MAAMD,IAAAA,EAAAA;gBAEtB,IAAI,CAACvC,2BAA2BC,OAAU,CAAA,EAAA;oBACxC,OAAOuC,MAAAA;AACT;;AAGA,gBAAA,MAAMC,UACJxC,GAAAA,OAAAA,CAAQO,MAAM,KAAK,YAAYP,OAAQO,CAAAA,MAAM,KAAK,OAAA,GAC9CgC,OAAOC,UAAU,GACjBxC,OAAQyC,CAAAA,MAAM,CAACD,UAAU;;gBAG/B,MAAME,aAAAA,GAAgB,MAAMX,YAAAA,CAAaY,gBAAgB,EAAA;AACzD,gBAAA,MAAMC,OAAUC,GAAAA,YAAAA,CAAU7C,OAAQyC,CAAAA,MAAM,EAAEK,MAAUJ,IAAAA,aAAAA,CAAAA;gBACpD,IAAI,CAACE,OAAQG,CAAAA,MAAM,EAAE;oBACnB,OAAOR,MAAAA;AACT;;AAGA,gBAAA,MAAM7B,GAAMV,GAAAA,OAAAA,CAAQS,WAAW,CAACC,GAAG;AACnC,gBAAA,MAAMsC,UAAUrC,UAAWD,CAAAA,GAAAA,CAAAA;gBAC3B,MAAMuC,KAAAA,GAAQhD,OAAOY,CAAAA,QAAQ,CAACH,GAAAA,CAAAA;gBAE9B,MAAMwC,sBAAAA,GAAyBnB,YAAamB,CAAAA,sBAAsB,CAACD,KAAAA,CAAAA;;gBAGnE,MAAME,aAAAA,GAAgB,MAAMlD,OAAOmD,CAAAA,EAAE,CAACC,KAAK,CAAC3C,GAAK4C,CAAAA,CAAAA,QAAQ,CAAC;oBACxDC,KAAO,EAAA;AACLf,wBAAAA,UAAAA;AACA,wBAAA,GAAIU,sBAAyB,GAAA;4BAAEJ,MAAQ,EAAA;gCAAEU,GAAKZ,EAAAA;AAAQ;AAAE,yBAAA,GAAI,EAAE;AAC9D,wBAAA,GAAIa,yBAAaC,kBAAkB,CAACzD,QAAOwD,YAAY,CAAC/C,IAAI,CACxD,GAAA;4BAAEiD,WAAa,EAAA;AAAK,yBAAA,GACpB;AACN,qBAAA;oBACAC,QAAU7B,EAAAA,YAAAA,CAAa8B,eAAe,CAACnD,GAAK,EAAA,IAAA;AAC9C,iBAAA,CAAA;gBAEA,MAAMT,OAAAA,CAAOmD,EAAE,CAACU,WAAW,CAAC,OAAO,EAAEC,QAAQ,EAAE,GAAA;;;;oBAI7CA,QAAS,CAAA,UAAA;wBACP,KAAK,MAAMC,SAASb,aAAe,CAAA;AACjC,4BAAA,MAAMc,MAAS,GAAA,MAAMlC,YAAamC,CAAAA,gBAAgB,CAACxD,GAAKsD,EAAAA,KAAAA,CAAAA;AAExD,4BAAA,MAAMG,kBAAWlE,CAAAA,OAAAA,EAAQ,SAAWmE,CAAAA,CAAAA,aAAa,CAAC;gCAChD3D,WAAaC,EAAAA,GAAAA;AACb2D,gCAAAA,IAAAA,EAAM3C,QAAKC,0BAAkBqC,EAAAA,KAAAA,CAAAA;gCAC7BM,iBAAmB9B,EAAAA,UAAAA;AACnBM,gCAAAA,MAAAA,EAAQkB,MAAMlB,MAAM;AACpBmB,gCAAAA,MAAAA;AACA,gCAAA,GAAGjB;AACL,6BAAA,CAAA;AACF;AACF,qBAAA,CAAA;AACF,iBAAA,CAAA;gBAEA,OAAOT,MAAAA;AACT,aAAA,CAAA;;YAGAtC,OAAOsE,CAAAA,IAAI,CAACC,GAAG,CAAC;gBACdC,kBAAoB,EAAA;oBAClB,MAAMC,IAAAA,CAAAA,GAAAA;AACJ,wBAAA,MAAMC,8BACJ5C,YAAa6C,CAAAA,gBAAgB,EAAK,GAAA,EAAA,GAAK,KAAK,EAAK,GAAA,IAAA;AACnD,wBAAA,MAAMC,cAAiB,GAAA,IAAIC,IAAKA,CAAAA,IAAAA,CAAKC,GAAG,EAAKJ,GAAAA,2BAAAA,CAAAA;AAE7C1E,wBAAAA,OAAAA,CAAOmD,EAAE,CACNC,KAAK,CAAC2B,6BAAAA,CAAAA,CACNC,UAAU,CAAC;4BACV1B,KAAO,EAAA;gCACL2B,UAAY,EAAA;oCACVC,GAAKN,EAAAA;AACP;AACF;yBAEDO,CAAAA,CAAAA,KAAK,CAAC,CAACC,KAAAA,GAAAA;AACN,4BAAA,IAAIA,iBAAiBC,KAAO,EAAA;AAC1BrF,gCAAAA,OAAAA,CAAOsF,GAAG,CAACF,KAAK,CAAC,yCAAA,EAA2CA,MAAMG,OAAO,CAAA;AAC3E;AACF,yBAAA,CAAA;AACJ,qBAAA;oBACAC,OAAS,EAAA;AACX;AACF,aAAA,CAAA;AAEA5D,YAAAA,KAAAA,CAAMC,aAAa,GAAG,IAAA;AACxB,SAAA;QAEA,MAAM4D,OAAAA,CAAAA,GAAAA;YACJzF,OAAOsE,CAAAA,IAAI,CAACoB,MAAM,CAAC,oBAAA,CAAA;AACrB;AACF,KAAA;AACF;;;;"}
@@ -1,6 +1,5 @@
1
1
  import { contentTypes } from '@strapi/utils';
2
2
  import { castArray, omit } from 'lodash/fp';
3
- import { scheduleJob } from 'node-schedule';
4
3
  import { getService } from '../utils.mjs';
5
4
  import { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants.mjs';
6
5
  import { createServiceUtils } from './utils.mjs';
@@ -56,7 +55,6 @@ import { createServiceUtils } from './utils.mjs';
56
55
  };
57
56
  const createLifecyclesService = ({ strapi: strapi1 })=>{
58
57
  const state = {
59
- deleteExpiredJob: null,
60
58
  isInitialized: false
61
59
  };
62
60
  const serviceUtils = createServiceUtils({
@@ -125,27 +123,30 @@ const createLifecyclesService = ({ strapi: strapi1 })=>{
125
123
  return result;
126
124
  });
127
125
  // Schedule a job to delete expired history versions every day at midnight
128
- state.deleteExpiredJob = scheduleJob('historyDaily', '0 0 * * *', ()=>{
129
- const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;
130
- const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
131
- strapi1.db.query(HISTORY_VERSION_UID).deleteMany({
132
- where: {
133
- created_at: {
134
- $lt: expirationDate
135
- }
136
- }
137
- }).catch((error)=>{
138
- if (error instanceof Error) {
139
- strapi1.log.error('Error deleting expired history versions', error.message);
140
- }
141
- });
126
+ strapi1.cron.add({
127
+ deleteHistoryDaily: {
128
+ async task () {
129
+ const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;
130
+ const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
131
+ strapi1.db.query(HISTORY_VERSION_UID).deleteMany({
132
+ where: {
133
+ created_at: {
134
+ $lt: expirationDate
135
+ }
136
+ }
137
+ }).catch((error)=>{
138
+ if (error instanceof Error) {
139
+ strapi1.log.error('Error deleting expired history versions', error.message);
140
+ }
141
+ });
142
+ },
143
+ options: '0 0 * * *'
144
+ }
142
145
  });
143
146
  state.isInitialized = true;
144
147
  },
145
148
  async destroy () {
146
- if (state.deleteExpiredJob) {
147
- state.deleteExpiredJob.cancel();
148
- }
149
+ strapi1.cron.remove('deleteHistoryDaily');
149
150
  }
150
151
  };
151
152
  };
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.mjs","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { scheduleJob } from 'node-schedule';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n deleteExpiredJob: ReturnType<typeof scheduleJob> | null;\n isInitialized: boolean;\n } = {\n deleteExpiredJob: null,\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n state.deleteExpiredJob = scheduleJob('historyDaily', '0 0 * * *', () => {\n const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n strapi.db\n .query(HISTORY_VERSION_UID)\n .deleteMany({\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n })\n .catch((error) => {\n if (error instanceof Error) {\n strapi.log.error('Error deleting expired history versions', error.message);\n }\n });\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n if (state.deleteExpiredJob) {\n state.deleteExpiredJob.cancel();\n }\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","deleteExpiredJob","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","scheduleJob","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","HISTORY_VERSION_UID","deleteMany","created_at","$lt","catch","error","Error","log","message","destroy","cancel"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycles.mjs","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n strapi.db\n .query(HISTORY_VERSION_UID)\n .deleteMany({\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n })\n .catch((error) => {\n if (error instanceof Error) {\n strapi.log.error('Error deleting expired history versions', error.message);\n }\n });\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","HISTORY_VERSION_UID","deleteMany","created_at","$lt","catch","error","Error","log","message","options","destroy","remove"],"mappings":"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"}
@@ -49,6 +49,11 @@ const createHomepageController = ()=>{
49
49
  return {
50
50
  data: await homepageService.getRecentlyUpdatedDocuments()
51
51
  };
52
+ },
53
+ async getCountDocuments () {
54
+ return {
55
+ data: await homepageService.getCountDocuments()
56
+ };
52
57
  }
53
58
  };
54
59
  };
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,cACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,cAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,kBAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n async getCountDocuments(): Promise<GetCountDocuments.Response> {\n return { data: await homepageService.getCountDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments","getCountDocuments"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,cACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,cAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,kBAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE,SAAA;QACA,MAAMC,iBAAAA,CAAAA,GAAAA;YACJ,OAAO;gBAAEH,IAAM,EAAA,MAAMpB,gBAAgBuB,iBAAiB;AAAG,aAAA;AAC3D;AACF,KAAA;AACF;;;;"}
@@ -28,6 +28,11 @@ const createHomepageController = ()=>{
28
28
  return {
29
29
  data: await homepageService.getRecentlyUpdatedDocuments()
30
30
  };
31
+ },
32
+ async getCountDocuments () {
33
+ return {
34
+ data: await homepageService.getCountDocuments()
35
+ };
31
36
  }
32
37
  };
33
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments"],"mappings":";;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,GACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,GAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,MAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n async getCountDocuments(): Promise<GetCountDocuments.Response> {\n return { data: await homepageService.getCountDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments","getCountDocuments"],"mappings":";;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,GACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,GAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,MAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE,SAAA;QACA,MAAMC,iBAAAA,CAAAA,GAAAA;YACJ,OAAO;gBAAEH,IAAM,EAAA,MAAMpB,gBAAgBuB,iBAAiB;AAAG,aAAA;AAC3D;AACF,KAAA;AACF;;;;"}
@@ -17,6 +17,17 @@ const homepageRouter = {
17
17
  'admin::isAuthenticatedAdmin'
18
18
  ]
19
19
  }
20
+ },
21
+ {
22
+ method: 'GET',
23
+ info,
24
+ path: '/homepage/count-documents',
25
+ handler: 'homepage.getCountDocuments',
26
+ config: {
27
+ policies: [
28
+ 'admin::isAuthenticatedAdmin'
29
+ ]
30
+ }
20
31
  }
21
32
  ]
22
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/routes/homepage.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nconst info = { pluginName: 'content-manager', type: 'admin' };\n\nconst homepageRouter: Plugin.LoadedPlugin['routes'][string] = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n info,\n path: '/homepage/recent-documents',\n handler: 'homepage.getRecentDocuments',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n\nexport { homepageRouter };\n"],"names":["info","pluginName","type","homepageRouter","routes","method","path","handler","config","policies"],"mappings":";;AAEA,MAAMA,IAAO,GAAA;IAAEC,UAAY,EAAA,iBAAA;IAAmBC,IAAM,EAAA;AAAQ,CAAA;AAE5D,MAAMC,cAAwD,GAAA;IAC5DD,IAAM,EAAA,OAAA;IACNE,MAAQ,EAAA;AACN,QAAA;YACEC,MAAQ,EAAA,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAM,EAAA,4BAAA;YACNC,OAAS,EAAA,6BAAA;YACTC,MAAQ,EAAA;gBACNC,QAAU,EAAA;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH;;;;"}
1
+ {"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/routes/homepage.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nconst info = { pluginName: 'content-manager', type: 'admin' };\n\nconst homepageRouter: Plugin.LoadedPlugin['routes'][string] = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n info,\n path: '/homepage/recent-documents',\n handler: 'homepage.getRecentDocuments',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n info,\n path: '/homepage/count-documents',\n handler: 'homepage.getCountDocuments',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n\nexport { homepageRouter };\n"],"names":["info","pluginName","type","homepageRouter","routes","method","path","handler","config","policies"],"mappings":";;AAEA,MAAMA,IAAO,GAAA;IAAEC,UAAY,EAAA,iBAAA;IAAmBC,IAAM,EAAA;AAAQ,CAAA;AAE5D,MAAMC,cAAwD,GAAA;IAC5DD,IAAM,EAAA,OAAA;IACNE,MAAQ,EAAA;AACN,QAAA;YACEC,MAAQ,EAAA,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAM,EAAA,4BAAA;YACNC,OAAS,EAAA,6BAAA;YACTC,MAAQ,EAAA;gBACNC,QAAU,EAAA;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAQ,EAAA,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAM,EAAA,2BAAA;YACNC,OAAS,EAAA,4BAAA;YACTC,MAAQ,EAAA;gBACNC,QAAU,EAAA;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH;;;;"}