@strapi/admin 5.0.0-beta.1 → 5.0.0-beta.10
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.
- package/dist/admin/AdminSeatInfo-Bbq8UNek.mjs +92 -0
- package/dist/admin/AdminSeatInfo-Bbq8UNek.mjs.map +1 -0
- package/dist/admin/AdminSeatInfo-pe7_J25t.js +96 -0
- package/dist/admin/AdminSeatInfo-pe7_J25t.js.map +1 -0
- package/dist/admin/ApplicationInfoPage-S_AoXyUe.js +658 -0
- package/dist/admin/ApplicationInfoPage-S_AoXyUe.js.map +1 -0
- package/dist/admin/ApplicationInfoPage-bfXW7lrq.mjs +631 -0
- package/dist/admin/ApplicationInfoPage-bfXW7lrq.mjs.map +1 -0
- package/dist/admin/AuthResponse-BJbG4S2h.js +81 -0
- package/dist/admin/AuthResponse-BJbG4S2h.js.map +1 -0
- package/dist/admin/AuthResponse-CTQ0fh3I.mjs +57 -0
- package/dist/admin/AuthResponse-CTQ0fh3I.mjs.map +1 -0
- package/dist/admin/AuthenticatedLayout-lXbF2KKJ.mjs +1160 -0
- package/dist/admin/AuthenticatedLayout-lXbF2KKJ.mjs.map +1 -0
- package/dist/admin/AuthenticatedLayout-s7jnYVG9.js +1192 -0
- package/dist/admin/AuthenticatedLayout-s7jnYVG9.js.map +1 -0
- package/dist/admin/ContentBox-3MRTNw0X.js +43 -0
- package/dist/admin/ContentBox-3MRTNw0X.js.map +1 -0
- package/dist/admin/ContentBox-9LBDzws0.mjs +41 -0
- package/dist/admin/ContentBox-9LBDzws0.mjs.map +1 -0
- package/dist/admin/CreateActionEE-Yfp4hs7a.mjs +49 -0
- package/dist/admin/CreateActionEE-Yfp4hs7a.mjs.map +1 -0
- package/dist/admin/CreateActionEE-uqyKLxwI.js +76 -0
- package/dist/admin/CreateActionEE-uqyKLxwI.js.map +1 -0
- package/dist/admin/CreatePage-4gOQVUMq.mjs +13 -0
- package/dist/admin/CreatePage-4gOQVUMq.mjs.map +1 -0
- package/dist/admin/CreatePage-6pIItf4z.mjs +243 -0
- package/dist/admin/CreatePage-6pIItf4z.mjs.map +1 -0
- package/dist/admin/CreatePage-s23BIVXe.js +18 -0
- package/dist/admin/CreatePage-s23BIVXe.js.map +1 -0
- package/dist/admin/CreatePage-uWZ7dxp6.js +269 -0
- package/dist/admin/CreatePage-uWZ7dxp6.js.map +1 -0
- package/dist/admin/CreateView-3cLNRlgO.mjs +13 -0
- package/dist/admin/CreateView-3cLNRlgO.mjs.map +1 -0
- package/dist/admin/CreateView-DNHRcJsj.js +17 -0
- package/dist/admin/CreateView-DNHRcJsj.js.map +1 -0
- package/dist/admin/CreateView-JQYIo77z.js +17 -0
- package/dist/admin/CreateView-JQYIo77z.js.map +1 -0
- package/dist/admin/CreateView-aMz4KfSZ.mjs +13 -0
- package/dist/admin/CreateView-aMz4KfSZ.mjs.map +1 -0
- package/dist/admin/EditPage-24cGvUbV.js +297 -0
- package/dist/admin/EditPage-24cGvUbV.js.map +1 -0
- package/dist/admin/EditPage-JPZ7c-8x.mjs +737 -0
- package/dist/admin/EditPage-JPZ7c-8x.mjs.map +1 -0
- package/dist/admin/EditPage-Wpz4YmVY.js +351 -0
- package/dist/admin/EditPage-Wpz4YmVY.js.map +1 -0
- package/dist/admin/EditPage-tUvaZzFe.mjs +322 -0
- package/dist/admin/EditPage-tUvaZzFe.mjs.map +1 -0
- package/dist/admin/EditPage-tmpterlY.mjs +271 -0
- package/dist/admin/EditPage-tmpterlY.mjs.map +1 -0
- package/dist/admin/EditPage-wGJLuMsP.js +762 -0
- package/dist/admin/EditPage-wGJLuMsP.js.map +1 -0
- package/dist/admin/EditView-HjYkw6Y_.mjs +332 -0
- package/dist/admin/EditView-HjYkw6Y_.mjs.map +1 -0
- package/dist/admin/EditView-ul5nHrFh.js +358 -0
- package/dist/admin/EditView-ul5nHrFh.js.map +1 -0
- package/dist/admin/EditViewPage-bnTbQJ_O.mjs +817 -0
- package/dist/admin/EditViewPage-bnTbQJ_O.mjs.map +1 -0
- package/dist/admin/EditViewPage-c3DI4uzU.js +849 -0
- package/dist/admin/EditViewPage-c3DI4uzU.js.map +1 -0
- package/dist/admin/EventsTable-7--SHloR.js +36 -0
- package/dist/admin/EventsTable-7--SHloR.js.map +1 -0
- package/dist/admin/EventsTable-XUKqJdnX.mjs +32 -0
- package/dist/admin/EventsTable-XUKqJdnX.mjs.map +1 -0
- package/dist/admin/HomePage--Mskxb9Z.mjs +579 -0
- package/dist/admin/HomePage--Mskxb9Z.mjs.map +1 -0
- package/dist/admin/HomePage-Xrg1dR_D.js +604 -0
- package/dist/admin/HomePage-Xrg1dR_D.js.map +1 -0
- package/dist/admin/HomePage-fBY17m1h.js +15 -0
- package/dist/admin/HomePage-fBY17m1h.js.map +1 -0
- package/dist/admin/HomePage-ppJpMP9G.mjs +11 -0
- package/dist/admin/HomePage-ppJpMP9G.mjs.map +1 -0
- package/dist/admin/InstalledPluginsPage-EtnkMG0G.mjs +97 -0
- package/dist/admin/InstalledPluginsPage-EtnkMG0G.mjs.map +1 -0
- package/dist/admin/InstalledPluginsPage-alfcy8jO.js +122 -0
- package/dist/admin/InstalledPluginsPage-alfcy8jO.js.map +1 -0
- package/dist/admin/Layout-9EvJq4Gc.mjs +215 -0
- package/dist/admin/Layout-9EvJq4Gc.mjs.map +1 -0
- package/dist/admin/Layout-RKjEsOtu.js +242 -0
- package/dist/admin/Layout-RKjEsOtu.js.map +1 -0
- package/dist/admin/ListPage-21q8_YN7.mjs +487 -0
- package/dist/admin/ListPage-21q8_YN7.mjs.map +1 -0
- package/dist/admin/ListPage-CRyM6NXF.js +559 -0
- package/dist/admin/ListPage-CRyM6NXF.js.map +1 -0
- package/dist/admin/ListPage-D8Ih2axK.js +515 -0
- package/dist/admin/ListPage-D8Ih2axK.js.map +1 -0
- package/dist/admin/ListPage-MJlQ5gGq.js +293 -0
- package/dist/admin/ListPage-MJlQ5gGq.js.map +1 -0
- package/dist/admin/ListPage-TkJa9Qcz.js +335 -0
- package/dist/admin/ListPage-TkJa9Qcz.js.map +1 -0
- package/dist/admin/ListPage-Ur-kwyVv.mjs +531 -0
- package/dist/admin/ListPage-Ur-kwyVv.mjs.map +1 -0
- package/dist/admin/ListPage-Z0mmlysk.js +15 -0
- package/dist/admin/ListPage-Z0mmlysk.js.map +1 -0
- package/dist/admin/ListPage-gl3tUWS8.mjs +310 -0
- package/dist/admin/ListPage-gl3tUWS8.mjs.map +1 -0
- package/dist/admin/ListPage-nbTQdpBX.mjs +11 -0
- package/dist/admin/ListPage-nbTQdpBX.mjs.map +1 -0
- package/dist/admin/ListPage-xQbMtUpV.mjs +268 -0
- package/dist/admin/ListPage-xQbMtUpV.mjs.map +1 -0
- package/dist/admin/ListView-Drn22JZ1.mjs +200 -0
- package/dist/admin/ListView-Drn22JZ1.mjs.map +1 -0
- package/dist/admin/ListView-geMTlhDN.mjs +211 -0
- package/dist/admin/ListView-geMTlhDN.mjs.map +1 -0
- package/dist/admin/ListView-nRGxAwIh.js +237 -0
- package/dist/admin/ListView-nRGxAwIh.js.map +1 -0
- package/dist/admin/ListView-qAX3ZO28.js +226 -0
- package/dist/admin/ListView-qAX3ZO28.js.map +1 -0
- package/dist/admin/Login-Hn_q1QSn.js +35 -0
- package/dist/admin/Login-Hn_q1QSn.js.map +1 -0
- package/dist/admin/Login-ngKWBSD4.mjs +31 -0
- package/dist/admin/Login-ngKWBSD4.mjs.map +1 -0
- package/dist/admin/MagicLinkEE-B5NOEO47.js +31 -0
- package/dist/admin/MagicLinkEE-B5NOEO47.js.map +1 -0
- package/dist/admin/MagicLinkEE-JWmJRiBS.mjs +27 -0
- package/dist/admin/MagicLinkEE-JWmJRiBS.mjs.map +1 -0
- package/dist/admin/MarketplacePage-Pk9USes6.mjs +971 -0
- package/dist/admin/MarketplacePage-Pk9USes6.mjs.map +1 -0
- package/dist/admin/MarketplacePage-vQaaicxu.js +1001 -0
- package/dist/admin/MarketplacePage-vQaaicxu.js.map +1 -0
- package/dist/admin/Ornaments-jAwgQeK0.mjs +209 -0
- package/dist/admin/Ornaments-jAwgQeK0.mjs.map +1 -0
- package/dist/admin/Ornaments-sFPQPOtb.js +214 -0
- package/dist/admin/Ornaments-sFPQPOtb.js.map +1 -0
- package/dist/admin/Permissions-2GKZ2IjP.mjs +1986 -0
- package/dist/admin/Permissions-2GKZ2IjP.mjs.map +1 -0
- package/dist/admin/Permissions-GCSY8mIm.js +2022 -0
- package/dist/admin/Permissions-GCSY8mIm.js.map +1 -0
- package/dist/admin/PrivateRoute-KfrFibGN.js +22 -0
- package/dist/admin/PrivateRoute-KfrFibGN.js.map +1 -0
- package/dist/admin/PrivateRoute-xkGBbDbU.mjs +20 -0
- package/dist/admin/PrivateRoute-xkGBbDbU.mjs.map +1 -0
- package/dist/admin/ProfilePage-Q5UpeDjs.mjs +387 -0
- package/dist/admin/ProfilePage-Q5UpeDjs.mjs.map +1 -0
- package/dist/admin/ProfilePage-o028o7JD.js +415 -0
- package/dist/admin/ProfilePage-o028o7JD.js.map +1 -0
- package/dist/admin/PurchaseAuditLogs-Vur69JZB.js +53 -0
- package/dist/admin/PurchaseAuditLogs-Vur69JZB.js.map +1 -0
- package/dist/admin/PurchaseAuditLogs-tpXbhCx-.mjs +49 -0
- package/dist/admin/PurchaseAuditLogs-tpXbhCx-.mjs.map +1 -0
- package/dist/admin/PurchaseSingleSignOn-6VTPjJVO.mjs +52 -0
- package/dist/admin/PurchaseSingleSignOn-6VTPjJVO.mjs.map +1 -0
- package/dist/admin/PurchaseSingleSignOn-7NMcihzT.js +56 -0
- package/dist/admin/PurchaseSingleSignOn-7NMcihzT.js.map +1 -0
- package/dist/admin/SSOProviders-QBcyB9VI.js +60 -0
- package/dist/admin/SSOProviders-QBcyB9VI.js.map +1 -0
- package/dist/admin/SSOProviders-nMmBLr8g.mjs +58 -0
- package/dist/admin/SSOProviders-nMmBLr8g.mjs.map +1 -0
- package/dist/admin/SelectRoles-BtQp5Va-.mjs +111 -0
- package/dist/admin/SelectRoles-BtQp5Va-.mjs.map +1 -0
- package/dist/admin/SelectRoles-q8vaxqfL.js +115 -0
- package/dist/admin/SelectRoles-q8vaxqfL.js.map +1 -0
- package/dist/admin/SingleSignOnPage-X1OAuyhO.mjs +231 -0
- package/dist/admin/SingleSignOnPage-X1OAuyhO.mjs.map +1 -0
- package/dist/admin/SingleSignOnPage-_l9MyJvN.js +256 -0
- package/dist/admin/SingleSignOnPage-_l9MyJvN.js.map +1 -0
- package/dist/admin/Table-V5-qnRte.mjs +183 -0
- package/dist/admin/Table-V5-qnRte.mjs.map +1 -0
- package/dist/admin/Table-z6l5BFoH.js +205 -0
- package/dist/admin/Table-z6l5BFoH.js.map +1 -0
- package/dist/admin/TokenTypeSelect-2iXEz7zs.js +402 -0
- package/dist/admin/TokenTypeSelect-2iXEz7zs.js.map +1 -0
- package/dist/admin/TokenTypeSelect-crPtoLFc.mjs +374 -0
- package/dist/admin/TokenTypeSelect-crPtoLFc.mjs.map +1 -0
- package/dist/admin/UseCasePage-26Y6U1DU.js +155 -0
- package/dist/admin/UseCasePage-26Y6U1DU.js.map +1 -0
- package/dist/admin/UseCasePage-QsvlJAQD.mjs +129 -0
- package/dist/admin/UseCasePage-QsvlJAQD.mjs.map +1 -0
- package/dist/admin/admin-B6AW0Kov.mjs +318 -0
- package/dist/admin/admin-B6AW0Kov.mjs.map +1 -0
- package/dist/admin/admin-p0djr5G6.js +338 -0
- package/dist/admin/admin-p0djr5G6.js.map +1 -0
- package/dist/admin/apiTokens-YMUmHnrH.mjs +57 -0
- package/dist/admin/apiTokens-YMUmHnrH.mjs.map +1 -0
- package/dist/admin/apiTokens-YxfAnO7_.js +63 -0
- package/dist/admin/apiTokens-YxfAnO7_.js.map +1 -0
- package/dist/admin/ar-74XpZHjA.js +853 -0
- package/dist/admin/ar-74XpZHjA.js.map +1 -0
- package/dist/admin/ar-gTQs8p7A.mjs +832 -0
- package/dist/admin/ar-gTQs8p7A.mjs.map +1 -0
- package/dist/admin/ca-A-U5stlG.mjs +520 -0
- package/dist/admin/ca-A-U5stlG.mjs.map +1 -0
- package/dist/admin/ca-tfhzbe_0.js +538 -0
- package/dist/admin/ca-tfhzbe_0.js.map +1 -0
- package/dist/admin/constants-Maq_tQvu.js +55 -0
- package/dist/admin/constants-Maq_tQvu.js.map +1 -0
- package/dist/admin/constants-ThodPHfR.mjs +51 -0
- package/dist/admin/constants-ThodPHfR.mjs.map +1 -0
- package/dist/admin/cs-iYqoHUVt.mjs +166 -0
- package/dist/admin/cs-iYqoHUVt.mjs.map +1 -0
- package/dist/admin/cs-sS-228vY.js +179 -0
- package/dist/admin/cs-sS-228vY.js.map +1 -0
- package/dist/admin/de-og0YSnla.js +532 -0
- package/dist/admin/de-og0YSnla.js.map +1 -0
- package/dist/admin/de-uZBjRd6a.mjs +514 -0
- package/dist/admin/de-uZBjRd6a.mjs.map +1 -0
- package/dist/admin/dk-GtDhDxRc.js +452 -0
- package/dist/admin/dk-GtDhDxRc.js.map +1 -0
- package/dist/admin/dk-nXAO32DE.mjs +434 -0
- package/dist/admin/dk-nXAO32DE.mjs.map +1 -0
- package/dist/admin/ee.js +12 -0
- package/dist/admin/ee.js.map +1 -0
- package/dist/admin/ee.mjs +3 -0
- package/dist/admin/ee.mjs.map +1 -0
- package/dist/admin/en-GunF9CPV.mjs +786 -0
- package/dist/admin/en-GunF9CPV.mjs.map +1 -0
- package/dist/admin/en-Wdy8NEIO.js +807 -0
- package/dist/admin/en-Wdy8NEIO.js.map +1 -0
- package/dist/admin/es-TQtY4G8X.js +615 -0
- package/dist/admin/es-TQtY4G8X.js.map +1 -0
- package/dist/admin/es-i0dEHPPQ.mjs +595 -0
- package/dist/admin/es-i0dEHPPQ.mjs.map +1 -0
- package/dist/admin/eu-SRdPRyQu.js +645 -0
- package/dist/admin/eu-SRdPRyQu.js.map +1 -0
- package/dist/admin/eu-wFmYHERY.mjs +625 -0
- package/dist/admin/eu-wFmYHERY.mjs.map +1 -0
- package/dist/admin/fr-GW5-kEO9.js +571 -0
- package/dist/admin/fr-GW5-kEO9.js.map +1 -0
- package/dist/admin/fr-OI7VyC_k.mjs +550 -0
- package/dist/admin/fr-OI7VyC_k.mjs.map +1 -0
- package/dist/admin/gu-z6qqOLRh.js +438 -0
- package/dist/admin/gu-z6qqOLRh.js.map +1 -0
- package/dist/admin/gu-zSaMc-a6.mjs +429 -0
- package/dist/admin/gu-zSaMc-a6.mjs.map +1 -0
- package/dist/admin/he-CLdZZ_n1.js +329 -0
- package/dist/admin/he-CLdZZ_n1.js.map +1 -0
- package/dist/admin/he-YzAGShlQ.mjs +315 -0
- package/dist/admin/he-YzAGShlQ.mjs.map +1 -0
- package/dist/admin/hi-3pMoYe6q.js +537 -0
- package/dist/admin/hi-3pMoYe6q.js.map +1 -0
- package/dist/admin/hi-ZQ4t6UdY.mjs +519 -0
- package/dist/admin/hi-ZQ4t6UdY.mjs.map +1 -0
- package/dist/admin/hu-O1FJoY8c.mjs +625 -0
- package/dist/admin/hu-O1FJoY8c.mjs.map +1 -0
- package/dist/admin/hu-VxIqV1X0.js +645 -0
- package/dist/admin/hu-VxIqV1X0.js.map +1 -0
- package/dist/admin/id-Lb_0kPQU.mjs +290 -0
- package/dist/admin/id-Lb_0kPQU.mjs.map +1 -0
- package/dist/admin/id-cUUpuxZO.js +303 -0
- package/dist/admin/id-cUUpuxZO.js.map +1 -0
- package/dist/admin/index-Ncrnmg5a.js +5385 -0
- package/dist/admin/index-Ncrnmg5a.js.map +1 -0
- package/dist/admin/index-jwAq-BX-.mjs +5306 -0
- package/dist/admin/index-jwAq-BX-.mjs.map +1 -0
- package/dist/admin/index.js +33 -27
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +3 -3
- package/dist/admin/it-136monzD.mjs +299 -0
- package/dist/admin/it-136monzD.mjs.map +1 -0
- package/dist/admin/it-m8H0rXTP.js +312 -0
- package/dist/admin/it-m8H0rXTP.js.map +1 -0
- package/dist/admin/ja-0-FUC0T4.mjs +434 -0
- package/dist/admin/ja-0-FUC0T4.mjs.map +1 -0
- package/dist/admin/ja-jhqUhh7F.js +452 -0
- package/dist/admin/ja-jhqUhh7F.js.map +1 -0
- package/dist/admin/ko-Fq49QS3z.js +451 -0
- package/dist/admin/ko-Fq49QS3z.js.map +1 -0
- package/dist/admin/ko-H3Y8GpnD.mjs +433 -0
- package/dist/admin/ko-H3Y8GpnD.mjs.map +1 -0
- package/dist/admin/ml-NPdcpJoN.mjs +519 -0
- package/dist/admin/ml-NPdcpJoN.mjs.map +1 -0
- package/dist/admin/ml-mLJM4sQP.js +537 -0
- package/dist/admin/ml-mLJM4sQP.js.map +1 -0
- package/dist/admin/ms-NDmpSkMY.js +213 -0
- package/dist/admin/ms-NDmpSkMY.js.map +1 -0
- package/dist/admin/ms-v9c434YI.mjs +200 -0
- package/dist/admin/ms-v9c434YI.mjs.map +1 -0
- package/dist/admin/nl-RREi1JAg.js +641 -0
- package/dist/admin/nl-RREi1JAg.js.map +1 -0
- package/dist/admin/nl-qHmOt3d1.mjs +621 -0
- package/dist/admin/nl-qHmOt3d1.mjs.map +1 -0
- package/dist/admin/no-2wT9Jd9n.js +313 -0
- package/dist/admin/no-2wT9Jd9n.js.map +1 -0
- package/dist/admin/no-XGZQN-Ji.mjs +300 -0
- package/dist/admin/no-XGZQN-Ji.mjs.map +1 -0
- package/dist/admin/pl-Id5YX-Pw.mjs +519 -0
- package/dist/admin/pl-Id5YX-Pw.mjs.map +1 -0
- package/dist/admin/pl-kU2npCRO.js +537 -0
- package/dist/admin/pl-kU2npCRO.js.map +1 -0
- package/dist/admin/pt-BR-0o0Gf-P8.mjs +588 -0
- package/dist/admin/pt-BR-0o0Gf-P8.mjs.map +1 -0
- package/dist/admin/pt-BR-R-dMJxPL.js +608 -0
- package/dist/admin/pt-BR-R-dMJxPL.js.map +1 -0
- package/dist/admin/pt-IygqsPYv.js +212 -0
- package/dist/admin/pt-IygqsPYv.js.map +1 -0
- package/dist/admin/pt-f52AXrxz.mjs +200 -0
- package/dist/admin/pt-f52AXrxz.mjs.map +1 -0
- package/dist/admin/rbac-A_QIXvpC.mjs +1174 -0
- package/dist/admin/rbac-A_QIXvpC.mjs.map +1 -0
- package/dist/admin/rbac-c6QPc6s7.js +1240 -0
- package/dist/admin/rbac-c6QPc6s7.js.map +1 -0
- package/dist/admin/ru-5TBoMH_2.js +766 -0
- package/dist/admin/ru-5TBoMH_2.js.map +1 -0
- package/dist/admin/ru-FpmG9SEf.mjs +745 -0
- package/dist/admin/ru-FpmG9SEf.mjs.map +1 -0
- package/dist/admin/sa-KUwV8aRB.mjs +519 -0
- package/dist/admin/sa-KUwV8aRB.mjs.map +1 -0
- package/dist/admin/sa-KmwTiEO5.js +537 -0
- package/dist/admin/sa-KmwTiEO5.js.map +1 -0
- package/dist/admin/selectors-s8oNaHXK.mjs +6 -0
- package/dist/admin/selectors-s8oNaHXK.mjs.map +1 -0
- package/dist/admin/selectors-yGCxM4Rk.js +8 -0
- package/dist/admin/selectors-yGCxM4Rk.js.map +1 -0
- package/dist/admin/sk-IV2uPmXo.js +503 -0
- package/dist/admin/sk-IV2uPmXo.js.map +1 -0
- package/dist/admin/sk-g_1C955P.mjs +483 -0
- package/dist/admin/sk-g_1C955P.mjs.map +1 -0
- package/dist/admin/src/StrapiApp.d.ts +14 -42
- package/dist/admin/src/components/ConfirmDialog.d.ts +17 -7
- package/dist/admin/src/components/Context.d.ts +6 -0
- package/dist/admin/src/components/Filters.d.ts +10 -9
- package/dist/admin/src/components/Form.d.ts +18 -4
- package/dist/admin/src/components/FormInputs/Boolean.d.ts +2 -2
- package/dist/admin/src/components/FormInputs/Checkbox.d.ts +2 -2
- package/dist/admin/src/components/FormInputs/Date.d.ts +2 -2
- package/dist/admin/src/components/FormInputs/DateTime.d.ts +2 -2
- package/dist/admin/src/components/FormInputs/Email.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Enumeration.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Json.d.ts +3 -4
- package/dist/admin/src/components/FormInputs/Number.d.ts +2 -2
- package/dist/admin/src/components/FormInputs/Password.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Renderer.d.ts +2 -8
- package/dist/admin/src/components/FormInputs/String.d.ts +2 -4
- package/dist/admin/src/components/FormInputs/Textarea.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Time.d.ts +2 -2
- package/dist/admin/src/components/FormInputs/types.d.ts +1 -0
- package/dist/admin/src/components/Layouts/ActionLayout.d.ts +7 -0
- package/dist/admin/src/components/Layouts/ContentLayout.d.ts +6 -0
- package/dist/admin/src/components/Layouts/GridLayout.d.ts +17 -0
- package/dist/admin/src/components/Layouts/HeaderLayout.d.ts +19 -0
- package/dist/admin/src/components/Layouts/Layout.d.ts +18 -0
- package/dist/admin/src/components/MainNav/MainNav.d.ts +3 -0
- package/dist/admin/src/components/MainNav/NavBrand.d.ts +1 -0
- package/dist/admin/src/components/MainNav/NavLink.d.ts +24 -0
- package/dist/admin/src/components/MainNav/NavUser.d.ts +7 -0
- package/dist/admin/src/components/PageHelpers.d.ts +5 -1
- package/dist/admin/src/components/Table.d.ts +1 -1
- package/dist/admin/src/constants.d.ts +2 -2
- package/dist/admin/src/core/apis/rbac.d.ts +24 -0
- package/dist/admin/src/core/store/configure.d.ts +4 -21
- package/dist/admin/src/core/store/hooks.d.ts +3 -24
- package/dist/admin/src/ee.d.ts +5 -0
- package/dist/admin/src/features/Auth.d.ts +14 -3
- package/dist/admin/src/features/BackButton.d.ts +1 -1
- package/dist/admin/src/features/StrapiApp.d.ts +3 -1
- package/dist/admin/src/features/Tracking.d.ts +1 -1
- package/dist/admin/src/hooks/useAPIErrorHandler.d.ts +2 -4
- package/dist/admin/src/hooks/useAdminRoles.d.ts +2 -2
- package/dist/admin/src/hooks/useContentTypes.d.ts +3 -3
- package/dist/admin/src/hooks/useFetchClient.d.ts +4 -10
- package/dist/admin/src/hooks/useFocusInputField.d.ts +2 -5
- package/dist/admin/src/hooks/useMenu.d.ts +1 -1
- package/dist/admin/src/hooks/useRBAC.d.ts +33 -1
- package/dist/admin/src/hooks/useSettingsMenu.d.ts +1 -1
- package/dist/admin/src/index.d.ts +18 -7
- package/dist/admin/src/layouts/UnauthenticatedLayout.d.ts +4 -1
- package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.d.ts +9 -0
- package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +6 -50
- package/dist/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.d.ts +4 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.d.ts +1 -4
- package/dist/admin/src/pages/Settings/pages/Roles/components/HiddenAction.d.ts +2 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.d.ts +2 -4
- package/dist/admin/src/pages/Settings/pages/Roles/components/RoleRow.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/utils/constants.d.ts +3 -3
- package/dist/admin/src/pages/Settings/pages/Users/components/CreateActionCE.d.ts +2 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/components/Events.d.ts +2 -3
- package/dist/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
- package/dist/admin/src/selectors.d.ts +2 -16
- package/dist/admin/src/services/admin.d.ts +5 -5
- package/dist/admin/src/services/api.d.ts +11 -9
- package/dist/admin/src/services/apiTokens.d.ts +1 -1
- package/dist/admin/src/services/auth.d.ts +14 -12
- package/dist/admin/src/services/contentApi.d.ts +2 -2
- package/dist/admin/src/services/contentManager.d.ts +6 -2
- package/dist/admin/src/services/transferTokens.d.ts +2 -2
- package/dist/admin/src/services/users.d.ts +8 -8
- package/dist/admin/src/services/webhooks.d.ts +2 -2
- package/dist/admin/src/types/adminConfiguration.d.ts +90 -0
- package/dist/admin/src/utils/baseQuery.d.ts +10 -9
- package/dist/admin/src/utils/getFetchClient.d.ts +40 -10
- package/dist/admin/src/utils/normalizeAPIError.d.ts +2 -5
- package/dist/admin/src/utils/once.d.ts +1 -0
- package/dist/admin/src/utils/urls.d.ts +7 -1
- package/dist/admin/src/utils/users.d.ts +4 -4
- package/dist/admin/sv-Uv9nW9cN.js +640 -0
- package/dist/admin/sv-Uv9nW9cN.js.map +1 -0
- package/dist/admin/sv-lzyY1dsz.mjs +620 -0
- package/dist/admin/sv-lzyY1dsz.mjs.map +1 -0
- package/dist/admin/test.js +180 -2656
- package/dist/admin/test.js.map +1 -1
- package/dist/admin/test.mjs +176 -2652
- package/dist/admin/test.mjs.map +1 -1
- package/dist/admin/tests/mockData.d.ts +0 -1065
- package/dist/admin/tests/store.d.ts +0 -169
- package/dist/admin/tests/utils.d.ts +1 -177
- package/dist/admin/th-7LJ9Y8EL.mjs +284 -0
- package/dist/admin/th-7LJ9Y8EL.mjs.map +1 -0
- package/dist/admin/th-SXQwWjv6.js +297 -0
- package/dist/admin/th-SXQwWjv6.js.map +1 -0
- package/dist/admin/tr-09v-DLMg.mjs +581 -0
- package/dist/admin/tr-09v-DLMg.mjs.map +1 -0
- package/dist/admin/tr-RBQM-Vq5.js +601 -0
- package/dist/admin/tr-RBQM-Vq5.js.map +1 -0
- package/dist/admin/transferTokens-CNI0TFdA.mjs +69 -0
- package/dist/admin/transferTokens-CNI0TFdA.mjs.map +1 -0
- package/dist/admin/transferTokens-HcVXmOrq.js +76 -0
- package/dist/admin/transferTokens-HcVXmOrq.js.map +1 -0
- package/dist/admin/uk-38IblmOr.mjs +201 -0
- package/dist/admin/uk-38IblmOr.mjs.map +1 -0
- package/dist/admin/uk-5T4XFIKm.js +214 -0
- package/dist/admin/uk-5T4XFIKm.js.map +1 -0
- package/dist/admin/useAdminRoles-gMNUnVWO.mjs +28 -0
- package/dist/admin/useAdminRoles-gMNUnVWO.mjs.map +1 -0
- package/dist/admin/useAdminRoles-zEk0tBhE.js +50 -0
- package/dist/admin/useAdminRoles-zEk0tBhE.js.map +1 -0
- package/dist/admin/useEnterprise-DUs6BYlP.js +50 -0
- package/dist/admin/useEnterprise-DUs6BYlP.js.map +1 -0
- package/dist/admin/useEnterprise-jpsYZWzn.mjs +28 -0
- package/dist/admin/useEnterprise-jpsYZWzn.mjs.map +1 -0
- package/dist/admin/useLicenseLimitNotification-AUg5DyS9.mjs +80 -0
- package/dist/admin/useLicenseLimitNotification-AUg5DyS9.mjs.map +1 -0
- package/dist/admin/useLicenseLimitNotification-ItNGgex2.js +105 -0
- package/dist/admin/useLicenseLimitNotification-ItNGgex2.js.map +1 -0
- package/dist/admin/useLicenseLimits-FtmLXkwK.js +45 -0
- package/dist/admin/useLicenseLimits-FtmLXkwK.js.map +1 -0
- package/dist/admin/useLicenseLimits-Jy6E6qc2.mjs +23 -0
- package/dist/admin/useLicenseLimits-Jy6E6qc2.mjs.map +1 -0
- package/dist/admin/useWebhooks-bgdpL7W6.mjs +93 -0
- package/dist/admin/useWebhooks-bgdpL7W6.mjs.map +1 -0
- package/dist/admin/useWebhooks-opYGugiT.js +95 -0
- package/dist/admin/useWebhooks-opYGugiT.js.map +1 -0
- package/dist/admin/users-R5A0kUOV.js +33 -0
- package/dist/admin/users-R5A0kUOV.js.map +1 -0
- package/dist/admin/users-a4KTyEyc.mjs +30 -0
- package/dist/admin/users-a4KTyEyc.mjs.map +1 -0
- package/dist/admin/validation-F0JMLUkr.mjs +43 -0
- package/dist/admin/validation-F0JMLUkr.mjs.map +1 -0
- package/dist/admin/validation-cP2hBbZm.js +65 -0
- package/dist/admin/validation-cP2hBbZm.js.map +1 -0
- package/dist/admin/vi-mj-Smy3d.js +200 -0
- package/dist/admin/vi-mj-Smy3d.js.map +1 -0
- package/dist/admin/vi-ryNZtXtk.mjs +187 -0
- package/dist/admin/vi-ryNZtXtk.mjs.map +1 -0
- package/dist/admin/zh-6qF5HCOo.js +642 -0
- package/dist/admin/zh-6qF5HCOo.js.map +1 -0
- package/dist/admin/zh-Hans-HlxDUeVA.mjs +716 -0
- package/dist/admin/zh-Hans-HlxDUeVA.mjs.map +1 -0
- package/dist/admin/zh-Hans-eWSoi9-X.js +737 -0
- package/dist/admin/zh-Hans-eWSoi9-X.js.map +1 -0
- package/dist/admin/zh-WEteLuNm.mjs +622 -0
- package/dist/admin/zh-WEteLuNm.mjs.map +1 -0
- package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +2 -2
- package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.d.ts +2 -1
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/ee/admin/src/utils/cookies.d.ts +2 -0
- package/dist/ee/server/index.js +1254 -3011
- package/dist/ee/server/index.js.map +1 -1
- package/dist/ee/server/index.mjs +1259 -3013
- package/dist/ee/server/index.mjs.map +1 -1
- package/dist/package.json.d.ts +33 -46
- package/dist/server/index.js +170 -146
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +147 -140
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/server/src/controllers/webhooks.d.ts.map +1 -1
- package/dist/server/src/domain/permission/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/serve-admin-panel.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +7 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics.d.ts +8 -6
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/dist/server/src/services/passport.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
- package/dist/server/src/services/transfer/token.d.ts.map +1 -1
- package/dist/server/src/validation/project-settings.d.ts +52 -6
- package/dist/server/src/validation/project-settings.d.ts.map +1 -1
- package/dist/shared/contracts/admin.d.ts +7 -1
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- package/dist/shared/contracts/content-types.d.ts +5 -0
- package/dist/shared/contracts/content-types.d.ts.map +1 -0
- package/dist/shared/contracts/webhooks.d.ts +5 -5
- package/dist/shared/contracts/webhooks.d.ts.map +1 -1
- package/package.json +34 -47
- package/strapi-server.js +1 -0
- package/dist/admin/AdminSeatInfo-Gp4BFR1_.js +0 -105
- package/dist/admin/AdminSeatInfo-Gp4BFR1_.js.map +0 -1
- package/dist/admin/AdminSeatInfo-dDgFBcLY.mjs +0 -101
- package/dist/admin/AdminSeatInfo-dDgFBcLY.mjs.map +0 -1
- package/dist/admin/ApplicationInfoPage-GQLKLk5T.mjs +0 -670
- package/dist/admin/ApplicationInfoPage-GQLKLk5T.mjs.map +0 -1
- package/dist/admin/ApplicationInfoPage-e_sOqQMh.js +0 -698
- package/dist/admin/ApplicationInfoPage-e_sOqQMh.js.map +0 -1
- package/dist/admin/AuthResponse-gf-zZkxm.mjs +0 -43
- package/dist/admin/AuthResponse-gf-zZkxm.mjs.map +0 -1
- package/dist/admin/AuthResponse-l5QiAAK7.js +0 -70
- package/dist/admin/AuthResponse-l5QiAAK7.js.map +0 -1
- package/dist/admin/AuthenticatedLayout-3fYM18Xy.mjs +0 -1115
- package/dist/admin/AuthenticatedLayout-3fYM18Xy.mjs.map +0 -1
- package/dist/admin/AuthenticatedLayout-gGQYIisy.js +0 -1148
- package/dist/admin/AuthenticatedLayout-gGQYIisy.js.map +0 -1
- package/dist/admin/ComponentConfigurationPage-0kf7a5LK.mjs +0 -237
- package/dist/admin/ComponentConfigurationPage-0kf7a5LK.mjs.map +0 -1
- package/dist/admin/ComponentConfigurationPage-U7RcNJFs.js +0 -262
- package/dist/admin/ComponentConfigurationPage-U7RcNJFs.js.map +0 -1
- package/dist/admin/ComponentIcon-AkrHxAkm.mjs +0 -158
- package/dist/admin/ComponentIcon-AkrHxAkm.mjs.map +0 -1
- package/dist/admin/ComponentIcon-wcNWpdCz.js +0 -180
- package/dist/admin/ComponentIcon-wcNWpdCz.js.map +0 -1
- package/dist/admin/ContentBox-PbS25I_4.mjs +0 -40
- package/dist/admin/ContentBox-PbS25I_4.mjs.map +0 -1
- package/dist/admin/ContentBox-xqJCP2BC.js +0 -46
- package/dist/admin/ContentBox-xqJCP2BC.js.map +0 -1
- package/dist/admin/CreateActionEE-HO-FmNjw.js +0 -61
- package/dist/admin/CreateActionEE-HO-FmNjw.js.map +0 -1
- package/dist/admin/CreateActionEE-OscS6KZj.mjs +0 -53
- package/dist/admin/CreateActionEE-OscS6KZj.mjs.map +0 -1
- package/dist/admin/CreatePage-1a_Nb-RK.mjs +0 -248
- package/dist/admin/CreatePage-1a_Nb-RK.mjs.map +0 -1
- package/dist/admin/CreatePage-8rG8fSZv.mjs +0 -245
- package/dist/admin/CreatePage-8rG8fSZv.mjs.map +0 -1
- package/dist/admin/CreatePage-B0kLot_Q.js +0 -18
- package/dist/admin/CreatePage-B0kLot_Q.js.map +0 -1
- package/dist/admin/CreatePage-c92hDTE3.mjs +0 -13
- package/dist/admin/CreatePage-c92hDTE3.mjs.map +0 -1
- package/dist/admin/CreatePage-h9gJgINE.js +0 -274
- package/dist/admin/CreatePage-h9gJgINE.js.map +0 -1
- package/dist/admin/CreatePage-pN8WcSWM.js +0 -272
- package/dist/admin/CreatePage-pN8WcSWM.js.map +0 -1
- package/dist/admin/CreateView-Gd7sLphf.js +0 -17
- package/dist/admin/CreateView-Gd7sLphf.js.map +0 -1
- package/dist/admin/CreateView-PIPvgwa8.mjs +0 -13
- package/dist/admin/CreateView-PIPvgwa8.mjs.map +0 -1
- package/dist/admin/CreateView-kVD9MjAf.js +0 -17
- package/dist/admin/CreateView-kVD9MjAf.js.map +0 -1
- package/dist/admin/CreateView-nXkGgZTO.mjs +0 -13
- package/dist/admin/CreateView-nXkGgZTO.mjs.map +0 -1
- package/dist/admin/EditConfigurationPage-YAS-MAtE.js +0 -155
- package/dist/admin/EditConfigurationPage-YAS-MAtE.js.map +0 -1
- package/dist/admin/EditConfigurationPage-jugWslla.mjs +0 -130
- package/dist/admin/EditConfigurationPage-jugWslla.mjs.map +0 -1
- package/dist/admin/EditPage-6pGLGlrZ.mjs +0 -794
- package/dist/admin/EditPage-6pGLGlrZ.mjs.map +0 -1
- package/dist/admin/EditPage-I99-ASjb.mjs +0 -325
- package/dist/admin/EditPage-I99-ASjb.mjs.map +0 -1
- package/dist/admin/EditPage-NrM8ZRAf.mjs +0 -303
- package/dist/admin/EditPage-NrM8ZRAf.mjs.map +0 -1
- package/dist/admin/EditPage-ci9fcWte.js +0 -327
- package/dist/admin/EditPage-ci9fcWte.js.map +0 -1
- package/dist/admin/EditPage-fT6nuOwT.mjs +0 -260
- package/dist/admin/EditPage-fT6nuOwT.mjs.map +0 -1
- package/dist/admin/EditPage-hEDFGDcC.js +0 -822
- package/dist/admin/EditPage-hEDFGDcC.js.map +0 -1
- package/dist/admin/EditPage-m5HVhxC-.js +0 -286
- package/dist/admin/EditPage-m5HVhxC-.js.map +0 -1
- package/dist/admin/EditPage-um8Yysr-.js +0 -354
- package/dist/admin/EditPage-um8Yysr-.js.map +0 -1
- package/dist/admin/EditView-79rujo0b.mjs +0 -336
- package/dist/admin/EditView-79rujo0b.mjs.map +0 -1
- package/dist/admin/EditView-zEf-a-YM.js +0 -362
- package/dist/admin/EditView-zEf-a-YM.js.map +0 -1
- package/dist/admin/EditViewPage-BJdNfzBZ.mjs +0 -198
- package/dist/admin/EditViewPage-BJdNfzBZ.mjs.map +0 -1
- package/dist/admin/EditViewPage-Y67V7K7l.js +0 -226
- package/dist/admin/EditViewPage-Y67V7K7l.js.map +0 -1
- package/dist/admin/EditViewPage-iuq_KY3C.mjs +0 -846
- package/dist/admin/EditViewPage-iuq_KY3C.mjs.map +0 -1
- package/dist/admin/EditViewPage-vrE8FNb1.js +0 -879
- package/dist/admin/EditViewPage-vrE8FNb1.js.map +0 -1
- package/dist/admin/EventsTable-LOh2EX0N.mjs +0 -32
- package/dist/admin/EventsTable-LOh2EX0N.mjs.map +0 -1
- package/dist/admin/EventsTable-bm16Pj4a.js +0 -36
- package/dist/admin/EventsTable-bm16Pj4a.js.map +0 -1
- package/dist/admin/FieldTypeIcon-SCwhXPf6.mjs +0 -50
- package/dist/admin/FieldTypeIcon-SCwhXPf6.mjs.map +0 -1
- package/dist/admin/FieldTypeIcon-u9dTaLwb.js +0 -52
- package/dist/admin/FieldTypeIcon-u9dTaLwb.js.map +0 -1
- package/dist/admin/Filters-5FAHd62q.js +0 -511
- package/dist/admin/Filters-5FAHd62q.js.map +0 -1
- package/dist/admin/Filters-hYfcsahl.mjs +0 -489
- package/dist/admin/Filters-hYfcsahl.mjs.map +0 -1
- package/dist/admin/Form-7gccxUtH.mjs +0 -739
- package/dist/admin/Form-7gccxUtH.mjs.map +0 -1
- package/dist/admin/Form-m0qUJusG.js +0 -767
- package/dist/admin/Form-m0qUJusG.js.map +0 -1
- package/dist/admin/History-UVk6YZaL.js +0 -456
- package/dist/admin/History-UVk6YZaL.js.map +0 -1
- package/dist/admin/History-gNttF1-u.mjs +0 -430
- package/dist/admin/History-gNttF1-u.mjs.map +0 -1
- package/dist/admin/HomePage-2q7ngwX4.mjs +0 -11
- package/dist/admin/HomePage-2q7ngwX4.mjs.map +0 -1
- package/dist/admin/HomePage-_eHszm7N.mjs +0 -521
- package/dist/admin/HomePage-_eHszm7N.mjs.map +0 -1
- package/dist/admin/HomePage-jwm3AAzI.js +0 -530
- package/dist/admin/HomePage-jwm3AAzI.js.map +0 -1
- package/dist/admin/HomePage-ozwWqZdZ.js +0 -15
- package/dist/admin/HomePage-ozwWqZdZ.js.map +0 -1
- package/dist/admin/InputRenderer-tdeZayqM.js +0 -5345
- package/dist/admin/InputRenderer-tdeZayqM.js.map +0 -1
- package/dist/admin/InputRenderer-uXGu-VvL.mjs +0 -5304
- package/dist/admin/InputRenderer-uXGu-VvL.mjs.map +0 -1
- package/dist/admin/InstalledPluginsPage-rGp1BINi.mjs +0 -101
- package/dist/admin/InstalledPluginsPage-rGp1BINi.mjs.map +0 -1
- package/dist/admin/InstalledPluginsPage-relNbZiA.js +0 -126
- package/dist/admin/InstalledPluginsPage-relNbZiA.js.map +0 -1
- package/dist/admin/Layout-JSg7Wwnx.mjs +0 -89
- package/dist/admin/Layout-JSg7Wwnx.mjs.map +0 -1
- package/dist/admin/Layout-gqm-mRb2.mjs +0 -209
- package/dist/admin/Layout-gqm-mRb2.mjs.map +0 -1
- package/dist/admin/Layout-rp7YlCuF.js +0 -237
- package/dist/admin/Layout-rp7YlCuF.js.map +0 -1
- package/dist/admin/Layout-tPXv8ts4.js +0 -97
- package/dist/admin/Layout-tPXv8ts4.js.map +0 -1
- package/dist/admin/ListConfigurationPage-1JkDop6y.mjs +0 -651
- package/dist/admin/ListConfigurationPage-1JkDop6y.mjs.map +0 -1
- package/dist/admin/ListConfigurationPage-egv99PTx.js +0 -679
- package/dist/admin/ListConfigurationPage-egv99PTx.js.map +0 -1
- package/dist/admin/ListPage-5VIwPlnG.js +0 -520
- package/dist/admin/ListPage-5VIwPlnG.js.map +0 -1
- package/dist/admin/ListPage-85XB15gk.js +0 -305
- package/dist/admin/ListPage-85XB15gk.js.map +0 -1
- package/dist/admin/ListPage-NG7c9Zx-.js +0 -313
- package/dist/admin/ListPage-NG7c9Zx-.js.map +0 -1
- package/dist/admin/ListPage-Wf8HxliA.js +0 -15
- package/dist/admin/ListPage-Wf8HxliA.js.map +0 -1
- package/dist/admin/ListPage-Y0vGfxO1.mjs +0 -492
- package/dist/admin/ListPage-Y0vGfxO1.mjs.map +0 -1
- package/dist/admin/ListPage-_1MCPNWC.mjs +0 -11
- package/dist/admin/ListPage-_1MCPNWC.mjs.map +0 -1
- package/dist/admin/ListPage-bdblB4wE.mjs +0 -338
- package/dist/admin/ListPage-bdblB4wE.mjs.map +0 -1
- package/dist/admin/ListPage-d0uTS6lH.js +0 -363
- package/dist/admin/ListPage-d0uTS6lH.js.map +0 -1
- package/dist/admin/ListPage-e0975Wh-.js +0 -568
- package/dist/admin/ListPage-e0975Wh-.js.map +0 -1
- package/dist/admin/ListPage-eMKRFxzM.mjs +0 -288
- package/dist/admin/ListPage-eMKRFxzM.mjs.map +0 -1
- package/dist/admin/ListPage-tFqx6zb_.mjs +0 -540
- package/dist/admin/ListPage-tFqx6zb_.mjs.map +0 -1
- package/dist/admin/ListPage-v07yRAHk.mjs +0 -277
- package/dist/admin/ListPage-v07yRAHk.mjs.map +0 -1
- package/dist/admin/ListView-9shnR2xp.mjs +0 -212
- package/dist/admin/ListView-9shnR2xp.mjs.map +0 -1
- package/dist/admin/ListView-IaEe1_Uy.js +0 -238
- package/dist/admin/ListView-IaEe1_Uy.js.map +0 -1
- package/dist/admin/ListView-_EZZ571X.js +0 -228
- package/dist/admin/ListView-_EZZ571X.js.map +0 -1
- package/dist/admin/ListView-z9G1Eash.mjs +0 -202
- package/dist/admin/ListView-z9G1Eash.mjs.map +0 -1
- package/dist/admin/ListViewPage-FE12IpwT.mjs +0 -925
- package/dist/admin/ListViewPage-FE12IpwT.mjs.map +0 -1
- package/dist/admin/ListViewPage-u5WSF93L.js +0 -957
- package/dist/admin/ListViewPage-u5WSF93L.js.map +0 -1
- package/dist/admin/Login-9iKNSYCJ.mjs +0 -31
- package/dist/admin/Login-9iKNSYCJ.mjs.map +0 -1
- package/dist/admin/Login-ug0ICazL.js +0 -39
- package/dist/admin/Login-ug0ICazL.js.map +0 -1
- package/dist/admin/MagicLinkEE-3a4aj5bM.mjs +0 -27
- package/dist/admin/MagicLinkEE-3a4aj5bM.mjs.map +0 -1
- package/dist/admin/MagicLinkEE-TlpYCgSF.js +0 -31
- package/dist/admin/MagicLinkEE-TlpYCgSF.js.map +0 -1
- package/dist/admin/MarketplacePage-BBs4GMeX.mjs +0 -1014
- package/dist/admin/MarketplacePage-BBs4GMeX.mjs.map +0 -1
- package/dist/admin/MarketplacePage-GuZItQkJ.js +0 -1045
- package/dist/admin/MarketplacePage-GuZItQkJ.js.map +0 -1
- package/dist/admin/NoContentTypePage-MI-TNgDm.mjs +0 -50
- package/dist/admin/NoContentTypePage-MI-TNgDm.mjs.map +0 -1
- package/dist/admin/NoContentTypePage-WM9PSeKc.js +0 -54
- package/dist/admin/NoContentTypePage-WM9PSeKc.js.map +0 -1
- package/dist/admin/NoPermissionsPage-K6eIf5zl.mjs +0 -23
- package/dist/admin/NoPermissionsPage-K6eIf5zl.mjs.map +0 -1
- package/dist/admin/NoPermissionsPage-PP92ItBk.js +0 -27
- package/dist/admin/NoPermissionsPage-PP92ItBk.js.map +0 -1
- package/dist/admin/NotAllowed-9d8xvtvI.mjs +0 -36
- package/dist/admin/NotAllowed-9d8xvtvI.mjs.map +0 -1
- package/dist/admin/NotAllowed-FmDlK9I3.js +0 -42
- package/dist/admin/NotAllowed-FmDlK9I3.js.map +0 -1
- package/dist/admin/Ornaments-fHu7120M.js +0 -214
- package/dist/admin/Ornaments-fHu7120M.js.map +0 -1
- package/dist/admin/Ornaments-izqdN6fh.mjs +0 -209
- package/dist/admin/Ornaments-izqdN6fh.mjs.map +0 -1
- package/dist/admin/Permissions-jsl-R7bI.js +0 -2082
- package/dist/admin/Permissions-jsl-R7bI.js.map +0 -1
- package/dist/admin/Permissions-v99MLjbi.mjs +0 -2046
- package/dist/admin/Permissions-v99MLjbi.mjs.map +0 -1
- package/dist/admin/PrivateRoute-AFoVG5Bk.js +0 -22
- package/dist/admin/PrivateRoute-AFoVG5Bk.js.map +0 -1
- package/dist/admin/PrivateRoute-XiRz2oSq.mjs +0 -20
- package/dist/admin/PrivateRoute-XiRz2oSq.mjs.map +0 -1
- package/dist/admin/ProfilePage-HjJiMiTt.mjs +0 -391
- package/dist/admin/ProfilePage-HjJiMiTt.mjs.map +0 -1
- package/dist/admin/ProfilePage-wGM1mvXn.js +0 -419
- package/dist/admin/ProfilePage-wGM1mvXn.js.map +0 -1
- package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs +0 -48
- package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs.map +0 -1
- package/dist/admin/PurchaseAuditLogs-couRts7-.js +0 -52
- package/dist/admin/PurchaseAuditLogs-couRts7-.js.map +0 -1
- package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs +0 -51
- package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs.map +0 -1
- package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js +0 -55
- package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js.map +0 -1
- package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs +0 -51
- package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs.map +0 -1
- package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js +0 -55
- package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js.map +0 -1
- package/dist/admin/ReviewWorkflowsColumn-NUu47oVz.mjs +0 -34
- package/dist/admin/ReviewWorkflowsColumn-NUu47oVz.mjs.map +0 -1
- package/dist/admin/ReviewWorkflowsColumn-uIqJfjyd.js +0 -39
- package/dist/admin/ReviewWorkflowsColumn-uIqJfjyd.js.map +0 -1
- package/dist/admin/SSOProviders-JTam8pNP.js +0 -64
- package/dist/admin/SSOProviders-JTam8pNP.js.map +0 -1
- package/dist/admin/SSOProviders-f1OPn1AH.mjs +0 -58
- package/dist/admin/SSOProviders-f1OPn1AH.mjs.map +0 -1
- package/dist/admin/SelectRoles-5vr-vXOm.js +0 -114
- package/dist/admin/SelectRoles-5vr-vXOm.js.map +0 -1
- package/dist/admin/SelectRoles-ytHc3di2.mjs +0 -106
- package/dist/admin/SelectRoles-ytHc3di2.mjs.map +0 -1
- package/dist/admin/SingleSignOnPage-1Wqj_7y-.js +0 -263
- package/dist/admin/SingleSignOnPage-1Wqj_7y-.js.map +0 -1
- package/dist/admin/SingleSignOnPage-7oJES3UH.mjs +0 -238
- package/dist/admin/SingleSignOnPage-7oJES3UH.mjs.map +0 -1
- package/dist/admin/Table-LQhGojNx.mjs +0 -165
- package/dist/admin/Table-LQhGojNx.mjs.map +0 -1
- package/dist/admin/Table-M5UsBfFs.js +0 -190
- package/dist/admin/Table-M5UsBfFs.js.map +0 -1
- package/dist/admin/TokenTypeSelect-5o9mvFd7.mjs +0 -357
- package/dist/admin/TokenTypeSelect-5o9mvFd7.mjs.map +0 -1
- package/dist/admin/TokenTypeSelect-ZBDI26vJ.js +0 -385
- package/dist/admin/TokenTypeSelect-ZBDI26vJ.js.map +0 -1
- package/dist/admin/UseCasePage-e7rn-aW-.mjs +0 -146
- package/dist/admin/UseCasePage-e7rn-aW-.mjs.map +0 -1
- package/dist/admin/UseCasePage-q3u-xs7F.js +0 -175
- package/dist/admin/UseCasePage-q3u-xs7F.js.map +0 -1
- package/dist/admin/apiTokens-_gKUBKPQ.js +0 -62
- package/dist/admin/apiTokens-_gKUBKPQ.js.map +0 -1
- package/dist/admin/apiTokens-nD8zbNlc.mjs +0 -56
- package/dist/admin/apiTokens-nD8zbNlc.mjs.map +0 -1
- package/dist/admin/ar-i6ait0_Z.js +0 -939
- package/dist/admin/ar-i6ait0_Z.js.map +0 -1
- package/dist/admin/ar-lYsknZVT.mjs +0 -918
- package/dist/admin/ar-lYsknZVT.mjs.map +0 -1
- package/dist/admin/ca-1Cl4eOmr.js +0 -727
- package/dist/admin/ca-1Cl4eOmr.js.map +0 -1
- package/dist/admin/ca-ruPjUw52.mjs +0 -709
- package/dist/admin/ca-ruPjUw52.mjs.map +0 -1
- package/dist/admin/constants-6E1OwHx7.js +0 -197
- package/dist/admin/constants-6E1OwHx7.js.map +0 -1
- package/dist/admin/constants-AdKxCt0x.mjs +0 -52
- package/dist/admin/constants-AdKxCt0x.mjs.map +0 -1
- package/dist/admin/constants-D6NLEhwu.mjs +0 -172
- package/dist/admin/constants-D6NLEhwu.mjs.map +0 -1
- package/dist/admin/constants-DxpaZFhM.mjs +0 -10
- package/dist/admin/constants-DxpaZFhM.mjs.map +0 -1
- package/dist/admin/constants-ZZWbRAQT.js +0 -60
- package/dist/admin/constants-ZZWbRAQT.js.map +0 -1
- package/dist/admin/constants-wsN7Fj5H.js +0 -14
- package/dist/admin/constants-wsN7Fj5H.js.map +0 -1
- package/dist/admin/cs-MneRs5g8.js +0 -294
- package/dist/admin/cs-MneRs5g8.js.map +0 -1
- package/dist/admin/cs-cEW7Jgll.mjs +0 -281
- package/dist/admin/cs-cEW7Jgll.mjs.map +0 -1
- package/dist/admin/de-vPJQw5Tm.js +0 -719
- package/dist/admin/de-vPJQw5Tm.js.map +0 -1
- package/dist/admin/de-xZr3TXsT.mjs +0 -701
- package/dist/admin/de-xZr3TXsT.mjs.map +0 -1
- package/dist/admin/dk-_Fh6kypZ.js +0 -637
- package/dist/admin/dk-_Fh6kypZ.js.map +0 -1
- package/dist/admin/dk-nqK-ugFb.mjs +0 -619
- package/dist/admin/dk-nqK-ugFb.mjs.map +0 -1
- package/dist/admin/en-X84kQxpg.js +0 -1068
- package/dist/admin/en-X84kQxpg.js.map +0 -1
- package/dist/admin/en-qxG24n4z.mjs +0 -1047
- package/dist/admin/en-qxG24n4z.mjs.map +0 -1
- package/dist/admin/es-6dicYJQA.mjs +0 -779
- package/dist/admin/es-6dicYJQA.mjs.map +0 -1
- package/dist/admin/es-FC_8jlK7.js +0 -799
- package/dist/admin/es-FC_8jlK7.js.map +0 -1
- package/dist/admin/eu-Pzqod2VF.js +0 -835
- package/dist/admin/eu-Pzqod2VF.js.map +0 -1
- package/dist/admin/eu-l9nvfvQj.mjs +0 -815
- package/dist/admin/eu-l9nvfvQj.mjs.map +0 -1
- package/dist/admin/fr-8h2tzs3Z.js +0 -765
- package/dist/admin/fr-8h2tzs3Z.js.map +0 -1
- package/dist/admin/fr-97oVHDGZ.mjs +0 -744
- package/dist/admin/fr-97oVHDGZ.mjs.map +0 -1
- package/dist/admin/gu-YXP9LW1p.mjs +0 -617
- package/dist/admin/gu-YXP9LW1p.mjs.map +0 -1
- package/dist/admin/gu-fkXeW5oU.js +0 -626
- package/dist/admin/gu-fkXeW5oU.js.map +0 -1
- package/dist/admin/he-Rnd0orlz.mjs +0 -315
- package/dist/admin/he-Rnd0orlz.mjs.map +0 -1
- package/dist/admin/he-YNZzVWgP.js +0 -329
- package/dist/admin/he-YNZzVWgP.js.map +0 -1
- package/dist/admin/hi-42LJgJV1.mjs +0 -707
- package/dist/admin/hi-42LJgJV1.mjs.map +0 -1
- package/dist/admin/hi-ubgoUzQ0.js +0 -725
- package/dist/admin/hi-ubgoUzQ0.js.map +0 -1
- package/dist/admin/hu-oHJgjivB.js +0 -835
- package/dist/admin/hu-oHJgjivB.js.map +0 -1
- package/dist/admin/hu-xsansjmF.mjs +0 -815
- package/dist/admin/hu-xsansjmF.mjs.map +0 -1
- package/dist/admin/id-JurRr0gC.mjs +0 -438
- package/dist/admin/id-JurRr0gC.mjs.map +0 -1
- package/dist/admin/id-T2ge96wh.js +0 -451
- package/dist/admin/id-T2ge96wh.js.map +0 -1
- package/dist/admin/index-1NFAbkxM.mjs +0 -5927
- package/dist/admin/index-1NFAbkxM.mjs.map +0 -1
- package/dist/admin/index-mQQPK-ix.js +0 -6023
- package/dist/admin/index-mQQPK-ix.js.map +0 -1
- package/dist/admin/it-890_w-P3.mjs +0 -449
- package/dist/admin/it-890_w-P3.mjs.map +0 -1
- package/dist/admin/it-uWPMs24z.js +0 -462
- package/dist/admin/it-uWPMs24z.js.map +0 -1
- package/dist/admin/ja-F61alnK1.mjs +0 -618
- package/dist/admin/ja-F61alnK1.mjs.map +0 -1
- package/dist/admin/ja-pw-zE8MH.js +0 -636
- package/dist/admin/ja-pw-zE8MH.js.map +0 -1
- package/dist/admin/ko-DfQWK5T3.mjs +0 -616
- package/dist/admin/ko-DfQWK5T3.mjs.map +0 -1
- package/dist/admin/ko-XhK2FY3_.js +0 -634
- package/dist/admin/ko-XhK2FY3_.js.map +0 -1
- package/dist/admin/ml-EVaVYywL.mjs +0 -707
- package/dist/admin/ml-EVaVYywL.mjs.map +0 -1
- package/dist/admin/ml-hT2VI8JA.js +0 -725
- package/dist/admin/ml-hT2VI8JA.js.map +0 -1
- package/dist/admin/ms-CzgcVrsY.mjs +0 -332
- package/dist/admin/ms-CzgcVrsY.mjs.map +0 -1
- package/dist/admin/ms-DoMJCZ42.js +0 -345
- package/dist/admin/ms-DoMJCZ42.js.map +0 -1
- package/dist/admin/nl-LLi_sx9P.js +0 -831
- package/dist/admin/nl-LLi_sx9P.js.map +0 -1
- package/dist/admin/nl-XNqQYx_K.mjs +0 -811
- package/dist/admin/nl-XNqQYx_K.mjs.map +0 -1
- package/dist/admin/no-JwA1Lt4Y.mjs +0 -300
- package/dist/admin/no-JwA1Lt4Y.mjs.map +0 -1
- package/dist/admin/no-wmtVIVuz.js +0 -313
- package/dist/admin/no-wmtVIVuz.js.map +0 -1
- package/dist/admin/pl-05ncDTwZ.js +0 -724
- package/dist/admin/pl-05ncDTwZ.js.map +0 -1
- package/dist/admin/pl-euPz4n1g.mjs +0 -706
- package/dist/admin/pl-euPz4n1g.mjs.map +0 -1
- package/dist/admin/pt-BR-vpbGYSYw.mjs +0 -777
- package/dist/admin/pt-BR-vpbGYSYw.mjs.map +0 -1
- package/dist/admin/pt-BR-xA4J5pi2.js +0 -797
- package/dist/admin/pt-BR-xA4J5pi2.js.map +0 -1
- package/dist/admin/pt-RlnkaSdF.mjs +0 -287
- package/dist/admin/pt-RlnkaSdF.mjs.map +0 -1
- package/dist/admin/pt-yArB6nEx.js +0 -299
- package/dist/admin/pt-yArB6nEx.js.map +0 -1
- package/dist/admin/reducers-IQWvK_9L.mjs +0 -4617
- package/dist/admin/reducers-IQWvK_9L.mjs.map +0 -1
- package/dist/admin/reducers-wZUQqmNX.js +0 -4764
- package/dist/admin/reducers-wZUQqmNX.js.map +0 -1
- package/dist/admin/ru-4bDDGI3o.js +0 -996
- package/dist/admin/ru-4bDDGI3o.js.map +0 -1
- package/dist/admin/ru-tyoEF5X6.mjs +0 -975
- package/dist/admin/ru-tyoEF5X6.mjs.map +0 -1
- package/dist/admin/sa-OOEUNg5o.js +0 -725
- package/dist/admin/sa-OOEUNg5o.js.map +0 -1
- package/dist/admin/sa-s-WVHU-Y.mjs +0 -707
- package/dist/admin/sa-s-WVHU-Y.mjs.map +0 -1
- package/dist/admin/selectors-PTHjHMQi.js +0 -8
- package/dist/admin/selectors-PTHjHMQi.js.map +0 -1
- package/dist/admin/selectors-nn3C3YKE.mjs +0 -6
- package/dist/admin/selectors-nn3C3YKE.mjs.map +0 -1
- package/dist/admin/sk-1sQSF-r2.js +0 -693
- package/dist/admin/sk-1sQSF-r2.js.map +0 -1
- package/dist/admin/sk-5bIrjuCN.mjs +0 -673
- package/dist/admin/sk-5bIrjuCN.mjs.map +0 -1
- package/dist/admin/src/components/InjectionZone.d.ts +0 -59
- package/dist/admin/src/content-manager/components/ComponentIcon.d.ts +0 -8
- package/dist/admin/src/content-manager/components/ConfigurationForm/EditFieldForm.d.ts +0 -9
- package/dist/admin/src/content-manager/components/ConfigurationForm/Fields.d.ts +0 -21
- package/dist/admin/src/content-manager/components/ConfigurationForm/Form.d.ts +0 -32
- package/dist/admin/src/content-manager/components/DragPreviews/CardDragPreview.d.ts +0 -7
- package/dist/admin/src/content-manager/components/DragPreviews/ComponentDragPreview.d.ts +0 -6
- package/dist/admin/src/content-manager/components/DragPreviews/RelationDragPreview.d.ts +0 -11
- package/dist/admin/src/content-manager/components/FieldTypeIcon.d.ts +0 -9
- package/dist/admin/src/content-manager/components/LeftMenu.d.ts +0 -2
- package/dist/admin/src/content-manager/constants/attributes.d.ts +0 -14
- package/dist/admin/src/content-manager/constants/collections.d.ts +0 -3
- package/dist/admin/src/content-manager/constants/dragAndDrop.d.ts +0 -8
- package/dist/admin/src/content-manager/exports.d.ts +0 -10
- package/dist/admin/src/content-manager/features/DocumentRBAC.d.ts +0 -36
- package/dist/admin/src/content-manager/history/components/HistoryAction.d.ts +0 -3
- package/dist/admin/src/content-manager/history/components/VersionContent.d.ts +0 -2
- package/dist/admin/src/content-manager/history/components/VersionHeader.d.ts +0 -5
- package/dist/admin/src/content-manager/history/components/VersionsList.d.ts +0 -2
- package/dist/admin/src/content-manager/history/pages/History.d.ts +0 -25
- package/dist/admin/src/content-manager/history/routes.d.ts +0 -11
- package/dist/admin/src/content-manager/history/services/historyVersion.d.ts +0 -7
- package/dist/admin/src/content-manager/hooks/useContentManagerInitData.d.ts +0 -15
- package/dist/admin/src/content-manager/hooks/useContentTypeSchema.d.ts +0 -24
- package/dist/admin/src/content-manager/hooks/useDocument.d.ts +0 -89
- package/dist/admin/src/content-manager/hooks/useDocumentActions.d.ts +0 -102
- package/dist/admin/src/content-manager/hooks/useDocumentLayout.d.ts +0 -138
- package/dist/admin/src/content-manager/hooks/useDragAndDrop.d.ts +0 -51
- package/dist/admin/src/content-manager/hooks/useKeyboardDragAndDrop.d.ts +0 -14
- package/dist/admin/src/content-manager/hooks/useLazyComponents.d.ts +0 -13
- package/dist/admin/src/content-manager/hooks/useSyncRbac.d.ts +0 -15
- package/dist/admin/src/content-manager/layout.d.ts +0 -16
- package/dist/admin/src/content-manager/modules/rbac.d.ts +0 -14
- package/dist/admin/src/content-manager/modules/reducers.d.ts +0 -4
- package/dist/admin/src/content-manager/pages/ComponentConfigurationPage.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditConfigurationPage.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/EditViewPage.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/components/DocumentActions.d.ts +0 -69
- package/dist/admin/src/content-manager/pages/EditView/components/DocumentStatus.d.ts +0 -16
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.d.ts +0 -6
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +0 -61
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.d.ts +0 -10
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.d.ts +0 -10
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +0 -10
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Modifiers.d.ts +0 -16
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withImages.d.ts +0 -11
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withLinks.d.ts +0 -9
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.d.ts +0 -8
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +0 -13
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.d.ts +0 -6
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/links.d.ts +0 -10
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/types.d.ts +0 -10
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Initializer.d.ts +0 -9
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Input.d.ts +0 -9
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +0 -6
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +0 -6
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/ComponentContext.d.ts +0 -42
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.d.ts +0 -11
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentCard.d.ts +0 -9
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +0 -17
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +0 -9
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +0 -14
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.d.ts +0 -12
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +0 -13
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/NotAllowed.d.ts +0 -7
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Relations.d.ts +0 -26
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/UID.d.ts +0 -9
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/Editor.d.ts +0 -18
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +0 -59
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/Field.d.ts +0 -11
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.d.ts +0 -5
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +0 -7
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.d.ts +0 -17
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -54
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.d.ts +0 -5
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.d.ts +0 -4
- package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.d.ts +0 -16
- package/dist/admin/src/content-manager/pages/EditView/components/FormLayout.d.ts +0 -5
- package/dist/admin/src/content-manager/pages/EditView/components/Header.d.ts +0 -35
- package/dist/admin/src/content-manager/pages/EditView/components/InputRenderer.d.ts +0 -14
- package/dist/admin/src/content-manager/pages/EditView/components/Panels.d.ts +0 -10
- package/dist/admin/src/content-manager/pages/EditView/utils/data.d.ts +0 -20
- package/dist/admin/src/content-manager/pages/EditView/utils/forms.d.ts +0 -9
- package/dist/admin/src/content-manager/pages/ListConfiguration/ListConfigurationPage.d.ts +0 -10
- package/dist/admin/src/content-manager/pages/ListConfiguration/components/DraggableCard.d.ts +0 -12
- package/dist/admin/src/content-manager/pages/ListConfiguration/components/EditFieldForm.d.ts +0 -8
- package/dist/admin/src/content-manager/pages/ListConfiguration/components/Header.d.ts +0 -8
- package/dist/admin/src/content-manager/pages/ListConfiguration/components/Settings.d.ts +0 -5
- package/dist/admin/src/content-manager/pages/ListConfiguration/components/SortDisplayedFields.d.ts +0 -6
- package/dist/admin/src/content-manager/pages/ListView/ListViewPage.d.ts +0 -3
- package/dist/admin/src/content-manager/pages/ListView/components/AutoCloneFailureModal.d.ts +0 -8
- package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/Actions.d.ts +0 -52
- package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.d.ts +0 -15
- package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/PublishAction.d.ts +0 -31
- package/dist/admin/src/content-manager/pages/ListView/components/Filters.d.ts +0 -8
- package/dist/admin/src/content-manager/pages/ListView/components/InjectionZoneList.d.ts +0 -7
- package/dist/admin/src/content-manager/pages/ListView/components/TableActions.d.ts +0 -8
- package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellContent.d.ts +0 -9
- package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellValue.d.ts +0 -8
- package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Components.d.ts +0 -12
- package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Media.d.ts +0 -23
- package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Relations.d.ts +0 -12
- package/dist/admin/src/content-manager/pages/ListView/components/ViewSettingsMenu.d.ts +0 -10
- package/dist/admin/src/content-manager/pages/NoContentTypePage.d.ts +0 -2
- package/dist/admin/src/content-manager/pages/NoPermissionsPage.d.ts +0 -2
- package/dist/admin/src/content-manager/router.d.ts +0 -5
- package/dist/admin/src/content-manager/services/api.d.ts +0 -3
- package/dist/admin/src/content-manager/services/components.d.ts +0 -6
- package/dist/admin/src/content-manager/services/contentTypes.d.ts +0 -18
- package/dist/admin/src/content-manager/services/documents.d.ts +0 -94
- package/dist/admin/src/content-manager/services/init.d.ts +0 -10
- package/dist/admin/src/content-manager/services/relations.d.ts +0 -49
- package/dist/admin/src/content-manager/services/uid.d.ts +0 -32
- package/dist/admin/src/content-manager/utils/api.d.ts +0 -19
- package/dist/admin/src/content-manager/utils/attributes.d.ts +0 -19
- package/dist/admin/src/content-manager/utils/relations.d.ts +0 -12
- package/dist/admin/src/content-manager/utils/translations.d.ts +0 -2
- package/dist/admin/src/content-manager/utils/validation.d.ts +0 -7
- package/dist/admin/src/core/apis/content-manager.d.ts +0 -126
- package/dist/admin/src/hooks/useInjectionZone.d.ts +0 -2
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollabsableContentType.d.ts +0 -11
- package/dist/admin/src/pages/Settings/pages/PurchaseReviewWorkflows.d.ts +0 -2
- package/dist/admin/src/utils/getYupInnerErrors.d.ts +0 -7
- package/dist/admin/src/utils/hashAdminUserEmail.d.ts +0 -6
- package/dist/admin/sv-JVgQU2PS.mjs +0 -810
- package/dist/admin/sv-JVgQU2PS.mjs.map +0 -1
- package/dist/admin/sv-d0rqYiHZ.js +0 -830
- package/dist/admin/sv-d0rqYiHZ.js.map +0 -1
- package/dist/admin/th-er8qvbeL.mjs +0 -420
- package/dist/admin/th-er8qvbeL.mjs.map +0 -1
- package/dist/admin/th-mqExIzdv.js +0 -433
- package/dist/admin/th-mqExIzdv.js.map +0 -1
- package/dist/admin/tr-aYPucbUC.js +0 -788
- package/dist/admin/tr-aYPucbUC.js.map +0 -1
- package/dist/admin/tr-b2vrBJ49.mjs +0 -768
- package/dist/admin/tr-b2vrBJ49.mjs.map +0 -1
- package/dist/admin/transferTokens-P5z1yVh2.js +0 -65
- package/dist/admin/transferTokens-P5z1yVh2.js.map +0 -1
- package/dist/admin/transferTokens-PlBVZdw3.mjs +0 -59
- package/dist/admin/transferTokens-PlBVZdw3.mjs.map +0 -1
- package/dist/admin/uk-1c7KIaI6.js +0 -346
- package/dist/admin/uk-1c7KIaI6.js.map +0 -1
- package/dist/admin/uk-RfkbT49M.mjs +0 -333
- package/dist/admin/uk-RfkbT49M.mjs.map +0 -1
- package/dist/admin/useAdminRoles-BG7b996L.mjs +0 -28
- package/dist/admin/useAdminRoles-BG7b996L.mjs.map +0 -1
- package/dist/admin/useAdminRoles-THWXour6.js +0 -50
- package/dist/admin/useAdminRoles-THWXour6.js.map +0 -1
- package/dist/admin/useContentTypes-PEGh0Cg-.mjs +0 -51
- package/dist/admin/useContentTypes-PEGh0Cg-.mjs.map +0 -1
- package/dist/admin/useContentTypes-RoSvxizj.js +0 -73
- package/dist/admin/useContentTypes-RoSvxizj.js.map +0 -1
- package/dist/admin/useDebounce-OnUygPz6.mjs +0 -17
- package/dist/admin/useDebounce-OnUygPz6.mjs.map +0 -1
- package/dist/admin/useDebounce-tz5EMJbt.js +0 -39
- package/dist/admin/useDebounce-tz5EMJbt.js.map +0 -1
- package/dist/admin/useDocumentLayout-4trWL6Jz.mjs +0 -732
- package/dist/admin/useDocumentLayout-4trWL6Jz.mjs.map +0 -1
- package/dist/admin/useDocumentLayout-V_N5dUwQ.js +0 -764
- package/dist/admin/useDocumentLayout-V_N5dUwQ.js.map +0 -1
- package/dist/admin/useLicenseLimitNotification-9DqSZuyc.mjs +0 -80
- package/dist/admin/useLicenseLimitNotification-9DqSZuyc.mjs.map +0 -1
- package/dist/admin/useLicenseLimitNotification-SiWQ5LGo.js +0 -105
- package/dist/admin/useLicenseLimitNotification-SiWQ5LGo.js.map +0 -1
- package/dist/admin/useReviewWorkflows-0ty4mwQd.js +0 -29
- package/dist/admin/useReviewWorkflows-0ty4mwQd.js.map +0 -1
- package/dist/admin/useReviewWorkflows-HwyFyit7.mjs +0 -27
- package/dist/admin/useReviewWorkflows-HwyFyit7.mjs.map +0 -1
- package/dist/admin/useSyncRbac-LNOzRXJ5.mjs +0 -45
- package/dist/admin/useSyncRbac-LNOzRXJ5.mjs.map +0 -1
- package/dist/admin/useSyncRbac-vkWgDJTE.js +0 -67
- package/dist/admin/useSyncRbac-vkWgDJTE.js.map +0 -1
- package/dist/admin/useWebhooks-DmGNXCdi.js +0 -93
- package/dist/admin/useWebhooks-DmGNXCdi.js.map +0 -1
- package/dist/admin/useWebhooks-dOVyaYlw.mjs +0 -91
- package/dist/admin/useWebhooks-dOVyaYlw.mjs.map +0 -1
- package/dist/admin/validateWorkflow-99y3bkNx.js +0 -1077
- package/dist/admin/validateWorkflow-99y3bkNx.js.map +0 -1
- package/dist/admin/validateWorkflow-ubLwZqCK.mjs +0 -1033
- package/dist/admin/validateWorkflow-ubLwZqCK.mjs.map +0 -1
- package/dist/admin/validation-cpJKCQz1.mjs +0 -43
- package/dist/admin/validation-cpJKCQz1.mjs.map +0 -1
- package/dist/admin/validation-lIVymZ0n.js +0 -65
- package/dist/admin/validation-lIVymZ0n.js.map +0 -1
- package/dist/admin/vi-Rg9es0FD.js +0 -301
- package/dist/admin/vi-Rg9es0FD.js.map +0 -1
- package/dist/admin/vi-pyngavdo.mjs +0 -288
- package/dist/admin/vi-pyngavdo.mjs.map +0 -1
- package/dist/admin/zh-Hans-Gbpdme1Q.mjs +0 -939
- package/dist/admin/zh-Hans-Gbpdme1Q.mjs.map +0 -1
- package/dist/admin/zh-Hans-SgnidiuG.js +0 -960
- package/dist/admin/zh-Hans-SgnidiuG.js.map +0 -1
- package/dist/admin/zh-ONWhjzCj.js +0 -839
- package/dist/admin/zh-ONWhjzCj.js.map +0 -1
- package/dist/admin/zh-fMjW2qMl.mjs +0 -819
- package/dist/admin/zh-fMjW2qMl.mjs.map +0 -1
- package/dist/ee/admin/src/content-manager/pages/EditView/components/AssigneeSelect.d.ts +0 -2
- package/dist/ee/admin/src/content-manager/pages/EditView/components/ReviewWorkflowsPanel.d.ts +0 -3
- package/dist/ee/admin/src/content-manager/pages/EditView/components/StageSelect.d.ts +0 -1
- package/dist/ee/admin/src/content-manager/pages/EditView/components/constants.d.ts +0 -2
- package/dist/ee/admin/src/content-manager/pages/ListSettingsView/constants.d.ts +0 -7
- package/dist/ee/admin/src/content-manager/pages/ListView/components/AssigneeFilter.d.ts +0 -7
- package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsAssigneeEE.d.ts +0 -7
- package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsColumn.d.ts +0 -2
- package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsStageEE.d.ts +0 -7
- package/dist/ee/admin/src/content-manager/pages/ListView/components/StageFilter.d.ts +0 -8
- package/dist/ee/admin/src/content-manager/pages/ListView/constants.d.ts +0 -69
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/CreatePage.d.ts +0 -1
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/EditPage.d.ts +0 -1
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/ListPage.d.ts +0 -2
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/actions.d.ts +0 -86
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage.d.ts +0 -2
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Layout.d.ts +0 -12
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal.d.ts +0 -15
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stage.d.ts +0 -10
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview.d.ts +0 -4
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stages.d.ts +0 -7
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes.d.ts +0 -4
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/constants.d.ts +0 -20
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.d.ts +0 -15
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/reducer.d.ts +0 -38
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/selectors.d.ts +0 -62
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/colors.d.ts +0 -8
- package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/validateWorkflow.d.ts +0 -5
- package/dist/ee/admin/src/services/reviewWorkflows.d.ts +0 -39
- package/dist/shared/contracts/review-workflows.d.ts +0 -83
- package/dist/shared/contracts/review-workflows.d.ts.map +0 -1
- /package/dist/admin/src/{content-manager/hooks → hooks}/usePrev.d.ts +0 -0
package/dist/ee/server/index.mjs
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { resolve, basename, join, extname } from "path";
|
|
2
2
|
import fse from "fs-extra";
|
|
3
3
|
import koaStatic from "koa-static";
|
|
4
|
-
import "
|
|
5
|
-
import {
|
|
6
|
-
import { differenceInHours, parseISO, add } from "date-fns";
|
|
4
|
+
import { isNil, castArray, merge, map, uniq, difference, differenceWith, isEqual, isEmpty, toLower, isFunction, toString, pipe, toNumber, assign, reverse, take, prop, drop, pick, mapValues, curry, includes, isArray, set, omit, has, isUndefined } from "lodash/fp";
|
|
5
|
+
import { differenceInHours, parseISO } from "date-fns";
|
|
7
6
|
import { errors, async, arrays, yup, validateYupSchema, env } from "@strapi/utils";
|
|
8
|
-
import
|
|
9
|
-
import localProvider from "@strapi/provider-audit-logs-local";
|
|
10
|
-
import { scheduleJob } from "node-schedule";
|
|
7
|
+
import "@strapi/types";
|
|
11
8
|
import _ from "lodash";
|
|
12
9
|
import { Strategy } from "passport-local";
|
|
13
10
|
import passport$2 from "koa-passport";
|
|
14
11
|
import compose from "koa-compose";
|
|
12
|
+
import { scheduleJob } from "node-schedule";
|
|
15
13
|
const registerAdminPanelRoute = ({ strapi: strapi2 }) => {
|
|
16
14
|
let buildDir = resolve(strapi2.dirs.dist.root, "build");
|
|
17
15
|
if (!fse.pathExistsSync(buildDir)) {
|
|
@@ -94,9 +92,9 @@ const authenticate$2 = async (ctx) => {
|
|
|
94
92
|
ability: userAbility
|
|
95
93
|
};
|
|
96
94
|
};
|
|
97
|
-
const name
|
|
95
|
+
const name = "admin";
|
|
98
96
|
const adminAuthStrategy = {
|
|
99
|
-
name
|
|
97
|
+
name,
|
|
100
98
|
authenticate: authenticate$2
|
|
101
99
|
};
|
|
102
100
|
const DAY_IN_MS = 24 * 60 * 60 * 1e3;
|
|
@@ -217,7 +215,7 @@ const apiTokenAuthStrategy = {
|
|
|
217
215
|
verify
|
|
218
216
|
};
|
|
219
217
|
const executeCERegister = ({ strapi: strapi2 }) => {
|
|
220
|
-
const passportMiddleware = strapi2.admin
|
|
218
|
+
const passportMiddleware = strapi2.service("admin::passport").init();
|
|
221
219
|
strapi2.server.api("admin").use(passportMiddleware);
|
|
222
220
|
strapi2.get("auth").register("admin", adminAuthStrategy);
|
|
223
221
|
strapi2.get("auth").register("content-api", apiTokenAuthStrategy);
|
|
@@ -225,138 +223,354 @@ const executeCERegister = ({ strapi: strapi2 }) => {
|
|
|
225
223
|
registerAdminPanelRoute({ strapi: strapi2 });
|
|
226
224
|
}
|
|
227
225
|
};
|
|
228
|
-
async
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
226
|
+
const register = async ({ strapi: strapi2 }) => {
|
|
227
|
+
await executeCERegister({ strapi: strapi2 });
|
|
228
|
+
};
|
|
229
|
+
const actions$1 = [
|
|
230
|
+
{
|
|
231
|
+
uid: "marketplace.read",
|
|
232
|
+
displayName: "Access the marketplace",
|
|
233
|
+
pluginName: "admin",
|
|
234
|
+
section: "settings",
|
|
235
|
+
category: "plugins and marketplace",
|
|
236
|
+
subCategory: "marketplace"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
uid: "webhooks.create",
|
|
240
|
+
displayName: "Create",
|
|
241
|
+
pluginName: "admin",
|
|
242
|
+
section: "settings",
|
|
243
|
+
category: "webhooks"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
uid: "webhooks.read",
|
|
247
|
+
displayName: "Read",
|
|
248
|
+
pluginName: "admin",
|
|
249
|
+
section: "settings",
|
|
250
|
+
category: "webhooks"
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
uid: "webhooks.update",
|
|
254
|
+
displayName: "Update",
|
|
255
|
+
pluginName: "admin",
|
|
256
|
+
section: "settings",
|
|
257
|
+
category: "webhooks"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
uid: "webhooks.delete",
|
|
261
|
+
displayName: "Delete",
|
|
262
|
+
pluginName: "admin",
|
|
263
|
+
section: "settings",
|
|
264
|
+
category: "webhooks"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
uid: "users.create",
|
|
268
|
+
displayName: "Create (invite)",
|
|
269
|
+
pluginName: "admin",
|
|
270
|
+
section: "settings",
|
|
271
|
+
category: "users and roles",
|
|
272
|
+
subCategory: "users"
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
uid: "users.read",
|
|
276
|
+
displayName: "Read",
|
|
277
|
+
pluginName: "admin",
|
|
278
|
+
section: "settings",
|
|
279
|
+
category: "users and roles",
|
|
280
|
+
subCategory: "users"
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
uid: "users.update",
|
|
284
|
+
displayName: "Update",
|
|
285
|
+
pluginName: "admin",
|
|
286
|
+
section: "settings",
|
|
287
|
+
category: "users and roles",
|
|
288
|
+
subCategory: "users"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
uid: "users.delete",
|
|
292
|
+
displayName: "Delete",
|
|
293
|
+
pluginName: "admin",
|
|
294
|
+
section: "settings",
|
|
295
|
+
category: "users and roles",
|
|
296
|
+
subCategory: "users"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
uid: "roles.create",
|
|
300
|
+
displayName: "Create",
|
|
301
|
+
pluginName: "admin",
|
|
302
|
+
section: "settings",
|
|
303
|
+
category: "users and roles",
|
|
304
|
+
subCategory: "roles"
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
uid: "roles.read",
|
|
308
|
+
displayName: "Read",
|
|
309
|
+
pluginName: "admin",
|
|
310
|
+
section: "settings",
|
|
311
|
+
category: "users and roles",
|
|
312
|
+
subCategory: "roles"
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
uid: "roles.update",
|
|
316
|
+
displayName: "Update",
|
|
317
|
+
pluginName: "admin",
|
|
318
|
+
section: "settings",
|
|
319
|
+
category: "users and roles",
|
|
320
|
+
subCategory: "roles"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
uid: "roles.delete",
|
|
324
|
+
displayName: "Delete",
|
|
325
|
+
pluginName: "admin",
|
|
326
|
+
section: "settings",
|
|
327
|
+
category: "users and roles",
|
|
328
|
+
subCategory: "roles"
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
uid: "api-tokens.access",
|
|
332
|
+
displayName: "Access the API tokens settings page",
|
|
333
|
+
pluginName: "admin",
|
|
334
|
+
section: "settings",
|
|
335
|
+
category: "api tokens",
|
|
336
|
+
subCategory: "api Tokens"
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
uid: "api-tokens.create",
|
|
340
|
+
displayName: "Create (generate)",
|
|
341
|
+
pluginName: "admin",
|
|
342
|
+
section: "settings",
|
|
343
|
+
category: "api tokens",
|
|
344
|
+
subCategory: "general"
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
uid: "api-tokens.read",
|
|
348
|
+
displayName: "Read",
|
|
349
|
+
pluginName: "admin",
|
|
350
|
+
section: "settings",
|
|
351
|
+
category: "api tokens",
|
|
352
|
+
subCategory: "general"
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
uid: "api-tokens.update",
|
|
356
|
+
displayName: "Update",
|
|
357
|
+
pluginName: "admin",
|
|
358
|
+
section: "settings",
|
|
359
|
+
category: "api tokens",
|
|
360
|
+
subCategory: "general"
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
uid: "api-tokens.regenerate",
|
|
364
|
+
displayName: "Regenerate",
|
|
365
|
+
pluginName: "admin",
|
|
366
|
+
section: "settings",
|
|
367
|
+
category: "api tokens",
|
|
368
|
+
subCategory: "general"
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
uid: "api-tokens.delete",
|
|
372
|
+
displayName: "Delete (revoke)",
|
|
373
|
+
pluginName: "admin",
|
|
374
|
+
section: "settings",
|
|
375
|
+
category: "api tokens",
|
|
376
|
+
subCategory: "general"
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
uid: "project-settings.update",
|
|
380
|
+
displayName: "Update the project level settings",
|
|
381
|
+
pluginName: "admin",
|
|
382
|
+
section: "settings",
|
|
383
|
+
category: "project"
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
uid: "project-settings.read",
|
|
387
|
+
displayName: "Read the project level settings",
|
|
388
|
+
pluginName: "admin",
|
|
389
|
+
section: "settings",
|
|
390
|
+
category: "project"
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
uid: "transfer.tokens.access",
|
|
394
|
+
displayName: "Access the transfer tokens settings page",
|
|
395
|
+
pluginName: "admin",
|
|
396
|
+
section: "settings",
|
|
397
|
+
category: "transfer tokens",
|
|
398
|
+
subCategory: "transfer tokens"
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
uid: "transfer.tokens.create",
|
|
402
|
+
displayName: "Create (generate)",
|
|
403
|
+
pluginName: "admin",
|
|
404
|
+
section: "settings",
|
|
405
|
+
category: "transfer tokens",
|
|
406
|
+
subCategory: "general"
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
uid: "transfer.tokens.read",
|
|
410
|
+
displayName: "Read",
|
|
411
|
+
pluginName: "admin",
|
|
412
|
+
section: "settings",
|
|
413
|
+
category: "transfer tokens",
|
|
414
|
+
subCategory: "general"
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
uid: "transfer.tokens.update",
|
|
418
|
+
displayName: "Update",
|
|
419
|
+
pluginName: "admin",
|
|
420
|
+
section: "settings",
|
|
421
|
+
category: "transfer tokens",
|
|
422
|
+
subCategory: "general"
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
uid: "transfer.tokens.regenerate",
|
|
426
|
+
displayName: "Regenerate",
|
|
427
|
+
pluginName: "admin",
|
|
428
|
+
section: "settings",
|
|
429
|
+
category: "transfer tokens",
|
|
430
|
+
subCategory: "general"
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
uid: "transfer.tokens.delete",
|
|
434
|
+
displayName: "Delete (revoke)",
|
|
435
|
+
pluginName: "admin",
|
|
436
|
+
section: "settings",
|
|
437
|
+
category: "transfer tokens",
|
|
438
|
+
subCategory: "general"
|
|
244
439
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
fields: ["action", "actionParameters"],
|
|
267
|
-
populate: {
|
|
268
|
-
role: { fields: ["id", "name"] }
|
|
440
|
+
];
|
|
441
|
+
const adminActions = {
|
|
442
|
+
actions: actions$1
|
|
443
|
+
};
|
|
444
|
+
const conditions = [
|
|
445
|
+
{
|
|
446
|
+
displayName: "Is creator",
|
|
447
|
+
name: "is-creator",
|
|
448
|
+
plugin: "admin",
|
|
449
|
+
handler: (user2) => ({ "createdBy.id": user2.id })
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
displayName: "Has same role as creator",
|
|
453
|
+
name: "has-same-role-as-creator",
|
|
454
|
+
plugin: "admin",
|
|
455
|
+
handler: (user2) => ({
|
|
456
|
+
"createdBy.roles": {
|
|
457
|
+
$elemMatch: {
|
|
458
|
+
id: {
|
|
459
|
+
$in: user2.roles.map((r) => r.id)
|
|
460
|
+
}
|
|
269
461
|
}
|
|
270
462
|
}
|
|
271
|
-
}
|
|
463
|
+
})
|
|
272
464
|
}
|
|
465
|
+
];
|
|
466
|
+
const adminConditions = {
|
|
467
|
+
conditions
|
|
273
468
|
};
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
color: STAGE_DEFAULT_COLOR
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
|
|
286
|
-
return strapi2.service(`admin::${name2}`);
|
|
469
|
+
const defaultAdminAuthSettings = {
|
|
470
|
+
providers: {
|
|
471
|
+
autoRegister: false,
|
|
472
|
+
defaultRole: null,
|
|
473
|
+
ssoLockedRoles: null
|
|
474
|
+
}
|
|
287
475
|
};
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if (!groupedPermissions[stageId]) {
|
|
304
|
-
groupedPermissions[stageId] = [];
|
|
305
|
-
}
|
|
306
|
-
groupedPermissions[stageId].push({
|
|
307
|
-
roleId,
|
|
308
|
-
fromStage: stageId,
|
|
309
|
-
action: STAGE_TRANSITION_UID
|
|
310
|
-
});
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
|
-
for (const [stageId, permissions] of Object.entries(groupedPermissions)) {
|
|
314
|
-
const numericalStageId = Number(stageId);
|
|
315
|
-
if (Number.isNaN(numericalStageId)) {
|
|
316
|
-
strapi.log.warn(
|
|
317
|
-
`Unable to apply ${roleUID} migration for ${stageUID} with id ${stageId}. The stage does not have a numerical id.`
|
|
318
|
-
);
|
|
319
|
-
continue;
|
|
476
|
+
const registerPermissionActions = async () => {
|
|
477
|
+
await getService$1("permission").actionProvider.registerMany(adminActions.actions);
|
|
478
|
+
};
|
|
479
|
+
const registerAdminConditions = async () => {
|
|
480
|
+
await getService$1("permission").conditionProvider.registerMany(adminConditions.conditions);
|
|
481
|
+
};
|
|
482
|
+
const registerModelHooks = () => {
|
|
483
|
+
const { sendDidChangeInterfaceLanguage } = getService$1("metrics");
|
|
484
|
+
strapi.db.lifecycles.subscribe({
|
|
485
|
+
models: ["admin::user"],
|
|
486
|
+
afterCreate: sendDidChangeInterfaceLanguage,
|
|
487
|
+
afterDelete: sendDidChangeInterfaceLanguage,
|
|
488
|
+
afterUpdate({ params }) {
|
|
489
|
+
if (params.data.preferedLanguage) {
|
|
490
|
+
sendDidChangeInterfaceLanguage();
|
|
320
491
|
}
|
|
321
|
-
const stagePermissions2 = await stagePermissionsService.registerMany(permissions);
|
|
322
|
-
await strapi.db.query(STAGE_MODEL_UID).update({
|
|
323
|
-
where: { id: numericalStageId },
|
|
324
|
-
data: {
|
|
325
|
-
permissions: stagePermissions2.flat().map((permission2) => permission2.id)
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
492
|
}
|
|
493
|
+
});
|
|
494
|
+
};
|
|
495
|
+
const syncAuthSettings = async () => {
|
|
496
|
+
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
497
|
+
const adminAuthSettings = await adminStore.get({ key: "auth" });
|
|
498
|
+
const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);
|
|
499
|
+
const roleExists = await getService$1("role").exists({
|
|
500
|
+
id: newAuthSettings.providers.defaultRole
|
|
501
|
+
});
|
|
502
|
+
if (!roleExists) {
|
|
503
|
+
newAuthSettings.providers.defaultRole = null;
|
|
329
504
|
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
const
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
name: { $null: true }
|
|
342
|
-
},
|
|
343
|
-
data: {
|
|
344
|
-
name: defaultWorkflow.name
|
|
345
|
-
}
|
|
346
|
-
});
|
|
505
|
+
await adminStore.set({ key: "auth", value: newAuthSettings });
|
|
506
|
+
};
|
|
507
|
+
const syncAPITokensPermissions = async () => {
|
|
508
|
+
const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
|
|
509
|
+
const permissionsInDB = await async.pipe(
|
|
510
|
+
strapi.db.query("admin::api-token-permission").findMany,
|
|
511
|
+
map("action")
|
|
512
|
+
)();
|
|
513
|
+
const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));
|
|
514
|
+
if (unknownPermissions.length > 0) {
|
|
515
|
+
await strapi.db.query("admin::api-token-permission").deleteMany({ where: { action: { $in: unknownPermissions } } });
|
|
347
516
|
}
|
|
348
|
-
}
|
|
349
|
-
async
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
517
|
+
};
|
|
518
|
+
const executeCEBootstrap = async ({ strapi: strapi2 }) => {
|
|
519
|
+
await registerAdminConditions();
|
|
520
|
+
await registerPermissionActions();
|
|
521
|
+
registerModelHooks();
|
|
522
|
+
const permissionService = getService$1("permission");
|
|
523
|
+
const userService = getService$1("user");
|
|
524
|
+
const roleService = getService$1("role");
|
|
525
|
+
const apiTokenService = getService$1("api-token");
|
|
526
|
+
const transferService = getService$1("transfer");
|
|
527
|
+
const tokenService = getService$1("token");
|
|
528
|
+
await roleService.createRolesIfNoneExist();
|
|
529
|
+
await roleService.resetSuperAdminPermissions();
|
|
530
|
+
await roleService.displayWarningIfNoSuperAdmin();
|
|
531
|
+
await permissionService.cleanPermissionsInDatabase();
|
|
532
|
+
await userService.displayWarningIfUsersDontHaveRole();
|
|
533
|
+
await syncAuthSettings();
|
|
534
|
+
await syncAPITokensPermissions();
|
|
535
|
+
await getService$1("metrics").sendUpdateProjectInformation(strapi2);
|
|
536
|
+
getService$1("metrics").startCron(strapi2);
|
|
537
|
+
apiTokenService.checkSaltIsDefined();
|
|
538
|
+
transferService.token.checkSaltIsDefined();
|
|
539
|
+
tokenService.checkSecretIsDefined();
|
|
540
|
+
};
|
|
541
|
+
const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
|
|
542
|
+
return strapi2.service(`admin::${name2}`);
|
|
543
|
+
};
|
|
544
|
+
const actions = {
|
|
545
|
+
sso: [
|
|
546
|
+
{
|
|
547
|
+
uid: "provider-login.read",
|
|
548
|
+
displayName: "Read",
|
|
549
|
+
pluginName: "admin",
|
|
550
|
+
section: "settings",
|
|
551
|
+
category: "single sign on",
|
|
552
|
+
subCategory: "options"
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
uid: "provider-login.update",
|
|
556
|
+
displayName: "Update",
|
|
557
|
+
pluginName: "admin",
|
|
558
|
+
section: "settings",
|
|
559
|
+
category: "single sign on",
|
|
560
|
+
subCategory: "options"
|
|
357
561
|
}
|
|
358
|
-
|
|
359
|
-
|
|
562
|
+
],
|
|
563
|
+
auditLogs: [
|
|
564
|
+
{
|
|
565
|
+
uid: "audit-logs.read",
|
|
566
|
+
displayName: "Read",
|
|
567
|
+
pluginName: "admin",
|
|
568
|
+
section: "settings",
|
|
569
|
+
category: "audit logs",
|
|
570
|
+
subCategory: "options"
|
|
571
|
+
}
|
|
572
|
+
]
|
|
573
|
+
};
|
|
360
574
|
const transformTableName = (table) => {
|
|
361
575
|
if (typeof table === "string") {
|
|
362
576
|
return { name: table };
|
|
@@ -393,1292 +607,213 @@ async function getPersistedTables({ strapi: strapi2 }) {
|
|
|
393
607
|
});
|
|
394
608
|
return (persistedTables || []).map(transformTableName);
|
|
395
609
|
}
|
|
396
|
-
async function setPersistedTables({ strapi: strapi2 }, tableNames) {
|
|
397
|
-
await strapi2.store.set({
|
|
398
|
-
type: "core",
|
|
399
|
-
key: "persisted_tables",
|
|
400
|
-
value: tableNames
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
610
|
const persistTablesWithPrefix = async (tableNamePrefix) => {
|
|
404
611
|
const tableNameRegex = new RegExp(`^${tableNamePrefix}.*`);
|
|
405
612
|
const tableNames = await findTables({ strapi }, tableNameRegex);
|
|
406
613
|
await addPersistTables({ strapi }, tableNames);
|
|
407
614
|
};
|
|
408
|
-
const
|
|
409
|
-
const
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
615
|
+
const bootstrap = async (args) => {
|
|
616
|
+
const { actionProvider } = getService("permission");
|
|
617
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
618
|
+
await actionProvider.registerMany(actions.sso);
|
|
619
|
+
}
|
|
620
|
+
if (strapi.ee.features.isEnabled("audit-logs")) {
|
|
621
|
+
await persistTablesWithPrefix("strapi_audit_logs");
|
|
622
|
+
await actionProvider.registerMany(actions.auditLogs);
|
|
416
623
|
}
|
|
417
|
-
await
|
|
624
|
+
await getService("seat-enforcement").seatEnforcementWorkflow();
|
|
625
|
+
await executeCEBootstrap(args);
|
|
418
626
|
};
|
|
419
|
-
const
|
|
420
|
-
|
|
627
|
+
const executeCEDestroy = async () => {
|
|
628
|
+
const { conditionProvider, actionProvider } = getService$1("permission");
|
|
629
|
+
await conditionProvider.clear();
|
|
630
|
+
await actionProvider.clear();
|
|
421
631
|
};
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
const migrationNeeded = checkVersionThreshold(oldRWVersion, currentRWVersion, "1.1.0");
|
|
430
|
-
if (migrationNeeded) {
|
|
431
|
-
const oldAttributeTableName = "strapi_review_workflows_stage";
|
|
432
|
-
const newAttributeTableName = "strapi_stage";
|
|
433
|
-
const tables = await findTables({ strapi }, new RegExp(oldAttributeTableName));
|
|
434
|
-
await async.map(tables, async (tableName) => {
|
|
435
|
-
const newTableName = tableName.replace(oldAttributeTableName, newAttributeTableName);
|
|
436
|
-
const alreadyHasNextTable = await strapi.db.connection.schema.hasTable(newTableName);
|
|
437
|
-
if (alreadyHasNextTable) {
|
|
438
|
-
const dataInTable = await strapi.db.connection(newTableName).select().limit(1);
|
|
439
|
-
if (!dataInTable.length) {
|
|
440
|
-
await strapi.db.connection.schema.dropTable(newTableName);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
try {
|
|
444
|
-
await strapi.db.connection.schema.renameTable(tableName, newTableName);
|
|
445
|
-
} catch (e) {
|
|
446
|
-
strapi.log.warn(
|
|
447
|
-
`An error occurred during the migration of ${tableName} table to ${newTableName}.
|
|
448
|
-
If ${newTableName} already exists, migration can't be done automatically.`
|
|
449
|
-
);
|
|
450
|
-
strapi.log.warn(e.message);
|
|
451
|
-
}
|
|
452
|
-
});
|
|
632
|
+
const destroy = async ({ strapi: strapi2 }) => {
|
|
633
|
+
await executeCEDestroy();
|
|
634
|
+
};
|
|
635
|
+
const adminContentTypes = {};
|
|
636
|
+
const isSsoLocked = async (user2) => {
|
|
637
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
638
|
+
return false;
|
|
453
639
|
}
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
// Pick only content-types visible in the content-manager and option is not false
|
|
457
|
-
pickBy(
|
|
458
|
-
(value) => getOr(true, "pluginOptions.content-manager.visible", value) && !getOr(false, "options.noStageAttribute", value)
|
|
459
|
-
),
|
|
460
|
-
// Get UIDs
|
|
461
|
-
keys
|
|
462
|
-
]);
|
|
463
|
-
const hasStageAttribute = has(["attributes", ENTITY_STAGE_ATTRIBUTE]);
|
|
464
|
-
const getWorkflowContentTypeFilter = ({ strapi: strapi2 }, contentType) => {
|
|
465
|
-
if (strapi2.db.dialect.supportsOperator("$jsonSupersetOf")) {
|
|
466
|
-
return { $jsonSupersetOf: JSON.stringify([contentType]) };
|
|
467
|
-
}
|
|
468
|
-
return { $contains: `"${contentType}"` };
|
|
469
|
-
};
|
|
470
|
-
const clampMaxWorkflows = clamp(1, MAX_WORKFLOWS);
|
|
471
|
-
const clampMaxStagesPerWorkflow = clamp(1, MAX_STAGES_PER_WORKFLOW);
|
|
472
|
-
async function migrateDeletedCTInWorkflows({ oldContentTypes, contentTypes }) {
|
|
473
|
-
const deletedContentTypes = difference(keys(oldContentTypes), keys(contentTypes)) ?? [];
|
|
474
|
-
if (deletedContentTypes.length) {
|
|
475
|
-
await async.map(deletedContentTypes, async (deletedContentTypeUID) => {
|
|
476
|
-
const workflow2 = await strapi.db.query(WORKFLOW_MODEL_UID).findOne({
|
|
477
|
-
select: ["id", "contentTypes"],
|
|
478
|
-
where: {
|
|
479
|
-
contentTypes: getWorkflowContentTypeFilter({ strapi }, deletedContentTypeUID)
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
if (workflow2) {
|
|
483
|
-
await strapi.db.query(WORKFLOW_MODEL_UID).update({
|
|
484
|
-
where: { id: workflow2.id },
|
|
485
|
-
data: {
|
|
486
|
-
contentTypes: workflow2.contentTypes.filter(
|
|
487
|
-
(contentTypeUID) => contentTypeUID !== deletedContentTypeUID
|
|
488
|
-
)
|
|
489
|
-
}
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
});
|
|
640
|
+
if (!user2) {
|
|
641
|
+
throw new Error("Missing user object");
|
|
493
642
|
}
|
|
494
|
-
}
|
|
495
|
-
const
|
|
496
|
-
const
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
"entry.delete",
|
|
500
|
-
"entry.publish",
|
|
501
|
-
"entry.unpublish",
|
|
502
|
-
"media.create",
|
|
503
|
-
"media.update",
|
|
504
|
-
"media.delete",
|
|
505
|
-
"media-folder.create",
|
|
506
|
-
"media-folder.update",
|
|
507
|
-
"media-folder.delete",
|
|
508
|
-
"user.create",
|
|
509
|
-
"user.update",
|
|
510
|
-
"user.delete",
|
|
511
|
-
"admin.auth.success",
|
|
512
|
-
"admin.logout",
|
|
513
|
-
"content-type.create",
|
|
514
|
-
"content-type.update",
|
|
515
|
-
"content-type.delete",
|
|
516
|
-
"component.create",
|
|
517
|
-
"component.update",
|
|
518
|
-
"component.delete",
|
|
519
|
-
"role.create",
|
|
520
|
-
"role.update",
|
|
521
|
-
"role.delete",
|
|
522
|
-
"permission.create",
|
|
523
|
-
"permission.update",
|
|
524
|
-
"permission.delete"
|
|
525
|
-
];
|
|
526
|
-
const getSanitizedUser = (user2) => {
|
|
527
|
-
let displayName = user2.email;
|
|
528
|
-
if (user2.username) {
|
|
529
|
-
displayName = user2.username;
|
|
530
|
-
} else if (user2.firstname && user2.lastname) {
|
|
531
|
-
displayName = `${user2.firstname} ${user2.lastname}`;
|
|
643
|
+
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
644
|
+
const { providers } = await adminStore.get({ key: "auth" });
|
|
645
|
+
const lockedRoles = providers.ssoLockedRoles ?? [];
|
|
646
|
+
if (isEmpty(lockedRoles)) {
|
|
647
|
+
return false;
|
|
532
648
|
}
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
const
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
649
|
+
const roles2 = (
|
|
650
|
+
// If the roles are pre-loaded for the given user, then use them
|
|
651
|
+
user2.roles ?? // Otherwise, try to load the role based on the given user ID
|
|
652
|
+
await strapi.db.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
|
|
653
|
+
[]
|
|
654
|
+
);
|
|
655
|
+
const isLocked = lockedRoles.some(
|
|
656
|
+
(lockedId) => (
|
|
657
|
+
// lockedRoles will be a string to avoid issues with frontend and bigints
|
|
658
|
+
roles2.some((role2) => lockedId === role2.id.toString())
|
|
659
|
+
)
|
|
660
|
+
);
|
|
661
|
+
return isLocked;
|
|
545
662
|
};
|
|
546
|
-
const
|
|
547
|
-
|
|
548
|
-
const
|
|
549
|
-
if (
|
|
550
|
-
return
|
|
551
|
-
}
|
|
552
|
-
if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
|
|
553
|
-
return userRetentionDays;
|
|
663
|
+
const { ApplicationError: ApplicationError$2 } = errors;
|
|
664
|
+
const forgotPassword = async ({ email: email2 } = {}) => {
|
|
665
|
+
const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
|
|
666
|
+
if (!user2 || await isSsoLocked(user2)) {
|
|
667
|
+
return;
|
|
554
668
|
}
|
|
555
|
-
|
|
556
|
-
};
|
|
557
|
-
const
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
}
|
|
571
|
-
const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
|
|
572
|
-
if (ignoredUids.includes(args[0]?.uid)) {
|
|
573
|
-
return null;
|
|
669
|
+
const resetPasswordToken = getService("token").createToken();
|
|
670
|
+
await getService("user").updateById(user2.id, { resetPasswordToken });
|
|
671
|
+
const url = `${strapi.config.get(
|
|
672
|
+
"admin.absoluteUrl"
|
|
673
|
+
)}/auth/reset-password?code=${resetPasswordToken}`;
|
|
674
|
+
return strapi.plugin("email").service("email").sendTemplatedEmail(
|
|
675
|
+
{
|
|
676
|
+
to: user2.email,
|
|
677
|
+
from: strapi.config.get("admin.forgotPassword.from"),
|
|
678
|
+
replyTo: strapi.config.get("admin.forgotPassword.replyTo")
|
|
679
|
+
},
|
|
680
|
+
strapi.config.get("admin.forgotPassword.emailTemplate"),
|
|
681
|
+
{
|
|
682
|
+
url,
|
|
683
|
+
user: _.pick(user2, ["email", "firstname", "lastname", "username"])
|
|
574
684
|
}
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
685
|
+
).catch((err) => {
|
|
686
|
+
strapi.log.error(err);
|
|
687
|
+
});
|
|
688
|
+
};
|
|
689
|
+
const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
690
|
+
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
|
|
691
|
+
if (!matchingUser || await isSsoLocked(matchingUser)) {
|
|
692
|
+
throw new ApplicationError$2();
|
|
693
|
+
}
|
|
694
|
+
return getService("user").updateById(matchingUser.id, {
|
|
695
|
+
password: password2,
|
|
696
|
+
resetPasswordToken: null
|
|
697
|
+
});
|
|
698
|
+
};
|
|
699
|
+
const auth = {
|
|
700
|
+
forgotPassword,
|
|
701
|
+
resetPassword
|
|
702
|
+
};
|
|
703
|
+
const createLocalStrategy = (strapi2, middleware) => {
|
|
704
|
+
return new Strategy(
|
|
705
|
+
{
|
|
706
|
+
usernameField: "email",
|
|
707
|
+
passwordField: "password",
|
|
708
|
+
session: false
|
|
709
|
+
},
|
|
710
|
+
(email2, password2, done) => {
|
|
711
|
+
return getService$1("auth").checkCredentials({ email: toLower(email2), password: password2 }).then(async ([error, user2, message]) => {
|
|
712
|
+
if (middleware) {
|
|
713
|
+
return middleware([error, user2, message], done);
|
|
714
|
+
}
|
|
715
|
+
return done(error, user2, message);
|
|
716
|
+
}).catch((error) => done(error));
|
|
588
717
|
}
|
|
718
|
+
);
|
|
719
|
+
};
|
|
720
|
+
const authEventsMapper = {
|
|
721
|
+
onConnectionSuccess: "admin.auth.success",
|
|
722
|
+
onConnectionError: "admin.auth.error"
|
|
723
|
+
};
|
|
724
|
+
const valueIsFunctionType = ([, value]) => isFunction(value);
|
|
725
|
+
const keyIsValidEventName = ([key]) => {
|
|
726
|
+
return Object.keys(strapi.service("admin::passport").authEventsMapper).includes(key);
|
|
727
|
+
};
|
|
728
|
+
const getPassportStrategies$1 = () => [createLocalStrategy(strapi)];
|
|
729
|
+
const registerAuthEvents = () => {
|
|
730
|
+
const { events = {} } = strapi.config.get("admin.auth", {});
|
|
731
|
+
const { authEventsMapper: authEventsMapper2 } = strapi.service("admin::passport");
|
|
732
|
+
const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);
|
|
733
|
+
for (const [eventName, handler] of eventList) {
|
|
734
|
+
strapi.eventHub.on(authEventsMapper2[eventName], handler);
|
|
589
735
|
}
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
}
|
|
604
|
-
state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
|
|
605
|
-
this.destroy();
|
|
606
|
-
});
|
|
607
|
-
state.provider = await localProvider.register({ strapi: strapi2 });
|
|
608
|
-
if (!strapi2.ee.features.isEnabled("audit-logs")) {
|
|
609
|
-
return this;
|
|
736
|
+
};
|
|
737
|
+
const init = () => {
|
|
738
|
+
strapi.service("admin::passport").getPassportStrategies().forEach((strategy) => passport$2.use(strategy));
|
|
739
|
+
registerAuthEvents();
|
|
740
|
+
return passport$2.initialize();
|
|
741
|
+
};
|
|
742
|
+
const passport$1 = { init, getPassportStrategies: getPassportStrategies$1, authEventsMapper };
|
|
743
|
+
const createProviderRegistry = () => {
|
|
744
|
+
const registry = /* @__PURE__ */ new Map();
|
|
745
|
+
Object.assign(registry, {
|
|
746
|
+
register(provider) {
|
|
747
|
+
if (strapi.isLoaded) {
|
|
748
|
+
throw new Error(`You can't register new provider after the bootstrap`);
|
|
610
749
|
}
|
|
611
|
-
|
|
612
|
-
const retentionDays = getRetentionDays(strapi2);
|
|
613
|
-
state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
|
|
614
|
-
const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
|
|
615
|
-
state.provider.deleteExpiredEvents(expirationDate);
|
|
616
|
-
});
|
|
617
|
-
return this;
|
|
750
|
+
this.set(provider.uid, provider);
|
|
618
751
|
},
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
const { user: user2, ...rest } = result;
|
|
623
|
-
return {
|
|
624
|
-
...rest,
|
|
625
|
-
user: user2 ? getSanitizedUser(user2) : null
|
|
626
|
-
};
|
|
752
|
+
registerMany(providers) {
|
|
753
|
+
providers.forEach((provider) => {
|
|
754
|
+
this.register(provider);
|
|
627
755
|
});
|
|
628
|
-
return {
|
|
629
|
-
results: sanitizedResults,
|
|
630
|
-
pagination
|
|
631
|
-
};
|
|
632
|
-
},
|
|
633
|
-
async findOne(id) {
|
|
634
|
-
const result = await state.provider.findOne(id);
|
|
635
|
-
if (!result) {
|
|
636
|
-
return null;
|
|
637
|
-
}
|
|
638
|
-
const { user: user2, ...rest } = result;
|
|
639
|
-
return {
|
|
640
|
-
...rest,
|
|
641
|
-
user: user2 ? getSanitizedUser(user2) : null
|
|
642
|
-
};
|
|
643
|
-
},
|
|
644
|
-
unsubscribe() {
|
|
645
|
-
if (state.eeDisableUnsubscribe) {
|
|
646
|
-
state.eeDisableUnsubscribe();
|
|
647
|
-
}
|
|
648
|
-
if (state.eventHubUnsubscribe) {
|
|
649
|
-
state.eventHubUnsubscribe();
|
|
650
|
-
}
|
|
651
|
-
if (state.deleteExpiredJob) {
|
|
652
|
-
state.deleteExpiredJob.cancel();
|
|
653
|
-
}
|
|
654
|
-
return this;
|
|
655
756
|
},
|
|
656
|
-
|
|
657
|
-
return this.
|
|
658
|
-
}
|
|
659
|
-
};
|
|
660
|
-
};
|
|
661
|
-
function contentTypeMiddleware(strapi2) {
|
|
662
|
-
const moveReviewWorkflowOption = (ctx) => {
|
|
663
|
-
const { reviewWorkflows: reviewWorkflows2, ...contentType } = ctx.request.body.contentType;
|
|
664
|
-
if (typeof reviewWorkflows2 === "boolean") {
|
|
665
|
-
ctx.request.body.contentType = set("options.reviewWorkflows", reviewWorkflows2, contentType);
|
|
666
|
-
}
|
|
667
|
-
};
|
|
668
|
-
strapi2.server.router.use("/content-type-builder/content-types/:uid?", (ctx, next) => {
|
|
669
|
-
if (ctx.method === "PUT" || ctx.method === "POST") {
|
|
670
|
-
moveReviewWorkflowOption(ctx);
|
|
757
|
+
getAll() {
|
|
758
|
+
return Array.from(this.values());
|
|
671
759
|
}
|
|
672
|
-
return next();
|
|
673
760
|
});
|
|
674
|
-
|
|
675
|
-
const reviewWorkflowsMiddlewares = {
|
|
676
|
-
contentTypeMiddleware
|
|
761
|
+
return registry;
|
|
677
762
|
};
|
|
678
|
-
const
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
strapi2.add("audit-logs", auditLogsService);
|
|
684
|
-
await auditLogsService.register();
|
|
685
|
-
}
|
|
686
|
-
if (strapi2.ee.features.isEnabled("review-workflows")) {
|
|
687
|
-
strapi2.hook("strapi::content-types.beforeSync").register(migrateStageAttribute);
|
|
688
|
-
strapi2.hook("strapi::content-types.afterSync").register(migrateReviewWorkflowStagesColor).register(migrateReviewWorkflowStagesRoles).register(migrateReviewWorkflowName).register(migrateWorkflowsContentTypes).register(migrateDeletedCTInWorkflows);
|
|
689
|
-
const reviewWorkflowService = getService("review-workflows");
|
|
690
|
-
reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi2);
|
|
691
|
-
await reviewWorkflowService.register(strapi2.ee.features.get("review-workflows"));
|
|
763
|
+
const providerRegistry = createProviderRegistry();
|
|
764
|
+
const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
|
|
765
|
+
const getStrategyCallbackURL = (providerName) => {
|
|
766
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
767
|
+
throw new Error(errorMessage);
|
|
692
768
|
}
|
|
693
|
-
|
|
769
|
+
return `/admin/connect/${providerName}`;
|
|
694
770
|
};
|
|
695
|
-
const
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
info: {
|
|
699
|
-
name: "Workflow",
|
|
700
|
-
description: "",
|
|
701
|
-
singularName: "workflow",
|
|
702
|
-
pluralName: "workflows",
|
|
703
|
-
displayName: "Workflow"
|
|
704
|
-
},
|
|
705
|
-
options: {},
|
|
706
|
-
pluginOptions: {
|
|
707
|
-
"content-manager": {
|
|
708
|
-
visible: false
|
|
709
|
-
},
|
|
710
|
-
"content-type-builder": {
|
|
711
|
-
visible: false
|
|
712
|
-
}
|
|
713
|
-
},
|
|
714
|
-
attributes: {
|
|
715
|
-
name: {
|
|
716
|
-
type: "string",
|
|
717
|
-
required: true,
|
|
718
|
-
unique: true
|
|
719
|
-
},
|
|
720
|
-
stages: {
|
|
721
|
-
type: "relation",
|
|
722
|
-
target: "admin::workflow-stage",
|
|
723
|
-
relation: "oneToMany",
|
|
724
|
-
mappedBy: "workflow"
|
|
725
|
-
},
|
|
726
|
-
contentTypes: {
|
|
727
|
-
type: "json",
|
|
728
|
-
required: true,
|
|
729
|
-
default: []
|
|
730
|
-
}
|
|
731
|
-
}
|
|
771
|
+
const syncProviderRegistryWithConfig = () => {
|
|
772
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
773
|
+
throw new Error(errorMessage);
|
|
732
774
|
}
|
|
775
|
+
const { providers = [] } = strapi.config.get("admin.auth", {});
|
|
776
|
+
providerRegistry.registerMany(providers);
|
|
733
777
|
};
|
|
734
|
-
const
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
}
|
|
754
|
-
},
|
|
755
|
-
attributes: {
|
|
756
|
-
name: {
|
|
757
|
-
type: "string",
|
|
758
|
-
configurable: false
|
|
759
|
-
},
|
|
760
|
-
color: {
|
|
761
|
-
type: "string",
|
|
762
|
-
configurable: false,
|
|
763
|
-
default: STAGE_DEFAULT_COLOR
|
|
764
|
-
},
|
|
765
|
-
workflow: {
|
|
766
|
-
type: "relation",
|
|
767
|
-
target: "admin::workflow",
|
|
768
|
-
relation: "manyToOne",
|
|
769
|
-
inversedBy: "stages",
|
|
770
|
-
configurable: false
|
|
771
|
-
},
|
|
772
|
-
permissions: {
|
|
773
|
-
type: "relation",
|
|
774
|
-
target: "admin::permission",
|
|
775
|
-
relation: "manyToMany",
|
|
776
|
-
configurable: false
|
|
777
|
-
}
|
|
778
|
-
}
|
|
778
|
+
const SSOAuthEventsMapper = {
|
|
779
|
+
onSSOAutoRegistration: "admin.auth.autoRegistration"
|
|
780
|
+
};
|
|
781
|
+
const sso$1 = {
|
|
782
|
+
providerRegistry,
|
|
783
|
+
getStrategyCallbackURL,
|
|
784
|
+
syncProviderRegistryWithConfig,
|
|
785
|
+
authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
|
|
786
|
+
};
|
|
787
|
+
const { UnauthorizedError } = errors;
|
|
788
|
+
const localStrategyMiddleware = async ([error, user2, message], done) => {
|
|
789
|
+
if (user2 && !error && await isSsoLocked(user2)) {
|
|
790
|
+
return done(
|
|
791
|
+
new UnauthorizedError("Login not allowed, please contact your administrator", {
|
|
792
|
+
code: "LOGIN_NOT_ALLOWED"
|
|
793
|
+
}),
|
|
794
|
+
user2,
|
|
795
|
+
message
|
|
796
|
+
);
|
|
779
797
|
}
|
|
798
|
+
return done(error, user2, message);
|
|
780
799
|
};
|
|
781
|
-
const
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
}
|
|
785
|
-
const
|
|
786
|
-
{
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
subCategory: "marketplace"
|
|
793
|
-
},
|
|
794
|
-
{
|
|
795
|
-
uid: "webhooks.create",
|
|
796
|
-
displayName: "Create",
|
|
797
|
-
pluginName: "admin",
|
|
798
|
-
section: "settings",
|
|
799
|
-
category: "webhooks"
|
|
800
|
-
},
|
|
801
|
-
{
|
|
802
|
-
uid: "webhooks.read",
|
|
803
|
-
displayName: "Read",
|
|
804
|
-
pluginName: "admin",
|
|
805
|
-
section: "settings",
|
|
806
|
-
category: "webhooks"
|
|
807
|
-
},
|
|
808
|
-
{
|
|
809
|
-
uid: "webhooks.update",
|
|
810
|
-
displayName: "Update",
|
|
811
|
-
pluginName: "admin",
|
|
812
|
-
section: "settings",
|
|
813
|
-
category: "webhooks"
|
|
814
|
-
},
|
|
815
|
-
{
|
|
816
|
-
uid: "webhooks.delete",
|
|
817
|
-
displayName: "Delete",
|
|
818
|
-
pluginName: "admin",
|
|
819
|
-
section: "settings",
|
|
820
|
-
category: "webhooks"
|
|
821
|
-
},
|
|
822
|
-
{
|
|
823
|
-
uid: "users.create",
|
|
824
|
-
displayName: "Create (invite)",
|
|
825
|
-
pluginName: "admin",
|
|
826
|
-
section: "settings",
|
|
827
|
-
category: "users and roles",
|
|
828
|
-
subCategory: "users"
|
|
829
|
-
},
|
|
830
|
-
{
|
|
831
|
-
uid: "users.read",
|
|
832
|
-
displayName: "Read",
|
|
833
|
-
pluginName: "admin",
|
|
834
|
-
section: "settings",
|
|
835
|
-
category: "users and roles",
|
|
836
|
-
subCategory: "users"
|
|
837
|
-
},
|
|
838
|
-
{
|
|
839
|
-
uid: "users.update",
|
|
840
|
-
displayName: "Update",
|
|
841
|
-
pluginName: "admin",
|
|
842
|
-
section: "settings",
|
|
843
|
-
category: "users and roles",
|
|
844
|
-
subCategory: "users"
|
|
845
|
-
},
|
|
846
|
-
{
|
|
847
|
-
uid: "users.delete",
|
|
848
|
-
displayName: "Delete",
|
|
849
|
-
pluginName: "admin",
|
|
850
|
-
section: "settings",
|
|
851
|
-
category: "users and roles",
|
|
852
|
-
subCategory: "users"
|
|
853
|
-
},
|
|
854
|
-
{
|
|
855
|
-
uid: "roles.create",
|
|
856
|
-
displayName: "Create",
|
|
857
|
-
pluginName: "admin",
|
|
858
|
-
section: "settings",
|
|
859
|
-
category: "users and roles",
|
|
860
|
-
subCategory: "roles"
|
|
861
|
-
},
|
|
862
|
-
{
|
|
863
|
-
uid: "roles.read",
|
|
864
|
-
displayName: "Read",
|
|
865
|
-
pluginName: "admin",
|
|
866
|
-
section: "settings",
|
|
867
|
-
category: "users and roles",
|
|
868
|
-
subCategory: "roles"
|
|
869
|
-
},
|
|
870
|
-
{
|
|
871
|
-
uid: "roles.update",
|
|
872
|
-
displayName: "Update",
|
|
873
|
-
pluginName: "admin",
|
|
874
|
-
section: "settings",
|
|
875
|
-
category: "users and roles",
|
|
876
|
-
subCategory: "roles"
|
|
877
|
-
},
|
|
878
|
-
{
|
|
879
|
-
uid: "roles.delete",
|
|
880
|
-
displayName: "Delete",
|
|
881
|
-
pluginName: "admin",
|
|
882
|
-
section: "settings",
|
|
883
|
-
category: "users and roles",
|
|
884
|
-
subCategory: "roles"
|
|
885
|
-
},
|
|
886
|
-
{
|
|
887
|
-
uid: "api-tokens.access",
|
|
888
|
-
displayName: "Access the API tokens settings page",
|
|
889
|
-
pluginName: "admin",
|
|
890
|
-
section: "settings",
|
|
891
|
-
category: "api tokens",
|
|
892
|
-
subCategory: "api Tokens"
|
|
893
|
-
},
|
|
894
|
-
{
|
|
895
|
-
uid: "api-tokens.create",
|
|
896
|
-
displayName: "Create (generate)",
|
|
897
|
-
pluginName: "admin",
|
|
898
|
-
section: "settings",
|
|
899
|
-
category: "api tokens",
|
|
900
|
-
subCategory: "general"
|
|
901
|
-
},
|
|
902
|
-
{
|
|
903
|
-
uid: "api-tokens.read",
|
|
904
|
-
displayName: "Read",
|
|
905
|
-
pluginName: "admin",
|
|
906
|
-
section: "settings",
|
|
907
|
-
category: "api tokens",
|
|
908
|
-
subCategory: "general"
|
|
909
|
-
},
|
|
910
|
-
{
|
|
911
|
-
uid: "api-tokens.update",
|
|
912
|
-
displayName: "Update",
|
|
913
|
-
pluginName: "admin",
|
|
914
|
-
section: "settings",
|
|
915
|
-
category: "api tokens",
|
|
916
|
-
subCategory: "general"
|
|
917
|
-
},
|
|
918
|
-
{
|
|
919
|
-
uid: "api-tokens.regenerate",
|
|
920
|
-
displayName: "Regenerate",
|
|
921
|
-
pluginName: "admin",
|
|
922
|
-
section: "settings",
|
|
923
|
-
category: "api tokens",
|
|
924
|
-
subCategory: "general"
|
|
925
|
-
},
|
|
926
|
-
{
|
|
927
|
-
uid: "api-tokens.delete",
|
|
928
|
-
displayName: "Delete (revoke)",
|
|
929
|
-
pluginName: "admin",
|
|
930
|
-
section: "settings",
|
|
931
|
-
category: "api tokens",
|
|
932
|
-
subCategory: "general"
|
|
933
|
-
},
|
|
934
|
-
{
|
|
935
|
-
uid: "project-settings.update",
|
|
936
|
-
displayName: "Update the project level settings",
|
|
937
|
-
pluginName: "admin",
|
|
938
|
-
section: "settings",
|
|
939
|
-
category: "project"
|
|
940
|
-
},
|
|
941
|
-
{
|
|
942
|
-
uid: "project-settings.read",
|
|
943
|
-
displayName: "Read the project level settings",
|
|
944
|
-
pluginName: "admin",
|
|
945
|
-
section: "settings",
|
|
946
|
-
category: "project"
|
|
947
|
-
},
|
|
948
|
-
{
|
|
949
|
-
uid: "transfer.tokens.access",
|
|
950
|
-
displayName: "Access the transfer tokens settings page",
|
|
951
|
-
pluginName: "admin",
|
|
952
|
-
section: "settings",
|
|
953
|
-
category: "transfer tokens",
|
|
954
|
-
subCategory: "transfer tokens"
|
|
955
|
-
},
|
|
956
|
-
{
|
|
957
|
-
uid: "transfer.tokens.create",
|
|
958
|
-
displayName: "Create (generate)",
|
|
959
|
-
pluginName: "admin",
|
|
960
|
-
section: "settings",
|
|
961
|
-
category: "transfer tokens",
|
|
962
|
-
subCategory: "general"
|
|
963
|
-
},
|
|
964
|
-
{
|
|
965
|
-
uid: "transfer.tokens.read",
|
|
966
|
-
displayName: "Read",
|
|
967
|
-
pluginName: "admin",
|
|
968
|
-
section: "settings",
|
|
969
|
-
category: "transfer tokens",
|
|
970
|
-
subCategory: "general"
|
|
971
|
-
},
|
|
972
|
-
{
|
|
973
|
-
uid: "transfer.tokens.update",
|
|
974
|
-
displayName: "Update",
|
|
975
|
-
pluginName: "admin",
|
|
976
|
-
section: "settings",
|
|
977
|
-
category: "transfer tokens",
|
|
978
|
-
subCategory: "general"
|
|
979
|
-
},
|
|
980
|
-
{
|
|
981
|
-
uid: "transfer.tokens.regenerate",
|
|
982
|
-
displayName: "Regenerate",
|
|
983
|
-
pluginName: "admin",
|
|
984
|
-
section: "settings",
|
|
985
|
-
category: "transfer tokens",
|
|
986
|
-
subCategory: "general"
|
|
987
|
-
},
|
|
988
|
-
{
|
|
989
|
-
uid: "transfer.tokens.delete",
|
|
990
|
-
displayName: "Delete (revoke)",
|
|
991
|
-
pluginName: "admin",
|
|
992
|
-
section: "settings",
|
|
993
|
-
category: "transfer tokens",
|
|
994
|
-
subCategory: "general"
|
|
995
|
-
}
|
|
996
|
-
];
|
|
997
|
-
const adminActions = {
|
|
998
|
-
actions: actions$1
|
|
999
|
-
};
|
|
1000
|
-
const conditions = [
|
|
1001
|
-
{
|
|
1002
|
-
displayName: "Is creator",
|
|
1003
|
-
name: "is-creator",
|
|
1004
|
-
plugin: "admin",
|
|
1005
|
-
handler: (user2) => ({ "createdBy.id": user2.id })
|
|
1006
|
-
},
|
|
1007
|
-
{
|
|
1008
|
-
displayName: "Has same role as creator",
|
|
1009
|
-
name: "has-same-role-as-creator",
|
|
1010
|
-
plugin: "admin",
|
|
1011
|
-
handler: (user2) => ({
|
|
1012
|
-
"createdBy.roles": {
|
|
1013
|
-
$elemMatch: {
|
|
1014
|
-
id: {
|
|
1015
|
-
$in: user2.roles.map((r) => r.id)
|
|
1016
|
-
}
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
})
|
|
1020
|
-
}
|
|
1021
|
-
];
|
|
1022
|
-
const adminConditions = {
|
|
1023
|
-
conditions
|
|
1024
|
-
};
|
|
1025
|
-
const defaultAdminAuthSettings = {
|
|
1026
|
-
providers: {
|
|
1027
|
-
autoRegister: false,
|
|
1028
|
-
defaultRole: null,
|
|
1029
|
-
ssoLockedRoles: null
|
|
1030
|
-
}
|
|
1031
|
-
};
|
|
1032
|
-
const registerPermissionActions = async () => {
|
|
1033
|
-
await getService$1("permission").actionProvider.registerMany(adminActions.actions);
|
|
1034
|
-
};
|
|
1035
|
-
const registerAdminConditions = async () => {
|
|
1036
|
-
await getService$1("permission").conditionProvider.registerMany(adminConditions.conditions);
|
|
1037
|
-
};
|
|
1038
|
-
const registerModelHooks = () => {
|
|
1039
|
-
const { sendDidChangeInterfaceLanguage } = getService$1("metrics");
|
|
1040
|
-
strapi.db.lifecycles.subscribe({
|
|
1041
|
-
models: ["admin::user"],
|
|
1042
|
-
afterCreate: sendDidChangeInterfaceLanguage,
|
|
1043
|
-
afterDelete: sendDidChangeInterfaceLanguage,
|
|
1044
|
-
afterUpdate({ params }) {
|
|
1045
|
-
if (params.data.preferedLanguage) {
|
|
1046
|
-
sendDidChangeInterfaceLanguage();
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
});
|
|
1050
|
-
};
|
|
1051
|
-
const syncAuthSettings = async () => {
|
|
1052
|
-
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
1053
|
-
const adminAuthSettings = await adminStore.get({ key: "auth" });
|
|
1054
|
-
const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);
|
|
1055
|
-
const roleExists = await getService$1("role").exists({
|
|
1056
|
-
id: newAuthSettings.providers.defaultRole
|
|
1057
|
-
});
|
|
1058
|
-
if (!roleExists) {
|
|
1059
|
-
newAuthSettings.providers.defaultRole = null;
|
|
1060
|
-
}
|
|
1061
|
-
await adminStore.set({ key: "auth", value: newAuthSettings });
|
|
1062
|
-
};
|
|
1063
|
-
const syncAPITokensPermissions = async () => {
|
|
1064
|
-
const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
|
|
1065
|
-
const permissionsInDB = await async.pipe(
|
|
1066
|
-
strapi.db.query("admin::api-token-permission").findMany,
|
|
1067
|
-
map("action")
|
|
1068
|
-
)();
|
|
1069
|
-
const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));
|
|
1070
|
-
if (unknownPermissions.length > 0) {
|
|
1071
|
-
await strapi.db.query("admin::api-token-permission").deleteMany({ where: { action: { $in: unknownPermissions } } });
|
|
1072
|
-
}
|
|
1073
|
-
};
|
|
1074
|
-
const executeCEBootstrap = async ({ strapi: strapi2 }) => {
|
|
1075
|
-
await registerAdminConditions();
|
|
1076
|
-
await registerPermissionActions();
|
|
1077
|
-
registerModelHooks();
|
|
1078
|
-
const permissionService = getService$1("permission");
|
|
1079
|
-
const userService = getService$1("user");
|
|
1080
|
-
const roleService = getService$1("role");
|
|
1081
|
-
const apiTokenService = getService$1("api-token");
|
|
1082
|
-
const transferService = getService$1("transfer");
|
|
1083
|
-
const tokenService = getService$1("token");
|
|
1084
|
-
await roleService.createRolesIfNoneExist();
|
|
1085
|
-
await roleService.resetSuperAdminPermissions();
|
|
1086
|
-
await roleService.displayWarningIfNoSuperAdmin();
|
|
1087
|
-
await permissionService.cleanPermissionsInDatabase();
|
|
1088
|
-
await userService.displayWarningIfUsersDontHaveRole();
|
|
1089
|
-
await syncAuthSettings();
|
|
1090
|
-
await syncAPITokensPermissions();
|
|
1091
|
-
getService$1("metrics").sendUpdateProjectInformation(strapi2);
|
|
1092
|
-
getService$1("metrics").startCron(strapi2);
|
|
1093
|
-
apiTokenService.checkSaltIsDefined();
|
|
1094
|
-
transferService.token.checkSaltIsDefined();
|
|
1095
|
-
tokenService.checkSecretIsDefined();
|
|
1096
|
-
};
|
|
1097
|
-
const actions = {
|
|
1098
|
-
sso: [
|
|
1099
|
-
{
|
|
1100
|
-
uid: "provider-login.read",
|
|
1101
|
-
displayName: "Read",
|
|
1102
|
-
pluginName: "admin",
|
|
1103
|
-
section: "settings",
|
|
1104
|
-
category: "single sign on",
|
|
1105
|
-
subCategory: "options"
|
|
1106
|
-
},
|
|
1107
|
-
{
|
|
1108
|
-
uid: "provider-login.update",
|
|
1109
|
-
displayName: "Update",
|
|
1110
|
-
pluginName: "admin",
|
|
1111
|
-
section: "settings",
|
|
1112
|
-
category: "single sign on",
|
|
1113
|
-
subCategory: "options"
|
|
1114
|
-
}
|
|
1115
|
-
],
|
|
1116
|
-
auditLogs: [
|
|
1117
|
-
{
|
|
1118
|
-
uid: "audit-logs.read",
|
|
1119
|
-
displayName: "Read",
|
|
1120
|
-
pluginName: "admin",
|
|
1121
|
-
section: "settings",
|
|
1122
|
-
category: "audit logs",
|
|
1123
|
-
subCategory: "options"
|
|
1124
|
-
}
|
|
1125
|
-
],
|
|
1126
|
-
reviewWorkflows: [
|
|
1127
|
-
{
|
|
1128
|
-
uid: "review-workflows.create",
|
|
1129
|
-
displayName: "Create",
|
|
1130
|
-
pluginName: "admin",
|
|
1131
|
-
section: "settings",
|
|
1132
|
-
category: "review workflows",
|
|
1133
|
-
subCategory: "options"
|
|
1134
|
-
},
|
|
1135
|
-
{
|
|
1136
|
-
uid: "review-workflows.read",
|
|
1137
|
-
displayName: "Read",
|
|
1138
|
-
pluginName: "admin",
|
|
1139
|
-
section: "settings",
|
|
1140
|
-
category: "review workflows",
|
|
1141
|
-
subCategory: "options"
|
|
1142
|
-
},
|
|
1143
|
-
{
|
|
1144
|
-
uid: "review-workflows.update",
|
|
1145
|
-
displayName: "Update",
|
|
1146
|
-
pluginName: "admin",
|
|
1147
|
-
section: "settings",
|
|
1148
|
-
category: "review workflows",
|
|
1149
|
-
subCategory: "options"
|
|
1150
|
-
},
|
|
1151
|
-
{
|
|
1152
|
-
uid: "review-workflows.delete",
|
|
1153
|
-
displayName: "Delete",
|
|
1154
|
-
pluginName: "admin",
|
|
1155
|
-
section: "settings",
|
|
1156
|
-
category: "review workflows",
|
|
1157
|
-
subCategory: "options"
|
|
1158
|
-
},
|
|
1159
|
-
{
|
|
1160
|
-
uid: "review-workflows.stage.transition",
|
|
1161
|
-
displayName: "Change stage",
|
|
1162
|
-
pluginName: "admin",
|
|
1163
|
-
section: "internal"
|
|
1164
|
-
}
|
|
1165
|
-
]
|
|
1166
|
-
};
|
|
1167
|
-
const bootstrap = async (args) => {
|
|
1168
|
-
const { actionProvider } = getService("permission");
|
|
1169
|
-
if (strapi.ee.features.isEnabled("sso")) {
|
|
1170
|
-
await actionProvider.registerMany(actions.sso);
|
|
1171
|
-
}
|
|
1172
|
-
if (strapi.ee.features.isEnabled("audit-logs")) {
|
|
1173
|
-
await persistTablesWithPrefix("strapi_audit_logs");
|
|
1174
|
-
await actionProvider.registerMany(actions.auditLogs);
|
|
1175
|
-
}
|
|
1176
|
-
if (strapi.ee.features.isEnabled("review-workflows")) {
|
|
1177
|
-
await persistTablesWithPrefix("strapi_workflows");
|
|
1178
|
-
const { bootstrap: rwBootstrap } = getService("review-workflows");
|
|
1179
|
-
await rwBootstrap();
|
|
1180
|
-
await actionProvider.registerMany(actions.reviewWorkflows);
|
|
1181
|
-
getService("review-workflows-decorator");
|
|
1182
|
-
await getService("review-workflows-weekly-metrics").registerCron();
|
|
1183
|
-
}
|
|
1184
|
-
await getService("seat-enforcement").seatEnforcementWorkflow();
|
|
1185
|
-
await executeCEBootstrap(args);
|
|
1186
|
-
};
|
|
1187
|
-
const executeCEDestroy = async () => {
|
|
1188
|
-
const { conditionProvider, actionProvider } = getService$1("permission");
|
|
1189
|
-
await conditionProvider.clear();
|
|
1190
|
-
await actionProvider.clear();
|
|
1191
|
-
};
|
|
1192
|
-
const destroy = async ({ strapi: strapi2 }) => {
|
|
1193
|
-
if (strapi2.ee.features.isEnabled("audit-logs")) {
|
|
1194
|
-
strapi2.get("audit-logs").destroy();
|
|
1195
|
-
}
|
|
1196
|
-
await executeCEDestroy();
|
|
1197
|
-
};
|
|
1198
|
-
const enableFeatureMiddleware = (featureName) => (ctx, next) => {
|
|
1199
|
-
if (strapi.ee.features.isEnabled(featureName)) {
|
|
1200
|
-
return next();
|
|
1201
|
-
}
|
|
1202
|
-
ctx.status = 404;
|
|
1203
|
-
};
|
|
1204
|
-
const sso$1 = {
|
|
1205
|
-
type: "admin",
|
|
1206
|
-
routes: [
|
|
1207
|
-
{
|
|
1208
|
-
method: "GET",
|
|
1209
|
-
path: "/providers",
|
|
1210
|
-
handler: "authentication.getProviders",
|
|
1211
|
-
config: {
|
|
1212
|
-
middlewares: [enableFeatureMiddleware("sso")],
|
|
1213
|
-
auth: false
|
|
1214
|
-
}
|
|
1215
|
-
},
|
|
1216
|
-
{
|
|
1217
|
-
method: "GET",
|
|
1218
|
-
path: "/connect/:provider",
|
|
1219
|
-
handler: "authentication.providerLogin",
|
|
1220
|
-
config: {
|
|
1221
|
-
middlewares: [enableFeatureMiddleware("sso")],
|
|
1222
|
-
auth: false
|
|
1223
|
-
}
|
|
1224
|
-
},
|
|
1225
|
-
{
|
|
1226
|
-
method: "POST",
|
|
1227
|
-
path: "/connect/:provider",
|
|
1228
|
-
handler: "authentication.providerLogin",
|
|
1229
|
-
config: {
|
|
1230
|
-
middlewares: [enableFeatureMiddleware("sso")],
|
|
1231
|
-
auth: false
|
|
1232
|
-
}
|
|
1233
|
-
},
|
|
1234
|
-
{
|
|
1235
|
-
method: "GET",
|
|
1236
|
-
path: "/providers/options",
|
|
1237
|
-
handler: "authentication.getProviderLoginOptions",
|
|
1238
|
-
config: {
|
|
1239
|
-
middlewares: [enableFeatureMiddleware("sso")],
|
|
1240
|
-
policies: [
|
|
1241
|
-
"admin::isAuthenticatedAdmin",
|
|
1242
|
-
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
|
|
1243
|
-
]
|
|
1244
|
-
}
|
|
1245
|
-
},
|
|
1246
|
-
{
|
|
1247
|
-
method: "PUT",
|
|
1248
|
-
path: "/providers/options",
|
|
1249
|
-
handler: "authentication.updateProviderLoginOptions",
|
|
1250
|
-
config: {
|
|
1251
|
-
middlewares: [enableFeatureMiddleware("sso")],
|
|
1252
|
-
policies: [
|
|
1253
|
-
"admin::isAuthenticatedAdmin",
|
|
1254
|
-
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
|
|
1255
|
-
]
|
|
1256
|
-
}
|
|
1257
|
-
},
|
|
1258
|
-
{
|
|
1259
|
-
method: "GET",
|
|
1260
|
-
path: "/providers/isSSOLocked",
|
|
1261
|
-
handler: "user.isSSOLocked",
|
|
1262
|
-
config: {
|
|
1263
|
-
middlewares: [enableFeatureMiddleware("sso")],
|
|
1264
|
-
policies: ["admin::isAuthenticatedAdmin"]
|
|
1265
|
-
}
|
|
1266
|
-
}
|
|
1267
|
-
]
|
|
1268
|
-
};
|
|
1269
|
-
const licenseLimit = {
|
|
1270
|
-
type: "admin",
|
|
1271
|
-
routes: [
|
|
1272
|
-
// License limit infos
|
|
1273
|
-
{
|
|
1274
|
-
method: "GET",
|
|
1275
|
-
path: "/license-limit-information",
|
|
1276
|
-
handler: "admin.licenseLimitInformation",
|
|
1277
|
-
config: {
|
|
1278
|
-
policies: [
|
|
1279
|
-
"admin::isAuthenticatedAdmin",
|
|
1280
|
-
{
|
|
1281
|
-
name: "admin::hasPermissions",
|
|
1282
|
-
config: {
|
|
1283
|
-
actions: [
|
|
1284
|
-
"admin::users.create",
|
|
1285
|
-
"admin::users.read",
|
|
1286
|
-
"admin::users.update",
|
|
1287
|
-
"admin::users.delete"
|
|
1288
|
-
]
|
|
1289
|
-
}
|
|
1290
|
-
}
|
|
1291
|
-
]
|
|
1292
|
-
}
|
|
1293
|
-
}
|
|
1294
|
-
]
|
|
1295
|
-
};
|
|
1296
|
-
const auditLogs$1 = {
|
|
1297
|
-
type: "admin",
|
|
1298
|
-
routes: [
|
|
1299
|
-
{
|
|
1300
|
-
method: "GET",
|
|
1301
|
-
path: "/audit-logs",
|
|
1302
|
-
handler: "auditLogs.findMany",
|
|
1303
|
-
config: {
|
|
1304
|
-
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
1305
|
-
policies: [
|
|
1306
|
-
"admin::isAuthenticatedAdmin",
|
|
1307
|
-
{
|
|
1308
|
-
name: "admin::hasPermissions",
|
|
1309
|
-
config: {
|
|
1310
|
-
actions: ["admin::audit-logs.read"]
|
|
1311
|
-
}
|
|
1312
|
-
}
|
|
1313
|
-
]
|
|
1314
|
-
}
|
|
1315
|
-
},
|
|
1316
|
-
{
|
|
1317
|
-
method: "GET",
|
|
1318
|
-
path: "/audit-logs/:id",
|
|
1319
|
-
handler: "auditLogs.findOne",
|
|
1320
|
-
config: {
|
|
1321
|
-
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
1322
|
-
policies: [
|
|
1323
|
-
"admin::isAuthenticatedAdmin",
|
|
1324
|
-
{
|
|
1325
|
-
name: "admin::hasPermissions",
|
|
1326
|
-
config: {
|
|
1327
|
-
actions: ["admin::audit-logs.read"]
|
|
1328
|
-
}
|
|
1329
|
-
}
|
|
1330
|
-
]
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1333
|
-
]
|
|
1334
|
-
};
|
|
1335
|
-
const reviewWorkflows$1 = {
|
|
1336
|
-
type: "admin",
|
|
1337
|
-
routes: [
|
|
1338
|
-
// Review workflow
|
|
1339
|
-
{
|
|
1340
|
-
method: "POST",
|
|
1341
|
-
path: "/review-workflows/workflows",
|
|
1342
|
-
handler: "workflows.create",
|
|
1343
|
-
config: {
|
|
1344
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1345
|
-
policies: [
|
|
1346
|
-
"admin::isAuthenticatedAdmin",
|
|
1347
|
-
{
|
|
1348
|
-
name: "admin::hasPermissions",
|
|
1349
|
-
config: {
|
|
1350
|
-
actions: ["admin::review-workflows.create"]
|
|
1351
|
-
}
|
|
1352
|
-
}
|
|
1353
|
-
]
|
|
1354
|
-
}
|
|
1355
|
-
},
|
|
1356
|
-
{
|
|
1357
|
-
method: "PUT",
|
|
1358
|
-
path: "/review-workflows/workflows/:id",
|
|
1359
|
-
handler: "workflows.update",
|
|
1360
|
-
config: {
|
|
1361
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1362
|
-
policies: [
|
|
1363
|
-
"admin::isAuthenticatedAdmin",
|
|
1364
|
-
{
|
|
1365
|
-
name: "admin::hasPermissions",
|
|
1366
|
-
config: {
|
|
1367
|
-
actions: ["admin::review-workflows.update"]
|
|
1368
|
-
}
|
|
1369
|
-
}
|
|
1370
|
-
]
|
|
1371
|
-
}
|
|
1372
|
-
},
|
|
1373
|
-
{
|
|
1374
|
-
method: "DELETE",
|
|
1375
|
-
path: "/review-workflows/workflows/:id",
|
|
1376
|
-
handler: "workflows.delete",
|
|
1377
|
-
config: {
|
|
1378
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1379
|
-
policies: [
|
|
1380
|
-
"admin::isAuthenticatedAdmin",
|
|
1381
|
-
{
|
|
1382
|
-
name: "admin::hasPermissions",
|
|
1383
|
-
config: {
|
|
1384
|
-
actions: ["admin::review-workflows.delete"]
|
|
1385
|
-
}
|
|
1386
|
-
}
|
|
1387
|
-
]
|
|
1388
|
-
}
|
|
1389
|
-
},
|
|
1390
|
-
{
|
|
1391
|
-
method: "GET",
|
|
1392
|
-
path: "/review-workflows/workflows",
|
|
1393
|
-
handler: "workflows.find",
|
|
1394
|
-
config: {
|
|
1395
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1396
|
-
policies: [
|
|
1397
|
-
"admin::isAuthenticatedAdmin",
|
|
1398
|
-
{
|
|
1399
|
-
name: "admin::hasPermissions",
|
|
1400
|
-
config: {
|
|
1401
|
-
actions: ["admin::review-workflows.read"]
|
|
1402
|
-
}
|
|
1403
|
-
}
|
|
1404
|
-
]
|
|
1405
|
-
}
|
|
1406
|
-
},
|
|
1407
|
-
{
|
|
1408
|
-
method: "GET",
|
|
1409
|
-
path: "/review-workflows/workflows/:id",
|
|
1410
|
-
handler: "workflows.findById",
|
|
1411
|
-
config: {
|
|
1412
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1413
|
-
policies: [
|
|
1414
|
-
"admin::isAuthenticatedAdmin",
|
|
1415
|
-
{
|
|
1416
|
-
name: "admin::hasPermissions",
|
|
1417
|
-
config: {
|
|
1418
|
-
actions: ["admin::review-workflows.read"]
|
|
1419
|
-
}
|
|
1420
|
-
}
|
|
1421
|
-
]
|
|
1422
|
-
}
|
|
1423
|
-
},
|
|
1424
|
-
{
|
|
1425
|
-
method: "GET",
|
|
1426
|
-
path: "/review-workflows/workflows/:workflow_id/stages",
|
|
1427
|
-
handler: "stages.find",
|
|
1428
|
-
config: {
|
|
1429
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1430
|
-
policies: [
|
|
1431
|
-
"admin::isAuthenticatedAdmin",
|
|
1432
|
-
{
|
|
1433
|
-
name: "admin::hasPermissions",
|
|
1434
|
-
config: {
|
|
1435
|
-
actions: ["admin::review-workflows.read"]
|
|
1436
|
-
}
|
|
1437
|
-
}
|
|
1438
|
-
]
|
|
1439
|
-
}
|
|
1440
|
-
},
|
|
1441
|
-
{
|
|
1442
|
-
method: "GET",
|
|
1443
|
-
path: "/review-workflows/workflows/:workflow_id/stages/:id",
|
|
1444
|
-
handler: "stages.findById",
|
|
1445
|
-
config: {
|
|
1446
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1447
|
-
policies: [
|
|
1448
|
-
"admin::isAuthenticatedAdmin",
|
|
1449
|
-
{
|
|
1450
|
-
name: "admin::hasPermissions",
|
|
1451
|
-
config: {
|
|
1452
|
-
actions: ["admin::review-workflows.read"]
|
|
1453
|
-
}
|
|
1454
|
-
}
|
|
1455
|
-
]
|
|
1456
|
-
}
|
|
1457
|
-
},
|
|
1458
|
-
{
|
|
1459
|
-
method: "PUT",
|
|
1460
|
-
path: "/content-manager/(collection|single)-types/:model_uid/:id/stage",
|
|
1461
|
-
handler: "stages.updateEntity",
|
|
1462
|
-
config: {
|
|
1463
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1464
|
-
policies: ["admin::isAuthenticatedAdmin"]
|
|
1465
|
-
}
|
|
1466
|
-
},
|
|
1467
|
-
{
|
|
1468
|
-
method: "GET",
|
|
1469
|
-
path: "/content-manager/(collection|single)-types/:model_uid/:id/stages",
|
|
1470
|
-
handler: "stages.listAvailableStages",
|
|
1471
|
-
config: {
|
|
1472
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1473
|
-
policies: ["admin::isAuthenticatedAdmin"]
|
|
1474
|
-
}
|
|
1475
|
-
},
|
|
1476
|
-
{
|
|
1477
|
-
method: "PUT",
|
|
1478
|
-
path: "/content-manager/(collection|single)-types/:model_uid/:id/assignee",
|
|
1479
|
-
handler: "assignees.updateEntity",
|
|
1480
|
-
config: {
|
|
1481
|
-
middlewares: [enableFeatureMiddleware("review-workflows")],
|
|
1482
|
-
policies: [
|
|
1483
|
-
"admin::isAuthenticatedAdmin",
|
|
1484
|
-
{
|
|
1485
|
-
name: "admin::hasPermissions",
|
|
1486
|
-
config: {
|
|
1487
|
-
actions: ["admin::users.read", "admin::review-workflows.read"]
|
|
1488
|
-
}
|
|
1489
|
-
}
|
|
1490
|
-
]
|
|
1491
|
-
}
|
|
1492
|
-
}
|
|
1493
|
-
]
|
|
1494
|
-
};
|
|
1495
|
-
const index$2 = {
|
|
1496
|
-
sso: sso$1,
|
|
1497
|
-
"license-limit": licenseLimit,
|
|
1498
|
-
"audit-logs": auditLogs$1,
|
|
1499
|
-
"review-workflows": reviewWorkflows$1
|
|
1500
|
-
};
|
|
1501
|
-
const isSsoLocked = async (user2) => {
|
|
1502
|
-
if (!strapi.ee.features.isEnabled("sso")) {
|
|
1503
|
-
return false;
|
|
1504
|
-
}
|
|
1505
|
-
if (!user2) {
|
|
1506
|
-
throw new Error("Missing user object");
|
|
1507
|
-
}
|
|
1508
|
-
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
1509
|
-
const { providers } = await adminStore.get({ key: "auth" });
|
|
1510
|
-
const lockedRoles = providers.ssoLockedRoles ?? [];
|
|
1511
|
-
if (isEmpty(lockedRoles)) {
|
|
1512
|
-
return false;
|
|
1513
|
-
}
|
|
1514
|
-
const roles2 = (
|
|
1515
|
-
// If the roles are pre-loaded for the given user, then use them
|
|
1516
|
-
user2.roles ?? // Otherwise, try to load the role based on the given user ID
|
|
1517
|
-
await strapi.db.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
|
|
1518
|
-
[]
|
|
1519
|
-
);
|
|
1520
|
-
const isLocked = lockedRoles.some(
|
|
1521
|
-
(lockedId) => (
|
|
1522
|
-
// lockedRoles will be a string to avoid issues with frontend and bigints
|
|
1523
|
-
roles2.some((role2) => lockedId === role2.id.toString())
|
|
1524
|
-
)
|
|
1525
|
-
);
|
|
1526
|
-
return isLocked;
|
|
1527
|
-
};
|
|
1528
|
-
const { ApplicationError: ApplicationError$6 } = errors;
|
|
1529
|
-
const forgotPassword = async ({ email: email2 } = {}) => {
|
|
1530
|
-
const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
|
|
1531
|
-
if (!user2 || await isSsoLocked(user2)) {
|
|
1532
|
-
return;
|
|
1533
|
-
}
|
|
1534
|
-
const resetPasswordToken = getService("token").createToken();
|
|
1535
|
-
await getService("user").updateById(user2.id, { resetPasswordToken });
|
|
1536
|
-
const url = `${strapi.config.get(
|
|
1537
|
-
"admin.absoluteUrl"
|
|
1538
|
-
)}/auth/reset-password?code=${resetPasswordToken}`;
|
|
1539
|
-
return strapi.plugin("email").service("email").sendTemplatedEmail(
|
|
1540
|
-
{
|
|
1541
|
-
to: user2.email,
|
|
1542
|
-
from: strapi.config.get("admin.forgotPassword.from"),
|
|
1543
|
-
replyTo: strapi.config.get("admin.forgotPassword.replyTo")
|
|
1544
|
-
},
|
|
1545
|
-
strapi.config.get("admin.forgotPassword.emailTemplate"),
|
|
1546
|
-
{
|
|
1547
|
-
url,
|
|
1548
|
-
user: _.pick(user2, ["email", "firstname", "lastname", "username"])
|
|
1549
|
-
}
|
|
1550
|
-
).catch((err) => {
|
|
1551
|
-
strapi.log.error(err);
|
|
1552
|
-
});
|
|
1553
|
-
};
|
|
1554
|
-
const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
1555
|
-
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
|
|
1556
|
-
if (!matchingUser || await isSsoLocked(matchingUser)) {
|
|
1557
|
-
throw new ApplicationError$6();
|
|
1558
|
-
}
|
|
1559
|
-
return getService("user").updateById(matchingUser.id, {
|
|
1560
|
-
password: password2,
|
|
1561
|
-
resetPasswordToken: null
|
|
1562
|
-
});
|
|
1563
|
-
};
|
|
1564
|
-
const auth = {
|
|
1565
|
-
forgotPassword,
|
|
1566
|
-
resetPassword
|
|
1567
|
-
};
|
|
1568
|
-
const createLocalStrategy = (strapi2, middleware) => {
|
|
1569
|
-
return new Strategy(
|
|
1570
|
-
{
|
|
1571
|
-
usernameField: "email",
|
|
1572
|
-
passwordField: "password",
|
|
1573
|
-
session: false
|
|
1574
|
-
},
|
|
1575
|
-
(email2, password2, done) => {
|
|
1576
|
-
return getService$1("auth").checkCredentials({ email: toLower(email2), password: password2 }).then(async ([error, user2, message]) => {
|
|
1577
|
-
if (middleware) {
|
|
1578
|
-
return middleware([error, user2, message], done);
|
|
1579
|
-
}
|
|
1580
|
-
return done(error, user2, message);
|
|
1581
|
-
}).catch((error) => done(error));
|
|
1582
|
-
}
|
|
1583
|
-
);
|
|
1584
|
-
};
|
|
1585
|
-
const authEventsMapper = {
|
|
1586
|
-
onConnectionSuccess: "admin.auth.success",
|
|
1587
|
-
onConnectionError: "admin.auth.error"
|
|
1588
|
-
};
|
|
1589
|
-
const valueIsFunctionType = ([, value]) => isFunction(value);
|
|
1590
|
-
const keyIsValidEventName = ([key]) => {
|
|
1591
|
-
return Object.keys(strapi.admin.services.passport.authEventsMapper).includes(key);
|
|
1592
|
-
};
|
|
1593
|
-
const getPassportStrategies$1 = () => [createLocalStrategy(strapi)];
|
|
1594
|
-
const registerAuthEvents = () => {
|
|
1595
|
-
const { events = {} } = strapi.config.get("admin.auth", {});
|
|
1596
|
-
const { authEventsMapper: authEventsMapper2 } = strapi.admin.services.passport;
|
|
1597
|
-
const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);
|
|
1598
|
-
for (const [eventName, handler] of eventList) {
|
|
1599
|
-
strapi.eventHub.on(authEventsMapper2[eventName], handler);
|
|
1600
|
-
}
|
|
1601
|
-
};
|
|
1602
|
-
const init = () => {
|
|
1603
|
-
strapi.admin.services.passport.getPassportStrategies().forEach((strategy) => passport$2.use(strategy));
|
|
1604
|
-
registerAuthEvents();
|
|
1605
|
-
return passport$2.initialize();
|
|
1606
|
-
};
|
|
1607
|
-
const passport$1 = { init, getPassportStrategies: getPassportStrategies$1, authEventsMapper };
|
|
1608
|
-
const createProviderRegistry = () => {
|
|
1609
|
-
const registry = /* @__PURE__ */ new Map();
|
|
1610
|
-
Object.assign(registry, {
|
|
1611
|
-
register(provider) {
|
|
1612
|
-
if (strapi.isLoaded) {
|
|
1613
|
-
throw new Error(`You can't register new provider after the bootstrap`);
|
|
1614
|
-
}
|
|
1615
|
-
this.set(provider.uid, provider);
|
|
1616
|
-
},
|
|
1617
|
-
registerMany(providers) {
|
|
1618
|
-
providers.forEach((provider) => {
|
|
1619
|
-
this.register(provider);
|
|
1620
|
-
});
|
|
1621
|
-
},
|
|
1622
|
-
getAll() {
|
|
1623
|
-
return Array.from(this.values());
|
|
1624
|
-
}
|
|
1625
|
-
});
|
|
1626
|
-
return registry;
|
|
1627
|
-
};
|
|
1628
|
-
const providerRegistry = createProviderRegistry();
|
|
1629
|
-
const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
|
|
1630
|
-
const getStrategyCallbackURL = (providerName) => {
|
|
1631
|
-
if (!strapi.ee.features.isEnabled("sso")) {
|
|
1632
|
-
throw new Error(errorMessage);
|
|
1633
|
-
}
|
|
1634
|
-
return `/admin/connect/${providerName}`;
|
|
1635
|
-
};
|
|
1636
|
-
const syncProviderRegistryWithConfig = () => {
|
|
1637
|
-
if (!strapi.ee.features.isEnabled("sso")) {
|
|
1638
|
-
throw new Error(errorMessage);
|
|
1639
|
-
}
|
|
1640
|
-
const { providers = [] } = strapi.config.get("admin.auth", {});
|
|
1641
|
-
providerRegistry.registerMany(providers);
|
|
1642
|
-
};
|
|
1643
|
-
const SSOAuthEventsMapper = {
|
|
1644
|
-
onSSOAutoRegistration: "admin.auth.autoRegistration"
|
|
1645
|
-
};
|
|
1646
|
-
const sso = {
|
|
1647
|
-
providerRegistry,
|
|
1648
|
-
getStrategyCallbackURL,
|
|
1649
|
-
syncProviderRegistryWithConfig,
|
|
1650
|
-
authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
|
|
1651
|
-
};
|
|
1652
|
-
const { UnauthorizedError } = errors;
|
|
1653
|
-
const localStrategyMiddleware = async ([error, user2, message], done) => {
|
|
1654
|
-
if (user2 && !error && await isSsoLocked(user2)) {
|
|
1655
|
-
return done(
|
|
1656
|
-
new UnauthorizedError("Login not allowed, please contact your administrator", {
|
|
1657
|
-
code: "LOGIN_NOT_ALLOWED"
|
|
1658
|
-
}),
|
|
1659
|
-
user2,
|
|
1660
|
-
message
|
|
1661
|
-
);
|
|
1662
|
-
}
|
|
1663
|
-
return done(error, user2, message);
|
|
1664
|
-
};
|
|
1665
|
-
const getPassportStrategies = () => {
|
|
1666
|
-
if (!strapi.ee.features.isEnabled("sso")) {
|
|
1667
|
-
return [createLocalStrategy(strapi)];
|
|
1668
|
-
}
|
|
1669
|
-
const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
|
|
1670
|
-
if (!strapi.isLoaded) {
|
|
1671
|
-
sso.syncProviderRegistryWithConfig();
|
|
1672
|
-
}
|
|
1673
|
-
const providers = sso.providerRegistry.getAll();
|
|
1674
|
-
const strategies = providers.map((provider) => provider.createStrategy(strapi));
|
|
1675
|
-
return [localStrategy, ...strategies];
|
|
800
|
+
const getPassportStrategies = () => {
|
|
801
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
802
|
+
return [createLocalStrategy(strapi)];
|
|
803
|
+
}
|
|
804
|
+
const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
|
|
805
|
+
if (!strapi.isLoaded) {
|
|
806
|
+
sso$1.syncProviderRegistryWithConfig();
|
|
807
|
+
}
|
|
808
|
+
const providers = sso$1.providerRegistry.getAll();
|
|
809
|
+
const strategies = providers.map((provider) => provider.createStrategy(strapi));
|
|
810
|
+
return [localStrategy, ...strategies];
|
|
1676
811
|
};
|
|
1677
812
|
const passport = {
|
|
1678
813
|
getPassportStrategies,
|
|
1679
|
-
...sso
|
|
814
|
+
...sso$1
|
|
1680
815
|
};
|
|
1681
|
-
const { ApplicationError: ApplicationError$
|
|
816
|
+
const { ApplicationError: ApplicationError$1 } = errors;
|
|
1682
817
|
const ssoCheckRolesIdForDeletion = async (ids) => {
|
|
1683
818
|
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
1684
819
|
const {
|
|
@@ -1686,7 +821,7 @@ const ssoCheckRolesIdForDeletion = async (ids) => {
|
|
|
1686
821
|
} = await adminStore.get({ key: "auth" });
|
|
1687
822
|
for (const roleId of ids) {
|
|
1688
823
|
if (defaultRole && toString(defaultRole) === toString(roleId)) {
|
|
1689
|
-
throw new ApplicationError$
|
|
824
|
+
throw new ApplicationError$1(
|
|
1690
825
|
"This role is used as the default SSO role. Make sure to change this configuration before deleting the role"
|
|
1691
826
|
);
|
|
1692
827
|
}
|
|
@@ -1699,7 +834,7 @@ const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$2 } = constants;
|
|
|
1699
834
|
const hasSuperAdminRole = (user2) => {
|
|
1700
835
|
return user2.roles.filter((role2) => role2.code === SUPER_ADMIN_CODE$2).length > 0;
|
|
1701
836
|
};
|
|
1702
|
-
const { ValidationError: ValidationError$
|
|
837
|
+
const { ValidationError: ValidationError$1 } = errors;
|
|
1703
838
|
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$1 } = constants;
|
|
1704
839
|
const updateEEDisabledUsersList = async (id, input) => {
|
|
1705
840
|
const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
@@ -1744,13 +879,13 @@ const updateById = async (id, attributes) => {
|
|
|
1744
879
|
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1745
880
|
const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles, superAdminRole.id);
|
|
1746
881
|
if (lastAdminUser && willRemoveSuperAdminRole) {
|
|
1747
|
-
throw new ValidationError$
|
|
882
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
1748
883
|
}
|
|
1749
884
|
}
|
|
1750
885
|
if (attributes.isActive === false) {
|
|
1751
886
|
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
1752
887
|
if (lastAdminUser) {
|
|
1753
|
-
throw new ValidationError$
|
|
888
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
1754
889
|
}
|
|
1755
890
|
}
|
|
1756
891
|
if (_.has(attributes, "password")) {
|
|
@@ -1789,7 +924,7 @@ const deleteById = async (id) => {
|
|
|
1789
924
|
if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$1)) {
|
|
1790
925
|
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1791
926
|
if (superAdminRole.usersCount === 1) {
|
|
1792
|
-
throw new ValidationError$
|
|
927
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
1793
928
|
}
|
|
1794
929
|
}
|
|
1795
930
|
}
|
|
@@ -1807,7 +942,7 @@ const deleteByIds = async (ids) => {
|
|
|
1807
942
|
}
|
|
1808
943
|
});
|
|
1809
944
|
if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
|
|
1810
|
-
throw new ValidationError$
|
|
945
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
1811
946
|
}
|
|
1812
947
|
const deletedUsers = [];
|
|
1813
948
|
for (const id of ids) {
|
|
@@ -1850,7 +985,7 @@ const user$1 = {
|
|
|
1850
985
|
updateById
|
|
1851
986
|
};
|
|
1852
987
|
const getSSOProvidersList = async () => {
|
|
1853
|
-
const { providerRegistry: providerRegistry2 } = strapi.admin
|
|
988
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
1854
989
|
return providerRegistry2.getAll().map(({ uid }) => uid);
|
|
1855
990
|
};
|
|
1856
991
|
const sendUpdateProjectInformation = async (strapi2) => {
|
|
@@ -1867,7 +1002,7 @@ const sendUpdateProjectInformation = async (strapi2) => {
|
|
|
1867
1002
|
if (strapi2.ee.features.isEnabled("cms-content-releases")) {
|
|
1868
1003
|
const numberOfContentReleases = await strapi2.db.query("plugin::content-releases.release").count();
|
|
1869
1004
|
const numberOfPublishedContentReleases = await strapi2.db.query("plugin::content-releases.release").count({
|
|
1870
|
-
|
|
1005
|
+
filters: { releasedAt: { $notNull: true } }
|
|
1871
1006
|
});
|
|
1872
1007
|
groupProperties = assign(groupProperties, {
|
|
1873
1008
|
numberOfContentReleases,
|
|
@@ -1952,977 +1087,28 @@ const syncDisabledUserRecords = async () => {
|
|
|
1952
1087
|
const seatEnforcementWorkflow = async () => {
|
|
1953
1088
|
const adminSeats = strapi.ee.seats;
|
|
1954
1089
|
if (isNil(adminSeats)) {
|
|
1955
|
-
return;
|
|
1956
|
-
}
|
|
1957
|
-
await syncDisabledUserRecords();
|
|
1958
|
-
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
1959
|
-
const adminSeatsLeft = adminSeats - currentActiveUserCount;
|
|
1960
|
-
if (adminSeatsLeft > 0) {
|
|
1961
|
-
await enableMaximumUserCount(adminSeatsLeft);
|
|
1962
|
-
} else if (adminSeatsLeft < 0) {
|
|
1963
|
-
await disableUsersAboveLicenseLimit(-adminSeatsLeft);
|
|
1964
|
-
}
|
|
1965
|
-
};
|
|
1966
|
-
const seatEnforcement = {
|
|
1967
|
-
seatEnforcementWorkflow,
|
|
1968
|
-
getDisabledUserList
|
|
1969
|
-
};
|
|
1970
|
-
const workflowsContentTypesFactory = ({ strapi: strapi2 }) => {
|
|
1971
|
-
const contentManagerContentTypeService = strapi2.plugin("content-manager").service("content-types");
|
|
1972
|
-
const stagesService = getService("stages", { strapi: strapi2 });
|
|
1973
|
-
const updateContentTypeConfig = async (uid, reviewWorkflowOption) => {
|
|
1974
|
-
const modelConfig = await contentManagerContentTypeService.findConfiguration(uid);
|
|
1975
|
-
await contentManagerContentTypeService.updateConfiguration(
|
|
1976
|
-
{ uid },
|
|
1977
|
-
{ options: merge(modelConfig.options, { reviewWorkflows: reviewWorkflowOption }) }
|
|
1978
|
-
);
|
|
1979
|
-
};
|
|
1980
|
-
return {
|
|
1981
|
-
/**
|
|
1982
|
-
* Migrates entities stages. Used when a content type is assigned to a workflow.
|
|
1983
|
-
* @param {*} options
|
|
1984
|
-
* @param {Array<string>} options.srcContentTypes - The content types assigned to the previous workflow
|
|
1985
|
-
* @param {Array<string>} options.destContentTypes - The content types assigned to the new workflow
|
|
1986
|
-
* @param {Workflow.Stage} options.stageId - The new stage to assign the entities to
|
|
1987
|
-
*/
|
|
1988
|
-
async migrate({ srcContentTypes = [], destContentTypes, stageId }) {
|
|
1989
|
-
const workflowsService = getService("workflows", { strapi: strapi2 });
|
|
1990
|
-
const { created, deleted } = diffContentTypes(srcContentTypes, destContentTypes);
|
|
1991
|
-
await async.map(
|
|
1992
|
-
created,
|
|
1993
|
-
async (uid) => {
|
|
1994
|
-
const srcWorkflows = await workflowsService._getAssignedWorkflows(uid, {});
|
|
1995
|
-
if (srcWorkflows.length) {
|
|
1996
|
-
await stagesService.updateEntitiesStage(uid, { toStageId: stageId });
|
|
1997
|
-
await async.map(
|
|
1998
|
-
srcWorkflows,
|
|
1999
|
-
(srcWorkflow) => this.transferContentTypes(srcWorkflow, uid)
|
|
2000
|
-
);
|
|
2001
|
-
}
|
|
2002
|
-
await updateContentTypeConfig(uid, true);
|
|
2003
|
-
return stagesService.updateEntitiesStage(uid, {
|
|
2004
|
-
fromStageId: null,
|
|
2005
|
-
toStageId: stageId
|
|
2006
|
-
});
|
|
2007
|
-
},
|
|
2008
|
-
// transferContentTypes can cause race conditions if called in parallel when updating the same workflow
|
|
2009
|
-
{ concurrency: 1 }
|
|
2010
|
-
);
|
|
2011
|
-
await async.map(deleted, async (uid) => {
|
|
2012
|
-
await updateContentTypeConfig(uid, false);
|
|
2013
|
-
await stagesService.deleteAllEntitiesStage(uid, {});
|
|
2014
|
-
});
|
|
2015
|
-
},
|
|
2016
|
-
/**
|
|
2017
|
-
* Filters the content types assigned to a workflow
|
|
2018
|
-
* @param {Workflow} srcWorkflow - The workflow to transfer from
|
|
2019
|
-
* @param {string} uid - The content type uid
|
|
2020
|
-
*/
|
|
2021
|
-
async transferContentTypes(srcWorkflow, uid) {
|
|
2022
|
-
await strapi2.db.query(WORKFLOW_MODEL_UID).update({
|
|
2023
|
-
where: {
|
|
2024
|
-
id: srcWorkflow.id
|
|
2025
|
-
},
|
|
2026
|
-
data: {
|
|
2027
|
-
contentTypes: srcWorkflow.contentTypes.filter((contentType) => contentType !== uid)
|
|
2028
|
-
}
|
|
2029
|
-
});
|
|
2030
|
-
}
|
|
2031
|
-
};
|
|
2032
|
-
};
|
|
2033
|
-
const diffContentTypes = (srcContentTypes, destContentTypes) => {
|
|
2034
|
-
const created = difference(destContentTypes, srcContentTypes);
|
|
2035
|
-
const deleted = difference(srcContentTypes, destContentTypes);
|
|
2036
|
-
return { created, deleted };
|
|
2037
|
-
};
|
|
2038
|
-
const { ApplicationError: ApplicationError$4 } = errors;
|
|
2039
|
-
const processFilters = ({ strapi: strapi2 }, filters = {}) => {
|
|
2040
|
-
const processedFilters = { ...filters };
|
|
2041
|
-
if (isString(filters.contentTypes)) {
|
|
2042
|
-
processedFilters.contentTypes = getWorkflowContentTypeFilter({ strapi: strapi2 }, filters.contentTypes);
|
|
2043
|
-
}
|
|
2044
|
-
return processedFilters;
|
|
2045
|
-
};
|
|
2046
|
-
const processPopulate = (populate) => {
|
|
2047
|
-
if (!populate) {
|
|
2048
|
-
return populate;
|
|
2049
|
-
}
|
|
2050
|
-
return WORKFLOW_POPULATE;
|
|
2051
|
-
};
|
|
2052
|
-
const workflows$1 = ({ strapi: strapi2 }) => {
|
|
2053
|
-
const workflowsContentTypes = workflowsContentTypesFactory({ strapi: strapi2 });
|
|
2054
|
-
const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
|
|
2055
|
-
const metrics2 = getService("review-workflows-metrics", { strapi: strapi2 });
|
|
2056
|
-
return {
|
|
2057
|
-
/**
|
|
2058
|
-
* Returns all the workflows matching the user-defined filters.
|
|
2059
|
-
* @param {object} opts - Options for the query.
|
|
2060
|
-
* @param {object} opts.filters - Filters object.
|
|
2061
|
-
* @returns {Promise<object[]>} - List of workflows that match the user's filters.
|
|
2062
|
-
*/
|
|
2063
|
-
async find(opts = {}) {
|
|
2064
|
-
const filters = processFilters({ strapi: strapi2 }, opts.filters);
|
|
2065
|
-
const populate = processPopulate(opts.populate);
|
|
2066
|
-
const query = strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, {
|
|
2067
|
-
...opts,
|
|
2068
|
-
filters,
|
|
2069
|
-
populate
|
|
2070
|
-
});
|
|
2071
|
-
return strapi2.db.query(WORKFLOW_MODEL_UID).findMany(query);
|
|
2072
|
-
},
|
|
2073
|
-
/**
|
|
2074
|
-
* Returns the workflow with the specified ID.
|
|
2075
|
-
* @param {string} id - ID of the requested workflow.
|
|
2076
|
-
* @param {object} opts - Options for the query.
|
|
2077
|
-
* @returns {Promise<object>} - Workflow object matching the requested ID.
|
|
2078
|
-
*/
|
|
2079
|
-
findById(id, opts = {}) {
|
|
2080
|
-
const populate = processPopulate(opts.populate);
|
|
2081
|
-
const query = strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, { populate });
|
|
2082
|
-
return strapi2.db.query(WORKFLOW_MODEL_UID).findOne({
|
|
2083
|
-
...query,
|
|
2084
|
-
where: { id }
|
|
2085
|
-
});
|
|
2086
|
-
},
|
|
2087
|
-
/**
|
|
2088
|
-
* Creates a new workflow.
|
|
2089
|
-
* @param {object} opts - Options for creating the new workflow.
|
|
2090
|
-
* @returns {Promise<object>} - Workflow object that was just created.
|
|
2091
|
-
* @throws {ValidationError} - If the workflow has no stages.
|
|
2092
|
-
*/
|
|
2093
|
-
async create(opts) {
|
|
2094
|
-
let createOpts = { ...opts, populate: WORKFLOW_POPULATE };
|
|
2095
|
-
workflowsValidationService.validateWorkflowStages(opts.data.stages);
|
|
2096
|
-
await workflowsValidationService.validateWorkflowCount(1);
|
|
2097
|
-
return strapi2.db.transaction(async () => {
|
|
2098
|
-
const stages2 = await getService("stages", { strapi: strapi2 }).createMany(opts.data.stages);
|
|
2099
|
-
const mapIds = map(get("id"));
|
|
2100
|
-
createOpts = set("data.stages", mapIds(stages2), createOpts);
|
|
2101
|
-
if (opts.data.contentTypes) {
|
|
2102
|
-
await workflowsContentTypes.migrate({
|
|
2103
|
-
destContentTypes: opts.data.contentTypes,
|
|
2104
|
-
stageId: stages2[0].id
|
|
2105
|
-
});
|
|
2106
|
-
}
|
|
2107
|
-
metrics2.sendDidCreateWorkflow();
|
|
2108
|
-
return strapi2.db.query(WORKFLOW_MODEL_UID).create(strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, createOpts));
|
|
2109
|
-
});
|
|
2110
|
-
},
|
|
2111
|
-
/**
|
|
2112
|
-
* Updates an existing workflow.
|
|
2113
|
-
* @param {object} workflow - The existing workflow to update.
|
|
2114
|
-
* @param {object} opts - Options for updating the workflow.
|
|
2115
|
-
* @returns {Promise<object>} - Workflow object that was just updated.
|
|
2116
|
-
* @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.
|
|
2117
|
-
*/
|
|
2118
|
-
async update(workflow2, opts) {
|
|
2119
|
-
const stageService = getService("stages", { strapi: strapi2 });
|
|
2120
|
-
let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };
|
|
2121
|
-
let updatedStageIds;
|
|
2122
|
-
await workflowsValidationService.validateWorkflowCount();
|
|
2123
|
-
return strapi2.db.transaction(async () => {
|
|
2124
|
-
if (opts.data.stages) {
|
|
2125
|
-
workflowsValidationService.validateWorkflowStages(opts.data.stages);
|
|
2126
|
-
opts.data.stages.forEach(
|
|
2127
|
-
(stage) => this.assertStageBelongsToWorkflow(stage.id, workflow2)
|
|
2128
|
-
);
|
|
2129
|
-
updatedStageIds = await stageService.replaceStages(workflow2.stages, opts.data.stages, workflow2.contentTypes).then((stages2) => stages2.map((stage) => stage.id));
|
|
2130
|
-
updateOpts = set("data.stages", updatedStageIds, updateOpts);
|
|
2131
|
-
}
|
|
2132
|
-
if (opts.data.contentTypes) {
|
|
2133
|
-
await workflowsContentTypes.migrate({
|
|
2134
|
-
srcContentTypes: workflow2.contentTypes,
|
|
2135
|
-
destContentTypes: opts.data.contentTypes,
|
|
2136
|
-
stageId: updatedStageIds ? updatedStageIds[0] : workflow2.stages[0].id
|
|
2137
|
-
});
|
|
2138
|
-
}
|
|
2139
|
-
metrics2.sendDidEditWorkflow();
|
|
2140
|
-
const query = strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, updateOpts);
|
|
2141
|
-
return strapi2.db.query(WORKFLOW_MODEL_UID).update({
|
|
2142
|
-
...query,
|
|
2143
|
-
where: { id: workflow2.id }
|
|
2144
|
-
});
|
|
2145
|
-
});
|
|
2146
|
-
},
|
|
2147
|
-
/**
|
|
2148
|
-
* Deletes an existing workflow.
|
|
2149
|
-
* Also deletes all the workflow stages and migrate all assigned the content types.
|
|
2150
|
-
* @param {*} workflow
|
|
2151
|
-
* @param {*} opts
|
|
2152
|
-
* @returns
|
|
2153
|
-
*/
|
|
2154
|
-
async delete(workflow2, opts) {
|
|
2155
|
-
const stageService = getService("stages", { strapi: strapi2 });
|
|
2156
|
-
const workflowCount = await this.count();
|
|
2157
|
-
if (workflowCount <= 1) {
|
|
2158
|
-
throw new ApplicationError$4("Can not delete the last workflow");
|
|
2159
|
-
}
|
|
2160
|
-
return strapi2.db.transaction(async () => {
|
|
2161
|
-
await stageService.deleteMany(workflow2.stages);
|
|
2162
|
-
await workflowsContentTypes.migrate({
|
|
2163
|
-
srcContentTypes: workflow2.contentTypes,
|
|
2164
|
-
destContentTypes: []
|
|
2165
|
-
});
|
|
2166
|
-
const query = strapi2.get("query-params").transform(WORKFLOW_MODEL_UID, opts);
|
|
2167
|
-
return strapi2.db.query(WORKFLOW_MODEL_UID).delete({
|
|
2168
|
-
...query,
|
|
2169
|
-
where: { id: workflow2.id }
|
|
2170
|
-
});
|
|
2171
|
-
});
|
|
2172
|
-
},
|
|
2173
|
-
/**
|
|
2174
|
-
* Returns the total count of workflows.
|
|
2175
|
-
* @returns {Promise<number>} - Total count of workflows.
|
|
2176
|
-
*/
|
|
2177
|
-
count() {
|
|
2178
|
-
return strapi2.db.query(WORKFLOW_MODEL_UID).count();
|
|
2179
|
-
},
|
|
2180
|
-
/**
|
|
2181
|
-
* Finds the assigned workflow for a given content type ID.
|
|
2182
|
-
* @param {string} uid - Content type ID to find the assigned workflow for.
|
|
2183
|
-
* @param {object} opts - Options for the query.
|
|
2184
|
-
* @returns {Promise<object|null>} - Assigned workflow object if found, or null.
|
|
2185
|
-
*/
|
|
2186
|
-
async getAssignedWorkflow(uid, opts = {}) {
|
|
2187
|
-
const workflows2 = await this._getAssignedWorkflows(uid, opts);
|
|
2188
|
-
return workflows2.length > 0 ? workflows2[0] : null;
|
|
2189
|
-
},
|
|
2190
|
-
/**
|
|
2191
|
-
* Finds all the assigned workflows for a given content type ID.
|
|
2192
|
-
* Normally, there should only be one workflow assigned to a content type.
|
|
2193
|
-
* However, edge cases can occur where a content type is assigned to multiple workflows.
|
|
2194
|
-
* @param {string} uid - Content type ID to find the assigned workflows for.
|
|
2195
|
-
* @param {object} opts - Options for the query.
|
|
2196
|
-
* @returns {Promise<object[]>} - List of assigned workflow objects.
|
|
2197
|
-
*/
|
|
2198
|
-
async _getAssignedWorkflows(uid, opts = {}) {
|
|
2199
|
-
return this.find({
|
|
2200
|
-
...opts,
|
|
2201
|
-
filters: { contentTypes: getWorkflowContentTypeFilter({ strapi: strapi2 }, uid) }
|
|
2202
|
-
});
|
|
2203
|
-
},
|
|
2204
|
-
/**
|
|
2205
|
-
* Asserts that a content type has an assigned workflow.
|
|
2206
|
-
* @param {string} uid - Content type ID to verify the assignment of.
|
|
2207
|
-
* @returns {Promise<object>} - Workflow object associated with the content type ID.
|
|
2208
|
-
* @throws {ApplicationError} - If no assigned workflow is found for the content type ID.
|
|
2209
|
-
*/
|
|
2210
|
-
async assertContentTypeBelongsToWorkflow(uid) {
|
|
2211
|
-
const workflow2 = await this.getAssignedWorkflow(uid, {
|
|
2212
|
-
populate: "stages"
|
|
2213
|
-
});
|
|
2214
|
-
if (!workflow2) {
|
|
2215
|
-
throw new ApplicationError$4(`Review workflows is not activated on Content Type ${uid}.`);
|
|
2216
|
-
}
|
|
2217
|
-
return workflow2;
|
|
2218
|
-
},
|
|
2219
|
-
/**
|
|
2220
|
-
* Asserts that a stage belongs to a given workflow.
|
|
2221
|
-
* @param {string} stageId - ID of stage to check.
|
|
2222
|
-
* @param {object} workflow - Workflow object to check against.
|
|
2223
|
-
* @returns
|
|
2224
|
-
* @throws {ApplicationError} - If the stage does not belong to the specified workflow.
|
|
2225
|
-
*/
|
|
2226
|
-
assertStageBelongsToWorkflow(stageId, workflow2) {
|
|
2227
|
-
if (!stageId) {
|
|
2228
|
-
return;
|
|
2229
|
-
}
|
|
2230
|
-
const belongs = workflow2.stages.some((stage) => stage.id === stageId);
|
|
2231
|
-
if (!belongs) {
|
|
2232
|
-
throw new ApplicationError$4(`Stage does not belong to workflow "${workflow2.name}"`);
|
|
2233
|
-
}
|
|
2234
|
-
}
|
|
2235
|
-
};
|
|
2236
|
-
};
|
|
2237
|
-
const { ApplicationError: ApplicationError$3, ValidationError: ValidationError$2 } = errors;
|
|
2238
|
-
const sanitizedStageFields = ["id", "name", "workflow", "color"];
|
|
2239
|
-
const sanitizeStageFields = pick(sanitizedStageFields);
|
|
2240
|
-
const stages$1 = ({ strapi: strapi2 }) => {
|
|
2241
|
-
const metrics2 = getService("review-workflows-metrics", { strapi: strapi2 });
|
|
2242
|
-
const stagePermissionsService = getService("stage-permissions", { strapi: strapi2 });
|
|
2243
|
-
const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
|
|
2244
|
-
return {
|
|
2245
|
-
find({ workflowId, populate }) {
|
|
2246
|
-
return strapi2.db.query(STAGE_MODEL_UID).findMany({
|
|
2247
|
-
where: { workflow: workflowId },
|
|
2248
|
-
populate
|
|
2249
|
-
});
|
|
2250
|
-
},
|
|
2251
|
-
findById(id, { populate } = {}) {
|
|
2252
|
-
return strapi2.db.query(STAGE_MODEL_UID).findOne({
|
|
2253
|
-
where: { id },
|
|
2254
|
-
populate
|
|
2255
|
-
});
|
|
2256
|
-
},
|
|
2257
|
-
async createMany(stagesList, { fields } = {}) {
|
|
2258
|
-
const params = { select: fields ?? "*" };
|
|
2259
|
-
const stages2 = await Promise.all(
|
|
2260
|
-
stagesList.map(
|
|
2261
|
-
(stage) => strapi2.db.query(STAGE_MODEL_UID).create({
|
|
2262
|
-
data: sanitizeStageFields(stage),
|
|
2263
|
-
...params
|
|
2264
|
-
})
|
|
2265
|
-
)
|
|
2266
|
-
);
|
|
2267
|
-
await async.reduce(stagesList)(async (_2, stage, idx) => {
|
|
2268
|
-
if (!stage.permissions || stage.permissions.length === 0) {
|
|
2269
|
-
return;
|
|
2270
|
-
}
|
|
2271
|
-
const stagePermissions2 = stage.permissions;
|
|
2272
|
-
const stageId = stages2[idx].id;
|
|
2273
|
-
const permissions = await async.map(
|
|
2274
|
-
stagePermissions2,
|
|
2275
|
-
// Register each stage permission
|
|
2276
|
-
(permission2) => stagePermissionsService.register({
|
|
2277
|
-
roleId: permission2.role,
|
|
2278
|
-
action: permission2.action,
|
|
2279
|
-
fromStage: stageId
|
|
2280
|
-
})
|
|
2281
|
-
);
|
|
2282
|
-
await strapi2.db.query(STAGE_MODEL_UID).update({
|
|
2283
|
-
where: { id: stageId },
|
|
2284
|
-
data: {
|
|
2285
|
-
permissions: permissions.flat().map((p) => p.id)
|
|
2286
|
-
}
|
|
2287
|
-
});
|
|
2288
|
-
}, []);
|
|
2289
|
-
metrics2.sendDidCreateStage();
|
|
2290
|
-
return stages2;
|
|
2291
|
-
},
|
|
2292
|
-
async update(srcStage, destStage) {
|
|
2293
|
-
let stagePermissions2 = srcStage?.permissions ?? [];
|
|
2294
|
-
const stageId = destStage.id;
|
|
2295
|
-
if (destStage.permissions) {
|
|
2296
|
-
await this.deleteStagePermissions([srcStage]);
|
|
2297
|
-
const permissions = await async.map(
|
|
2298
|
-
destStage.permissions,
|
|
2299
|
-
(permission2) => stagePermissionsService.register({
|
|
2300
|
-
roleId: permission2.role,
|
|
2301
|
-
action: permission2.action,
|
|
2302
|
-
fromStage: stageId
|
|
2303
|
-
})
|
|
2304
|
-
);
|
|
2305
|
-
stagePermissions2 = permissions.flat().map((p) => p.id);
|
|
2306
|
-
}
|
|
2307
|
-
const stage = await strapi2.db.query(STAGE_MODEL_UID).update({
|
|
2308
|
-
where: { id: stageId },
|
|
2309
|
-
data: {
|
|
2310
|
-
...destStage,
|
|
2311
|
-
permissions: stagePermissions2
|
|
2312
|
-
}
|
|
2313
|
-
});
|
|
2314
|
-
metrics2.sendDidEditStage();
|
|
2315
|
-
return stage;
|
|
2316
|
-
},
|
|
2317
|
-
async delete(stage) {
|
|
2318
|
-
await this.deleteStagePermissions([stage]);
|
|
2319
|
-
const deletedStage = await strapi2.db.query(STAGE_MODEL_UID).delete({
|
|
2320
|
-
where: { id: stage.id }
|
|
2321
|
-
});
|
|
2322
|
-
metrics2.sendDidDeleteStage();
|
|
2323
|
-
return deletedStage;
|
|
2324
|
-
},
|
|
2325
|
-
async deleteMany(stages2) {
|
|
2326
|
-
await this.deleteStagePermissions(stages2);
|
|
2327
|
-
return strapi2.db.query(STAGE_MODEL_UID).deleteMany({
|
|
2328
|
-
where: { id: { $in: stages2.map((s) => s.id) } }
|
|
2329
|
-
});
|
|
2330
|
-
},
|
|
2331
|
-
async deleteStagePermissions(stages2) {
|
|
2332
|
-
const permissions = stages2.map((s) => s.permissions || []).flat();
|
|
2333
|
-
await stagePermissionsService.unregister(permissions || []);
|
|
2334
|
-
},
|
|
2335
|
-
count({ workflowId } = {}) {
|
|
2336
|
-
const opts = {};
|
|
2337
|
-
if (workflowId) {
|
|
2338
|
-
opts.where = {
|
|
2339
|
-
workflow: workflowId
|
|
2340
|
-
};
|
|
2341
|
-
}
|
|
2342
|
-
return strapi2.db.query(STAGE_MODEL_UID).count(opts);
|
|
2343
|
-
},
|
|
2344
|
-
async replaceStages(srcStages, destStages, contentTypesToMigrate = []) {
|
|
2345
|
-
const { created, updated, deleted } = getDiffBetweenStages(srcStages, destStages);
|
|
2346
|
-
assertAtLeastOneStageRemain(srcStages || [], { created, deleted });
|
|
2347
|
-
return strapi2.db.transaction(async ({ trx }) => {
|
|
2348
|
-
const createdStages = await this.createMany(created, { fields: ["id"] });
|
|
2349
|
-
const createdStagesIds = map("id", createdStages);
|
|
2350
|
-
await async.map(updated, (destStage) => {
|
|
2351
|
-
const srcStage = srcStages.find((s) => s.id === destStage.id);
|
|
2352
|
-
return this.update(srcStage, destStage);
|
|
2353
|
-
});
|
|
2354
|
-
await async.map(deleted, async (stage) => {
|
|
2355
|
-
const nearestStage = findNearestMatchingStage(
|
|
2356
|
-
[...srcStages, ...createdStages],
|
|
2357
|
-
srcStages.findIndex((s) => s.id === stage.id),
|
|
2358
|
-
(targetStage) => {
|
|
2359
|
-
return !deleted.find((s) => s.id === targetStage.id);
|
|
2360
|
-
}
|
|
2361
|
-
);
|
|
2362
|
-
await async.map(contentTypesToMigrate, (contentTypeUID) => {
|
|
2363
|
-
this.updateEntitiesStage(contentTypeUID, {
|
|
2364
|
-
fromStageId: stage.id,
|
|
2365
|
-
toStageId: nearestStage.id,
|
|
2366
|
-
trx
|
|
2367
|
-
});
|
|
2368
|
-
});
|
|
2369
|
-
return this.delete(stage);
|
|
2370
|
-
});
|
|
2371
|
-
return destStages.map((stage) => ({
|
|
2372
|
-
...stage,
|
|
2373
|
-
id: stage.id ?? createdStagesIds.shift()
|
|
2374
|
-
}));
|
|
2375
|
-
});
|
|
2376
|
-
},
|
|
2377
|
-
/**
|
|
2378
|
-
* Update the stage of an entity
|
|
2379
|
-
*
|
|
2380
|
-
* @param {object} entityInfo
|
|
2381
|
-
* @param {number} entityInfo.id - Entity id
|
|
2382
|
-
* @param {string} entityInfo.modelUID - the content-type of the entity
|
|
2383
|
-
* @param {number} stageId - The id of the stage to assign to the entity
|
|
2384
|
-
*/
|
|
2385
|
-
async updateEntity(entityInfo, stageId) {
|
|
2386
|
-
const stage = await this.findById(stageId);
|
|
2387
|
-
await workflowsValidationService.validateWorkflowCount();
|
|
2388
|
-
if (!stage) {
|
|
2389
|
-
throw new ApplicationError$3(`Selected stage does not exist`);
|
|
2390
|
-
}
|
|
2391
|
-
const entity = await strapi2.db.query(entityInfo.modelUID).update({
|
|
2392
|
-
where: {
|
|
2393
|
-
id: entityInfo.id
|
|
2394
|
-
},
|
|
2395
|
-
data: { [ENTITY_STAGE_ATTRIBUTE]: stageId },
|
|
2396
|
-
populate: [ENTITY_STAGE_ATTRIBUTE]
|
|
2397
|
-
});
|
|
2398
|
-
metrics2.sendDidChangeEntryStage();
|
|
2399
|
-
return entity;
|
|
2400
|
-
},
|
|
2401
|
-
/**
|
|
2402
|
-
* Updates entity stages of a content type:
|
|
2403
|
-
* - If fromStageId is undefined, all entities with an existing stage will be assigned the new stage
|
|
2404
|
-
* - If fromStageId is null, all entities without a stage will be assigned the new stage
|
|
2405
|
-
* - If fromStageId is a number, all entities with that stage will be assigned the new stage
|
|
2406
|
-
*
|
|
2407
|
-
* For performance reasons we use knex queries directly.
|
|
2408
|
-
*
|
|
2409
|
-
* @param {string} contentTypeUID
|
|
2410
|
-
* @param {number | undefined | null} fromStageId
|
|
2411
|
-
* @param {number} toStageId
|
|
2412
|
-
* @param {import('knex').Knex.Transaction} trx
|
|
2413
|
-
* @returns
|
|
2414
|
-
*/
|
|
2415
|
-
async updateEntitiesStage(contentTypeUID, { fromStageId, toStageId }) {
|
|
2416
|
-
const { attributes, tableName } = strapi2.db.metadata.get(contentTypeUID);
|
|
2417
|
-
const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;
|
|
2418
|
-
const joinColumn = joinTable.joinColumn.name;
|
|
2419
|
-
const invJoinColumn = joinTable.inverseJoinColumn.name;
|
|
2420
|
-
await workflowsValidationService.validateWorkflowCount();
|
|
2421
|
-
return strapi2.db.transaction(async ({ trx }) => {
|
|
2422
|
-
if (fromStageId === void 0) {
|
|
2423
|
-
return strapi2.db.getConnection().from(joinTable.name).update({ [invJoinColumn]: toStageId }).transacting(trx);
|
|
2424
|
-
}
|
|
2425
|
-
const selectStatement = strapi2.db.getConnection().select({ [joinColumn]: "t1.id", [invJoinColumn]: toStageId }).from(`${tableName} as t1`).leftJoin(`${joinTable.name} as t2`, `t1.id`, `t2.${joinColumn}`).where(`t2.${invJoinColumn}`, fromStageId).toSQL();
|
|
2426
|
-
return strapi2.db.getConnection(joinTable.name).insert(
|
|
2427
|
-
strapi2.db.connection.raw(
|
|
2428
|
-
`(${joinColumn}, ${invJoinColumn}) ${selectStatement.sql}`,
|
|
2429
|
-
selectStatement.bindings
|
|
2430
|
-
)
|
|
2431
|
-
).transacting(trx);
|
|
2432
|
-
});
|
|
2433
|
-
},
|
|
2434
|
-
/**
|
|
2435
|
-
* Deletes all entity stages of a content type
|
|
2436
|
-
* @param {string} contentTypeUID
|
|
2437
|
-
* @returns
|
|
2438
|
-
*/
|
|
2439
|
-
async deleteAllEntitiesStage(contentTypeUID) {
|
|
2440
|
-
const { attributes } = strapi2.db.metadata.get(contentTypeUID);
|
|
2441
|
-
const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;
|
|
2442
|
-
return strapi2.db.transaction(
|
|
2443
|
-
async ({ trx }) => strapi2.db.getConnection().from(joinTable.name).delete().transacting(trx)
|
|
2444
|
-
);
|
|
2445
|
-
}
|
|
2446
|
-
};
|
|
2447
|
-
};
|
|
2448
|
-
function getDiffBetweenStages(sourceStages, comparisonStages) {
|
|
2449
|
-
const result = comparisonStages.reduce(
|
|
2450
|
-
// ...
|
|
2451
|
-
(acc, stageToCompare) => {
|
|
2452
|
-
const srcStage = sourceStages.find((stage) => stage.id === stageToCompare.id);
|
|
2453
|
-
if (!srcStage) {
|
|
2454
|
-
acc.created.push(stageToCompare);
|
|
2455
|
-
} else if (!isEqual(
|
|
2456
|
-
pick(["name", "color", "permissions"], srcStage),
|
|
2457
|
-
pick(["name", "color", "permissions"], stageToCompare)
|
|
2458
|
-
)) {
|
|
2459
|
-
acc.updated.push(stageToCompare);
|
|
2460
|
-
}
|
|
2461
|
-
return acc;
|
|
2462
|
-
},
|
|
2463
|
-
{ created: [], updated: [] }
|
|
2464
|
-
);
|
|
2465
|
-
result.deleted = sourceStages.filter(
|
|
2466
|
-
(srcStage) => !comparisonStages.some((cmpStage) => cmpStage.id === srcStage.id)
|
|
2467
|
-
);
|
|
2468
|
-
return result;
|
|
2469
|
-
}
|
|
2470
|
-
function assertAtLeastOneStageRemain(workflowStages, diffStages) {
|
|
2471
|
-
const remainingStagesCount = workflowStages.length - diffStages.deleted.length + diffStages.created.length;
|
|
2472
|
-
if (remainingStagesCount < 1) {
|
|
2473
|
-
throw new ValidationError$2(ERRORS.WORKFLOW_WITHOUT_STAGES);
|
|
2474
|
-
}
|
|
2475
|
-
}
|
|
2476
|
-
function findNearestMatchingStage(stages2, startIndex, condition) {
|
|
2477
|
-
for (let i = startIndex; i >= 0; i -= 1) {
|
|
2478
|
-
if (condition(stages2[i])) {
|
|
2479
|
-
return stages2[i];
|
|
2480
|
-
}
|
|
2481
|
-
}
|
|
2482
|
-
const remainingArray = stages2.slice(startIndex + 1);
|
|
2483
|
-
const nearestObject = remainingArray.filter(condition)[0];
|
|
2484
|
-
return nearestObject;
|
|
2485
|
-
}
|
|
2486
|
-
const { ApplicationError: ApplicationError$2 } = errors;
|
|
2487
|
-
const validActions = [STAGE_TRANSITION_UID];
|
|
2488
|
-
const stagePermissions = ({ strapi: strapi2 }) => {
|
|
2489
|
-
const roleService = getService("role");
|
|
2490
|
-
const permissionService = getService("permission");
|
|
2491
|
-
return {
|
|
2492
|
-
async register({ roleId, action, fromStage }) {
|
|
2493
|
-
if (!validActions.includes(action)) {
|
|
2494
|
-
throw new ApplicationError$2(`Invalid action ${action}`);
|
|
2495
|
-
}
|
|
2496
|
-
const permissions = await roleService.addPermissions(roleId, [
|
|
2497
|
-
{
|
|
2498
|
-
action,
|
|
2499
|
-
actionParameters: {
|
|
2500
|
-
from: fromStage
|
|
2501
|
-
}
|
|
2502
|
-
}
|
|
2503
|
-
]);
|
|
2504
|
-
return permissions;
|
|
2505
|
-
},
|
|
2506
|
-
async registerMany(permissions) {
|
|
2507
|
-
return async.map(permissions, this.register);
|
|
2508
|
-
},
|
|
2509
|
-
async unregister(permissions) {
|
|
2510
|
-
const permissionIds = permissions.map(prop("id"));
|
|
2511
|
-
await permissionService.deleteByIds(permissionIds);
|
|
2512
|
-
},
|
|
2513
|
-
can(action, fromStage) {
|
|
2514
|
-
const requestState = strapi2.requestContext.get()?.state;
|
|
2515
|
-
if (!requestState) {
|
|
2516
|
-
return false;
|
|
2517
|
-
}
|
|
2518
|
-
const userRoles = requestState.user?.roles;
|
|
2519
|
-
if (userRoles?.some((role2) => role2.code === "strapi-super-admin")) {
|
|
2520
|
-
return true;
|
|
2521
|
-
}
|
|
2522
|
-
return requestState.userAbility.can({
|
|
2523
|
-
name: action,
|
|
2524
|
-
params: { from: fromStage }
|
|
2525
|
-
});
|
|
2526
|
-
}
|
|
2527
|
-
};
|
|
2528
|
-
};
|
|
2529
|
-
const { ApplicationError: ApplicationError$1 } = errors;
|
|
2530
|
-
const assignees$1 = ({ strapi: strapi2 }) => {
|
|
2531
|
-
const metrics2 = getService("review-workflows-metrics", { strapi: strapi2 });
|
|
2532
|
-
return {
|
|
2533
|
-
async findEntityAssigneeId(id, model) {
|
|
2534
|
-
const entity = await strapi2.db.query(model).findOne({
|
|
2535
|
-
where: { id },
|
|
2536
|
-
populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
|
|
2537
|
-
select: []
|
|
2538
|
-
});
|
|
2539
|
-
return entity?.[ENTITY_ASSIGNEE_ATTRIBUTE]?.id ?? null;
|
|
2540
|
-
},
|
|
2541
|
-
/**
|
|
2542
|
-
* Update the assignee of an entity
|
|
2543
|
-
*/
|
|
2544
|
-
async updateEntityAssignee(id, model, assigneeId) {
|
|
2545
|
-
if (isNil(assigneeId)) {
|
|
2546
|
-
return this.deleteEntityAssignee(id, model);
|
|
2547
|
-
}
|
|
2548
|
-
const userExists = await getService("user", { strapi: strapi2 }).exists({ id: assigneeId });
|
|
2549
|
-
if (!userExists) {
|
|
2550
|
-
throw new ApplicationError$1(`Selected user does not exist`);
|
|
2551
|
-
}
|
|
2552
|
-
metrics2.sendDidEditAssignee(await this.findEntityAssigneeId(id, model), assigneeId);
|
|
2553
|
-
return strapi2.db.query(model).update({
|
|
2554
|
-
where: { id },
|
|
2555
|
-
data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: assigneeId },
|
|
2556
|
-
populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
|
|
2557
|
-
select: []
|
|
2558
|
-
});
|
|
2559
|
-
},
|
|
2560
|
-
async deleteEntityAssignee(id, model) {
|
|
2561
|
-
metrics2.sendDidEditAssignee(await this.findEntityAssigneeId(id, model), null);
|
|
2562
|
-
return strapi2.db.query(model).update({
|
|
2563
|
-
where: { id },
|
|
2564
|
-
data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: null },
|
|
2565
|
-
populate: [ENTITY_ASSIGNEE_ATTRIBUTE],
|
|
2566
|
-
select: []
|
|
2567
|
-
});
|
|
2568
|
-
}
|
|
2569
|
-
};
|
|
2570
|
-
};
|
|
2571
|
-
const defaultStages = [
|
|
2572
|
-
{
|
|
2573
|
-
name: "To do",
|
|
2574
|
-
color: "#4945FF"
|
|
2575
|
-
},
|
|
2576
|
-
{
|
|
2577
|
-
name: "Ready to review",
|
|
2578
|
-
color: "#9736E8"
|
|
2579
|
-
},
|
|
2580
|
-
{
|
|
2581
|
-
name: "In progress",
|
|
2582
|
-
color: "#EE5E52"
|
|
2583
|
-
},
|
|
2584
|
-
{
|
|
2585
|
-
name: "Reviewed",
|
|
2586
|
-
color: "#328048"
|
|
2587
|
-
}
|
|
2588
|
-
];
|
|
2589
|
-
const WORKFLOW_UPDATE_STAGE = "review-workflows.updateEntryStage";
|
|
2590
|
-
const webhookEvents = {
|
|
2591
|
-
WORKFLOW_UPDATE_STAGE
|
|
2592
|
-
};
|
|
2593
|
-
const MAX_DB_TABLE_NAME_LEN = 63;
|
|
2594
|
-
const MAX_JOIN_TABLE_NAME_SUFFIX = 1 + ENTITY_STAGE_ATTRIBUTE.length + "_links_inv_fk".length;
|
|
2595
|
-
const MAX_CONTENT_TYPE_NAME_LEN = MAX_DB_TABLE_NAME_LEN - MAX_JOIN_TABLE_NAME_SUFFIX;
|
|
2596
|
-
const DEFAULT_OPTIONS = {
|
|
2597
|
-
numberOfWorkflows: MAX_WORKFLOWS,
|
|
2598
|
-
stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW
|
|
2599
|
-
};
|
|
2600
|
-
async function initDefaultWorkflow({ workflowsService, stagesService }) {
|
|
2601
|
-
const wfCount = await workflowsService.count();
|
|
2602
|
-
const stagesCount = await stagesService.count();
|
|
2603
|
-
if (wfCount === 0 && stagesCount === 0) {
|
|
2604
|
-
const workflow2 = {
|
|
2605
|
-
...defaultWorkflow,
|
|
2606
|
-
contentTypes: [],
|
|
2607
|
-
stages: defaultStages
|
|
2608
|
-
};
|
|
2609
|
-
await workflowsService.create({ data: workflow2 });
|
|
2610
|
-
}
|
|
2611
|
-
}
|
|
2612
|
-
const setRelation = (attributeName, target) => (contentType) => {
|
|
2613
|
-
Object.assign(contentType.attributes, {
|
|
2614
|
-
[attributeName]: {
|
|
2615
|
-
writable: true,
|
|
2616
|
-
private: false,
|
|
2617
|
-
configurable: false,
|
|
2618
|
-
visible: false,
|
|
2619
|
-
useJoinTable: true,
|
|
2620
|
-
// We want a join table to persist data when downgrading to CE
|
|
2621
|
-
type: "relation",
|
|
2622
|
-
relation: "oneToOne",
|
|
2623
|
-
target
|
|
2624
|
-
}
|
|
2625
|
-
});
|
|
2626
|
-
return contentType;
|
|
2627
|
-
};
|
|
2628
|
-
const setStageAttribute = setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID);
|
|
2629
|
-
const setAssigneeAttribute = setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, "admin::user");
|
|
2630
|
-
const setReviewWorkflowAttributes = (contentType) => {
|
|
2631
|
-
setStageAttribute(contentType);
|
|
2632
|
-
setAssigneeAttribute(contentType);
|
|
2633
|
-
};
|
|
2634
|
-
function extendReviewWorkflowContentTypes({ strapi: strapi2 }) {
|
|
2635
|
-
const extendContentType = (contentTypeUID) => {
|
|
2636
|
-
const assertContentTypeCompatibility = (contentType) => contentType.collectionName.length <= MAX_CONTENT_TYPE_NAME_LEN;
|
|
2637
|
-
const incompatibleContentTypeAlert = (contentType) => {
|
|
2638
|
-
strapi2.log.warn(
|
|
2639
|
-
`Review Workflow cannot be activated for the content type with the name '${contentType.info.displayName}' because the name exceeds the maximum length of ${MAX_CONTENT_TYPE_NAME_LEN} characters.`
|
|
2640
|
-
);
|
|
2641
|
-
return contentType;
|
|
2642
|
-
};
|
|
2643
|
-
const extendContentTypeIfCompatible = cond([
|
|
2644
|
-
[assertContentTypeCompatibility, setReviewWorkflowAttributes],
|
|
2645
|
-
[stubTrue, incompatibleContentTypeAlert]
|
|
2646
|
-
]);
|
|
2647
|
-
strapi2.get("content-types").extend(contentTypeUID, extendContentTypeIfCompatible);
|
|
2648
|
-
};
|
|
2649
|
-
pipe([
|
|
2650
|
-
getVisibleContentTypesUID,
|
|
2651
|
-
// Iterate over UIDs to extend the content-type
|
|
2652
|
-
forEach(extendContentType)
|
|
2653
|
-
])(strapi2.contentTypes);
|
|
2654
|
-
}
|
|
2655
|
-
function persistStagesJoinTables({ strapi: strapi2 }) {
|
|
2656
|
-
return async ({ contentTypes }) => {
|
|
2657
|
-
const getStageTableToPersist = (contentTypeUID) => {
|
|
2658
|
-
const { attributes, tableName } = strapi2.db.metadata.get(contentTypeUID);
|
|
2659
|
-
const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;
|
|
2660
|
-
return { name: joinTableName, dependsOn: [{ name: tableName }] };
|
|
2661
|
-
};
|
|
2662
|
-
const joinTablesToPersist = pipe([
|
|
2663
|
-
getVisibleContentTypesUID,
|
|
2664
|
-
filter((uid) => hasStageAttribute(contentTypes[uid])),
|
|
2665
|
-
map(getStageTableToPersist)
|
|
2666
|
-
])(contentTypes);
|
|
2667
|
-
await removePersistedTablesWithSuffix("_strapi_stage_links");
|
|
2668
|
-
await persistTables(joinTablesToPersist);
|
|
2669
|
-
};
|
|
2670
|
-
}
|
|
2671
|
-
const registerWebhookEvents = async ({ strapi: strapi2 }) => Object.entries(webhookEvents).forEach(
|
|
2672
|
-
([eventKey, event]) => strapi2.webhookStore.addAllowedEvent(eventKey, event)
|
|
2673
|
-
);
|
|
2674
|
-
const reviewWorkflows = ({ strapi: strapi2 }) => {
|
|
2675
|
-
const workflowsService = getService("workflows", { strapi: strapi2 });
|
|
2676
|
-
const stagesService = getService("stages", { strapi: strapi2 });
|
|
2677
|
-
const workflowsValidationService = getService("review-workflows-validation", { strapi: strapi2 });
|
|
2678
|
-
return {
|
|
2679
|
-
async bootstrap() {
|
|
2680
|
-
await registerWebhookEvents({ strapi: strapi2 });
|
|
2681
|
-
await initDefaultWorkflow({ workflowsService, stagesService, strapi: strapi2 });
|
|
2682
|
-
},
|
|
2683
|
-
async register({ options } = { options: {} }) {
|
|
2684
|
-
extendReviewWorkflowContentTypes({ strapi: strapi2 });
|
|
2685
|
-
strapi2.hook("strapi::content-types.afterSync").register(persistStagesJoinTables({ strapi: strapi2 }));
|
|
2686
|
-
const reviewWorkflowsOptions = defaultsDeep(DEFAULT_OPTIONS, options);
|
|
2687
|
-
workflowsValidationService.register(reviewWorkflowsOptions);
|
|
2688
|
-
}
|
|
2689
|
-
};
|
|
2690
|
-
};
|
|
2691
|
-
const { ValidationError: ValidationError$1 } = errors;
|
|
2692
|
-
const reviewWorkflowsValidation = ({ strapi: strapi2 }) => {
|
|
2693
|
-
return {
|
|
2694
|
-
limits: {
|
|
2695
|
-
numberOfWorkflows: MAX_WORKFLOWS,
|
|
2696
|
-
stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW
|
|
2697
|
-
},
|
|
2698
|
-
register({ numberOfWorkflows, stagesPerWorkflow }) {
|
|
2699
|
-
if (!Object.isFrozen(this.limits)) {
|
|
2700
|
-
this.limits.numberOfWorkflows = clampMaxWorkflows(
|
|
2701
|
-
numberOfWorkflows || this.limits.numberOfWorkflows
|
|
2702
|
-
);
|
|
2703
|
-
this.limits.stagesPerWorkflow = clampMaxStagesPerWorkflow(
|
|
2704
|
-
stagesPerWorkflow || this.limits.stagesPerWorkflow
|
|
2705
|
-
);
|
|
2706
|
-
Object.freeze(this.limits);
|
|
2707
|
-
}
|
|
2708
|
-
},
|
|
2709
|
-
/**
|
|
2710
|
-
* Validates the stages of a workflow.
|
|
2711
|
-
* @param {Array} stages - Array of stages to be validated.
|
|
2712
|
-
* @throws {ValidationError} - If the workflow has no stages or exceeds the limit.
|
|
2713
|
-
*/
|
|
2714
|
-
validateWorkflowStages(stages2) {
|
|
2715
|
-
if (!stages2 || stages2.length === 0) {
|
|
2716
|
-
throw new ValidationError$1(ERRORS.WORKFLOW_WITHOUT_STAGES);
|
|
2717
|
-
}
|
|
2718
|
-
if (stages2.length > this.limits.stagesPerWorkflow) {
|
|
2719
|
-
throw new ValidationError$1(ERRORS.STAGES_LIMIT);
|
|
2720
|
-
}
|
|
2721
|
-
const stageNames = stages2.map((stage) => stage.name);
|
|
2722
|
-
if (uniq(stageNames).length !== stageNames.length) {
|
|
2723
|
-
throw new ValidationError$1(ERRORS.DUPLICATED_STAGE_NAME);
|
|
2724
|
-
}
|
|
2725
|
-
},
|
|
2726
|
-
async validateWorkflowCountStages(workflowId, countAddedStages = 0) {
|
|
2727
|
-
const stagesService = getService("stages", { strapi: strapi2 });
|
|
2728
|
-
const countWorkflowStages = await stagesService.count({ workflowId });
|
|
2729
|
-
if (countWorkflowStages + countAddedStages > this.limits.stagesPerWorkflow) {
|
|
2730
|
-
throw new ValidationError$1(ERRORS.STAGES_LIMIT);
|
|
2731
|
-
}
|
|
2732
|
-
},
|
|
2733
|
-
/**
|
|
2734
|
-
* Validates the count of existing and added workflows.
|
|
2735
|
-
* @param {number} [countAddedWorkflows=0] - The count of workflows to be added.
|
|
2736
|
-
* @throws {ValidationError} - If the total count of workflows exceeds the limit.
|
|
2737
|
-
* @returns {Promise<void>} - A Promise that resolves when the validation is completed.
|
|
2738
|
-
*/
|
|
2739
|
-
async validateWorkflowCount(countAddedWorkflows = 0) {
|
|
2740
|
-
const workflowsService = getService("workflows", { strapi: strapi2 });
|
|
2741
|
-
const countWorkflows = await workflowsService.count();
|
|
2742
|
-
if (countWorkflows + countAddedWorkflows > this.limits.numberOfWorkflows) {
|
|
2743
|
-
throw new ValidationError$1(ERRORS.WORKFLOWS_LIMIT);
|
|
2744
|
-
}
|
|
2745
|
-
}
|
|
2746
|
-
};
|
|
2747
|
-
};
|
|
2748
|
-
const getDataWithStage = async (workflow2, data) => {
|
|
2749
|
-
if (!isNil(ENTITY_STAGE_ATTRIBUTE)) {
|
|
2750
|
-
return { ...data, [ENTITY_STAGE_ATTRIBUTE]: workflow2.stages[0].id };
|
|
2751
|
-
}
|
|
2752
|
-
return data;
|
|
2753
|
-
};
|
|
2754
|
-
const getEntityStage = async (uid, id) => {
|
|
2755
|
-
const entity = await strapi.db.query(uid).findOne({
|
|
2756
|
-
where: { id },
|
|
2757
|
-
populate: {
|
|
2758
|
-
[ENTITY_STAGE_ATTRIBUTE]: {
|
|
2759
|
-
populate: {
|
|
2760
|
-
workflow: true
|
|
2761
|
-
}
|
|
2762
|
-
}
|
|
2763
|
-
}
|
|
2764
|
-
});
|
|
2765
|
-
return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? {};
|
|
2766
|
-
};
|
|
2767
|
-
const decorator = (service) => ({
|
|
2768
|
-
async create(uid, opts = {}) {
|
|
2769
|
-
const workflow2 = await getService("workflows").getAssignedWorkflow(uid, {
|
|
2770
|
-
populate: "stages"
|
|
2771
|
-
});
|
|
2772
|
-
if (!workflow2) {
|
|
2773
|
-
return service.create.call(this, uid, opts);
|
|
2774
|
-
}
|
|
2775
|
-
const data = await getDataWithStage(workflow2, opts.data);
|
|
2776
|
-
return service.create.call(this, uid, { ...opts, data });
|
|
2777
|
-
},
|
|
2778
|
-
async update(uid, entityId, opts = {}) {
|
|
2779
|
-
const data = { ...opts.data };
|
|
2780
|
-
if (isNil(data[ENTITY_STAGE_ATTRIBUTE])) {
|
|
2781
|
-
delete data[ENTITY_STAGE_ATTRIBUTE];
|
|
2782
|
-
return service.update.call(this, uid, entityId, { ...opts, data });
|
|
2783
|
-
}
|
|
2784
|
-
const previousStage = await getEntityStage(uid, entityId);
|
|
2785
|
-
const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data });
|
|
2786
|
-
const updatedStage = updatedEntity[ENTITY_STAGE_ATTRIBUTE];
|
|
2787
|
-
if (updatedStage && previousStage?.id && previousStage.id !== updatedStage.id) {
|
|
2788
|
-
const model = strapi.getModel(uid);
|
|
2789
|
-
strapi.eventHub.emit(WORKFLOW_UPDATE_STAGE, {
|
|
2790
|
-
model: model.modelName,
|
|
2791
|
-
uid: model.uid,
|
|
2792
|
-
entity: {
|
|
2793
|
-
id: entityId
|
|
2794
|
-
},
|
|
2795
|
-
workflow: {
|
|
2796
|
-
id: previousStage.workflow.id,
|
|
2797
|
-
stages: {
|
|
2798
|
-
from: {
|
|
2799
|
-
id: previousStage.id,
|
|
2800
|
-
name: previousStage.name
|
|
2801
|
-
},
|
|
2802
|
-
to: {
|
|
2803
|
-
id: updatedStage.id,
|
|
2804
|
-
name: updatedStage.name
|
|
2805
|
-
}
|
|
2806
|
-
}
|
|
2807
|
-
}
|
|
2808
|
-
});
|
|
2809
|
-
}
|
|
2810
|
-
return updatedEntity;
|
|
2811
|
-
}
|
|
2812
|
-
});
|
|
2813
|
-
const reviewWorkflowsDecorator = () => ({
|
|
2814
|
-
decorator
|
|
2815
|
-
});
|
|
2816
|
-
const sendDidCreateStage = async () => {
|
|
2817
|
-
strapi.telemetry.send("didCreateStage", {});
|
|
2818
|
-
};
|
|
2819
|
-
const sendDidEditStage = async () => {
|
|
2820
|
-
strapi.telemetry.send("didEditStage", {});
|
|
2821
|
-
};
|
|
2822
|
-
const sendDidDeleteStage = async () => {
|
|
2823
|
-
strapi.telemetry.send("didDeleteStage", {});
|
|
2824
|
-
};
|
|
2825
|
-
const sendDidChangeEntryStage = async () => {
|
|
2826
|
-
strapi.telemetry.send("didChangeEntryStage", {});
|
|
2827
|
-
};
|
|
2828
|
-
const sendDidCreateWorkflow = async () => {
|
|
2829
|
-
strapi.telemetry.send("didCreateWorkflow", {});
|
|
2830
|
-
};
|
|
2831
|
-
const sendDidEditWorkflow = async () => {
|
|
2832
|
-
strapi.telemetry.send("didEditWorkflow", {});
|
|
2833
|
-
};
|
|
2834
|
-
const sendDidEditAssignee = async (fromId, toId) => {
|
|
2835
|
-
strapi.telemetry.send("didEditAssignee", { from: fromId, to: toId });
|
|
2836
|
-
};
|
|
2837
|
-
const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes) => {
|
|
2838
|
-
strapi.telemetry.send("didSendReviewWorkflowPropertiesOnceAWeek", {
|
|
2839
|
-
groupProperties: {
|
|
2840
|
-
numberOfActiveWorkflows,
|
|
2841
|
-
avgStagesCount,
|
|
2842
|
-
maxStagesCount,
|
|
2843
|
-
activatedContentTypes
|
|
2844
|
-
}
|
|
2845
|
-
});
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
await syncDisabledUserRecords();
|
|
1093
|
+
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
1094
|
+
const adminSeatsLeft = adminSeats - currentActiveUserCount;
|
|
1095
|
+
if (adminSeatsLeft > 0) {
|
|
1096
|
+
await enableMaximumUserCount(adminSeatsLeft);
|
|
1097
|
+
} else if (adminSeatsLeft < 0) {
|
|
1098
|
+
await disableUsersAboveLicenseLimit(-adminSeatsLeft);
|
|
1099
|
+
}
|
|
2846
1100
|
};
|
|
2847
|
-
const
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
sendDidDeleteStage,
|
|
2851
|
-
sendDidChangeEntryStage,
|
|
2852
|
-
sendDidCreateWorkflow,
|
|
2853
|
-
sendDidEditWorkflow,
|
|
2854
|
-
sendDidSendReviewWorkflowPropertiesOnceAWeek,
|
|
2855
|
-
sendDidEditAssignee
|
|
2856
|
-
};
|
|
2857
|
-
const ONE_WEEK = 7 * 24 * 60 * 60 * 1e3;
|
|
2858
|
-
const getWeeklyCronScheduleAt = (date) => `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;
|
|
2859
|
-
const reviewWorkflowsWeeklyMetrics = ({ strapi: strapi2 }) => {
|
|
2860
|
-
const metrics2 = getService("review-workflows-metrics", { strapi: strapi2 });
|
|
2861
|
-
const workflowsService = getService("workflows", { strapi: strapi2 });
|
|
2862
|
-
const getMetricsStoreValue = async () => {
|
|
2863
|
-
const value = await strapi2.store.get({ type: "plugin", name: "ee", key: "metrics" });
|
|
2864
|
-
return defaultTo({}, value);
|
|
2865
|
-
};
|
|
2866
|
-
const setMetricsStoreValue = (value) => strapi2.store.set({ type: "plugin", name: "ee", key: "metrics", value });
|
|
2867
|
-
return {
|
|
2868
|
-
async computeMetrics() {
|
|
2869
|
-
const workflows2 = await workflowsService.find({ populate: "stages" });
|
|
2870
|
-
const stagesCount = flow(
|
|
2871
|
-
map("stages"),
|
|
2872
|
-
// Number of stages per workflow
|
|
2873
|
-
map(size)
|
|
2874
|
-
)(workflows2);
|
|
2875
|
-
const contentTypesCount = flow(
|
|
2876
|
-
map("contentTypes"),
|
|
2877
|
-
// Number of content types per workflow
|
|
2878
|
-
map(size)
|
|
2879
|
-
)(workflows2);
|
|
2880
|
-
return {
|
|
2881
|
-
numberOfActiveWorkflows: size(workflows2),
|
|
2882
|
-
avgStagesCount: mean(stagesCount),
|
|
2883
|
-
maxStagesCount: max(stagesCount),
|
|
2884
|
-
activatedContentTypes: sum(contentTypesCount)
|
|
2885
|
-
};
|
|
2886
|
-
},
|
|
2887
|
-
async sendMetrics() {
|
|
2888
|
-
const computedMetrics = await this.computeMetrics();
|
|
2889
|
-
metrics2.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
|
|
2890
|
-
const metricsInfoStored = await getMetricsStoreValue();
|
|
2891
|
-
await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: (/* @__PURE__ */ new Date()).getTime() });
|
|
2892
|
-
},
|
|
2893
|
-
async ensureWeeklyStoredCronSchedule() {
|
|
2894
|
-
const metricsInfoStored = await getMetricsStoreValue();
|
|
2895
|
-
const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;
|
|
2896
|
-
const now = /* @__PURE__ */ new Date();
|
|
2897
|
-
let weeklySchedule = currentSchedule;
|
|
2898
|
-
if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {
|
|
2899
|
-
weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 10 }));
|
|
2900
|
-
await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });
|
|
2901
|
-
}
|
|
2902
|
-
return weeklySchedule;
|
|
2903
|
-
},
|
|
2904
|
-
async registerCron() {
|
|
2905
|
-
const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();
|
|
2906
|
-
strapi2.cron.add({ [weeklySchedule]: this.sendMetrics.bind(this) });
|
|
2907
|
-
}
|
|
2908
|
-
};
|
|
1101
|
+
const seatEnforcement = {
|
|
1102
|
+
seatEnforcementWorkflow,
|
|
1103
|
+
getDisabledUserList
|
|
2909
1104
|
};
|
|
2910
|
-
const
|
|
1105
|
+
const services = {
|
|
2911
1106
|
auth,
|
|
2912
1107
|
passport,
|
|
2913
1108
|
role: role$1,
|
|
2914
1109
|
user: user$1,
|
|
2915
1110
|
metrics,
|
|
2916
|
-
"seat-enforcement": seatEnforcement
|
|
2917
|
-
workflows: workflows$1,
|
|
2918
|
-
stages: stages$1,
|
|
2919
|
-
"stage-permissions": stagePermissions,
|
|
2920
|
-
assignees: assignees$1,
|
|
2921
|
-
"review-workflows": reviewWorkflows,
|
|
2922
|
-
"review-workflows-validation": reviewWorkflowsValidation,
|
|
2923
|
-
"review-workflows-decorator": reviewWorkflowsDecorator,
|
|
2924
|
-
"review-workflows-metrics": reviewWorkflowsMetrics,
|
|
2925
|
-
"review-workflows-weekly-metrics": reviewWorkflowsWeeklyMetrics
|
|
1111
|
+
"seat-enforcement": seatEnforcement
|
|
2926
1112
|
};
|
|
2927
1113
|
const providerOptionsUpdateSchema = yup.object().shape({
|
|
2928
1114
|
autoRegister: yup.boolean().required(),
|
|
@@ -2932,14 +1118,14 @@ const providerOptionsUpdateSchema = yup.object().shape({
|
|
|
2932
1118
|
if (roleId === null) {
|
|
2933
1119
|
return true;
|
|
2934
1120
|
}
|
|
2935
|
-
return strapi.admin
|
|
1121
|
+
return strapi.service("admin::role").exists({ id: roleId });
|
|
2936
1122
|
}),
|
|
2937
1123
|
ssoLockedRoles: yup.array().nullable().of(
|
|
2938
1124
|
yup.strapiID().test(
|
|
2939
1125
|
"is-valid-role",
|
|
2940
1126
|
"You must submit a valid role for the SSO Locked roles",
|
|
2941
1127
|
(roleId) => {
|
|
2942
|
-
return strapi.admin
|
|
1128
|
+
return strapi.service("admin::role").exists({ id: roleId });
|
|
2943
1129
|
}
|
|
2944
1130
|
)
|
|
2945
1131
|
)
|
|
@@ -3054,7 +1240,7 @@ const providerAuthenticationFlow = compose([
|
|
|
3054
1240
|
]);
|
|
3055
1241
|
const authentication = {
|
|
3056
1242
|
async getProviders(ctx) {
|
|
3057
|
-
const { providerRegistry: providerRegistry2 } = strapi.admin
|
|
1243
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
3058
1244
|
ctx.body = providerRegistry2.getAll().map(toProviderDTO);
|
|
3059
1245
|
},
|
|
3060
1246
|
async getProviderLoginOptions(ctx) {
|
|
@@ -3082,7 +1268,7 @@ const authentication = {
|
|
|
3082
1268
|
const {
|
|
3083
1269
|
params: { provider: providerName }
|
|
3084
1270
|
} = ctx;
|
|
3085
|
-
const { providerRegistry: providerRegistry2 } = strapi.admin
|
|
1271
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
3086
1272
|
if (!providerRegistry2.has(providerName)) {
|
|
3087
1273
|
throw new ValidationError(`Invalid provider supplied: ${providerName}`);
|
|
3088
1274
|
}
|
|
@@ -3099,9 +1285,9 @@ const rolesDeleteSchema = yup.object().shape({
|
|
|
3099
1285
|
"Roles deletion checks have failed",
|
|
3100
1286
|
async function rolesDeletionChecks(ids) {
|
|
3101
1287
|
try {
|
|
3102
|
-
await strapi.admin
|
|
1288
|
+
await strapi.service("admin::role").checkRolesIdForDeletion(ids);
|
|
3103
1289
|
if (strapi.ee.features.isEnabled("sso")) {
|
|
3104
|
-
await strapi.admin
|
|
1290
|
+
await strapi.service("admin::role").ssoCheckRolesIdForDeletion(ids);
|
|
3105
1291
|
}
|
|
3106
1292
|
} catch (e) {
|
|
3107
1293
|
return this.createError({ path: "ids", message: e.message });
|
|
@@ -3115,9 +1301,9 @@ const roleDeleteSchema = yup.strapiID().required().test(
|
|
|
3115
1301
|
"Role deletion checks have failed",
|
|
3116
1302
|
async function noAdminSingleDelete(id) {
|
|
3117
1303
|
try {
|
|
3118
|
-
await strapi.admin
|
|
1304
|
+
await strapi.service("admin::role").checkRolesIdForDeletion([id]);
|
|
3119
1305
|
if (strapi.ee.features.isEnabled("sso")) {
|
|
3120
|
-
await strapi.admin
|
|
1306
|
+
await strapi.service("admin::role").ssoCheckRolesIdForDeletion([id]);
|
|
3121
1307
|
}
|
|
3122
1308
|
} catch (e) {
|
|
3123
1309
|
return this.createError({ path: "id", message: e.message });
|
|
@@ -3200,8 +1386,8 @@ const assignOrOmitSubCategory = (action) => {
|
|
|
3200
1386
|
const shouldHaveSubCategory = ["settings", "plugins"].includes(action.section);
|
|
3201
1387
|
return shouldHaveSubCategory ? set("subCategory", action.subCategory || "general", action) : omit("subCategory", action);
|
|
3202
1388
|
};
|
|
3203
|
-
const appliesToProperty = curry((
|
|
3204
|
-
return pipe(prop("options.applyToProperties"), includes(
|
|
1389
|
+
const appliesToProperty = curry((property, action) => {
|
|
1390
|
+
return pipe(prop("options.applyToProperties"), includes(property))(action);
|
|
3205
1391
|
});
|
|
3206
1392
|
const appliesToSubject = curry((subject, action) => {
|
|
3207
1393
|
return isArray(action.subjects) && includes(subject, action.subjects);
|
|
@@ -3243,689 +1429,749 @@ const checkFieldsAreCorrectlyNested = (fields) => {
|
|
|
3243
1429
|
if (failed)
|
|
3244
1430
|
break;
|
|
3245
1431
|
}
|
|
3246
|
-
return !failed;
|
|
1432
|
+
return !failed;
|
|
1433
|
+
};
|
|
1434
|
+
const checkFieldsDontHaveDuplicates = (fields) => {
|
|
1435
|
+
if (_.isNil(fields)) {
|
|
1436
|
+
return true;
|
|
1437
|
+
}
|
|
1438
|
+
if (!Array.isArray(fields)) {
|
|
1439
|
+
return false;
|
|
1440
|
+
}
|
|
1441
|
+
return _.uniq(fields).length === fields.length;
|
|
1442
|
+
};
|
|
1443
|
+
const getActionFromProvider = (actionId) => {
|
|
1444
|
+
return getService$1("permission").actionProvider.get(actionId);
|
|
1445
|
+
};
|
|
1446
|
+
const email = yup.string().email().lowercase();
|
|
1447
|
+
const firstname = yup.string().trim().min(1);
|
|
1448
|
+
const lastname = yup.string();
|
|
1449
|
+
const username = yup.string().min(1);
|
|
1450
|
+
const password = yup.string().min(8).matches(/[a-z]/, "${path} must contain at least one lowercase character").matches(/[A-Z]/, "${path} must contain at least one uppercase character").matches(/\d/, "${path} must contain at least one number");
|
|
1451
|
+
const roles = yup.array(yup.strapiID()).min(1);
|
|
1452
|
+
const isAPluginName = yup.string().test("is-a-plugin-name", "is not a plugin name", function(value) {
|
|
1453
|
+
return [void 0, "admin", ...Object.keys(strapi.plugins)].includes(value) ? true : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });
|
|
1454
|
+
});
|
|
1455
|
+
const arrayOfConditionNames = yup.array().of(yup.string()).test("is-an-array-of-conditions", "is not a plugin name", function(value) {
|
|
1456
|
+
const ids = strapi.service("admin::permission").conditionProvider.keys();
|
|
1457
|
+
return _.isUndefined(value) || _.difference(value, ids).length === 0 ? true : this.createError({ path: this.path, message: `contains conditions that don't exist` });
|
|
1458
|
+
});
|
|
1459
|
+
const permissionsAreEquals = (a, b) => a.action === b.action && (a.subject === b.subject || _.isNil(a.subject) && _.isNil(b.subject));
|
|
1460
|
+
const checkNoDuplicatedPermissions = (permissions) => !Array.isArray(permissions) || permissions.every(
|
|
1461
|
+
(permA, i) => permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))
|
|
1462
|
+
);
|
|
1463
|
+
const checkNilFields = (action) => function(fields) {
|
|
1464
|
+
if (isNil(action)) {
|
|
1465
|
+
return true;
|
|
1466
|
+
}
|
|
1467
|
+
return actionDomain.appliesToProperty("fields", action) || isNil(fields);
|
|
1468
|
+
};
|
|
1469
|
+
const fieldsPropertyValidation = (action) => yup.array().of(yup.string()).nullable().test(
|
|
1470
|
+
"field-nested",
|
|
1471
|
+
"Fields format are incorrect (bad nesting).",
|
|
1472
|
+
checkFieldsAreCorrectlyNested
|
|
1473
|
+
).test(
|
|
1474
|
+
"field-nested",
|
|
1475
|
+
"Fields format are incorrect (duplicates).",
|
|
1476
|
+
checkFieldsDontHaveDuplicates
|
|
1477
|
+
).test(
|
|
1478
|
+
"fields-restriction",
|
|
1479
|
+
"The permission at ${path} must have fields set to null or undefined",
|
|
1480
|
+
// @ts-expect-error yup types
|
|
1481
|
+
checkNilFields(action)
|
|
1482
|
+
);
|
|
1483
|
+
const permission = yup.object().shape({
|
|
1484
|
+
action: yup.string().required().test("action-validity", "action is not an existing permission action", function(actionId) {
|
|
1485
|
+
if (isNil(actionId)) {
|
|
1486
|
+
return true;
|
|
1487
|
+
}
|
|
1488
|
+
return !!getActionFromProvider(actionId);
|
|
1489
|
+
}),
|
|
1490
|
+
actionParameters: yup.object().nullable(),
|
|
1491
|
+
subject: yup.string().nullable().test("subject-validity", "Invalid subject submitted", function(subject) {
|
|
1492
|
+
const action = getActionFromProvider(this.options.parent.action);
|
|
1493
|
+
if (!action) {
|
|
1494
|
+
return true;
|
|
1495
|
+
}
|
|
1496
|
+
if (isNil(action.subjects)) {
|
|
1497
|
+
return isNil(subject);
|
|
1498
|
+
}
|
|
1499
|
+
if (isArray(action.subjects)) {
|
|
1500
|
+
return action.subjects.includes(subject);
|
|
1501
|
+
}
|
|
1502
|
+
return false;
|
|
1503
|
+
}),
|
|
1504
|
+
properties: yup.object().test("properties-structure", "Invalid property set at ${path}", function(properties) {
|
|
1505
|
+
const action = getActionFromProvider(this.options.parent.action);
|
|
1506
|
+
const hasNoProperties = isEmpty(properties) || isNil(properties);
|
|
1507
|
+
if (!has("options.applyToProperties", action)) {
|
|
1508
|
+
return hasNoProperties;
|
|
1509
|
+
}
|
|
1510
|
+
if (hasNoProperties) {
|
|
1511
|
+
return true;
|
|
1512
|
+
}
|
|
1513
|
+
const { applyToProperties } = action.options;
|
|
1514
|
+
if (!isArray(applyToProperties)) {
|
|
1515
|
+
return false;
|
|
1516
|
+
}
|
|
1517
|
+
return Object.keys(properties).every((property) => applyToProperties.includes(property));
|
|
1518
|
+
}).test(
|
|
1519
|
+
"fields-property",
|
|
1520
|
+
"Invalid fields property at ${path}",
|
|
1521
|
+
async function(properties = {}) {
|
|
1522
|
+
const action = getActionFromProvider(this.options.parent.action);
|
|
1523
|
+
if (!action || !properties) {
|
|
1524
|
+
return true;
|
|
1525
|
+
}
|
|
1526
|
+
if (!actionDomain.appliesToProperty("fields", action)) {
|
|
1527
|
+
return true;
|
|
1528
|
+
}
|
|
1529
|
+
try {
|
|
1530
|
+
await fieldsPropertyValidation(action).validate(properties.fields, {
|
|
1531
|
+
strict: true,
|
|
1532
|
+
abortEarly: false
|
|
1533
|
+
});
|
|
1534
|
+
return true;
|
|
1535
|
+
} catch (e) {
|
|
1536
|
+
throw this.createError({
|
|
1537
|
+
message: e.message,
|
|
1538
|
+
path: `${this.path}.fields`
|
|
1539
|
+
});
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
),
|
|
1543
|
+
conditions: yup.array().of(yup.string())
|
|
1544
|
+
}).noUnknown();
|
|
1545
|
+
const updatePermissions = yup.object().shape({
|
|
1546
|
+
permissions: yup.array().required().of(permission).test(
|
|
1547
|
+
"duplicated-permissions",
|
|
1548
|
+
"Some permissions are duplicated (same action and subject)",
|
|
1549
|
+
checkNoDuplicatedPermissions
|
|
1550
|
+
)
|
|
1551
|
+
}).required().noUnknown();
|
|
1552
|
+
const validators = {
|
|
1553
|
+
email,
|
|
1554
|
+
firstname,
|
|
1555
|
+
lastname,
|
|
1556
|
+
username,
|
|
1557
|
+
password,
|
|
1558
|
+
roles,
|
|
1559
|
+
isAPluginName,
|
|
1560
|
+
arrayOfConditionNames,
|
|
1561
|
+
permission,
|
|
1562
|
+
updatePermissions
|
|
1563
|
+
};
|
|
1564
|
+
const userCreationSchema = yup.object().shape({
|
|
1565
|
+
email: validators.email.required(),
|
|
1566
|
+
firstname: validators.firstname.required(),
|
|
1567
|
+
lastname: validators.lastname,
|
|
1568
|
+
roles: validators.roles.min(1),
|
|
1569
|
+
preferedLanguage: yup.string().nullable()
|
|
1570
|
+
}).noUnknown();
|
|
1571
|
+
const profileUpdateSchema = yup.object().shape({
|
|
1572
|
+
email: validators.email.notNull(),
|
|
1573
|
+
firstname: validators.firstname.notNull(),
|
|
1574
|
+
lastname: validators.lastname.nullable(),
|
|
1575
|
+
username: validators.username.nullable(),
|
|
1576
|
+
password: validators.password.notNull(),
|
|
1577
|
+
currentPassword: yup.string().when(
|
|
1578
|
+
"password",
|
|
1579
|
+
(password2, schema) => !isUndefined(password2) ? schema.required() : schema
|
|
1580
|
+
).notNull(),
|
|
1581
|
+
preferedLanguage: yup.string().nullable()
|
|
1582
|
+
}).noUnknown();
|
|
1583
|
+
const userUpdateSchema = yup.object().shape({
|
|
1584
|
+
email: validators.email.notNull(),
|
|
1585
|
+
firstname: validators.firstname.notNull(),
|
|
1586
|
+
lastname: validators.lastname.nullable(),
|
|
1587
|
+
username: validators.username.nullable(),
|
|
1588
|
+
password: validators.password.notNull(),
|
|
1589
|
+
isActive: yup.bool().notNull(),
|
|
1590
|
+
roles: validators.roles.min(1).notNull()
|
|
1591
|
+
}).noUnknown();
|
|
1592
|
+
const usersDeleteSchema = yup.object().shape({
|
|
1593
|
+
ids: yup.array().of(yup.strapiID()).min(1).required()
|
|
1594
|
+
}).noUnknown();
|
|
1595
|
+
validateYupSchema(userCreationSchema);
|
|
1596
|
+
validateYupSchema(profileUpdateSchema);
|
|
1597
|
+
const validateUserUpdateInput = validateYupSchema(userUpdateSchema);
|
|
1598
|
+
validateYupSchema(usersDeleteSchema);
|
|
1599
|
+
const schemas = {
|
|
1600
|
+
userCreationSchema,
|
|
1601
|
+
usersDeleteSchema,
|
|
1602
|
+
userUpdateSchema
|
|
1603
|
+
};
|
|
1604
|
+
const ssoUserCreationInputExtension = yup.object().shape({
|
|
1605
|
+
useSSORegistration: yup.boolean()
|
|
1606
|
+
}).noUnknown();
|
|
1607
|
+
const validateUserCreationInput = (data) => {
|
|
1608
|
+
let schema = schemas.userCreationSchema;
|
|
1609
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
1610
|
+
schema = schema.concat(ssoUserCreationInputExtension);
|
|
1611
|
+
}
|
|
1612
|
+
return validateYupSchema(schema)(data);
|
|
1613
|
+
};
|
|
1614
|
+
const { ApplicationError, ForbiddenError } = errors;
|
|
1615
|
+
const pickUserCreationAttributes = pick(["firstname", "lastname", "email", "roles"]);
|
|
1616
|
+
const hasAdminSeatsAvaialble = async () => {
|
|
1617
|
+
if (!strapi.EE) {
|
|
1618
|
+
return true;
|
|
1619
|
+
}
|
|
1620
|
+
const permittedSeats = strapi.ee.seats;
|
|
1621
|
+
if (isNil(permittedSeats)) {
|
|
1622
|
+
return true;
|
|
1623
|
+
}
|
|
1624
|
+
const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
|
|
1625
|
+
if (userCount < permittedSeats) {
|
|
1626
|
+
return true;
|
|
1627
|
+
}
|
|
1628
|
+
};
|
|
1629
|
+
const user = {
|
|
1630
|
+
async create(ctx) {
|
|
1631
|
+
if (!await hasAdminSeatsAvaialble()) {
|
|
1632
|
+
throw new ForbiddenError("License seat limit reached. You cannot create a new user");
|
|
1633
|
+
}
|
|
1634
|
+
const { body } = ctx.request;
|
|
1635
|
+
const cleanData = { ...body, email: _.get(body, `email`, ``).toLowerCase() };
|
|
1636
|
+
await validateUserCreationInput(cleanData);
|
|
1637
|
+
const attributes = pickUserCreationAttributes(cleanData);
|
|
1638
|
+
const { useSSORegistration } = cleanData;
|
|
1639
|
+
const userAlreadyExists = await getService("user").exists({ email: attributes.email });
|
|
1640
|
+
if (userAlreadyExists) {
|
|
1641
|
+
throw new ApplicationError("Email already taken");
|
|
1642
|
+
}
|
|
1643
|
+
if (useSSORegistration) {
|
|
1644
|
+
Object.assign(attributes, { registrationToken: null, isActive: true });
|
|
1645
|
+
}
|
|
1646
|
+
const createdUser = await getService("user").create(attributes);
|
|
1647
|
+
const userInfo = getService("user").sanitizeUser(createdUser);
|
|
1648
|
+
Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
|
|
1649
|
+
ctx.created({ data: userInfo });
|
|
1650
|
+
},
|
|
1651
|
+
async update(ctx) {
|
|
1652
|
+
const { id } = ctx.params;
|
|
1653
|
+
const { body: input } = ctx.request;
|
|
1654
|
+
await validateUserUpdateInput(input);
|
|
1655
|
+
if (_.has(input, "email")) {
|
|
1656
|
+
const uniqueEmailCheck = await getService("user").exists({
|
|
1657
|
+
id: { $ne: id },
|
|
1658
|
+
email: input.email
|
|
1659
|
+
});
|
|
1660
|
+
if (uniqueEmailCheck) {
|
|
1661
|
+
throw new ApplicationError("A user with this email address already exists");
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
const user2 = await getService("user").findOne(id, null);
|
|
1665
|
+
if (!await hasAdminSeatsAvaialble() && !user2.isActive && input.isActive) {
|
|
1666
|
+
throw new ForbiddenError("License seat limit reached. You cannot active this user");
|
|
1667
|
+
}
|
|
1668
|
+
const updatedUser = await getService("user").updateById(id, input);
|
|
1669
|
+
if (!updatedUser) {
|
|
1670
|
+
return ctx.notFound("User does not exist");
|
|
1671
|
+
}
|
|
1672
|
+
ctx.body = {
|
|
1673
|
+
data: getService("user").sanitizeUser(updatedUser)
|
|
1674
|
+
};
|
|
1675
|
+
},
|
|
1676
|
+
async isSSOLocked(ctx) {
|
|
1677
|
+
const { user: user2 } = ctx.state;
|
|
1678
|
+
const isSSOLocked = await isSsoLocked(user2);
|
|
1679
|
+
ctx.body = {
|
|
1680
|
+
data: {
|
|
1681
|
+
isSSOLocked
|
|
1682
|
+
}
|
|
1683
|
+
};
|
|
1684
|
+
}
|
|
3247
1685
|
};
|
|
3248
|
-
const
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
1686
|
+
const admin = {
|
|
1687
|
+
// NOTE: Overrides CE admin controller
|
|
1688
|
+
async getProjectType() {
|
|
1689
|
+
const flags = strapi.config.get("admin.flags", {});
|
|
1690
|
+
try {
|
|
1691
|
+
return { data: { isEE: strapi.EE, features: strapi.ee.features.list(), flags } };
|
|
1692
|
+
} catch (err) {
|
|
1693
|
+
return { data: { isEE: false, features: [], flags } };
|
|
1694
|
+
}
|
|
1695
|
+
},
|
|
1696
|
+
async licenseLimitInformation() {
|
|
1697
|
+
const permittedSeats = strapi.ee.seats;
|
|
1698
|
+
let shouldNotify = false;
|
|
1699
|
+
let licenseLimitStatus = null;
|
|
1700
|
+
let enforcementUserCount;
|
|
1701
|
+
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
1702
|
+
const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
1703
|
+
if (eeDisabledUsers) {
|
|
1704
|
+
enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
|
|
1705
|
+
} else {
|
|
1706
|
+
enforcementUserCount = currentActiveUserCount;
|
|
1707
|
+
}
|
|
1708
|
+
if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
|
|
1709
|
+
shouldNotify = true;
|
|
1710
|
+
licenseLimitStatus = "OVER_LIMIT";
|
|
1711
|
+
}
|
|
1712
|
+
if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
|
|
1713
|
+
shouldNotify = true;
|
|
1714
|
+
licenseLimitStatus = "AT_LIMIT";
|
|
1715
|
+
}
|
|
1716
|
+
const data = {
|
|
1717
|
+
enforcementUserCount,
|
|
1718
|
+
currentActiveUserCount,
|
|
1719
|
+
permittedSeats,
|
|
1720
|
+
shouldNotify,
|
|
1721
|
+
shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
|
|
1722
|
+
licenseLimitStatus,
|
|
1723
|
+
isHostedOnStrapiCloud: env("STRAPI_HOSTING", null) === "strapi.cloud",
|
|
1724
|
+
features: strapi.ee.features.list() ?? []
|
|
1725
|
+
};
|
|
1726
|
+
return { data };
|
|
3254
1727
|
}
|
|
3255
|
-
return _.uniq(fields).length === fields.length;
|
|
3256
1728
|
};
|
|
3257
|
-
const
|
|
3258
|
-
|
|
1729
|
+
const controllers = {
|
|
1730
|
+
authentication,
|
|
1731
|
+
role,
|
|
1732
|
+
user,
|
|
1733
|
+
admin
|
|
3259
1734
|
};
|
|
3260
|
-
const
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
const username = yup.string().min(1);
|
|
3264
|
-
const password = yup.string().min(8).matches(/[a-z]/, "${path} must contain at least one lowercase character").matches(/[A-Z]/, "${path} must contain at least one uppercase character").matches(/\d/, "${path} must contain at least one number");
|
|
3265
|
-
const roles = yup.array(yup.strapiID()).min(1);
|
|
3266
|
-
const isAPluginName = yup.string().test("is-a-plugin-name", "is not a plugin name", function(value) {
|
|
3267
|
-
return [void 0, "admin", ...Object.keys(strapi.plugins)].includes(value) ? true : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });
|
|
3268
|
-
});
|
|
3269
|
-
const arrayOfConditionNames = yup.array().of(yup.string()).test("is-an-array-of-conditions", "is not a plugin name", function(value) {
|
|
3270
|
-
const ids = strapi.admin.services.permission.conditionProvider.keys();
|
|
3271
|
-
return _.isUndefined(value) || _.difference(value, ids).length === 0 ? true : this.createError({ path: this.path, message: `contains conditions that don't exist` });
|
|
3272
|
-
});
|
|
3273
|
-
const permissionsAreEquals = (a, b) => a.action === b.action && (a.subject === b.subject || _.isNil(a.subject) && _.isNil(b.subject));
|
|
3274
|
-
const checkNoDuplicatedPermissions = (permissions) => !Array.isArray(permissions) || permissions.every(
|
|
3275
|
-
(permA, i) => permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))
|
|
3276
|
-
);
|
|
3277
|
-
const checkNilFields = (action) => function(fields) {
|
|
3278
|
-
if (isNil(action)) {
|
|
3279
|
-
return true;
|
|
1735
|
+
const enableFeatureMiddleware = (featureName) => (ctx, next) => {
|
|
1736
|
+
if (strapi.ee.features.isEnabled(featureName)) {
|
|
1737
|
+
return next();
|
|
3280
1738
|
}
|
|
3281
|
-
|
|
1739
|
+
ctx.status = 404;
|
|
3282
1740
|
};
|
|
3283
|
-
const
|
|
3284
|
-
"
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
)
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3299
|
-
|
|
3300
|
-
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
}
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
3323
|
-
|
|
3324
|
-
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
1741
|
+
const sso = {
|
|
1742
|
+
type: "admin",
|
|
1743
|
+
routes: [
|
|
1744
|
+
{
|
|
1745
|
+
method: "GET",
|
|
1746
|
+
path: "/providers",
|
|
1747
|
+
handler: "authentication.getProviders",
|
|
1748
|
+
config: {
|
|
1749
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
1750
|
+
auth: false
|
|
1751
|
+
}
|
|
1752
|
+
},
|
|
1753
|
+
{
|
|
1754
|
+
method: "GET",
|
|
1755
|
+
path: "/connect/:provider",
|
|
1756
|
+
handler: "authentication.providerLogin",
|
|
1757
|
+
config: {
|
|
1758
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
1759
|
+
auth: false
|
|
1760
|
+
}
|
|
1761
|
+
},
|
|
1762
|
+
{
|
|
1763
|
+
method: "POST",
|
|
1764
|
+
path: "/connect/:provider",
|
|
1765
|
+
handler: "authentication.providerLogin",
|
|
1766
|
+
config: {
|
|
1767
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
1768
|
+
auth: false
|
|
1769
|
+
}
|
|
1770
|
+
},
|
|
1771
|
+
{
|
|
1772
|
+
method: "GET",
|
|
1773
|
+
path: "/providers/options",
|
|
1774
|
+
handler: "authentication.getProviderLoginOptions",
|
|
1775
|
+
config: {
|
|
1776
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
1777
|
+
policies: [
|
|
1778
|
+
"admin::isAuthenticatedAdmin",
|
|
1779
|
+
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
|
|
1780
|
+
]
|
|
1781
|
+
}
|
|
1782
|
+
},
|
|
1783
|
+
{
|
|
1784
|
+
method: "PUT",
|
|
1785
|
+
path: "/providers/options",
|
|
1786
|
+
handler: "authentication.updateProviderLoginOptions",
|
|
1787
|
+
config: {
|
|
1788
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
1789
|
+
policies: [
|
|
1790
|
+
"admin::isAuthenticatedAdmin",
|
|
1791
|
+
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
|
|
1792
|
+
]
|
|
1793
|
+
}
|
|
1794
|
+
},
|
|
1795
|
+
{
|
|
1796
|
+
method: "GET",
|
|
1797
|
+
path: "/providers/isSSOLocked",
|
|
1798
|
+
handler: "user.isSSOLocked",
|
|
1799
|
+
config: {
|
|
1800
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
1801
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
|
1802
|
+
}
|
|
3330
1803
|
}
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
|
|
3336
|
-
|
|
3337
|
-
|
|
3338
|
-
|
|
1804
|
+
]
|
|
1805
|
+
};
|
|
1806
|
+
const licenseLimit = {
|
|
1807
|
+
type: "admin",
|
|
1808
|
+
routes: [
|
|
1809
|
+
// License limit infos
|
|
1810
|
+
{
|
|
1811
|
+
method: "GET",
|
|
1812
|
+
path: "/license-limit-information",
|
|
1813
|
+
handler: "admin.licenseLimitInformation",
|
|
1814
|
+
config: {
|
|
1815
|
+
policies: [
|
|
1816
|
+
"admin::isAuthenticatedAdmin",
|
|
1817
|
+
{
|
|
1818
|
+
name: "admin::hasPermissions",
|
|
1819
|
+
config: {
|
|
1820
|
+
actions: [
|
|
1821
|
+
"admin::users.create",
|
|
1822
|
+
"admin::users.read",
|
|
1823
|
+
"admin::users.update",
|
|
1824
|
+
"admin::users.delete"
|
|
1825
|
+
]
|
|
1826
|
+
}
|
|
1827
|
+
}
|
|
1828
|
+
]
|
|
3339
1829
|
}
|
|
3340
|
-
|
|
3341
|
-
|
|
1830
|
+
}
|
|
1831
|
+
]
|
|
1832
|
+
};
|
|
1833
|
+
const routes = {
|
|
1834
|
+
sso,
|
|
1835
|
+
"license-limit": licenseLimit
|
|
1836
|
+
};
|
|
1837
|
+
const auditLogsRoutes = {
|
|
1838
|
+
type: "admin",
|
|
1839
|
+
routes: [
|
|
1840
|
+
{
|
|
1841
|
+
method: "GET",
|
|
1842
|
+
path: "/audit-logs",
|
|
1843
|
+
handler: "audit-logs.findMany",
|
|
1844
|
+
config: {
|
|
1845
|
+
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
1846
|
+
policies: [
|
|
1847
|
+
"admin::isAuthenticatedAdmin",
|
|
1848
|
+
{
|
|
1849
|
+
name: "admin::hasPermissions",
|
|
1850
|
+
config: {
|
|
1851
|
+
actions: ["admin::audit-logs.read"]
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
]
|
|
3342
1855
|
}
|
|
3343
|
-
|
|
3344
|
-
|
|
3345
|
-
|
|
3346
|
-
|
|
3347
|
-
|
|
3348
|
-
|
|
3349
|
-
|
|
3350
|
-
|
|
3351
|
-
|
|
3352
|
-
|
|
3353
|
-
|
|
1856
|
+
},
|
|
1857
|
+
{
|
|
1858
|
+
method: "GET",
|
|
1859
|
+
path: "/audit-logs/:id",
|
|
1860
|
+
handler: "audit-logs.findOne",
|
|
1861
|
+
config: {
|
|
1862
|
+
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
1863
|
+
policies: [
|
|
1864
|
+
"admin::isAuthenticatedAdmin",
|
|
1865
|
+
{
|
|
1866
|
+
name: "admin::hasPermissions",
|
|
1867
|
+
config: {
|
|
1868
|
+
actions: ["admin::audit-logs.read"]
|
|
1869
|
+
}
|
|
1870
|
+
}
|
|
1871
|
+
]
|
|
3354
1872
|
}
|
|
3355
1873
|
}
|
|
3356
|
-
|
|
3357
|
-
conditions: yup.array().of(yup.string())
|
|
3358
|
-
}).noUnknown();
|
|
3359
|
-
const updatePermissions = yup.object().shape({
|
|
3360
|
-
permissions: yup.array().required().of(permission).test(
|
|
3361
|
-
"duplicated-permissions",
|
|
3362
|
-
"Some permissions are duplicated (same action and subject)",
|
|
3363
|
-
checkNoDuplicatedPermissions
|
|
3364
|
-
)
|
|
3365
|
-
}).required().noUnknown();
|
|
3366
|
-
const validators = {
|
|
3367
|
-
email,
|
|
3368
|
-
firstname,
|
|
3369
|
-
lastname,
|
|
3370
|
-
username,
|
|
3371
|
-
password,
|
|
3372
|
-
roles,
|
|
3373
|
-
isAPluginName,
|
|
3374
|
-
arrayOfConditionNames,
|
|
3375
|
-
permission,
|
|
3376
|
-
updatePermissions
|
|
3377
|
-
};
|
|
3378
|
-
const userCreationSchema = yup.object().shape({
|
|
3379
|
-
email: validators.email.required(),
|
|
3380
|
-
firstname: validators.firstname.required(),
|
|
3381
|
-
lastname: validators.lastname,
|
|
3382
|
-
roles: validators.roles.min(1),
|
|
3383
|
-
preferedLanguage: yup.string().nullable()
|
|
3384
|
-
}).noUnknown();
|
|
3385
|
-
const profileUpdateSchema = yup.object().shape({
|
|
3386
|
-
email: validators.email.notNull(),
|
|
3387
|
-
firstname: validators.firstname.notNull(),
|
|
3388
|
-
lastname: validators.lastname.nullable(),
|
|
3389
|
-
username: validators.username.nullable(),
|
|
3390
|
-
password: validators.password.notNull(),
|
|
3391
|
-
currentPassword: yup.string().when(
|
|
3392
|
-
"password",
|
|
3393
|
-
(password2, schema) => !isUndefined(password2) ? schema.required() : schema
|
|
3394
|
-
).notNull(),
|
|
3395
|
-
preferedLanguage: yup.string().nullable()
|
|
3396
|
-
}).noUnknown();
|
|
3397
|
-
const userUpdateSchema = yup.object().shape({
|
|
3398
|
-
email: validators.email.notNull(),
|
|
3399
|
-
firstname: validators.firstname.notNull(),
|
|
3400
|
-
lastname: validators.lastname.nullable(),
|
|
3401
|
-
username: validators.username.nullable(),
|
|
3402
|
-
password: validators.password.notNull(),
|
|
3403
|
-
isActive: yup.bool().notNull(),
|
|
3404
|
-
roles: validators.roles.min(1).notNull()
|
|
3405
|
-
}).noUnknown();
|
|
3406
|
-
const usersDeleteSchema = yup.object().shape({
|
|
3407
|
-
ids: yup.array().of(yup.strapiID()).min(1).required()
|
|
3408
|
-
}).noUnknown();
|
|
3409
|
-
validateYupSchema(userCreationSchema);
|
|
3410
|
-
validateYupSchema(profileUpdateSchema);
|
|
3411
|
-
const validateUserUpdateInput = validateYupSchema(userUpdateSchema);
|
|
3412
|
-
validateYupSchema(usersDeleteSchema);
|
|
3413
|
-
const schemas = {
|
|
3414
|
-
userCreationSchema,
|
|
3415
|
-
usersDeleteSchema,
|
|
3416
|
-
userUpdateSchema
|
|
1874
|
+
]
|
|
3417
1875
|
};
|
|
3418
|
-
const
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
|
|
3422
|
-
|
|
3423
|
-
|
|
3424
|
-
|
|
1876
|
+
const ALLOWED_SORT_STRINGS = ["action:ASC", "action:DESC", "date:ASC", "date:DESC"];
|
|
1877
|
+
const validateFindManySchema = yup.object().shape({
|
|
1878
|
+
page: yup.number().integer().min(1),
|
|
1879
|
+
pageSize: yup.number().integer().min(1).max(100),
|
|
1880
|
+
sort: yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
|
|
1881
|
+
}).required();
|
|
1882
|
+
const validateFindMany = validateYupSchema(validateFindManySchema, { strict: false });
|
|
1883
|
+
const auditLogsController = {
|
|
1884
|
+
async findMany(ctx) {
|
|
1885
|
+
const { query } = ctx.request;
|
|
1886
|
+
await validateFindMany(query);
|
|
1887
|
+
const auditLogs = strapi.get("audit-logs");
|
|
1888
|
+
const body = await auditLogs.findMany(query);
|
|
1889
|
+
ctx.body = body;
|
|
1890
|
+
},
|
|
1891
|
+
async findOne(ctx) {
|
|
1892
|
+
const { id } = ctx.params;
|
|
1893
|
+
const auditLogs = strapi.get("audit-logs");
|
|
1894
|
+
const body = await auditLogs.findOne(id);
|
|
1895
|
+
ctx.body = body;
|
|
1896
|
+
strapi.telemetry.send("didWatchAnAuditLog");
|
|
3425
1897
|
}
|
|
3426
|
-
return validateYupSchema(schema)(data);
|
|
3427
1898
|
};
|
|
3428
|
-
const
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
|
|
3432
|
-
|
|
3433
|
-
|
|
3434
|
-
const permittedSeats = strapi.ee.seats;
|
|
3435
|
-
if (isNil(permittedSeats)) {
|
|
3436
|
-
return true;
|
|
3437
|
-
}
|
|
3438
|
-
const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
|
|
3439
|
-
if (userCount < permittedSeats) {
|
|
3440
|
-
return true;
|
|
1899
|
+
const getSanitizedUser = (user2) => {
|
|
1900
|
+
let displayName = user2.email;
|
|
1901
|
+
if (user2.username) {
|
|
1902
|
+
displayName = user2.username;
|
|
1903
|
+
} else if (user2.firstname && user2.lastname) {
|
|
1904
|
+
displayName = `${user2.firstname} ${user2.lastname}`;
|
|
3441
1905
|
}
|
|
1906
|
+
return {
|
|
1907
|
+
id: user2.id,
|
|
1908
|
+
email: user2.email,
|
|
1909
|
+
displayName
|
|
1910
|
+
};
|
|
3442
1911
|
};
|
|
3443
|
-
const
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
}
|
|
3457
|
-
if (useSSORegistration) {
|
|
3458
|
-
Object.assign(attributes, { registrationToken: null, isActive: true });
|
|
3459
|
-
}
|
|
3460
|
-
const createdUser = await getService("user").create(attributes);
|
|
3461
|
-
const userInfo = getService("user").sanitizeUser(createdUser);
|
|
3462
|
-
Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
|
|
3463
|
-
ctx.created({ data: userInfo });
|
|
3464
|
-
},
|
|
3465
|
-
async update(ctx) {
|
|
3466
|
-
const { id } = ctx.params;
|
|
3467
|
-
const { body: input } = ctx.request;
|
|
3468
|
-
await validateUserUpdateInput(input);
|
|
3469
|
-
if (_.has(input, "email")) {
|
|
3470
|
-
const uniqueEmailCheck = await getService("user").exists({
|
|
3471
|
-
id: { $ne: id },
|
|
3472
|
-
email: input.email
|
|
1912
|
+
const createAuditLogsService = (strapi2) => {
|
|
1913
|
+
return {
|
|
1914
|
+
async saveEvent(event) {
|
|
1915
|
+
const { userId, ...rest } = event;
|
|
1916
|
+
const auditLog2 = { ...rest, user: userId };
|
|
1917
|
+
await strapi2.db?.query("admin::audit-log").create({ data: auditLog2 });
|
|
1918
|
+
return this;
|
|
1919
|
+
},
|
|
1920
|
+
async findMany(query) {
|
|
1921
|
+
const { results, pagination } = await strapi2.db?.query("admin::audit-log").findPage({
|
|
1922
|
+
populate: ["user"],
|
|
1923
|
+
select: ["action", "date", "payload"],
|
|
1924
|
+
...strapi2.get("query-params").transform("admin::audit-log", query)
|
|
3473
1925
|
});
|
|
3474
|
-
|
|
3475
|
-
|
|
1926
|
+
const sanitizedResults = results.map((result) => {
|
|
1927
|
+
const { user: user2, ...rest } = result;
|
|
1928
|
+
return {
|
|
1929
|
+
...rest,
|
|
1930
|
+
user: user2 ? getSanitizedUser(user2) : null
|
|
1931
|
+
};
|
|
1932
|
+
});
|
|
1933
|
+
return {
|
|
1934
|
+
results: sanitizedResults,
|
|
1935
|
+
pagination
|
|
1936
|
+
};
|
|
1937
|
+
},
|
|
1938
|
+
async findOne(id) {
|
|
1939
|
+
const result = await strapi2.db?.query("admin::audit-log").findOne({
|
|
1940
|
+
where: { id },
|
|
1941
|
+
populate: ["user"],
|
|
1942
|
+
select: ["action", "date", "payload"]
|
|
1943
|
+
});
|
|
1944
|
+
if (!result) {
|
|
1945
|
+
return null;
|
|
3476
1946
|
}
|
|
1947
|
+
const { user: user2, ...rest } = result;
|
|
1948
|
+
return {
|
|
1949
|
+
...rest,
|
|
1950
|
+
user: user2 ? getSanitizedUser(user2) : null
|
|
1951
|
+
};
|
|
1952
|
+
},
|
|
1953
|
+
deleteExpiredEvents(expirationDate) {
|
|
1954
|
+
return strapi2.db?.query("admin::audit-log").deleteMany({
|
|
1955
|
+
where: {
|
|
1956
|
+
date: {
|
|
1957
|
+
$lt: expirationDate.toISOString()
|
|
1958
|
+
}
|
|
1959
|
+
}
|
|
1960
|
+
});
|
|
3477
1961
|
}
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
1962
|
+
};
|
|
1963
|
+
};
|
|
1964
|
+
const DEFAULT_RETENTION_DAYS = 90;
|
|
1965
|
+
const defaultEvents = [
|
|
1966
|
+
"entry.create",
|
|
1967
|
+
"entry.update",
|
|
1968
|
+
"entry.delete",
|
|
1969
|
+
"entry.publish",
|
|
1970
|
+
"entry.unpublish",
|
|
1971
|
+
"media.create",
|
|
1972
|
+
"media.update",
|
|
1973
|
+
"media.delete",
|
|
1974
|
+
"media-folder.create",
|
|
1975
|
+
"media-folder.update",
|
|
1976
|
+
"media-folder.delete",
|
|
1977
|
+
"user.create",
|
|
1978
|
+
"user.update",
|
|
1979
|
+
"user.delete",
|
|
1980
|
+
"admin.auth.success",
|
|
1981
|
+
"admin.logout",
|
|
1982
|
+
"content-type.create",
|
|
1983
|
+
"content-type.update",
|
|
1984
|
+
"content-type.delete",
|
|
1985
|
+
"component.create",
|
|
1986
|
+
"component.update",
|
|
1987
|
+
"component.delete",
|
|
1988
|
+
"role.create",
|
|
1989
|
+
"role.update",
|
|
1990
|
+
"role.delete",
|
|
1991
|
+
"permission.create",
|
|
1992
|
+
"permission.update",
|
|
1993
|
+
"permission.delete"
|
|
1994
|
+
];
|
|
1995
|
+
const getEventMap = (defaultEvents2) => {
|
|
1996
|
+
const getDefaultPayload = (...args) => args[0];
|
|
1997
|
+
return defaultEvents2.reduce((acc, event) => {
|
|
1998
|
+
acc[event] = getDefaultPayload;
|
|
1999
|
+
return acc;
|
|
2000
|
+
}, {});
|
|
3499
2001
|
};
|
|
3500
|
-
const
|
|
3501
|
-
const
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
const validateFindMany = validateYupSchema(validateFindManySchema, { strict: false });
|
|
3507
|
-
const auditLogs = {
|
|
3508
|
-
async findMany(ctx) {
|
|
3509
|
-
const { query } = ctx.request;
|
|
3510
|
-
await validateFindMany(query);
|
|
3511
|
-
const auditLogs2 = strapi.get("audit-logs");
|
|
3512
|
-
const body = await auditLogs2.findMany(query);
|
|
3513
|
-
ctx.body = body;
|
|
3514
|
-
},
|
|
3515
|
-
async findOne(ctx) {
|
|
3516
|
-
const { id } = ctx.params;
|
|
3517
|
-
const auditLogs2 = strapi.get("audit-logs");
|
|
3518
|
-
const body = await auditLogs2.findOne(id);
|
|
3519
|
-
ctx.body = body;
|
|
3520
|
-
strapi.telemetry.send("didWatchAnAuditLog");
|
|
2002
|
+
const getRetentionDays = (strapi2) => {
|
|
2003
|
+
const featureConfig = strapi2.ee.features.get("audit-logs");
|
|
2004
|
+
const licenseRetentionDays = typeof featureConfig === "object" && featureConfig?.options.retentionDays;
|
|
2005
|
+
const userRetentionDays = strapi2.config.get("admin.auditLogs.retentionDays");
|
|
2006
|
+
if (licenseRetentionDays == null) {
|
|
2007
|
+
return userRetentionDays ?? DEFAULT_RETENTION_DAYS;
|
|
3521
2008
|
}
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
// NOTE: Overrides CE admin controller
|
|
3525
|
-
async getProjectType() {
|
|
3526
|
-
const flags = strapi.config.get("admin.flags", {});
|
|
3527
|
-
try {
|
|
3528
|
-
return { data: { isEE: strapi.EE, features: strapi.ee.features.list(), flags } };
|
|
3529
|
-
} catch (err) {
|
|
3530
|
-
return { data: { isEE: false, features: [], flags } };
|
|
3531
|
-
}
|
|
3532
|
-
},
|
|
3533
|
-
async licenseLimitInformation() {
|
|
3534
|
-
const permittedSeats = strapi.ee.seats;
|
|
3535
|
-
let shouldNotify = false;
|
|
3536
|
-
let licenseLimitStatus = null;
|
|
3537
|
-
let enforcementUserCount;
|
|
3538
|
-
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
3539
|
-
const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
3540
|
-
if (eeDisabledUsers) {
|
|
3541
|
-
enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
|
|
3542
|
-
} else {
|
|
3543
|
-
enforcementUserCount = currentActiveUserCount;
|
|
3544
|
-
}
|
|
3545
|
-
if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
|
|
3546
|
-
shouldNotify = true;
|
|
3547
|
-
licenseLimitStatus = "OVER_LIMIT";
|
|
3548
|
-
}
|
|
3549
|
-
if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
|
|
3550
|
-
shouldNotify = true;
|
|
3551
|
-
licenseLimitStatus = "AT_LIMIT";
|
|
3552
|
-
}
|
|
3553
|
-
const data = {
|
|
3554
|
-
enforcementUserCount,
|
|
3555
|
-
currentActiveUserCount,
|
|
3556
|
-
permittedSeats,
|
|
3557
|
-
shouldNotify,
|
|
3558
|
-
shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
|
|
3559
|
-
licenseLimitStatus,
|
|
3560
|
-
isHostedOnStrapiCloud: env("STRAPI_HOSTING", null) === "strapi.cloud",
|
|
3561
|
-
features: strapi.ee.features.list() ?? []
|
|
3562
|
-
};
|
|
3563
|
-
return { data };
|
|
2009
|
+
if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
|
|
2010
|
+
return userRetentionDays;
|
|
3564
2011
|
}
|
|
2012
|
+
return licenseRetentionDays;
|
|
3565
2013
|
};
|
|
3566
|
-
const
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
from: yup.number().integer().min(1).required(),
|
|
3577
|
-
to: yup.number().integer().min(1)
|
|
3578
|
-
})
|
|
3579
|
-
})
|
|
3580
|
-
)
|
|
3581
|
-
});
|
|
3582
|
-
const validateUpdateStageOnEntitySchema = yup.object().shape({
|
|
3583
|
-
id: yup.number().integer().min(1).required()
|
|
3584
|
-
}).required();
|
|
3585
|
-
const validateContentTypes = yup.array().of(
|
|
3586
|
-
// @ts-expect-error yup types
|
|
3587
|
-
yup.string().test({
|
|
3588
|
-
name: "content-type-exists",
|
|
3589
|
-
message: (value) => `Content type ${value.originalValue} does not exist`,
|
|
3590
|
-
test(uid) {
|
|
3591
|
-
return strapi.getModel(uid);
|
|
2014
|
+
const createAuditLogsLifecycleService = (strapi2) => {
|
|
2015
|
+
const state = {};
|
|
2016
|
+
const auditLogsService = strapi2.get("audit-logs");
|
|
2017
|
+
const eventMap = getEventMap(defaultEvents);
|
|
2018
|
+
const processEvent = (name2, ...args) => {
|
|
2019
|
+
const requestState = strapi2.requestContext.get()?.state;
|
|
2020
|
+
const isUsingAdminAuth = requestState?.route.info.type === "admin";
|
|
2021
|
+
const user2 = requestState?.user;
|
|
2022
|
+
if (!isUsingAdminAuth || !user2) {
|
|
2023
|
+
return null;
|
|
3592
2024
|
}
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3596
|
-
test(uid) {
|
|
3597
|
-
const model = strapi.getModel(uid);
|
|
3598
|
-
return hasStageAttribute(model);
|
|
2025
|
+
const getPayload = eventMap[name2];
|
|
2026
|
+
if (!getPayload) {
|
|
2027
|
+
return null;
|
|
3599
2028
|
}
|
|
3600
|
-
|
|
3601
|
-
)
|
|
3602
|
-
|
|
3603
|
-
name: yup.string().max(255).min(1, "Workflow name can not be empty").required(),
|
|
3604
|
-
stages: yup.array().of(stageObject).uniqueProperty("name", "Stage name must be unique").min(1, "Can not create a workflow without stages").max(200, "Can not have more than 200 stages").required("Can not create a workflow without stages"),
|
|
3605
|
-
contentTypes: validateContentTypes
|
|
3606
|
-
});
|
|
3607
|
-
const validateWorkflowUpdateSchema = yup.object().shape({
|
|
3608
|
-
name: yup.string().max(255).min(1, "Workflow name can not be empty"),
|
|
3609
|
-
stages: yup.array().of(stageObject).uniqueProperty("name", "Stage name must be unique").min(1, "Can not update a workflow without stages").max(200, "Can not have more than 200 stages"),
|
|
3610
|
-
contentTypes: validateContentTypes
|
|
3611
|
-
});
|
|
3612
|
-
const validateUpdateAssigneeOnEntitySchema = yup.object().shape({
|
|
3613
|
-
id: yup.number().integer().min(1).nullable()
|
|
3614
|
-
}).required();
|
|
3615
|
-
const validateWorkflowCreate = validateYupSchema(validateWorkflowCreateSchema);
|
|
3616
|
-
const validateUpdateStageOnEntity = validateYupSchema(validateUpdateStageOnEntitySchema);
|
|
3617
|
-
const validateUpdateAssigneeOnEntity = validateYupSchema(
|
|
3618
|
-
validateUpdateAssigneeOnEntitySchema
|
|
3619
|
-
);
|
|
3620
|
-
const validateWorkflowUpdate = validateYupSchema(validateWorkflowUpdateSchema);
|
|
3621
|
-
function getWorkflowsPermissionChecker({ strapi: strapi2 }, userAbility) {
|
|
3622
|
-
return strapi2.plugin("content-manager").service("permission-checker").create({ userAbility, model: WORKFLOW_MODEL_UID });
|
|
3623
|
-
}
|
|
3624
|
-
function formatWorkflowToAdmin(workflow2) {
|
|
3625
|
-
if (!workflow2)
|
|
3626
|
-
return;
|
|
3627
|
-
if (!workflow2.stages)
|
|
3628
|
-
return workflow2;
|
|
3629
|
-
const transformPermissions = map(update("role", property("id")));
|
|
3630
|
-
const transformStages = map(update("permissions", transformPermissions));
|
|
3631
|
-
return update("stages", transformStages, workflow2);
|
|
3632
|
-
}
|
|
3633
|
-
const workflows = {
|
|
3634
|
-
/**
|
|
3635
|
-
* Create a new workflow
|
|
3636
|
-
* @param {import('koa').BaseContext} ctx - koa context
|
|
3637
|
-
*/
|
|
3638
|
-
async create(ctx) {
|
|
3639
|
-
const { body, query } = ctx.request;
|
|
3640
|
-
const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
|
|
3641
|
-
{ strapi },
|
|
3642
|
-
ctx.state.userAbility
|
|
3643
|
-
);
|
|
3644
|
-
const { populate } = await sanitizedQuery.create(query);
|
|
3645
|
-
const workflowBody = await validateWorkflowCreate(body.data);
|
|
3646
|
-
const workflowService = getService("workflows");
|
|
3647
|
-
const createdWorkflow = await workflowService.create({
|
|
3648
|
-
data: await sanitizeCreateInput(workflowBody),
|
|
3649
|
-
populate
|
|
3650
|
-
}).then(formatWorkflowToAdmin);
|
|
3651
|
-
ctx.body = {
|
|
3652
|
-
data: await sanitizeOutput(createdWorkflow)
|
|
3653
|
-
};
|
|
3654
|
-
},
|
|
3655
|
-
/**
|
|
3656
|
-
* Update a workflow
|
|
3657
|
-
* @param {import('koa').BaseContext} ctx - koa context
|
|
3658
|
-
*/
|
|
3659
|
-
async update(ctx) {
|
|
3660
|
-
const { id } = ctx.params;
|
|
3661
|
-
const { body, query } = ctx.request;
|
|
3662
|
-
const workflowService = getService("workflows");
|
|
3663
|
-
const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
|
|
3664
|
-
{ strapi },
|
|
3665
|
-
ctx.state.userAbility
|
|
3666
|
-
);
|
|
3667
|
-
const { populate } = await sanitizedQuery.update(query);
|
|
3668
|
-
const workflowBody = await validateWorkflowUpdate(body.data);
|
|
3669
|
-
const workflow2 = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });
|
|
3670
|
-
if (!workflow2) {
|
|
3671
|
-
return ctx.notFound();
|
|
2029
|
+
const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
|
|
2030
|
+
if (ignoredUids.includes(args[0]?.uid)) {
|
|
2031
|
+
return null;
|
|
3672
2032
|
}
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3676
|
-
|
|
3677
|
-
|
|
3678
|
-
}).then(formatWorkflowToAdmin);
|
|
3679
|
-
ctx.body = {
|
|
3680
|
-
data: await sanitizeOutput(updatedWorkflow)
|
|
2033
|
+
return {
|
|
2034
|
+
action: name2,
|
|
2035
|
+
date: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2036
|
+
payload: getPayload(...args) || {},
|
|
2037
|
+
userId: user2.id
|
|
3681
2038
|
};
|
|
3682
|
-
}
|
|
3683
|
-
|
|
3684
|
-
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
3688
|
-
|
|
3689
|
-
const { query } = ctx.request;
|
|
3690
|
-
const workflowService = getService("workflows");
|
|
3691
|
-
const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
|
|
3692
|
-
{ strapi },
|
|
3693
|
-
ctx.state.userAbility
|
|
3694
|
-
);
|
|
3695
|
-
const { populate } = await sanitizedQuery.delete(query);
|
|
3696
|
-
const workflow2 = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });
|
|
3697
|
-
if (!workflow2) {
|
|
3698
|
-
return ctx.notFound("Workflow doesn't exist");
|
|
2039
|
+
};
|
|
2040
|
+
const handleEvent = async (name2, ...args) => {
|
|
2041
|
+
const processedEvent = processEvent(name2, ...args);
|
|
2042
|
+
if (processedEvent) {
|
|
2043
|
+
await strapi2.db.transaction(({ onCommit }) => {
|
|
2044
|
+
onCommit(() => auditLogsService.saveEvent(processedEvent));
|
|
2045
|
+
});
|
|
3699
2046
|
}
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3708
|
-
*/
|
|
3709
|
-
async find(ctx) {
|
|
3710
|
-
const { query } = ctx.request;
|
|
3711
|
-
const workflowService = getService("workflows");
|
|
3712
|
-
const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
|
|
3713
|
-
{ strapi },
|
|
3714
|
-
ctx.state.userAbility
|
|
3715
|
-
);
|
|
3716
|
-
const { populate, filters, sort } = await sanitizedQuery.read(query);
|
|
3717
|
-
const [workflows2, workflowCount] = await Promise.all([
|
|
3718
|
-
workflowService.find({ populate, filters, sort }).then(map(formatWorkflowToAdmin)),
|
|
3719
|
-
workflowService.count()
|
|
3720
|
-
]);
|
|
3721
|
-
ctx.body = {
|
|
3722
|
-
data: await async.map(workflows2, sanitizeOutput),
|
|
3723
|
-
meta: {
|
|
3724
|
-
workflowCount
|
|
2047
|
+
};
|
|
2048
|
+
return {
|
|
2049
|
+
async register() {
|
|
2050
|
+
if (!state.eeEnableUnsubscribe) {
|
|
2051
|
+
state.eeEnableUnsubscribe = strapi2.eventHub.on("ee.enable", () => {
|
|
2052
|
+
this.destroy();
|
|
2053
|
+
this.register();
|
|
2054
|
+
});
|
|
3725
2055
|
}
|
|
3726
|
-
|
|
3727
|
-
|
|
3728
|
-
|
|
3729
|
-
|
|
3730
|
-
|
|
3731
|
-
|
|
3732
|
-
|
|
3733
|
-
|
|
3734
|
-
|
|
3735
|
-
|
|
3736
|
-
|
|
3737
|
-
|
|
3738
|
-
|
|
3739
|
-
|
|
3740
|
-
|
|
3741
|
-
|
|
3742
|
-
|
|
3743
|
-
|
|
3744
|
-
|
|
3745
|
-
|
|
3746
|
-
|
|
3747
|
-
|
|
3748
|
-
|
|
3749
|
-
|
|
3750
|
-
|
|
3751
|
-
|
|
3752
|
-
}
|
|
3753
|
-
|
|
3754
|
-
|
|
3755
|
-
|
|
3756
|
-
|
|
3757
|
-
|
|
3758
|
-
|
|
3759
|
-
|
|
3760
|
-
* @param {import('koa').BaseContext} ctx - koa context
|
|
3761
|
-
*/
|
|
3762
|
-
async find(ctx) {
|
|
3763
|
-
const { workflow_id: workflowId } = ctx.params;
|
|
3764
|
-
const { populate } = ctx.query;
|
|
3765
|
-
const stagesService = getService("stages");
|
|
3766
|
-
const sanitizer = sanitizeStage({ strapi }, ctx.state.userAbility);
|
|
3767
|
-
const stages2 = await stagesService.find({
|
|
3768
|
-
workflowId,
|
|
3769
|
-
populate
|
|
3770
|
-
});
|
|
3771
|
-
ctx.body = {
|
|
3772
|
-
data: await async.map(stages2, sanitizer)
|
|
3773
|
-
};
|
|
3774
|
-
},
|
|
3775
|
-
/**
|
|
3776
|
-
* Get one stage
|
|
3777
|
-
* @param {import('koa').BaseContext} ctx - koa context
|
|
3778
|
-
*/
|
|
3779
|
-
async findById(ctx) {
|
|
3780
|
-
const { id, workflow_id: workflowId } = ctx.params;
|
|
3781
|
-
const { populate } = ctx.query;
|
|
3782
|
-
const stagesService = getService("stages");
|
|
3783
|
-
const sanitizer = sanitizeStage({ strapi }, ctx.state.userAbility);
|
|
3784
|
-
const stage = await stagesService.findById(id, {
|
|
3785
|
-
workflowId,
|
|
3786
|
-
populate
|
|
3787
|
-
});
|
|
3788
|
-
ctx.body = {
|
|
3789
|
-
data: await sanitizer(stage)
|
|
3790
|
-
};
|
|
3791
|
-
},
|
|
3792
|
-
/**
|
|
3793
|
-
* Updates an entity's stage.
|
|
3794
|
-
* @async
|
|
3795
|
-
* @param {Object} ctx - The Koa context object.
|
|
3796
|
-
* @param {Object} ctx.params - An object containing the parameters from the request URL.
|
|
3797
|
-
* @param {string} ctx.params.model_uid - The model UID of the entity.
|
|
3798
|
-
* @param {string} ctx.params.id - The ID of the entity to update.
|
|
3799
|
-
* @param {Object} ctx.request.body.data - Optional data object containing the new stage ID for the entity.
|
|
3800
|
-
* @param {string} ctx.request.body.data.id - The ID of the new stage for the entity.
|
|
3801
|
-
* @throws {ApplicationError} If review workflows is not activated on the specified model UID.
|
|
3802
|
-
* @throws {ValidationError} If the `data` object in the request body fails to pass validation.
|
|
3803
|
-
* @returns {Promise<void>} A promise that resolves when the entity's stage has been updated.
|
|
3804
|
-
*/
|
|
3805
|
-
async updateEntity(ctx) {
|
|
3806
|
-
const stagesService = getService("stages");
|
|
3807
|
-
const stagePermissions2 = getService("stage-permissions");
|
|
3808
|
-
const workflowService = getService("workflows");
|
|
3809
|
-
const { model_uid: modelUID, id } = ctx.params;
|
|
3810
|
-
const { body } = ctx.request;
|
|
3811
|
-
const { sanitizeOutput } = strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model: modelUID });
|
|
3812
|
-
const entity = await strapi.db.query(modelUID).findOne({
|
|
3813
|
-
where: { id },
|
|
3814
|
-
populate: [ENTITY_STAGE_ATTRIBUTE]
|
|
3815
|
-
});
|
|
3816
|
-
if (!entity) {
|
|
3817
|
-
ctx.throw(404, "Entity not found");
|
|
3818
|
-
}
|
|
3819
|
-
const canTransition = stagePermissions2.can(
|
|
3820
|
-
STAGE_TRANSITION_UID,
|
|
3821
|
-
entity[ENTITY_STAGE_ATTRIBUTE]?.id
|
|
3822
|
-
);
|
|
3823
|
-
if (!canTransition) {
|
|
3824
|
-
ctx.throw(403, "Forbidden stage transition");
|
|
3825
|
-
}
|
|
3826
|
-
const { id: stageId } = await validateUpdateStageOnEntity(
|
|
3827
|
-
{ id: Number(body?.data?.id) },
|
|
3828
|
-
"You should pass an id to the body of the put request."
|
|
3829
|
-
);
|
|
3830
|
-
const workflow2 = await workflowService.assertContentTypeBelongsToWorkflow(modelUID);
|
|
3831
|
-
workflowService.assertStageBelongsToWorkflow(stageId, workflow2);
|
|
3832
|
-
const updatedEntity = await stagesService.updateEntity({ id: entity.id, modelUID }, stageId);
|
|
3833
|
-
ctx.body = { data: await sanitizeOutput(updatedEntity) };
|
|
3834
|
-
},
|
|
3835
|
-
/**
|
|
3836
|
-
* List all the stages that are available for a user to transition an entity to.
|
|
3837
|
-
* If the user has permission to change the current stage of the entity every other stage in the workflow is returned
|
|
3838
|
-
* @async
|
|
3839
|
-
* @param {*} ctx
|
|
3840
|
-
* @param {string} ctx.params.model_uid - The model UID of the entity.
|
|
3841
|
-
* @param {string} ctx.params.id - The ID of the entity.
|
|
3842
|
-
* @throws {ApplicationError} If review workflows is not activated on the specified model UID.
|
|
3843
|
-
*/
|
|
3844
|
-
async listAvailableStages(ctx) {
|
|
3845
|
-
const stagePermissions2 = getService("stage-permissions");
|
|
3846
|
-
const workflowService = getService("workflows");
|
|
3847
|
-
const { model_uid: modelUID, id } = ctx.params;
|
|
3848
|
-
if (strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model: modelUID }).cannot.read()) {
|
|
3849
|
-
return ctx.forbidden();
|
|
3850
|
-
}
|
|
3851
|
-
const entity = await strapi.db.query(modelUID).findOne({
|
|
3852
|
-
where: { id },
|
|
3853
|
-
populate: [ENTITY_STAGE_ATTRIBUTE]
|
|
3854
|
-
});
|
|
3855
|
-
if (!entity) {
|
|
3856
|
-
ctx.throw(404, "Entity not found");
|
|
2056
|
+
if (!state.eeUpdateUnsubscribe) {
|
|
2057
|
+
state.eeUpdateUnsubscribe = strapi2.eventHub.on("ee.update", () => {
|
|
2058
|
+
this.destroy();
|
|
2059
|
+
this.register();
|
|
2060
|
+
});
|
|
2061
|
+
}
|
|
2062
|
+
state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
|
|
2063
|
+
this.destroy();
|
|
2064
|
+
});
|
|
2065
|
+
if (!strapi2.ee.features.isEnabled("audit-logs")) {
|
|
2066
|
+
return this;
|
|
2067
|
+
}
|
|
2068
|
+
state.eventHubUnsubscribe = strapi2.eventHub.subscribe(handleEvent);
|
|
2069
|
+
const retentionDays = getRetentionDays(strapi2);
|
|
2070
|
+
state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
|
|
2071
|
+
const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
|
|
2072
|
+
auditLogsService.deleteExpiredEvents(expirationDate);
|
|
2073
|
+
});
|
|
2074
|
+
return this;
|
|
2075
|
+
},
|
|
2076
|
+
unsubscribe() {
|
|
2077
|
+
if (state.eeDisableUnsubscribe) {
|
|
2078
|
+
state.eeDisableUnsubscribe();
|
|
2079
|
+
}
|
|
2080
|
+
if (state.eventHubUnsubscribe) {
|
|
2081
|
+
state.eventHubUnsubscribe();
|
|
2082
|
+
}
|
|
2083
|
+
if (state.deleteExpiredJob) {
|
|
2084
|
+
state.deleteExpiredJob.cancel();
|
|
2085
|
+
}
|
|
2086
|
+
return this;
|
|
2087
|
+
},
|
|
2088
|
+
destroy() {
|
|
2089
|
+
return this.unsubscribe();
|
|
3857
2090
|
}
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3865
|
-
|
|
3866
|
-
|
|
3867
|
-
|
|
3868
|
-
|
|
3869
|
-
|
|
3870
|
-
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
|
|
3874
|
-
|
|
3875
|
-
|
|
2091
|
+
};
|
|
2092
|
+
};
|
|
2093
|
+
const auditLog = {
|
|
2094
|
+
schema: {
|
|
2095
|
+
kind: "collectionType",
|
|
2096
|
+
collectionName: "strapi_audit_logs",
|
|
2097
|
+
info: {
|
|
2098
|
+
singularName: "audit-log",
|
|
2099
|
+
pluralName: "audit-logs",
|
|
2100
|
+
displayName: "Audit Log"
|
|
2101
|
+
},
|
|
2102
|
+
options: {
|
|
2103
|
+
timestamps: false
|
|
2104
|
+
},
|
|
2105
|
+
pluginOptions: {
|
|
2106
|
+
"content-manager": {
|
|
2107
|
+
visible: false
|
|
2108
|
+
},
|
|
2109
|
+
"content-type-builder": {
|
|
2110
|
+
visible: false
|
|
2111
|
+
}
|
|
2112
|
+
},
|
|
2113
|
+
attributes: {
|
|
2114
|
+
action: {
|
|
2115
|
+
type: "string",
|
|
2116
|
+
required: true
|
|
2117
|
+
},
|
|
2118
|
+
date: {
|
|
2119
|
+
type: "datetime",
|
|
2120
|
+
required: true
|
|
2121
|
+
},
|
|
2122
|
+
user: {
|
|
2123
|
+
type: "relation",
|
|
2124
|
+
relation: "oneToOne",
|
|
2125
|
+
target: "admin::user"
|
|
2126
|
+
},
|
|
2127
|
+
payload: {
|
|
2128
|
+
type: "json"
|
|
2129
|
+
}
|
|
3876
2130
|
}
|
|
3877
|
-
const data = workflowStages.filter((stage) => stage.id !== entityStageId);
|
|
3878
|
-
ctx.body = {
|
|
3879
|
-
data,
|
|
3880
|
-
meta
|
|
3881
|
-
};
|
|
3882
2131
|
}
|
|
3883
2132
|
};
|
|
3884
|
-
const
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
|
|
3889
|
-
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3908
|
-
|
|
3909
|
-
|
|
2133
|
+
const getAdminEE = () => {
|
|
2134
|
+
const eeAdmin = {
|
|
2135
|
+
register,
|
|
2136
|
+
bootstrap,
|
|
2137
|
+
destroy,
|
|
2138
|
+
contentTypes: {
|
|
2139
|
+
// Always register the audit-log content type to prevent data loss
|
|
2140
|
+
"audit-log": auditLog,
|
|
2141
|
+
...adminContentTypes
|
|
2142
|
+
},
|
|
2143
|
+
services,
|
|
2144
|
+
controllers,
|
|
2145
|
+
routes
|
|
2146
|
+
};
|
|
2147
|
+
if (strapi.config.get("admin.auditLogs.enabled", true) && strapi.ee.features.isEnabled("audit-logs")) {
|
|
2148
|
+
return {
|
|
2149
|
+
...eeAdmin,
|
|
2150
|
+
controllers: {
|
|
2151
|
+
...eeAdmin.controllers,
|
|
2152
|
+
"audit-logs": auditLogsController
|
|
2153
|
+
},
|
|
2154
|
+
routes: {
|
|
2155
|
+
...eeAdmin.routes,
|
|
2156
|
+
"audit-logs": auditLogsRoutes
|
|
2157
|
+
},
|
|
2158
|
+
async register({ strapi: strapi2 }) {
|
|
2159
|
+
await eeAdmin.register({ strapi: strapi2 });
|
|
2160
|
+
strapi2.add("audit-logs", createAuditLogsService(strapi2));
|
|
2161
|
+
const auditLogsLifecycle = createAuditLogsLifecycleService(strapi2);
|
|
2162
|
+
strapi2.add("audit-logs-lifecycle", auditLogsLifecycle);
|
|
2163
|
+
await auditLogsLifecycle.register();
|
|
2164
|
+
},
|
|
2165
|
+
async destroy({ strapi: strapi2 }) {
|
|
2166
|
+
strapi2.get("audit-logs-lifecycle").destroy();
|
|
2167
|
+
await eeAdmin.destroy({ strapi: strapi2 });
|
|
2168
|
+
}
|
|
2169
|
+
};
|
|
3910
2170
|
}
|
|
2171
|
+
return eeAdmin;
|
|
3911
2172
|
};
|
|
3912
|
-
const index =
|
|
3913
|
-
authentication,
|
|
3914
|
-
role,
|
|
3915
|
-
user,
|
|
3916
|
-
auditLogs,
|
|
3917
|
-
admin,
|
|
3918
|
-
workflows,
|
|
3919
|
-
stages,
|
|
3920
|
-
assignees
|
|
3921
|
-
};
|
|
2173
|
+
const index = getAdminEE();
|
|
3922
2174
|
export {
|
|
3923
|
-
|
|
3924
|
-
index$3 as contentTypes,
|
|
3925
|
-
index as controllers,
|
|
3926
|
-
destroy,
|
|
3927
|
-
register,
|
|
3928
|
-
index$2 as routes,
|
|
3929
|
-
index$1 as services
|
|
2175
|
+
index as default
|
|
3930
2176
|
};
|
|
3931
2177
|
//# sourceMappingURL=index.mjs.map
|