@strapi/content-releases 0.0.0-next.f5312617ca16b870c2bf1adcea2c69b676979e29 → 0.0.0-next.f5d21551ed005f524bfc4760b274f1be154e26a8

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 (321) hide show
  1. package/dist/admin/assets/purchase-page-illustration-dark.svg.js +6 -0
  2. package/dist/admin/assets/purchase-page-illustration-dark.svg.js.map +1 -0
  3. package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs +4 -0
  4. package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs.map +1 -0
  5. package/dist/admin/assets/purchase-page-illustration-light.svg.js +6 -0
  6. package/dist/admin/assets/purchase-page-illustration-light.svg.js.map +1 -0
  7. package/dist/admin/assets/purchase-page-illustration-light.svg.mjs +4 -0
  8. package/dist/admin/assets/purchase-page-illustration-light.svg.mjs.map +1 -0
  9. package/dist/admin/components/EntryValidationPopover.js +310 -0
  10. package/dist/admin/components/EntryValidationPopover.js.map +1 -0
  11. package/dist/admin/components/EntryValidationPopover.mjs +308 -0
  12. package/dist/admin/components/EntryValidationPopover.mjs.map +1 -0
  13. package/dist/admin/components/RelativeTime.js +76 -0
  14. package/dist/admin/components/RelativeTime.js.map +1 -0
  15. package/dist/admin/components/RelativeTime.mjs +55 -0
  16. package/dist/admin/components/RelativeTime.mjs.map +1 -0
  17. package/dist/admin/components/ReleaseAction.js +203 -0
  18. package/dist/admin/components/ReleaseAction.js.map +1 -0
  19. package/dist/admin/components/ReleaseAction.mjs +201 -0
  20. package/dist/admin/components/ReleaseAction.mjs.map +1 -0
  21. package/dist/admin/components/ReleaseActionMenu.js +194 -0
  22. package/dist/admin/components/ReleaseActionMenu.js.map +1 -0
  23. package/dist/admin/components/ReleaseActionMenu.mjs +173 -0
  24. package/dist/admin/components/ReleaseActionMenu.mjs.map +1 -0
  25. package/dist/admin/components/ReleaseActionModal.js +268 -0
  26. package/dist/admin/components/ReleaseActionModal.js.map +1 -0
  27. package/dist/admin/components/ReleaseActionModal.mjs +244 -0
  28. package/dist/admin/components/ReleaseActionModal.mjs.map +1 -0
  29. package/dist/admin/components/ReleaseActionOptions.js +104 -0
  30. package/dist/admin/components/ReleaseActionOptions.js.map +1 -0
  31. package/dist/admin/components/ReleaseActionOptions.mjs +102 -0
  32. package/dist/admin/components/ReleaseActionOptions.mjs.map +1 -0
  33. package/dist/admin/components/ReleaseListCell.js +103 -0
  34. package/dist/admin/components/ReleaseListCell.js.map +1 -0
  35. package/dist/admin/components/ReleaseListCell.mjs +100 -0
  36. package/dist/admin/components/ReleaseListCell.mjs.map +1 -0
  37. package/dist/admin/components/ReleaseModal.js +323 -0
  38. package/dist/admin/components/ReleaseModal.js.map +1 -0
  39. package/dist/admin/components/ReleaseModal.mjs +302 -0
  40. package/dist/admin/components/ReleaseModal.mjs.map +1 -0
  41. package/dist/admin/components/ReleasesPanel.js +138 -0
  42. package/dist/admin/components/ReleasesPanel.js.map +1 -0
  43. package/dist/admin/components/ReleasesPanel.mjs +136 -0
  44. package/dist/admin/components/ReleasesPanel.mjs.map +1 -0
  45. package/dist/admin/components/Widgets.js +122 -0
  46. package/dist/admin/components/Widgets.js.map +1 -0
  47. package/dist/admin/components/Widgets.mjs +120 -0
  48. package/dist/admin/components/Widgets.mjs.map +1 -0
  49. package/dist/admin/constants.js +79 -0
  50. package/dist/admin/constants.js.map +1 -0
  51. package/dist/admin/constants.mjs +76 -0
  52. package/dist/admin/constants.mjs.map +1 -0
  53. package/dist/admin/index.js +148 -4
  54. package/dist/admin/index.js.map +1 -1
  55. package/dist/admin/index.mjs +143 -4
  56. package/dist/admin/index.mjs.map +1 -1
  57. package/dist/admin/modules/hooks.js +8 -0
  58. package/dist/admin/modules/hooks.js.map +1 -0
  59. package/dist/admin/modules/hooks.mjs +6 -0
  60. package/dist/admin/modules/hooks.mjs.map +1 -0
  61. package/dist/admin/pages/App.js +29 -0
  62. package/dist/admin/pages/App.js.map +1 -0
  63. package/dist/admin/pages/App.mjs +27 -0
  64. package/dist/admin/pages/App.mjs.map +1 -0
  65. package/dist/admin/pages/PurchaseContentReleases.js +192 -0
  66. package/dist/admin/pages/PurchaseContentReleases.js.map +1 -0
  67. package/dist/admin/pages/PurchaseContentReleases.mjs +190 -0
  68. package/dist/admin/pages/PurchaseContentReleases.mjs.map +1 -0
  69. package/dist/admin/pages/ReleaseDetailsPage.js +772 -0
  70. package/dist/admin/pages/ReleaseDetailsPage.js.map +1 -0
  71. package/dist/admin/pages/ReleaseDetailsPage.mjs +751 -0
  72. package/dist/admin/pages/ReleaseDetailsPage.mjs.map +1 -0
  73. package/dist/admin/pages/ReleasesPage.js +403 -0
  74. package/dist/admin/pages/ReleasesPage.js.map +1 -0
  75. package/dist/admin/pages/ReleasesPage.mjs +381 -0
  76. package/dist/admin/pages/ReleasesPage.mjs.map +1 -0
  77. package/dist/admin/pages/ReleasesSettingsPage.js +225 -0
  78. package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -0
  79. package/dist/admin/pages/ReleasesSettingsPage.mjs +223 -0
  80. package/dist/admin/pages/ReleasesSettingsPage.mjs.map +1 -0
  81. package/dist/admin/pluginId.js +6 -0
  82. package/dist/admin/pluginId.js.map +1 -0
  83. package/dist/admin/pluginId.mjs +4 -0
  84. package/dist/admin/pluginId.mjs.map +1 -0
  85. package/dist/admin/services/homepage.js +24 -0
  86. package/dist/admin/services/homepage.js.map +1 -0
  87. package/dist/admin/services/homepage.mjs +22 -0
  88. package/dist/admin/services/homepage.mjs.map +1 -0
  89. package/dist/admin/services/release.js +474 -0
  90. package/dist/admin/services/release.js.map +1 -0
  91. package/dist/admin/services/release.mjs +457 -0
  92. package/dist/admin/services/release.mjs.map +1 -0
  93. package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
  94. package/dist/admin/src/components/ReleaseListCell.d.ts +1 -1
  95. package/dist/admin/src/components/Widgets.d.ts +2 -0
  96. package/dist/admin/src/constants.d.ts +1 -0
  97. package/dist/admin/src/services/homepage.d.ts +9 -0
  98. package/dist/admin/src/services/release.d.ts +28 -28
  99. package/dist/admin/store/hooks.js +8 -0
  100. package/dist/admin/store/hooks.js.map +1 -0
  101. package/dist/admin/store/hooks.mjs +6 -0
  102. package/dist/admin/store/hooks.mjs.map +1 -0
  103. package/dist/admin/translations/en.json.js +111 -0
  104. package/dist/admin/translations/en.json.js.map +1 -0
  105. package/dist/admin/translations/en.json.mjs +109 -0
  106. package/dist/admin/translations/en.json.mjs.map +1 -0
  107. package/dist/admin/translations/uk.json.js +103 -0
  108. package/dist/admin/translations/uk.json.js.map +1 -0
  109. package/dist/admin/translations/uk.json.mjs +101 -0
  110. package/dist/admin/translations/uk.json.mjs.map +1 -0
  111. package/dist/admin/utils/api.js +8 -0
  112. package/dist/admin/utils/api.js.map +1 -0
  113. package/dist/admin/utils/api.mjs +6 -0
  114. package/dist/admin/utils/api.mjs.map +1 -0
  115. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  116. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  117. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  118. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  119. package/dist/admin/utils/time.js +42 -0
  120. package/dist/admin/utils/time.js.map +1 -0
  121. package/dist/admin/utils/time.mjs +39 -0
  122. package/dist/admin/utils/time.mjs.map +1 -0
  123. package/dist/admin/validation/schemas.js +65 -0
  124. package/dist/admin/validation/schemas.js.map +1 -0
  125. package/dist/admin/validation/schemas.mjs +43 -0
  126. package/dist/admin/validation/schemas.mjs.map +1 -0
  127. package/dist/server/bootstrap.js +68 -0
  128. package/dist/server/bootstrap.js.map +1 -0
  129. package/dist/server/bootstrap.mjs +66 -0
  130. package/dist/server/bootstrap.mjs.map +1 -0
  131. package/dist/server/constants.js +74 -0
  132. package/dist/server/constants.js.map +1 -0
  133. package/dist/server/constants.mjs +69 -0
  134. package/dist/server/constants.mjs.map +1 -0
  135. package/dist/server/content-types/index.js +12 -0
  136. package/dist/server/content-types/index.js.map +1 -0
  137. package/dist/server/content-types/index.mjs +10 -0
  138. package/dist/server/content-types/index.mjs.map +1 -0
  139. package/dist/server/content-types/release/index.js +10 -0
  140. package/dist/server/content-types/release/index.js.map +1 -0
  141. package/dist/server/content-types/release/index.mjs +8 -0
  142. package/dist/server/content-types/release/index.mjs.map +1 -0
  143. package/dist/server/content-types/release/schema.js +58 -0
  144. package/dist/server/content-types/release/schema.js.map +1 -0
  145. package/dist/server/content-types/release/schema.mjs +56 -0
  146. package/dist/server/content-types/release/schema.mjs.map +1 -0
  147. package/dist/server/content-types/release-action/index.js +10 -0
  148. package/dist/server/content-types/release-action/index.js.map +1 -0
  149. package/dist/server/content-types/release-action/index.mjs +8 -0
  150. package/dist/server/content-types/release-action/index.mjs.map +1 -0
  151. package/dist/server/content-types/release-action/schema.js +55 -0
  152. package/dist/server/content-types/release-action/schema.js.map +1 -0
  153. package/dist/server/content-types/release-action/schema.mjs +53 -0
  154. package/dist/server/content-types/release-action/schema.mjs.map +1 -0
  155. package/dist/server/controllers/homepage.js +15 -0
  156. package/dist/server/controllers/homepage.js.map +1 -0
  157. package/dist/server/controllers/homepage.mjs +13 -0
  158. package/dist/server/controllers/homepage.mjs.map +1 -0
  159. package/dist/server/controllers/index.js +16 -0
  160. package/dist/server/controllers/index.js.map +1 -0
  161. package/dist/server/controllers/index.mjs +14 -0
  162. package/dist/server/controllers/index.mjs.map +1 -0
  163. package/dist/server/controllers/release-action.js +150 -0
  164. package/dist/server/controllers/release-action.js.map +1 -0
  165. package/dist/server/controllers/release-action.mjs +148 -0
  166. package/dist/server/controllers/release-action.mjs.map +1 -0
  167. package/dist/server/controllers/release.js +302 -0
  168. package/dist/server/controllers/release.js.map +1 -0
  169. package/dist/server/controllers/release.mjs +300 -0
  170. package/dist/server/controllers/release.mjs.map +1 -0
  171. package/dist/server/controllers/settings.js +37 -0
  172. package/dist/server/controllers/settings.js.map +1 -0
  173. package/dist/server/controllers/settings.mjs +35 -0
  174. package/dist/server/controllers/settings.mjs.map +1 -0
  175. package/dist/server/controllers/validation/release-action.js +34 -0
  176. package/dist/server/controllers/validation/release-action.js.map +1 -0
  177. package/dist/server/controllers/validation/release-action.mjs +30 -0
  178. package/dist/server/controllers/validation/release-action.mjs.map +1 -0
  179. package/dist/server/controllers/validation/release.js +26 -0
  180. package/dist/server/controllers/validation/release.js.map +1 -0
  181. package/dist/server/controllers/validation/release.mjs +22 -0
  182. package/dist/server/controllers/validation/release.mjs.map +1 -0
  183. package/dist/server/controllers/validation/settings.js +32 -0
  184. package/dist/server/controllers/validation/settings.js.map +1 -0
  185. package/dist/server/controllers/validation/settings.mjs +10 -0
  186. package/dist/server/controllers/validation/settings.mjs.map +1 -0
  187. package/dist/server/destroy.js +15 -0
  188. package/dist/server/destroy.js.map +1 -0
  189. package/dist/server/destroy.mjs +13 -0
  190. package/dist/server/destroy.mjs.map +1 -0
  191. package/dist/server/index.js +25 -1984
  192. package/dist/server/index.js.map +1 -1
  193. package/dist/server/index.mjs +24 -1964
  194. package/dist/server/index.mjs.map +1 -1
  195. package/dist/server/middlewares/documents.js +104 -0
  196. package/dist/server/middlewares/documents.js.map +1 -0
  197. package/dist/server/middlewares/documents.mjs +101 -0
  198. package/dist/server/middlewares/documents.mjs.map +1 -0
  199. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js +51 -0
  200. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js.map +1 -0
  201. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs +49 -0
  202. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs.map +1 -0
  203. package/dist/server/migrations/index.js +205 -0
  204. package/dist/server/migrations/index.js.map +1 -0
  205. package/dist/server/migrations/index.mjs +198 -0
  206. package/dist/server/migrations/index.mjs.map +1 -0
  207. package/dist/server/register.js +23 -0
  208. package/dist/server/register.js.map +1 -0
  209. package/dist/server/register.mjs +21 -0
  210. package/dist/server/register.mjs.map +1 -0
  211. package/dist/server/routes/homepage.js +25 -0
  212. package/dist/server/routes/homepage.js.map +1 -0
  213. package/dist/server/routes/homepage.mjs +23 -0
  214. package/dist/server/routes/homepage.mjs.map +1 -0
  215. package/dist/server/routes/index.js +16 -0
  216. package/dist/server/routes/index.js.map +1 -0
  217. package/dist/server/routes/index.mjs +14 -0
  218. package/dist/server/routes/index.mjs.map +1 -0
  219. package/dist/server/routes/release-action.js +100 -0
  220. package/dist/server/routes/release-action.js.map +1 -0
  221. package/dist/server/routes/release-action.mjs +98 -0
  222. package/dist/server/routes/release-action.mjs.map +1 -0
  223. package/dist/server/routes/release.js +154 -0
  224. package/dist/server/routes/release.js.map +1 -0
  225. package/dist/server/routes/release.mjs +152 -0
  226. package/dist/server/routes/release.mjs.map +1 -0
  227. package/dist/server/routes/settings.js +46 -0
  228. package/dist/server/routes/settings.js.map +1 -0
  229. package/dist/server/routes/settings.mjs +44 -0
  230. package/dist/server/routes/settings.mjs.map +1 -0
  231. package/dist/server/services/homepage.js +26 -0
  232. package/dist/server/services/homepage.js.map +1 -0
  233. package/dist/server/services/homepage.mjs +24 -0
  234. package/dist/server/services/homepage.mjs.map +1 -0
  235. package/dist/server/services/index.js +20 -0
  236. package/dist/server/services/index.js.map +1 -0
  237. package/dist/server/services/index.mjs +18 -0
  238. package/dist/server/services/index.mjs.map +1 -0
  239. package/dist/server/services/release-action.js +324 -0
  240. package/dist/server/services/release-action.js.map +1 -0
  241. package/dist/server/services/release-action.mjs +322 -0
  242. package/dist/server/services/release-action.mjs.map +1 -0
  243. package/dist/server/services/release.js +324 -0
  244. package/dist/server/services/release.js.map +1 -0
  245. package/dist/server/services/release.mjs +322 -0
  246. package/dist/server/services/release.mjs.map +1 -0
  247. package/dist/server/services/scheduling.js +74 -0
  248. package/dist/server/services/scheduling.js.map +1 -0
  249. package/dist/server/services/scheduling.mjs +72 -0
  250. package/dist/server/services/scheduling.mjs.map +1 -0
  251. package/dist/server/services/settings.js +34 -0
  252. package/dist/server/services/settings.js.map +1 -0
  253. package/dist/server/services/settings.mjs +32 -0
  254. package/dist/server/services/settings.mjs.map +1 -0
  255. package/dist/server/services/validation.js +91 -0
  256. package/dist/server/services/validation.js.map +1 -0
  257. package/dist/server/services/validation.mjs +86 -0
  258. package/dist/server/services/validation.mjs.map +1 -0
  259. package/dist/server/src/controllers/homepage.d.ts +6 -0
  260. package/dist/server/src/controllers/homepage.d.ts.map +1 -0
  261. package/dist/server/src/controllers/index.d.ts +3 -0
  262. package/dist/server/src/controllers/index.d.ts.map +1 -1
  263. package/dist/server/src/destroy.d.ts +1 -1
  264. package/dist/server/src/destroy.d.ts.map +1 -1
  265. package/dist/server/src/index.d.ts +15 -10
  266. package/dist/server/src/index.d.ts.map +1 -1
  267. package/dist/server/src/middlewares/documents.d.ts +1 -1
  268. package/dist/server/src/middlewares/documents.d.ts.map +1 -1
  269. package/dist/server/src/routes/homepage.d.ts +4 -0
  270. package/dist/server/src/routes/homepage.d.ts.map +1 -0
  271. package/dist/server/src/routes/index.d.ts +1 -0
  272. package/dist/server/src/routes/index.d.ts.map +1 -1
  273. package/dist/server/src/services/homepage.d.ts +9 -0
  274. package/dist/server/src/services/homepage.d.ts.map +1 -0
  275. package/dist/server/src/services/index.d.ts +11 -10
  276. package/dist/server/src/services/index.d.ts.map +1 -1
  277. package/dist/server/src/services/release-action.d.ts +3 -7
  278. package/dist/server/src/services/release-action.d.ts.map +1 -1
  279. package/dist/server/src/services/scheduling.d.ts +5 -6
  280. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  281. package/dist/server/src/services/validation.d.ts +1 -1
  282. package/dist/server/src/services/validation.d.ts.map +1 -1
  283. package/dist/server/src/utils/index.d.ts.map +1 -1
  284. package/dist/server/utils/index.js +94 -0
  285. package/dist/server/utils/index.js.map +1 -0
  286. package/dist/server/utils/index.mjs +88 -0
  287. package/dist/server/utils/index.mjs.map +1 -0
  288. package/dist/shared/contracts/homepage.d.ts +11 -0
  289. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  290. package/dist/shared/contracts/release-actions.d.ts +8 -2
  291. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  292. package/dist/shared/contracts/releases.d.ts +0 -1
  293. package/dist/shared/contracts/settings.d.ts +1 -2
  294. package/dist/shared/contracts/settings.d.ts.map +1 -1
  295. package/dist/shared/types.d.ts +1 -1
  296. package/dist/shared/types.d.ts.map +1 -1
  297. package/package.json +19 -17
  298. package/dist/_chunks/App-BKB1esYS.js +0 -1395
  299. package/dist/_chunks/App-BKB1esYS.js.map +0 -1
  300. package/dist/_chunks/App-Cne--1Z8.mjs +0 -1374
  301. package/dist/_chunks/App-Cne--1Z8.mjs.map +0 -1
  302. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js +0 -52
  303. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
  304. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs +0 -52
  305. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +0 -1
  306. package/dist/_chunks/ReleasesSettingsPage-C1WwGWIH.mjs +0 -178
  307. package/dist/_chunks/ReleasesSettingsPage-C1WwGWIH.mjs.map +0 -1
  308. package/dist/_chunks/ReleasesSettingsPage-kuXIwpWp.js +0 -178
  309. package/dist/_chunks/ReleasesSettingsPage-kuXIwpWp.js.map +0 -1
  310. package/dist/_chunks/en-CmYoEnA7.js +0 -93
  311. package/dist/_chunks/en-CmYoEnA7.js.map +0 -1
  312. package/dist/_chunks/en-D0yVZFqf.mjs +0 -93
  313. package/dist/_chunks/en-D0yVZFqf.mjs.map +0 -1
  314. package/dist/_chunks/index-5Odi61vw.js +0 -1381
  315. package/dist/_chunks/index-5Odi61vw.js.map +0 -1
  316. package/dist/_chunks/index-Cy7qwpaU.mjs +0 -1362
  317. package/dist/_chunks/index-Cy7qwpaU.mjs.map +0 -1
  318. package/dist/_chunks/schemas-BE1LxE9J.js +0 -62
  319. package/dist/_chunks/schemas-BE1LxE9J.js.map +0 -1
  320. package/dist/_chunks/schemas-DdA2ic2U.mjs +0 -44
  321. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +0 -1
@@ -0,0 +1,150 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@strapi/utils');
4
+ var releaseAction = require('./validation/release-action.js');
5
+ var index = require('../utils/index.js');
6
+ var constants = require('../constants.js');
7
+ var validation = require('../services/validation.js');
8
+
9
+ const releaseActionController = {
10
+ async create (ctx) {
11
+ const releaseId = ctx.params.releaseId;
12
+ const releaseActionArgs = ctx.request.body;
13
+ await releaseAction.validateReleaseAction(releaseActionArgs);
14
+ const releaseActionService = index.getService('release-action', {
15
+ strapi
16
+ });
17
+ const releaseAction$1 = await releaseActionService.create(releaseId, releaseActionArgs);
18
+ ctx.created({
19
+ data: releaseAction$1
20
+ });
21
+ },
22
+ async createMany (ctx) {
23
+ const releaseId = ctx.params.releaseId;
24
+ const releaseActionsArgs = ctx.request.body;
25
+ await Promise.all(releaseActionsArgs.map((releaseActionArgs)=>releaseAction.validateReleaseAction(releaseActionArgs)));
26
+ const releaseActionService = index.getService('release-action', {
27
+ strapi
28
+ });
29
+ const releaseService = index.getService('release', {
30
+ strapi
31
+ });
32
+ const releaseActions = await strapi.db.transaction(async ()=>{
33
+ const releaseActions = await Promise.all(releaseActionsArgs.map(async (releaseActionArgs)=>{
34
+ try {
35
+ const action = await releaseActionService.create(releaseId, releaseActionArgs, {
36
+ disableUpdateReleaseStatus: true
37
+ });
38
+ return action;
39
+ } catch (error) {
40
+ // If the entry is already in the release, we don't want to throw an error, so we catch and ignore it
41
+ if (error instanceof validation.AlreadyOnReleaseError) {
42
+ return null;
43
+ }
44
+ throw error;
45
+ }
46
+ }));
47
+ return releaseActions;
48
+ });
49
+ const newReleaseActions = releaseActions.filter((action)=>action !== null);
50
+ if (newReleaseActions.length > 0) {
51
+ releaseService.updateReleaseStatus(releaseId);
52
+ }
53
+ ctx.created({
54
+ data: newReleaseActions,
55
+ meta: {
56
+ entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
57
+ totalEntries: releaseActions.length
58
+ }
59
+ });
60
+ },
61
+ async findMany (ctx) {
62
+ const releaseId = ctx.params.releaseId;
63
+ const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
64
+ ability: ctx.state.userAbility,
65
+ model: constants.RELEASE_ACTION_MODEL_UID
66
+ });
67
+ await releaseAction.validateFindManyActionsParams(ctx.query);
68
+ if (ctx.query.groupBy) {
69
+ if (![
70
+ 'action',
71
+ 'contentType',
72
+ 'locale'
73
+ ].includes(ctx.query.groupBy)) {
74
+ ctx.badRequest('Invalid groupBy parameter');
75
+ }
76
+ }
77
+ ctx.query.sort = ctx.query.groupBy === 'action' ? 'type' : ctx.query.groupBy;
78
+ delete ctx.query.groupBy;
79
+ const query = await permissionsManager.sanitizeQuery(ctx.query);
80
+ const releaseActionService = index.getService('release-action', {
81
+ strapi
82
+ });
83
+ const { results, pagination } = await releaseActionService.findPage(releaseId, {
84
+ ...query
85
+ });
86
+ /**
87
+ * Release actions can be related to entries of different content types.
88
+ * We need to sanitize the entry output according to that content type.
89
+ * So, we group the sanitized output function by content type.
90
+ */ const contentTypeOutputSanitizers = results.reduce((acc, action)=>{
91
+ if (acc[action.contentType]) {
92
+ return acc;
93
+ }
94
+ const contentTypePermissionsManager = strapi.service('admin::permission').createPermissionsManager({
95
+ ability: ctx.state.userAbility,
96
+ model: action.contentType
97
+ });
98
+ acc[action.contentType] = contentTypePermissionsManager.sanitizeOutput;
99
+ return acc;
100
+ }, {});
101
+ /**
102
+ * sanitizeOutput doesn't work if you use it directly on the Release Action model, it doesn't sanitize the entries
103
+ * So, we need to sanitize manually each entry inside a Release Action
104
+ */ const sanitizedResults = await utils.async.map(results, async (action)=>({
105
+ ...action,
106
+ entry: action.entry ? await contentTypeOutputSanitizers[action.contentType](action.entry) : {}
107
+ }));
108
+ const groupedData = await releaseActionService.groupActions(sanitizedResults, query.sort);
109
+ const contentTypes = await releaseActionService.getContentTypeModelsFromActions(results);
110
+ const releaseService = index.getService('release', {
111
+ strapi
112
+ });
113
+ const components = await releaseService.getAllComponents();
114
+ ctx.body = {
115
+ data: groupedData,
116
+ meta: {
117
+ pagination,
118
+ contentTypes,
119
+ components
120
+ }
121
+ };
122
+ },
123
+ async update (ctx) {
124
+ const actionId = ctx.params.actionId;
125
+ const releaseId = ctx.params.releaseId;
126
+ const releaseActionUpdateArgs = ctx.request.body;
127
+ await releaseAction.validateReleaseActionUpdateSchema(releaseActionUpdateArgs);
128
+ const releaseActionService = index.getService('release-action', {
129
+ strapi
130
+ });
131
+ const updatedAction = await releaseActionService.update(actionId, releaseId, releaseActionUpdateArgs);
132
+ ctx.body = {
133
+ data: updatedAction
134
+ };
135
+ },
136
+ async delete (ctx) {
137
+ const actionId = ctx.params.actionId;
138
+ const releaseId = ctx.params.releaseId;
139
+ const releaseActionService = index.getService('release-action', {
140
+ strapi
141
+ });
142
+ const deletedReleaseAction = await releaseActionService.delete(actionId, releaseId);
143
+ ctx.body = {
144
+ data: deletedReleaseAction
145
+ };
146
+ }
147
+ };
148
+
149
+ module.exports = releaseActionController;
150
+ //# sourceMappingURL=release-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-action.js","sources":["../../../server/src/controllers/release-action.ts"],"sourcesContent":["import type Koa from 'koa';\n\nimport { async } from '@strapi/utils';\nimport {\n validateReleaseAction,\n validateReleaseActionUpdateSchema,\n validateFindManyActionsParams,\n} from './validation/release-action';\nimport type {\n CreateReleaseAction,\n CreateManyReleaseActions,\n GetReleaseActions,\n UpdateReleaseAction,\n DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport { getService } from '../utils';\nimport { RELEASE_ACTION_MODEL_UID } from '../constants';\nimport { AlreadyOnReleaseError } from '../services/validation';\n\nconst releaseActionController = {\n async create(ctx: Koa.Context) {\n const releaseId: CreateReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n const releaseActionArgs = ctx.request.body as CreateReleaseAction.Request['body'];\n\n await validateReleaseAction(releaseActionArgs);\n\n const releaseActionService = getService('release-action', { strapi });\n const releaseAction = await releaseActionService.create(releaseId, releaseActionArgs);\n\n ctx.created({\n data: releaseAction,\n });\n },\n\n async createMany(ctx: Koa.Context) {\n const releaseId: CreateManyReleaseActions.Request['params']['releaseId'] = ctx.params.releaseId;\n const releaseActionsArgs = ctx.request.body as CreateManyReleaseActions.Request['body'];\n\n await Promise.all(\n releaseActionsArgs.map((releaseActionArgs) => validateReleaseAction(releaseActionArgs))\n );\n\n const releaseActionService = getService('release-action', { strapi });\n const releaseService = getService('release', { strapi });\n\n const releaseActions = await strapi.db.transaction(async () => {\n const releaseActions = await Promise.all(\n releaseActionsArgs.map(async (releaseActionArgs) => {\n try {\n const action = await releaseActionService.create(releaseId, releaseActionArgs, {\n disableUpdateReleaseStatus: true,\n });\n return action;\n } catch (error) {\n // If the entry is already in the release, we don't want to throw an error, so we catch and ignore it\n if (error instanceof AlreadyOnReleaseError) {\n return null;\n }\n throw error;\n }\n })\n );\n return releaseActions;\n });\n\n const newReleaseActions = releaseActions.filter((action) => action !== null);\n\n if (newReleaseActions.length > 0) {\n releaseService.updateReleaseStatus(releaseId);\n }\n\n ctx.created({\n data: newReleaseActions,\n meta: {\n entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,\n totalEntries: releaseActions.length,\n },\n });\n },\n\n async findMany(ctx: Koa.Context) {\n const releaseId: GetReleaseActions.Request['params']['releaseId'] = ctx.params.releaseId;\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_ACTION_MODEL_UID,\n });\n\n await validateFindManyActionsParams(ctx.query);\n\n if (ctx.query.groupBy) {\n if (!['action', 'contentType', 'locale'].includes(ctx.query.groupBy as string)) {\n ctx.badRequest('Invalid groupBy parameter');\n }\n }\n\n ctx.query.sort = ctx.query.groupBy === 'action' ? 'type' : ctx.query.groupBy;\n delete ctx.query.groupBy;\n\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const releaseActionService = getService('release-action', { strapi });\n const { results, pagination } = await releaseActionService.findPage(releaseId, {\n ...query,\n });\n\n /**\n * Release actions can be related to entries of different content types.\n * We need to sanitize the entry output according to that content type.\n * So, we group the sanitized output function by content type.\n */\n const contentTypeOutputSanitizers = results.reduce((acc: Record<string, any>, action: any) => {\n if (acc[action.contentType]) {\n return acc;\n }\n\n const contentTypePermissionsManager = strapi\n .service('admin::permission')\n .createPermissionsManager({\n ability: ctx.state.userAbility,\n model: action.contentType,\n });\n\n acc[action.contentType] = contentTypePermissionsManager.sanitizeOutput;\n\n return acc;\n }, {});\n\n /**\n * sanitizeOutput doesn't work if you use it directly on the Release Action model, it doesn't sanitize the entries\n * So, we need to sanitize manually each entry inside a Release Action\n */\n const sanitizedResults = await async.map(results, async (action: any) => ({\n ...action,\n entry: action.entry\n ? await contentTypeOutputSanitizers[action.contentType](action.entry)\n : {},\n }));\n\n const groupedData = await releaseActionService.groupActions(sanitizedResults, query.sort);\n\n const contentTypes = await releaseActionService.getContentTypeModelsFromActions(results);\n\n const releaseService = getService('release', { strapi });\n const components = await releaseService.getAllComponents();\n\n ctx.body = {\n data: groupedData,\n meta: {\n pagination,\n contentTypes,\n components,\n },\n };\n },\n\n async update(ctx: Koa.Context) {\n const actionId: UpdateReleaseAction.Request['params']['actionId'] = ctx.params.actionId;\n const releaseId: UpdateReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n const releaseActionUpdateArgs = ctx.request.body as UpdateReleaseAction.Request['body'];\n\n await validateReleaseActionUpdateSchema(releaseActionUpdateArgs);\n\n const releaseActionService = getService('release-action', { strapi });\n\n const updatedAction = await releaseActionService.update(\n actionId,\n releaseId,\n releaseActionUpdateArgs\n );\n\n ctx.body = {\n data: updatedAction,\n };\n },\n\n async delete(ctx: Koa.Context) {\n const actionId: DeleteReleaseAction.Request['params']['actionId'] = ctx.params.actionId;\n const releaseId: DeleteReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n\n const releaseActionService = getService('release-action', { strapi });\n\n const deletedReleaseAction = await releaseActionService.delete(actionId, releaseId);\n\n ctx.body = {\n data: deletedReleaseAction,\n };\n },\n};\n\nexport default releaseActionController;\n"],"names":["releaseActionController","create","ctx","releaseId","params","releaseActionArgs","request","body","validateReleaseAction","releaseActionService","getService","strapi","releaseAction","created","data","createMany","releaseActionsArgs","Promise","all","map","releaseService","releaseActions","db","transaction","action","disableUpdateReleaseStatus","error","AlreadyOnReleaseError","newReleaseActions","filter","length","updateReleaseStatus","meta","entriesAlreadyInRelease","totalEntries","findMany","permissionsManager","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_ACTION_MODEL_UID","validateFindManyActionsParams","query","groupBy","includes","badRequest","sort","sanitizeQuery","results","pagination","findPage","contentTypeOutputSanitizers","reduce","acc","contentType","contentTypePermissionsManager","sanitizeOutput","sanitizedResults","async","entry","groupedData","groupActions","contentTypes","getContentTypeModelsFromActions","components","getAllComponents","update","actionId","releaseActionUpdateArgs","validateReleaseActionUpdateSchema","updatedAction","delete","deletedReleaseAction"],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import { async } from '@strapi/utils';
2
+ import { validateReleaseAction, validateFindManyActionsParams, validateReleaseActionUpdateSchema } from './validation/release-action.mjs';
3
+ import { getService } from '../utils/index.mjs';
4
+ import { RELEASE_ACTION_MODEL_UID } from '../constants.mjs';
5
+ import { AlreadyOnReleaseError } from '../services/validation.mjs';
6
+
7
+ const releaseActionController = {
8
+ async create (ctx) {
9
+ const releaseId = ctx.params.releaseId;
10
+ const releaseActionArgs = ctx.request.body;
11
+ await validateReleaseAction(releaseActionArgs);
12
+ const releaseActionService = getService('release-action', {
13
+ strapi
14
+ });
15
+ const releaseAction = await releaseActionService.create(releaseId, releaseActionArgs);
16
+ ctx.created({
17
+ data: releaseAction
18
+ });
19
+ },
20
+ async createMany (ctx) {
21
+ const releaseId = ctx.params.releaseId;
22
+ const releaseActionsArgs = ctx.request.body;
23
+ await Promise.all(releaseActionsArgs.map((releaseActionArgs)=>validateReleaseAction(releaseActionArgs)));
24
+ const releaseActionService = getService('release-action', {
25
+ strapi
26
+ });
27
+ const releaseService = getService('release', {
28
+ strapi
29
+ });
30
+ const releaseActions = await strapi.db.transaction(async ()=>{
31
+ const releaseActions = await Promise.all(releaseActionsArgs.map(async (releaseActionArgs)=>{
32
+ try {
33
+ const action = await releaseActionService.create(releaseId, releaseActionArgs, {
34
+ disableUpdateReleaseStatus: true
35
+ });
36
+ return action;
37
+ } catch (error) {
38
+ // If the entry is already in the release, we don't want to throw an error, so we catch and ignore it
39
+ if (error instanceof AlreadyOnReleaseError) {
40
+ return null;
41
+ }
42
+ throw error;
43
+ }
44
+ }));
45
+ return releaseActions;
46
+ });
47
+ const newReleaseActions = releaseActions.filter((action)=>action !== null);
48
+ if (newReleaseActions.length > 0) {
49
+ releaseService.updateReleaseStatus(releaseId);
50
+ }
51
+ ctx.created({
52
+ data: newReleaseActions,
53
+ meta: {
54
+ entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
55
+ totalEntries: releaseActions.length
56
+ }
57
+ });
58
+ },
59
+ async findMany (ctx) {
60
+ const releaseId = ctx.params.releaseId;
61
+ const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
62
+ ability: ctx.state.userAbility,
63
+ model: RELEASE_ACTION_MODEL_UID
64
+ });
65
+ await validateFindManyActionsParams(ctx.query);
66
+ if (ctx.query.groupBy) {
67
+ if (![
68
+ 'action',
69
+ 'contentType',
70
+ 'locale'
71
+ ].includes(ctx.query.groupBy)) {
72
+ ctx.badRequest('Invalid groupBy parameter');
73
+ }
74
+ }
75
+ ctx.query.sort = ctx.query.groupBy === 'action' ? 'type' : ctx.query.groupBy;
76
+ delete ctx.query.groupBy;
77
+ const query = await permissionsManager.sanitizeQuery(ctx.query);
78
+ const releaseActionService = getService('release-action', {
79
+ strapi
80
+ });
81
+ const { results, pagination } = await releaseActionService.findPage(releaseId, {
82
+ ...query
83
+ });
84
+ /**
85
+ * Release actions can be related to entries of different content types.
86
+ * We need to sanitize the entry output according to that content type.
87
+ * So, we group the sanitized output function by content type.
88
+ */ const contentTypeOutputSanitizers = results.reduce((acc, action)=>{
89
+ if (acc[action.contentType]) {
90
+ return acc;
91
+ }
92
+ const contentTypePermissionsManager = strapi.service('admin::permission').createPermissionsManager({
93
+ ability: ctx.state.userAbility,
94
+ model: action.contentType
95
+ });
96
+ acc[action.contentType] = contentTypePermissionsManager.sanitizeOutput;
97
+ return acc;
98
+ }, {});
99
+ /**
100
+ * sanitizeOutput doesn't work if you use it directly on the Release Action model, it doesn't sanitize the entries
101
+ * So, we need to sanitize manually each entry inside a Release Action
102
+ */ const sanitizedResults = await async.map(results, async (action)=>({
103
+ ...action,
104
+ entry: action.entry ? await contentTypeOutputSanitizers[action.contentType](action.entry) : {}
105
+ }));
106
+ const groupedData = await releaseActionService.groupActions(sanitizedResults, query.sort);
107
+ const contentTypes = await releaseActionService.getContentTypeModelsFromActions(results);
108
+ const releaseService = getService('release', {
109
+ strapi
110
+ });
111
+ const components = await releaseService.getAllComponents();
112
+ ctx.body = {
113
+ data: groupedData,
114
+ meta: {
115
+ pagination,
116
+ contentTypes,
117
+ components
118
+ }
119
+ };
120
+ },
121
+ async update (ctx) {
122
+ const actionId = ctx.params.actionId;
123
+ const releaseId = ctx.params.releaseId;
124
+ const releaseActionUpdateArgs = ctx.request.body;
125
+ await validateReleaseActionUpdateSchema(releaseActionUpdateArgs);
126
+ const releaseActionService = getService('release-action', {
127
+ strapi
128
+ });
129
+ const updatedAction = await releaseActionService.update(actionId, releaseId, releaseActionUpdateArgs);
130
+ ctx.body = {
131
+ data: updatedAction
132
+ };
133
+ },
134
+ async delete (ctx) {
135
+ const actionId = ctx.params.actionId;
136
+ const releaseId = ctx.params.releaseId;
137
+ const releaseActionService = getService('release-action', {
138
+ strapi
139
+ });
140
+ const deletedReleaseAction = await releaseActionService.delete(actionId, releaseId);
141
+ ctx.body = {
142
+ data: deletedReleaseAction
143
+ };
144
+ }
145
+ };
146
+
147
+ export { releaseActionController as default };
148
+ //# sourceMappingURL=release-action.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-action.mjs","sources":["../../../server/src/controllers/release-action.ts"],"sourcesContent":["import type Koa from 'koa';\n\nimport { async } from '@strapi/utils';\nimport {\n validateReleaseAction,\n validateReleaseActionUpdateSchema,\n validateFindManyActionsParams,\n} from './validation/release-action';\nimport type {\n CreateReleaseAction,\n CreateManyReleaseActions,\n GetReleaseActions,\n UpdateReleaseAction,\n DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport { getService } from '../utils';\nimport { RELEASE_ACTION_MODEL_UID } from '../constants';\nimport { AlreadyOnReleaseError } from '../services/validation';\n\nconst releaseActionController = {\n async create(ctx: Koa.Context) {\n const releaseId: CreateReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n const releaseActionArgs = ctx.request.body as CreateReleaseAction.Request['body'];\n\n await validateReleaseAction(releaseActionArgs);\n\n const releaseActionService = getService('release-action', { strapi });\n const releaseAction = await releaseActionService.create(releaseId, releaseActionArgs);\n\n ctx.created({\n data: releaseAction,\n });\n },\n\n async createMany(ctx: Koa.Context) {\n const releaseId: CreateManyReleaseActions.Request['params']['releaseId'] = ctx.params.releaseId;\n const releaseActionsArgs = ctx.request.body as CreateManyReleaseActions.Request['body'];\n\n await Promise.all(\n releaseActionsArgs.map((releaseActionArgs) => validateReleaseAction(releaseActionArgs))\n );\n\n const releaseActionService = getService('release-action', { strapi });\n const releaseService = getService('release', { strapi });\n\n const releaseActions = await strapi.db.transaction(async () => {\n const releaseActions = await Promise.all(\n releaseActionsArgs.map(async (releaseActionArgs) => {\n try {\n const action = await releaseActionService.create(releaseId, releaseActionArgs, {\n disableUpdateReleaseStatus: true,\n });\n return action;\n } catch (error) {\n // If the entry is already in the release, we don't want to throw an error, so we catch and ignore it\n if (error instanceof AlreadyOnReleaseError) {\n return null;\n }\n throw error;\n }\n })\n );\n return releaseActions;\n });\n\n const newReleaseActions = releaseActions.filter((action) => action !== null);\n\n if (newReleaseActions.length > 0) {\n releaseService.updateReleaseStatus(releaseId);\n }\n\n ctx.created({\n data: newReleaseActions,\n meta: {\n entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,\n totalEntries: releaseActions.length,\n },\n });\n },\n\n async findMany(ctx: Koa.Context) {\n const releaseId: GetReleaseActions.Request['params']['releaseId'] = ctx.params.releaseId;\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_ACTION_MODEL_UID,\n });\n\n await validateFindManyActionsParams(ctx.query);\n\n if (ctx.query.groupBy) {\n if (!['action', 'contentType', 'locale'].includes(ctx.query.groupBy as string)) {\n ctx.badRequest('Invalid groupBy parameter');\n }\n }\n\n ctx.query.sort = ctx.query.groupBy === 'action' ? 'type' : ctx.query.groupBy;\n delete ctx.query.groupBy;\n\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const releaseActionService = getService('release-action', { strapi });\n const { results, pagination } = await releaseActionService.findPage(releaseId, {\n ...query,\n });\n\n /**\n * Release actions can be related to entries of different content types.\n * We need to sanitize the entry output according to that content type.\n * So, we group the sanitized output function by content type.\n */\n const contentTypeOutputSanitizers = results.reduce((acc: Record<string, any>, action: any) => {\n if (acc[action.contentType]) {\n return acc;\n }\n\n const contentTypePermissionsManager = strapi\n .service('admin::permission')\n .createPermissionsManager({\n ability: ctx.state.userAbility,\n model: action.contentType,\n });\n\n acc[action.contentType] = contentTypePermissionsManager.sanitizeOutput;\n\n return acc;\n }, {});\n\n /**\n * sanitizeOutput doesn't work if you use it directly on the Release Action model, it doesn't sanitize the entries\n * So, we need to sanitize manually each entry inside a Release Action\n */\n const sanitizedResults = await async.map(results, async (action: any) => ({\n ...action,\n entry: action.entry\n ? await contentTypeOutputSanitizers[action.contentType](action.entry)\n : {},\n }));\n\n const groupedData = await releaseActionService.groupActions(sanitizedResults, query.sort);\n\n const contentTypes = await releaseActionService.getContentTypeModelsFromActions(results);\n\n const releaseService = getService('release', { strapi });\n const components = await releaseService.getAllComponents();\n\n ctx.body = {\n data: groupedData,\n meta: {\n pagination,\n contentTypes,\n components,\n },\n };\n },\n\n async update(ctx: Koa.Context) {\n const actionId: UpdateReleaseAction.Request['params']['actionId'] = ctx.params.actionId;\n const releaseId: UpdateReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n const releaseActionUpdateArgs = ctx.request.body as UpdateReleaseAction.Request['body'];\n\n await validateReleaseActionUpdateSchema(releaseActionUpdateArgs);\n\n const releaseActionService = getService('release-action', { strapi });\n\n const updatedAction = await releaseActionService.update(\n actionId,\n releaseId,\n releaseActionUpdateArgs\n );\n\n ctx.body = {\n data: updatedAction,\n };\n },\n\n async delete(ctx: Koa.Context) {\n const actionId: DeleteReleaseAction.Request['params']['actionId'] = ctx.params.actionId;\n const releaseId: DeleteReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n\n const releaseActionService = getService('release-action', { strapi });\n\n const deletedReleaseAction = await releaseActionService.delete(actionId, releaseId);\n\n ctx.body = {\n data: deletedReleaseAction,\n };\n },\n};\n\nexport default releaseActionController;\n"],"names":["releaseActionController","create","ctx","releaseId","params","releaseActionArgs","request","body","validateReleaseAction","releaseActionService","getService","strapi","releaseAction","created","data","createMany","releaseActionsArgs","Promise","all","map","releaseService","releaseActions","db","transaction","action","disableUpdateReleaseStatus","error","AlreadyOnReleaseError","newReleaseActions","filter","length","updateReleaseStatus","meta","entriesAlreadyInRelease","totalEntries","findMany","permissionsManager","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_ACTION_MODEL_UID","validateFindManyActionsParams","query","groupBy","includes","badRequest","sort","sanitizeQuery","results","pagination","findPage","contentTypeOutputSanitizers","reduce","acc","contentType","contentTypePermissionsManager","sanitizeOutput","sanitizedResults","async","entry","groupedData","groupActions","contentTypes","getContentTypeModelsFromActions","components","getAllComponents","update","actionId","releaseActionUpdateArgs","validateReleaseActionUpdateSchema","updatedAction","delete","deletedReleaseAction"],"mappings":"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"}
@@ -0,0 +1,302 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@strapi/utils');
4
+ var constants = require('../constants.js');
5
+ var release = require('./validation/release.js');
6
+ var index = require('../utils/index.js');
7
+
8
+ const releaseController = {
9
+ /**
10
+ * Find releases based on documents attached or not to the release.
11
+ * If `hasEntryAttached` is true, it will return all releases that have the entry attached.
12
+ * If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.
13
+ */ async findByDocumentAttached (ctx) {
14
+ const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
15
+ ability: ctx.state.userAbility,
16
+ model: constants.RELEASE_MODEL_UID
17
+ });
18
+ await permissionsManager.validateQuery(ctx.query);
19
+ const releaseService = index.getService('release', {
20
+ strapi
21
+ });
22
+ const query = await permissionsManager.sanitizeQuery(ctx.query);
23
+ await release.validatefindByDocumentAttachedParams(query);
24
+ // If entry is a singleType, we need to manually add the entryDocumentId to the query
25
+ const model = strapi.getModel(query.contentType);
26
+ if (model.kind && model.kind === 'singleType') {
27
+ const document = await strapi.db.query(model.uid).findOne({
28
+ select: [
29
+ 'documentId'
30
+ ]
31
+ });
32
+ if (!document) {
33
+ throw new utils.errors.NotFoundError(`No entry found for contentType ${query.contentType}`);
34
+ }
35
+ query.entryDocumentId = document.documentId;
36
+ }
37
+ const { contentType, hasEntryAttached, entryDocumentId, locale } = query;
38
+ const isEntryAttached = typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;
39
+ if (isEntryAttached) {
40
+ const releases = await releaseService.findMany({
41
+ where: {
42
+ releasedAt: null,
43
+ actions: {
44
+ contentType,
45
+ entryDocumentId: entryDocumentId ?? null,
46
+ locale: locale ?? null
47
+ }
48
+ },
49
+ populate: {
50
+ actions: {
51
+ fields: [
52
+ 'type'
53
+ ],
54
+ filters: {
55
+ contentType,
56
+ entryDocumentId: entryDocumentId ?? null,
57
+ locale: locale ?? null
58
+ }
59
+ }
60
+ }
61
+ });
62
+ ctx.body = {
63
+ data: releases
64
+ };
65
+ } else {
66
+ const relatedReleases = await releaseService.findMany({
67
+ where: {
68
+ releasedAt: null,
69
+ actions: {
70
+ contentType,
71
+ entryDocumentId: entryDocumentId ?? null,
72
+ locale: locale ?? null
73
+ }
74
+ }
75
+ });
76
+ const releases = await releaseService.findMany({
77
+ where: {
78
+ $or: [
79
+ {
80
+ id: {
81
+ $notIn: relatedReleases.map((release)=>release.id)
82
+ }
83
+ },
84
+ {
85
+ actions: null
86
+ }
87
+ ],
88
+ releasedAt: null
89
+ }
90
+ });
91
+ ctx.body = {
92
+ data: releases
93
+ };
94
+ }
95
+ },
96
+ async findPage (ctx) {
97
+ const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
98
+ ability: ctx.state.userAbility,
99
+ model: constants.RELEASE_MODEL_UID
100
+ });
101
+ await permissionsManager.validateQuery(ctx.query);
102
+ const releaseService = index.getService('release', {
103
+ strapi
104
+ });
105
+ const query = await permissionsManager.sanitizeQuery(ctx.query);
106
+ const { results, pagination } = await releaseService.findPage(query);
107
+ const data = results.map((release)=>{
108
+ const { actions, ...releaseData } = release;
109
+ return {
110
+ ...releaseData,
111
+ actions: {
112
+ meta: {
113
+ count: actions.count
114
+ }
115
+ }
116
+ };
117
+ });
118
+ const pendingReleasesCount = await strapi.db.query(constants.RELEASE_MODEL_UID).count({
119
+ where: {
120
+ releasedAt: null
121
+ }
122
+ });
123
+ ctx.body = {
124
+ data,
125
+ meta: {
126
+ pagination,
127
+ pendingReleasesCount
128
+ }
129
+ };
130
+ },
131
+ async findOne (ctx) {
132
+ const id = ctx.params.id;
133
+ const releaseService = index.getService('release', {
134
+ strapi
135
+ });
136
+ const releaseActionService = index.getService('release-action', {
137
+ strapi
138
+ });
139
+ const release = await releaseService.findOne(id, {
140
+ populate: [
141
+ 'createdBy'
142
+ ]
143
+ });
144
+ if (!release) {
145
+ throw new utils.errors.NotFoundError(`Release not found for id: ${id}`);
146
+ }
147
+ const count = await releaseActionService.countActions({
148
+ filters: {
149
+ release: id
150
+ }
151
+ });
152
+ const sanitizedRelease = {
153
+ ...release,
154
+ createdBy: release.createdBy ? strapi.service('admin::user').sanitizeUser(release.createdBy) : null
155
+ };
156
+ // Format the data object
157
+ const data = {
158
+ ...sanitizedRelease,
159
+ actions: {
160
+ meta: {
161
+ count
162
+ }
163
+ }
164
+ };
165
+ ctx.body = {
166
+ data
167
+ };
168
+ },
169
+ async mapEntriesToReleases (ctx) {
170
+ const { contentTypeUid, documentIds, locale } = ctx.query;
171
+ if (!contentTypeUid || !documentIds) {
172
+ throw new utils.errors.ValidationError('Missing required query parameters');
173
+ }
174
+ const releaseService = index.getService('release', {
175
+ strapi
176
+ });
177
+ const releasesWithActions = await releaseService.findMany({
178
+ where: {
179
+ releasedAt: null,
180
+ actions: {
181
+ contentType: contentTypeUid,
182
+ entryDocumentId: {
183
+ $in: documentIds
184
+ },
185
+ locale
186
+ }
187
+ },
188
+ populate: {
189
+ actions: true
190
+ }
191
+ });
192
+ const mappedEntriesInReleases = releasesWithActions.reduce((acc, release)=>{
193
+ release.actions.forEach((action)=>{
194
+ if (action.contentType !== contentTypeUid) {
195
+ return;
196
+ }
197
+ if (locale && action.locale !== locale) {
198
+ return;
199
+ }
200
+ if (!acc[action.entryDocumentId]) {
201
+ acc[action.entryDocumentId] = [
202
+ {
203
+ id: release.id,
204
+ name: release.name
205
+ }
206
+ ];
207
+ } else {
208
+ acc[action.entryDocumentId].push({
209
+ id: release.id,
210
+ name: release.name
211
+ });
212
+ }
213
+ });
214
+ return acc;
215
+ }, {});
216
+ ctx.body = {
217
+ data: mappedEntriesInReleases
218
+ };
219
+ },
220
+ async create (ctx) {
221
+ const user = ctx.state.user;
222
+ const releaseArgs = ctx.request.body;
223
+ await release.validateRelease(releaseArgs);
224
+ const releaseService = index.getService('release', {
225
+ strapi
226
+ });
227
+ const release$1 = await releaseService.create(releaseArgs, {
228
+ user
229
+ });
230
+ const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
231
+ ability: ctx.state.userAbility,
232
+ model: constants.RELEASE_MODEL_UID
233
+ });
234
+ ctx.created({
235
+ data: await permissionsManager.sanitizeOutput(release$1)
236
+ });
237
+ },
238
+ async update (ctx) {
239
+ const user = ctx.state.user;
240
+ const releaseArgs = ctx.request.body;
241
+ const id = ctx.params.id;
242
+ await release.validateRelease(releaseArgs);
243
+ const releaseService = index.getService('release', {
244
+ strapi
245
+ });
246
+ const release$1 = await releaseService.update(id, releaseArgs, {
247
+ user
248
+ });
249
+ const permissionsManager = strapi.service('admin::permission').createPermissionsManager({
250
+ ability: ctx.state.userAbility,
251
+ model: constants.RELEASE_MODEL_UID
252
+ });
253
+ ctx.body = {
254
+ data: await permissionsManager.sanitizeOutput(release$1)
255
+ };
256
+ },
257
+ async delete (ctx) {
258
+ const id = ctx.params.id;
259
+ const releaseService = index.getService('release', {
260
+ strapi
261
+ });
262
+ const release = await releaseService.delete(id);
263
+ ctx.body = {
264
+ data: release
265
+ };
266
+ },
267
+ async publish (ctx) {
268
+ const id = ctx.params.id;
269
+ const releaseService = index.getService('release', {
270
+ strapi
271
+ });
272
+ const releaseActionService = index.getService('release-action', {
273
+ strapi
274
+ });
275
+ const release = await releaseService.publish(id);
276
+ const [countPublishActions, countUnpublishActions] = await Promise.all([
277
+ releaseActionService.countActions({
278
+ filters: {
279
+ release: id,
280
+ type: 'publish'
281
+ }
282
+ }),
283
+ releaseActionService.countActions({
284
+ filters: {
285
+ release: id,
286
+ type: 'unpublish'
287
+ }
288
+ })
289
+ ]);
290
+ ctx.body = {
291
+ data: release,
292
+ meta: {
293
+ totalEntries: countPublishActions + countUnpublishActions,
294
+ totalPublishedEntries: countPublishActions,
295
+ totalUnpublishedEntries: countUnpublishActions
296
+ }
297
+ };
298
+ }
299
+ };
300
+
301
+ module.exports = releaseController;
302
+ //# sourceMappingURL=release.js.map