@atlashub/smartstack 3.21.0 → 3.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiCatalogDetailPage-2ktkRrCb.js","sources":["../../src/pages/platform/api/apis/ApiCatalogDetailPage.tsx"],"sourcesContent":["import { useEffect, useState, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft, BookOpen, Shield, Zap, Database, Code2, Copy, Check,\r\n Clock, Layers, AlertTriangle, Loader2, Brain, FileCode2\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport { aiApi } from '@/services/api/aiApi';\r\nimport type { DataApiEndpointDto } from '@/services/api/adminApi';\r\nimport type { AiSkillDetailDto } from '@/services/api/aiApi';\r\n\r\n// Response schema definitions per entity type\r\nconst responseSchemas: Record<string, { fields: { name: string; type: string; description: string; nullable?: boolean }[]; paginated: boolean }> = {\r\n User: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique user identifier' },\r\n { name: 'email', type: 'string', description: 'User email address' },\r\n { name: 'firstName', type: 'string', description: 'First name', nullable: true },\r\n { name: 'lastName', type: 'string', description: 'Last name', nullable: true },\r\n { name: 'displayName', type: 'string', description: 'Display name', nullable: true },\r\n { name: 'isActive', type: 'boolean', description: 'Account active status' },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'roles', type: 'string[]', description: 'Assigned role names' },\r\n { name: 'tenantIds', type: 'Guid[]', description: 'Associated tenant identifiers' },\r\n ],\r\n },\r\n Tenant: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique tenant identifier' },\r\n { name: 'name', type: 'string', description: 'Tenant name' },\r\n { name: 'slug', type: 'string', description: 'URL-friendly slug' },\r\n { name: 'type', type: 'string', description: 'Tenant type (B2C/B2B)' },\r\n { name: 'status', type: 'string', description: 'Current status' },\r\n { name: 'description', type: 'string', description: 'Tenant description', nullable: true },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'memberCount', type: 'int', description: 'Number of active members' },\r\n ],\r\n },\r\n Role: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique role identifier' },\r\n { name: 'name', type: 'string', description: 'Role display name' },\r\n { name: 'shortName', type: 'string', description: 'Short name', nullable: true },\r\n { name: 'code', type: 'string', description: 'Unique role code', nullable: true },\r\n { name: 'category', type: 'string', description: 'Role category' },\r\n { name: 'description', type: 'string', description: 'Role description', nullable: true },\r\n { name: 'isSystem', type: 'boolean', description: 'System-managed role flag' },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'permissions', type: 'string[]', description: 'Assigned permission codes' },\r\n ],\r\n },\r\n Ticket: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique ticket identifier' },\r\n { name: 'title', type: 'string', description: 'Ticket title' },\r\n { name: 'type', type: 'string', description: 'Ticket type (Incident/Request/Task)' },\r\n { name: 'status', type: 'string', description: 'Current status' },\r\n { name: 'priority', type: 'string', description: 'Priority level' },\r\n { name: 'assignedToUserId', type: 'Guid', description: 'Assigned user', nullable: true },\r\n { name: 'createdByUserId', type: 'Guid', description: 'Creator user' },\r\n { name: 'tenantId', type: 'Guid', description: 'Owning tenant', nullable: true },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'resolvedAt', type: 'DateTime', description: 'Resolution date', nullable: true },\r\n { name: 'closedAt', type: 'DateTime', description: 'Closing date', nullable: true },\r\n ],\r\n },\r\n NavigationApplication: {\r\n paginated: false,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Application identifier' },\r\n { name: 'code', type: 'string', description: 'Application code' },\r\n { name: 'label', type: 'string', description: 'Display label' },\r\n { name: 'modules', type: 'Module[]', description: 'Child modules' },\r\n { name: 'modules[].id', type: 'Guid', description: 'Module identifier' },\r\n { name: 'modules[].code', type: 'string', description: 'Module code' },\r\n { name: 'modules[].label', type: 'string', description: 'Module display label' },\r\n ],\r\n },\r\n};\r\n\r\n// Query parameters metadata per endpoint code (matches ExternalAppPromptTab)\r\nconst endpointQueryParams: Record<string, { name: string; type: string; default: string; description: string }[]> = {\r\n users: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - scope aux utilisateurs de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n { name: 'isActive', type: 'bool?', default: 'null', description: 'Filtre par statut actif/inactif' },\r\n ],\r\n tenants: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant a exporter' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n roles: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - exporte les roles de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n tickets: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - exporte les tickets de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 500)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n navigation: [],\r\n};\r\n\r\nfunction getJsonExampleValue(type: string): string {\r\n switch (type) {\r\n case 'Guid': return '\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"';\r\n case 'string': return '\"...\"';\r\n case 'boolean': return 'true';\r\n case 'int': return '0';\r\n case 'DateTime': return '\"2026-01-15T10:30:00Z\"';\r\n case 'string[]': return '[\"item1\", \"item2\"]';\r\n case 'Guid[]': return '[\"uuid1\", \"uuid2\"]';\r\n default: return '\"...\"';\r\n }\r\n}\r\n\r\nfunction addAuthSection(lines: string[]): void {\r\n lines.push('## 1. Authentification (HMAC-JWT Assertion)');\r\n lines.push('');\r\n lines.push('### Etape 1 : Creer une assertion JWT signee HMAC-SHA256');\r\n lines.push('');\r\n lines.push('```');\r\n lines.push('Header: { \"alg\": \"HS256\", \"typ\": \"JWT\" }');\r\n lines.push('Payload: {');\r\n lines.push(' \"sub\": \"<YOUR_CLIENT_ID>\", // ton clientId');\r\n lines.push(' \"iat\": <timestamp-unix-actuel>, // timestamp Unix actuel');\r\n lines.push(' \"exp\": <timestamp-unix + 300>, // expiration (max 5 min apres iat)');\r\n lines.push(' \"jti\": \"<uuid-unique>\" // nonce anti-replay');\r\n lines.push('}');\r\n lines.push('Signature: HMAC-SHA256(header.payload, Base64Decode(clientSecret))');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('**Important** : Le `clientSecret` est encode en Base64. Tu dois le **decoder** avant de l\\'utiliser comme cle HMAC.');\r\n lines.push('');\r\n lines.push('### Etape 2 : Echanger l\\'assertion contre un access token');\r\n lines.push('');\r\n lines.push('```http');\r\n lines.push('POST {baseUrl}/api/auth/external-app/token');\r\n lines.push('Content-Type: application/json');\r\n lines.push('');\r\n lines.push('{ \"assertion\": \"<jwt-assertion-de-etape-1>\" }');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('**Reponse succes (200)** :');\r\n lines.push('```json');\r\n lines.push('{');\r\n lines.push(' \"accessToken\": \"eyJhbGciOiJIUz...\",');\r\n lines.push(' \"expiresAt\": \"2026-02-25T11:00:00Z\",');\r\n lines.push(' \"permissions\": [\"administration.users.read\", ...]');\r\n lines.push('}');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('Cache le token et renouvelle-le 5 min avant `expiresAt`.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addTenantScopingSection(lines: string[], code: string): void {\r\n if (code !== 'navigation') {\r\n lines.push('## 2. Isolation par tenant (OBLIGATOIRE)');\r\n lines.push('');\r\n lines.push('Le parametre `tenantId` (UUID) est **obligatoire** en query string. Il scope l\\'export aux donnees du tenant specifie. Sans ce parametre, l\\'API retourne une erreur 400.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addEndpointSection(lines: string[], endpoint: DataApiEndpointDto): void {\r\n lines.push(`## 3. Endpoint : ${endpoint.name}`);\r\n lines.push('');\r\n lines.push('```http');\r\n lines.push(`GET {baseUrl}${endpoint.routeTemplate}`);\r\n lines.push('Authorization: Bearer <accessToken>');\r\n lines.push('```');\r\n lines.push('');\r\n}\r\n\r\nfunction addParamsSection(lines: string[], params: typeof endpointQueryParams[string]): void {\r\n if (params.length > 0) {\r\n lines.push('**Parametres (query string)** :');\r\n lines.push('');\r\n lines.push('| Parametre | Type | Defaut | Description |');\r\n lines.push('|-----------|------|--------|-------------|');\r\n for (const p of params) {\r\n lines.push(`| \\`${p.name}\\` | ${p.type} | ${p.default} | ${p.description} |`);\r\n }\r\n lines.push('');\r\n } else {\r\n lines.push('**Aucun parametre** - appel direct sans query string.');\r\n lines.push('');\r\n }\r\n}\r\n\r\nconst buildFieldLines = (schema: typeof responseSchemas[string], isNested: boolean): string[] => {\r\n const lines: string[] = [];\r\n const indent = isNested ? ' ' : ' ';\r\n for (let i = 0; i < schema.fields.length; i++) {\r\n const f = schema.fields[i];\r\n if (f.name.includes('[].')) continue;\r\n const comma = i < schema.fields.length - 1 ? ',' : '';\r\n lines.push(`${indent}\"${f.name}\": ${getJsonExampleValue(f.type)}${comma} // ${f.type}${f.nullable ? '?' : ''} - ${f.description}`);\r\n }\r\n return lines;\r\n};\r\n\r\nconst buildPaginatedResponseExample = (schema: typeof responseSchemas[string]): string[] => {\r\n const lines: string[] = [];\r\n lines.push('**Reponse (paginee)** :');\r\n lines.push('```json');\r\n lines.push('{');\r\n lines.push(' \"items\": [');\r\n lines.push(' {');\r\n lines.push(...buildFieldLines(schema, true));\r\n lines.push(' }');\r\n lines.push(' ],');\r\n lines.push(' \"page\": 1,');\r\n lines.push(' \"pageSize\": 100,');\r\n lines.push(' \"totalCount\": 250,');\r\n lines.push(' \"totalPages\": 3,');\r\n lines.push(' \"hasMore\": true');\r\n lines.push('}');\r\n lines.push('```');\r\n return lines;\r\n};\r\n\r\nconst buildArrayResponseExample = (schema: typeof responseSchemas[string]): string[] => {\r\n const lines: string[] = [];\r\n lines.push('**Reponse (tableau direct, NON pagine)** :');\r\n lines.push('```json');\r\n lines.push('[');\r\n lines.push(' {');\r\n lines.push(...buildFieldLines(schema, false));\r\n lines.push(' }');\r\n lines.push(']');\r\n lines.push('```');\r\n return lines;\r\n};\r\n\r\nfunction buildResponseExample(schema: typeof responseSchemas[string], isPaginated: boolean): string[] {\r\n return isPaginated\r\n ? buildPaginatedResponseExample(schema)\r\n : buildArrayResponseExample(schema);\r\n}\r\n\r\nfunction addResponseSection(lines: string[], schema: typeof responseSchemas[string] | undefined): void {\r\n if (schema) {\r\n const responseLines = buildResponseExample(schema, schema.paginated);\r\n lines.push(...responseLines);\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addRateLimitSection(lines: string[], endpoint: DataApiEndpointDto): void {\r\n lines.push(`**Rate limit** : ${endpoint.defaultRateLimitPerMinute} requetes/minute | Page size max : ${endpoint.defaultMaxPageSize}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addPaginationSection(lines: string[], schema: typeof responseSchemas[string] | undefined): void {\r\n if (schema?.paginated) {\r\n lines.push('## 4. Pagination');\r\n lines.push('');\r\n lines.push('Boucle tant que `hasMore === true`, en incrementant `page`. Les resultats sont tries par `createdAt ASC`.');\r\n lines.push('');\r\n lines.push('## 5. Synchronisation incrementale');\r\n lines.push('');\r\n lines.push('Utilise `modifiedSince` pour ne recuperer que les changements :');\r\n lines.push('1. Premiere synchro : appelle sans `modifiedSince` (recupere tout)');\r\n lines.push('2. Stocke `DateTime.UtcNow` du debut de la synchro');\r\n lines.push('3. Synchros suivantes : passe `modifiedSince=<timestamp-stocke>`');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addRateLimitingDetailSection(lines: string[]): void {\r\n lines.push('## 6. Rate Limiting');\r\n lines.push('');\r\n lines.push('Quand tu depasses la limite :');\r\n lines.push('```');\r\n lines.push('HTTP/1.1 429 Too Many Requests');\r\n lines.push('Retry-After: 42');\r\n lines.push('```');\r\n lines.push('Lis le header `Retry-After` et attends. Implemente un backoff exponentiel.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addErrorHandlingSection(lines: string[]): void {\r\n lines.push('## 7. Gestion des erreurs');\r\n lines.push('');\r\n lines.push('| HTTP | Action |');\r\n lines.push('|------|--------|');\r\n lines.push('| 200 | Traite les donnees |');\r\n lines.push('| 400 | tenantId manquant ou invalide |');\r\n lines.push('| 401 | Renouvelle le token et relance |');\r\n lines.push('| 403 | Acces export non accorde - contacte l\\'admin |');\r\n lines.push('| 404 | Tenant non trouve - verifie le tenantId |');\r\n lines.push('| 429 | Attends `Retry-After` secondes |');\r\n lines.push('| 500 | Retry avec backoff exponentiel |');\r\n}\r\n\r\nfunction generateEndpointPrompt(endpoint: DataApiEndpointDto): string {\r\n const schema = responseSchemas[endpoint.entityType];\r\n const params = endpointQueryParams[endpoint.code] || [];\r\n const lines: string[] = [];\r\n\r\n lines.push('## Contexte');\r\n lines.push('');\r\n lines.push(`Tu dois implementer un client HTTP qui consomme l'endpoint **${endpoint.name}** de l'API DataExport de SmartStack en mode machine-to-machine (M2M). L'application s'authentifie avec un \\`clientId\\` et un \\`clientSecret\\`, obtient un token JWT, puis appelle l'endpoint d'export.`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n\r\n addAuthSection(lines);\r\n addTenantScopingSection(lines, endpoint.code);\r\n addEndpointSection(lines, endpoint);\r\n addParamsSection(lines, params);\r\n addResponseSection(lines, schema);\r\n addRateLimitSection(lines, endpoint);\r\n addPaginationSection(lines, schema);\r\n addRateLimitingDetailSection(lines);\r\n addErrorHandlingSection(lines);\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction generateCurlExample(endpoint: DataApiEndpointDto): string {\r\n const baseUrl = 'https://your-api.smartstack.app';\r\n const route = endpoint.routeTemplate;\r\n const isPaginated = responseSchemas[endpoint.entityType]?.paginated;\r\n\r\n let curl = `curl -X GET \"${baseUrl}${route}`;\r\n if (isPaginated) {\r\n curl += '?page=1&pageSize=100';\r\n }\r\n curl += `\" \\\\\\n -H \"Authorization: Bearer <API_KEY>\" \\\\\\n -H \"Accept: application/json\"`;\r\n return curl;\r\n}\r\n\r\nconst buildExampleFieldValue = (field: { name: string; type: string; nullable?: boolean }): unknown => {\r\n if (field.name === 'modules') return [{ id: '...', code: 'users', label: 'Users' }];\r\n\r\n switch (field.type) {\r\n case 'Guid': return '3fa85f64-5717-4562-b3fc-2c963f66afa6';\r\n case 'string': return field.nullable ? null : `example-${field.name}`;\r\n case 'boolean': return true;\r\n case 'int': return 42;\r\n case 'DateTime': return field.nullable ? null : '2026-02-25T10:00:00Z';\r\n case 'string[]': return ['value1', 'value2'];\r\n case 'Guid[]': return ['3fa85f64-5717-4562-b3fc-2c963f66afa6'];\r\n default: return '...';\r\n }\r\n};\r\n\r\nconst buildExampleItem = (schema: typeof responseSchemas[string]): Record<string, unknown> => {\r\n const exampleItem: Record<string, unknown> = {};\r\n for (const field of schema.fields) {\r\n if (field.name.includes('[].')) continue;\r\n exampleItem[field.name] = buildExampleFieldValue(field);\r\n }\r\n return exampleItem;\r\n};\r\n\r\nfunction generateJsonExample(endpoint: DataApiEndpointDto): string {\r\n const schema = responseSchemas[endpoint.entityType];\r\n if (!schema) return '// Schema not available';\r\n\r\n const exampleItem = buildExampleItem(schema);\r\n const responseBody = schema.paginated\r\n ? { items: [exampleItem], page: 1, pageSize: 100, totalCount: 1, totalPages: 1, hasMore: false }\r\n : [exampleItem];\r\n\r\n return JSON.stringify(responseBody, null, 2);\r\n}\r\n\r\nfunction CopyButton({ text }: { text: string }) {\r\n const [copied, setCopied] = useState(false);\r\n const handleCopy = async () => {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n };\r\n return (\r\n <button\r\n onClick={handleCopy}\r\n className=\"absolute top-2 right-2 p-1.5 rounded-md bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)] transition-colors\"\r\n title=\"Copy\"\r\n >\r\n {copied ? <Check className=\"h-4 w-4 text-[var(--success-text)]\" /> : <Copy className=\"h-4 w-4\" />}\r\n </button>\r\n );\r\n}\r\n\r\nfunction PromptBlocksContent({ prompt }: { prompt: AiSkillDetailDto }) {\r\n return (\r\n <div className=\"space-y-3\">\r\n {prompt.blocks\r\n .filter(b => b.isEnabled !== false)\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .map((block) => (\r\n <div key={block.id} className=\"rounded-lg border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"flex items-center gap-2 px-4 py-2 bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {block.blockType}\r\n </span>\r\n {block.label && (\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{block.label}</span>\r\n )}\r\n </div>\r\n <div className=\"relative p-4\">\r\n <CopyButton text={block.content} />\r\n <pre className=\"text-sm font-mono text-[var(--text-secondary)] whitespace-pre-wrap pr-10\">\r\n {block.content}\r\n </pre>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction PromptVariablesContent({ variables, t }: { variables: string[]; t: any }) {\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-tertiary)] mb-2\">{t('externalApps.apis.catalog.detail.variables')}</h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {variables.map(v => (\r\n <code key={v} className=\"rounded bg-[var(--bg-secondary)] px-2 py-1 text-xs font-mono text-[var(--color-primary-600)]\">\r\n {`{${v}}`}\r\n </code>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction LoadedPromptContent({ t, prompt }: { t: any; prompt: AiSkillDetailDto }) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">{prompt.name}</h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n v{prompt.version} · {prompt.status}\r\n {prompt.description && <> · {prompt.description}</>}\r\n </p>\r\n </div>\r\n <a\r\n href={`/administration/ai/skills/${prompt.id}`}\r\n className=\"text-sm text-[var(--color-primary-600)] hover:underline\"\r\n >\r\n {t('externalApps.apis.catalog.detail.viewPrompt')}\r\n </a>\r\n </div>\r\n {(prompt.blocks?.length ?? 0) > 0 && (\r\n <PromptBlocksContent prompt={prompt} />\r\n )}\r\n {(prompt.variables?.length ?? 0) > 0 && (\r\n <PromptVariablesContent variables={prompt.variables} t={t} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction GeneratedPromptContent({ t, endpoint, generatedPrompt }: { t: any; endpoint: DataApiEndpointDto; generatedPrompt: string }) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">\r\n {t('externalApps.apis.catalog.detail.generatedPromptTitle')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n {t('externalApps.apis.catalog.detail.generatedPromptHint', { code: `data-export-${endpoint.code}` })}\r\n </p>\r\n </div>\r\n <CopyButton text={generatedPrompt} />\r\n </div>\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] whitespace-pre-wrap overflow-x-auto max-h-[600px] overflow-y-auto leading-relaxed\">\r\n {generatedPrompt}\r\n </pre>\r\n </div>\r\n );\r\n}\r\n\r\nasync function tryLoadPrompt(endpointCode: string): Promise<AiSkillDetailDto | null> {\r\n const codesToTry = [\r\n `data-export-${endpointCode}`,\r\n `export-${endpointCode}`,\r\n endpointCode,\r\n ];\r\n\r\n for (const code of codesToTry) {\r\n try {\r\n const detail = await aiApi.skills.getByCode(code);\r\n if (detail) return detail;\r\n } catch {\r\n // Code not found (404), try next\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function ApiCatalogDetailPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { endpointCode } = useParams<{ endpointCode: string }>();\r\n const navigate = useNavigate();\r\n const [endpoint, setEndpoint] = useState<DataApiEndpointDto | null>(null);\r\n const [prompt, setPrompt] = useState<AiSkillDetailDto | null>(null);\r\n const [promptLoading, setPromptLoading] = useState(false);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const endpoints = await adminApi.externalApps.getApiEndpoints();\r\n if (cancelled) return;\r\n\r\n const found = endpoints.find(ep => ep.code === endpointCode);\r\n if (!found) {\r\n setError('Endpoint not found');\r\n return;\r\n }\r\n setEndpoint(found);\r\n\r\n setPromptLoading(true);\r\n try {\r\n const detail = await tryLoadPrompt(found.code);\r\n if (!cancelled && detail) {\r\n setPrompt(detail);\r\n }\r\n } catch {\r\n // Prompts are optional, ignore errors\r\n } finally {\r\n if (!cancelled) setPromptLoading(false);\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : 'Failed to load endpoint');\r\n }\r\n } finally {\r\n if (!cancelled) setLoading(false);\r\n }\r\n };\r\n fetchData();\r\n\r\n return () => { cancelled = true; };\r\n }, [endpointCode]);\r\n\r\n const schema = useMemo(() => endpoint ? responseSchemas[endpoint.entityType] : null, [endpoint]);\r\n const curlExample = useMemo(() => endpoint ? generateCurlExample(endpoint) : '', [endpoint]);\r\n const jsonExample = useMemo(() => endpoint ? generateJsonExample(endpoint) : '', [endpoint]);\r\n const generatedPrompt = useMemo(() => endpoint ? generateEndpointPrompt(endpoint) : '', [endpoint]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !endpoint) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <button onClick={() => navigate(-1)} className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\">\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n {t('common:back')}\r\n </button>\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error || 'Endpoint not found'}</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('externalApps.navigation.api'), href: '/api' },\r\n { label: t('externalApps.apis.catalog.title'), href: '/api/apis/catalog' },\r\n { label: endpoint.name }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-start gap-4\">\r\n <button onClick={() => navigate(-1)} className=\"mt-1 p-2 rounded-md hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] transition-colors\">\r\n <ArrowLeft className=\"h-5 w-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <BookOpen className=\"h-7 w-7 text-[var(--color-accent-600)]\" />\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{endpoint.name}</h1>\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {endpoint.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('externalApps.apis.catalog.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('externalApps.apis.catalog.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n {endpoint.description && (\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">{endpoint.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Metadata cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Layers className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.application')}</span>\r\n </div>\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-sm font-medium text-[var(--info-text)]\">\r\n {endpoint.applicationLabel}\r\n </span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Database className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.module')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.moduleLabel}</span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Zap className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.rateLimit')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.defaultRateLimitPerMinute}/min</span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.maxPageSize')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.defaultMaxPageSize}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Technical details */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.technical')}</h2>\r\n </div>\r\n <div className=\"p-6 grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.route')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--color-primary-600)]\">\r\n GET {endpoint.routeTemplate}\r\n </code>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.permission')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <Shield className=\"h-4 w-4 text-[var(--warning-text)]\" />\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]\">\r\n {endpoint.requiredPermission}\r\n </code>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.entityType')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <Database className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.entityType}</span>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.code')}</label>\r\n <div className=\"mt-1\">\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]\">\r\n {endpoint.code}\r\n </code>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* cURL Example */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Code2 className=\"h-5 w-5 text-[var(--text-tertiary)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.curlExample')}</h2>\r\n </div>\r\n </div>\r\n <div className=\"p-6 relative\">\r\n <CopyButton text={curlExample} />\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto whitespace-pre-wrap\">\r\n {curlExample}\r\n </pre>\r\n </div>\r\n </div>\r\n\r\n {/* Response Schema */}\r\n {schema && (\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileCode2 className=\"h-5 w-5 text-[var(--text-tertiary)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.responseSchema')}</h2>\r\n </div>\r\n {schema.paginated && (\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {t('externalApps.apis.catalog.detail.paginated')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.field')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.type')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.nullable')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.fieldDescription')}</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {schema.fields.map((field) => (\r\n <tr key={field.name} className=\"hover:bg-[var(--bg-hover)] transition-colors\">\r\n <td className=\"px-6 py-3\">\r\n <code className=\"text-sm font-mono text-[var(--color-primary-600)]\">{field.name}</code>\r\n </td>\r\n <td className=\"px-6 py-3\">\r\n <code className=\"rounded bg-[var(--bg-secondary)] px-2 py-0.5 text-xs font-mono text-[var(--text-secondary)]\">{field.type}</code>\r\n </td>\r\n <td className=\"px-6 py-3 text-sm text-[var(--text-secondary)]\">\r\n {field.nullable ? '?' : '-'}\r\n </td>\r\n <td className=\"px-6 py-3 text-sm text-[var(--text-secondary)]\">{field.description}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* JSON Example */}\r\n <div className=\"border-t border-[var(--border-color)] p-6\">\r\n <h3 className=\"text-sm font-semibold text-[var(--text-tertiary)] uppercase mb-3\">{t('externalApps.apis.catalog.detail.jsonExample')}</h3>\r\n <div className=\"relative\">\r\n <CopyButton text={jsonExample} />\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto max-h-96 overflow-y-auto\">\r\n {jsonExample}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* AI Prompt section */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Brain className=\"h-5 w-5 text-[var(--color-accent-600)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.dedicatedPrompt')}</h2>\r\n </div>\r\n <p className=\"mt-1 text-sm text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.detail.promptDescription')}</p>\r\n </div>\r\n <div className=\"p-6\">\r\n {promptLoading && (\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)]\">\r\n <Loader2 className=\"h-4 w-4 animate-spin\" />\r\n <span className=\"text-sm\">{t('common:loading')}</span>\r\n </div>\r\n )}\r\n {!promptLoading && prompt && (\r\n <LoadedPromptContent t={t} prompt={prompt} />\r\n )}\r\n {!promptLoading && !prompt && (\r\n <GeneratedPromptContent t={t} endpoint={endpoint} generatedPrompt={generatedPrompt} />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["responseSchemas","endpointQueryParams","getJsonExampleValue","type","addAuthSection","lines","addTenantScopingSection","code","addEndpointSection","endpoint","addParamsSection","params","p","buildFieldLines","schema","isNested","indent","i","f","comma","buildPaginatedResponseExample","buildArrayResponseExample","buildResponseExample","isPaginated","addResponseSection","responseLines","addRateLimitSection","addPaginationSection","addRateLimitingDetailSection","addErrorHandlingSection","generateEndpointPrompt","generateCurlExample","baseUrl","route","curl","buildExampleFieldValue","field","buildExampleItem","exampleItem","generateJsonExample","responseBody","CopyButton","text","copied","setCopied","useState","jsx","Check","Copy","PromptBlocksContent","prompt","b","a","block","jsxs","PromptVariablesContent","variables","v","LoadedPromptContent","t","Fragment","GeneratedPromptContent","generatedPrompt","tryLoadPrompt","endpointCode","codesToTry","detail","aiApi","ApiCatalogDetailPage","useTranslation","useParams","navigate","useNavigate","setEndpoint","setPrompt","promptLoading","setPromptLoading","loading","setLoading","error","setError","useEffect","cancelled","endpoints","adminApi","found","ep","err","useMemo","curlExample","jsonExample","Loader2","ArrowLeft","AlertTriangle","Breadcrumb","BookOpen","Layers","Database","Zap","Clock","Shield","Code2","FileCode2","Brain"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ApiCatalogDetailPage-D3L8Yf4G.js","sources":["../../src/pages/platform/api/apis/ApiCatalogDetailPage.tsx"],"sourcesContent":["import { useEffect, useState, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n ArrowLeft, BookOpen, Shield, Zap, Database, Code2, Copy, Check,\r\n Clock, Layers, AlertTriangle, Loader2, Brain, FileCode2\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport { aiApi } from '@/services/api/aiApi';\r\nimport type { DataApiEndpointDto } from '@/services/api/adminApi';\r\nimport type { AiSkillDetailDto } from '@/services/api/aiApi';\r\n\r\n// Response schema definitions per entity type\r\nconst responseSchemas: Record<string, { fields: { name: string; type: string; description: string; nullable?: boolean }[]; paginated: boolean }> = {\r\n User: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique user identifier' },\r\n { name: 'email', type: 'string', description: 'User email address' },\r\n { name: 'firstName', type: 'string', description: 'First name', nullable: true },\r\n { name: 'lastName', type: 'string', description: 'Last name', nullable: true },\r\n { name: 'displayName', type: 'string', description: 'Display name', nullable: true },\r\n { name: 'isActive', type: 'boolean', description: 'Account active status' },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'roles', type: 'string[]', description: 'Assigned role names' },\r\n { name: 'tenantIds', type: 'Guid[]', description: 'Associated tenant identifiers' },\r\n ],\r\n },\r\n Tenant: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique tenant identifier' },\r\n { name: 'name', type: 'string', description: 'Tenant name' },\r\n { name: 'slug', type: 'string', description: 'URL-friendly slug' },\r\n { name: 'type', type: 'string', description: 'Tenant type (B2C/B2B)' },\r\n { name: 'status', type: 'string', description: 'Current status' },\r\n { name: 'description', type: 'string', description: 'Tenant description', nullable: true },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'memberCount', type: 'int', description: 'Number of active members' },\r\n ],\r\n },\r\n Role: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique role identifier' },\r\n { name: 'name', type: 'string', description: 'Role display name' },\r\n { name: 'shortName', type: 'string', description: 'Short name', nullable: true },\r\n { name: 'code', type: 'string', description: 'Unique role code', nullable: true },\r\n { name: 'category', type: 'string', description: 'Role category' },\r\n { name: 'description', type: 'string', description: 'Role description', nullable: true },\r\n { name: 'isSystem', type: 'boolean', description: 'System-managed role flag' },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'permissions', type: 'string[]', description: 'Assigned permission codes' },\r\n ],\r\n },\r\n Ticket: {\r\n paginated: true,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Unique ticket identifier' },\r\n { name: 'title', type: 'string', description: 'Ticket title' },\r\n { name: 'type', type: 'string', description: 'Ticket type (Incident/Request/Task)' },\r\n { name: 'status', type: 'string', description: 'Current status' },\r\n { name: 'priority', type: 'string', description: 'Priority level' },\r\n { name: 'assignedToUserId', type: 'Guid', description: 'Assigned user', nullable: true },\r\n { name: 'createdByUserId', type: 'Guid', description: 'Creator user' },\r\n { name: 'tenantId', type: 'Guid', description: 'Owning tenant', nullable: true },\r\n { name: 'createdAt', type: 'DateTime', description: 'Creation date (UTC)' },\r\n { name: 'updatedAt', type: 'DateTime', description: 'Last update date (UTC)', nullable: true },\r\n { name: 'resolvedAt', type: 'DateTime', description: 'Resolution date', nullable: true },\r\n { name: 'closedAt', type: 'DateTime', description: 'Closing date', nullable: true },\r\n ],\r\n },\r\n NavigationApplication: {\r\n paginated: false,\r\n fields: [\r\n { name: 'id', type: 'Guid', description: 'Application identifier' },\r\n { name: 'code', type: 'string', description: 'Application code' },\r\n { name: 'label', type: 'string', description: 'Display label' },\r\n { name: 'modules', type: 'Module[]', description: 'Child modules' },\r\n { name: 'modules[].id', type: 'Guid', description: 'Module identifier' },\r\n { name: 'modules[].code', type: 'string', description: 'Module code' },\r\n { name: 'modules[].label', type: 'string', description: 'Module display label' },\r\n ],\r\n },\r\n};\r\n\r\n// Query parameters metadata per endpoint code (matches ExternalAppPromptTab)\r\nconst endpointQueryParams: Record<string, { name: string; type: string; default: string; description: string }[]> = {\r\n users: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - scope aux utilisateurs de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n { name: 'isActive', type: 'bool?', default: 'null', description: 'Filtre par statut actif/inactif' },\r\n ],\r\n tenants: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant a exporter' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n roles: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - exporte les roles de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 1000)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n tickets: [\r\n { name: 'tenantId', type: 'UUID', default: '(requis)', description: 'ID du tenant - exporte les tickets de ce tenant' },\r\n { name: 'page', type: 'int', default: '1', description: 'Numero de page (commence a 1)' },\r\n { name: 'pageSize', type: 'int', default: '100', description: 'Elements par page (max 500)' },\r\n { name: 'modifiedSince', type: 'DateTime?', default: 'null', description: 'Filtre incremental UTC' },\r\n ],\r\n navigation: [],\r\n};\r\n\r\nfunction getJsonExampleValue(type: string): string {\r\n switch (type) {\r\n case 'Guid': return '\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"';\r\n case 'string': return '\"...\"';\r\n case 'boolean': return 'true';\r\n case 'int': return '0';\r\n case 'DateTime': return '\"2026-01-15T10:30:00Z\"';\r\n case 'string[]': return '[\"item1\", \"item2\"]';\r\n case 'Guid[]': return '[\"uuid1\", \"uuid2\"]';\r\n default: return '\"...\"';\r\n }\r\n}\r\n\r\nfunction addAuthSection(lines: string[]): void {\r\n lines.push('## 1. Authentification (HMAC-JWT Assertion)');\r\n lines.push('');\r\n lines.push('### Etape 1 : Creer une assertion JWT signee HMAC-SHA256');\r\n lines.push('');\r\n lines.push('```');\r\n lines.push('Header: { \"alg\": \"HS256\", \"typ\": \"JWT\" }');\r\n lines.push('Payload: {');\r\n lines.push(' \"sub\": \"<YOUR_CLIENT_ID>\", // ton clientId');\r\n lines.push(' \"iat\": <timestamp-unix-actuel>, // timestamp Unix actuel');\r\n lines.push(' \"exp\": <timestamp-unix + 300>, // expiration (max 5 min apres iat)');\r\n lines.push(' \"jti\": \"<uuid-unique>\" // nonce anti-replay');\r\n lines.push('}');\r\n lines.push('Signature: HMAC-SHA256(header.payload, Base64Decode(clientSecret))');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('**Important** : Le `clientSecret` est encode en Base64. Tu dois le **decoder** avant de l\\'utiliser comme cle HMAC.');\r\n lines.push('');\r\n lines.push('### Etape 2 : Echanger l\\'assertion contre un access token');\r\n lines.push('');\r\n lines.push('```http');\r\n lines.push('POST {baseUrl}/api/auth/external-app/token');\r\n lines.push('Content-Type: application/json');\r\n lines.push('');\r\n lines.push('{ \"assertion\": \"<jwt-assertion-de-etape-1>\" }');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('**Reponse succes (200)** :');\r\n lines.push('```json');\r\n lines.push('{');\r\n lines.push(' \"accessToken\": \"eyJhbGciOiJIUz...\",');\r\n lines.push(' \"expiresAt\": \"2026-02-25T11:00:00Z\",');\r\n lines.push(' \"permissions\": [\"administration.users.read\", ...]');\r\n lines.push('}');\r\n lines.push('```');\r\n lines.push('');\r\n lines.push('Cache le token et renouvelle-le 5 min avant `expiresAt`.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addTenantScopingSection(lines: string[], code: string): void {\r\n if (code !== 'navigation') {\r\n lines.push('## 2. Isolation par tenant (OBLIGATOIRE)');\r\n lines.push('');\r\n lines.push('Le parametre `tenantId` (UUID) est **obligatoire** en query string. Il scope l\\'export aux donnees du tenant specifie. Sans ce parametre, l\\'API retourne une erreur 400.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addEndpointSection(lines: string[], endpoint: DataApiEndpointDto): void {\r\n lines.push(`## 3. Endpoint : ${endpoint.name}`);\r\n lines.push('');\r\n lines.push('```http');\r\n lines.push(`GET {baseUrl}${endpoint.routeTemplate}`);\r\n lines.push('Authorization: Bearer <accessToken>');\r\n lines.push('```');\r\n lines.push('');\r\n}\r\n\r\nfunction addParamsSection(lines: string[], params: typeof endpointQueryParams[string]): void {\r\n if (params.length > 0) {\r\n lines.push('**Parametres (query string)** :');\r\n lines.push('');\r\n lines.push('| Parametre | Type | Defaut | Description |');\r\n lines.push('|-----------|------|--------|-------------|');\r\n for (const p of params) {\r\n lines.push(`| \\`${p.name}\\` | ${p.type} | ${p.default} | ${p.description} |`);\r\n }\r\n lines.push('');\r\n } else {\r\n lines.push('**Aucun parametre** - appel direct sans query string.');\r\n lines.push('');\r\n }\r\n}\r\n\r\nconst buildFieldLines = (schema: typeof responseSchemas[string], isNested: boolean): string[] => {\r\n const lines: string[] = [];\r\n const indent = isNested ? ' ' : ' ';\r\n for (let i = 0; i < schema.fields.length; i++) {\r\n const f = schema.fields[i];\r\n if (f.name.includes('[].')) continue;\r\n const comma = i < schema.fields.length - 1 ? ',' : '';\r\n lines.push(`${indent}\"${f.name}\": ${getJsonExampleValue(f.type)}${comma} // ${f.type}${f.nullable ? '?' : ''} - ${f.description}`);\r\n }\r\n return lines;\r\n};\r\n\r\nconst buildPaginatedResponseExample = (schema: typeof responseSchemas[string]): string[] => {\r\n const lines: string[] = [];\r\n lines.push('**Reponse (paginee)** :');\r\n lines.push('```json');\r\n lines.push('{');\r\n lines.push(' \"items\": [');\r\n lines.push(' {');\r\n lines.push(...buildFieldLines(schema, true));\r\n lines.push(' }');\r\n lines.push(' ],');\r\n lines.push(' \"page\": 1,');\r\n lines.push(' \"pageSize\": 100,');\r\n lines.push(' \"totalCount\": 250,');\r\n lines.push(' \"totalPages\": 3,');\r\n lines.push(' \"hasMore\": true');\r\n lines.push('}');\r\n lines.push('```');\r\n return lines;\r\n};\r\n\r\nconst buildArrayResponseExample = (schema: typeof responseSchemas[string]): string[] => {\r\n const lines: string[] = [];\r\n lines.push('**Reponse (tableau direct, NON pagine)** :');\r\n lines.push('```json');\r\n lines.push('[');\r\n lines.push(' {');\r\n lines.push(...buildFieldLines(schema, false));\r\n lines.push(' }');\r\n lines.push(']');\r\n lines.push('```');\r\n return lines;\r\n};\r\n\r\nfunction buildResponseExample(schema: typeof responseSchemas[string], isPaginated: boolean): string[] {\r\n return isPaginated\r\n ? buildPaginatedResponseExample(schema)\r\n : buildArrayResponseExample(schema);\r\n}\r\n\r\nfunction addResponseSection(lines: string[], schema: typeof responseSchemas[string] | undefined): void {\r\n if (schema) {\r\n const responseLines = buildResponseExample(schema, schema.paginated);\r\n lines.push(...responseLines);\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addRateLimitSection(lines: string[], endpoint: DataApiEndpointDto): void {\r\n lines.push(`**Rate limit** : ${endpoint.defaultRateLimitPerMinute} requetes/minute | Page size max : ${endpoint.defaultMaxPageSize}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addPaginationSection(lines: string[], schema: typeof responseSchemas[string] | undefined): void {\r\n if (schema?.paginated) {\r\n lines.push('## 4. Pagination');\r\n lines.push('');\r\n lines.push('Boucle tant que `hasMore === true`, en incrementant `page`. Les resultats sont tries par `createdAt ASC`.');\r\n lines.push('');\r\n lines.push('## 5. Synchronisation incrementale');\r\n lines.push('');\r\n lines.push('Utilise `modifiedSince` pour ne recuperer que les changements :');\r\n lines.push('1. Premiere synchro : appelle sans `modifiedSince` (recupere tout)');\r\n lines.push('2. Stocke `DateTime.UtcNow` du debut de la synchro');\r\n lines.push('3. Synchros suivantes : passe `modifiedSince=<timestamp-stocke>`');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n }\r\n}\r\n\r\nfunction addRateLimitingDetailSection(lines: string[]): void {\r\n lines.push('## 6. Rate Limiting');\r\n lines.push('');\r\n lines.push('Quand tu depasses la limite :');\r\n lines.push('```');\r\n lines.push('HTTP/1.1 429 Too Many Requests');\r\n lines.push('Retry-After: 42');\r\n lines.push('```');\r\n lines.push('Lis le header `Retry-After` et attends. Implemente un backoff exponentiel.');\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n}\r\n\r\nfunction addErrorHandlingSection(lines: string[]): void {\r\n lines.push('## 7. Gestion des erreurs');\r\n lines.push('');\r\n lines.push('| HTTP | Action |');\r\n lines.push('|------|--------|');\r\n lines.push('| 200 | Traite les donnees |');\r\n lines.push('| 400 | tenantId manquant ou invalide |');\r\n lines.push('| 401 | Renouvelle le token et relance |');\r\n lines.push('| 403 | Acces export non accorde - contacte l\\'admin |');\r\n lines.push('| 404 | Tenant non trouve - verifie le tenantId |');\r\n lines.push('| 429 | Attends `Retry-After` secondes |');\r\n lines.push('| 500 | Retry avec backoff exponentiel |');\r\n}\r\n\r\nfunction generateEndpointPrompt(endpoint: DataApiEndpointDto): string {\r\n const schema = responseSchemas[endpoint.entityType];\r\n const params = endpointQueryParams[endpoint.code] || [];\r\n const lines: string[] = [];\r\n\r\n lines.push('## Contexte');\r\n lines.push('');\r\n lines.push(`Tu dois implementer un client HTTP qui consomme l'endpoint **${endpoint.name}** de l'API DataExport de SmartStack en mode machine-to-machine (M2M). L'application s'authentifie avec un \\`clientId\\` et un \\`clientSecret\\`, obtient un token JWT, puis appelle l'endpoint d'export.`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n\r\n addAuthSection(lines);\r\n addTenantScopingSection(lines, endpoint.code);\r\n addEndpointSection(lines, endpoint);\r\n addParamsSection(lines, params);\r\n addResponseSection(lines, schema);\r\n addRateLimitSection(lines, endpoint);\r\n addPaginationSection(lines, schema);\r\n addRateLimitingDetailSection(lines);\r\n addErrorHandlingSection(lines);\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction generateCurlExample(endpoint: DataApiEndpointDto): string {\r\n const baseUrl = 'https://your-api.smartstack.app';\r\n const route = endpoint.routeTemplate;\r\n const isPaginated = responseSchemas[endpoint.entityType]?.paginated;\r\n\r\n let curl = `curl -X GET \"${baseUrl}${route}`;\r\n if (isPaginated) {\r\n curl += '?page=1&pageSize=100';\r\n }\r\n curl += `\" \\\\\\n -H \"Authorization: Bearer <API_KEY>\" \\\\\\n -H \"Accept: application/json\"`;\r\n return curl;\r\n}\r\n\r\nconst buildExampleFieldValue = (field: { name: string; type: string; nullable?: boolean }): unknown => {\r\n if (field.name === 'modules') return [{ id: '...', code: 'users', label: 'Users' }];\r\n\r\n switch (field.type) {\r\n case 'Guid': return '3fa85f64-5717-4562-b3fc-2c963f66afa6';\r\n case 'string': return field.nullable ? null : `example-${field.name}`;\r\n case 'boolean': return true;\r\n case 'int': return 42;\r\n case 'DateTime': return field.nullable ? null : '2026-02-25T10:00:00Z';\r\n case 'string[]': return ['value1', 'value2'];\r\n case 'Guid[]': return ['3fa85f64-5717-4562-b3fc-2c963f66afa6'];\r\n default: return '...';\r\n }\r\n};\r\n\r\nconst buildExampleItem = (schema: typeof responseSchemas[string]): Record<string, unknown> => {\r\n const exampleItem: Record<string, unknown> = {};\r\n for (const field of schema.fields) {\r\n if (field.name.includes('[].')) continue;\r\n exampleItem[field.name] = buildExampleFieldValue(field);\r\n }\r\n return exampleItem;\r\n};\r\n\r\nfunction generateJsonExample(endpoint: DataApiEndpointDto): string {\r\n const schema = responseSchemas[endpoint.entityType];\r\n if (!schema) return '// Schema not available';\r\n\r\n const exampleItem = buildExampleItem(schema);\r\n const responseBody = schema.paginated\r\n ? { items: [exampleItem], page: 1, pageSize: 100, totalCount: 1, totalPages: 1, hasMore: false }\r\n : [exampleItem];\r\n\r\n return JSON.stringify(responseBody, null, 2);\r\n}\r\n\r\nfunction CopyButton({ text }: { text: string }) {\r\n const [copied, setCopied] = useState(false);\r\n const handleCopy = async () => {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n };\r\n return (\r\n <button\r\n onClick={handleCopy}\r\n className=\"absolute top-2 right-2 p-1.5 rounded-md bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)] transition-colors\"\r\n title=\"Copy\"\r\n >\r\n {copied ? <Check className=\"h-4 w-4 text-[var(--success-text)]\" /> : <Copy className=\"h-4 w-4\" />}\r\n </button>\r\n );\r\n}\r\n\r\nfunction PromptBlocksContent({ prompt }: { prompt: AiSkillDetailDto }) {\r\n return (\r\n <div className=\"space-y-3\">\r\n {prompt.blocks\r\n .filter(b => b.isEnabled !== false)\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .map((block) => (\r\n <div key={block.id} className=\"rounded-lg border border-[var(--border-color)] overflow-hidden\">\r\n <div className=\"flex items-center gap-2 px-4 py-2 bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {block.blockType}\r\n </span>\r\n {block.label && (\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{block.label}</span>\r\n )}\r\n </div>\r\n <div className=\"relative p-4\">\r\n <CopyButton text={block.content} />\r\n <pre className=\"text-sm font-mono text-[var(--text-secondary)] whitespace-pre-wrap pr-10\">\r\n {block.content}\r\n </pre>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction PromptVariablesContent({ variables, t }: { variables: string[]; t: any }) {\r\n return (\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-tertiary)] mb-2\">{t('externalApps.apis.catalog.detail.variables')}</h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {variables.map(v => (\r\n <code key={v} className=\"rounded bg-[var(--bg-secondary)] px-2 py-1 text-xs font-mono text-[var(--color-primary-600)]\">\r\n {`{${v}}`}\r\n </code>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction LoadedPromptContent({ t, prompt }: { t: any; prompt: AiSkillDetailDto }) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">{prompt.name}</h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n v{prompt.version} · {prompt.status}\r\n {prompt.description && <> · {prompt.description}</>}\r\n </p>\r\n </div>\r\n <a\r\n href={`/administration/ai/skills/${prompt.id}`}\r\n className=\"text-sm text-[var(--color-primary-600)] hover:underline\"\r\n >\r\n {t('externalApps.apis.catalog.detail.viewPrompt')}\r\n </a>\r\n </div>\r\n {(prompt.blocks?.length ?? 0) > 0 && (\r\n <PromptBlocksContent prompt={prompt} />\r\n )}\r\n {(prompt.variables?.length ?? 0) > 0 && (\r\n <PromptVariablesContent variables={prompt.variables} t={t} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction GeneratedPromptContent({ t, endpoint, generatedPrompt }: { t: any; endpoint: DataApiEndpointDto; generatedPrompt: string }) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-medium text-[var(--text-primary)]\">\r\n {t('externalApps.apis.catalog.detail.generatedPromptTitle')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n {t('externalApps.apis.catalog.detail.generatedPromptHint', { code: `data-export-${endpoint.code}` })}\r\n </p>\r\n </div>\r\n <CopyButton text={generatedPrompt} />\r\n </div>\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] whitespace-pre-wrap overflow-x-auto max-h-[600px] overflow-y-auto leading-relaxed\">\r\n {generatedPrompt}\r\n </pre>\r\n </div>\r\n );\r\n}\r\n\r\nasync function tryLoadPrompt(endpointCode: string): Promise<AiSkillDetailDto | null> {\r\n const codesToTry = [\r\n `data-export-${endpointCode}`,\r\n `export-${endpointCode}`,\r\n endpointCode,\r\n ];\r\n\r\n for (const code of codesToTry) {\r\n try {\r\n const detail = await aiApi.skills.getByCode(code);\r\n if (detail) return detail;\r\n } catch {\r\n // Code not found (404), try next\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function ApiCatalogDetailPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { endpointCode } = useParams<{ endpointCode: string }>();\r\n const navigate = useNavigate();\r\n const [endpoint, setEndpoint] = useState<DataApiEndpointDto | null>(null);\r\n const [prompt, setPrompt] = useState<AiSkillDetailDto | null>(null);\r\n const [promptLoading, setPromptLoading] = useState(false);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const endpoints = await adminApi.externalApps.getApiEndpoints();\r\n if (cancelled) return;\r\n\r\n const found = endpoints.find(ep => ep.code === endpointCode);\r\n if (!found) {\r\n setError('Endpoint not found');\r\n return;\r\n }\r\n setEndpoint(found);\r\n\r\n setPromptLoading(true);\r\n try {\r\n const detail = await tryLoadPrompt(found.code);\r\n if (!cancelled && detail) {\r\n setPrompt(detail);\r\n }\r\n } catch {\r\n // Prompts are optional, ignore errors\r\n } finally {\r\n if (!cancelled) setPromptLoading(false);\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : 'Failed to load endpoint');\r\n }\r\n } finally {\r\n if (!cancelled) setLoading(false);\r\n }\r\n };\r\n fetchData();\r\n\r\n return () => { cancelled = true; };\r\n }, [endpointCode]);\r\n\r\n const schema = useMemo(() => endpoint ? responseSchemas[endpoint.entityType] : null, [endpoint]);\r\n const curlExample = useMemo(() => endpoint ? generateCurlExample(endpoint) : '', [endpoint]);\r\n const jsonExample = useMemo(() => endpoint ? generateJsonExample(endpoint) : '', [endpoint]);\r\n const generatedPrompt = useMemo(() => endpoint ? generateEndpointPrompt(endpoint) : '', [endpoint]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !endpoint) {\r\n return (\r\n <div className=\"space-y-4\">\r\n <button onClick={() => navigate(-1)} className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\">\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n {t('common:back')}\r\n </button>\r\n <div className=\"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error || 'Endpoint not found'}</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('externalApps.navigation.api'), href: '/api' },\r\n { label: t('externalApps.apis.catalog.title'), href: '/api/apis/catalog' },\r\n { label: endpoint.name }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-start gap-4\">\r\n <button onClick={() => navigate(-1)} className=\"mt-1 p-2 rounded-md hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] transition-colors\">\r\n <ArrowLeft className=\"h-5 w-5\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <BookOpen className=\"h-7 w-7 text-[var(--color-accent-600)]\" />\r\n <h1 className=\"text-3xl font-bold text-[var(--text-primary)]\">{endpoint.name}</h1>\r\n <div className=\"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium\">\r\n {endpoint.isActive ? (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--success-text)]\" />\r\n <span className=\"text-[var(--success-text)]\">{t('externalApps.apis.catalog.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"h-2 w-2 rounded-full bg-[var(--warning-text)]\" />\r\n <span className=\"text-[var(--warning-text)]\">{t('externalApps.apis.catalog.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n {endpoint.description && (\r\n <p className=\"mt-2 text-[var(--text-secondary)]\">{endpoint.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Metadata cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Layers className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.application')}</span>\r\n </div>\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-sm font-medium text-[var(--info-text)]\">\r\n {endpoint.applicationLabel}\r\n </span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Database className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.module')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.moduleLabel}</span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Zap className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.rateLimit')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.defaultRateLimitPerMinute}/min</span>\r\n </div>\r\n <div className=\"card p-4 border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Clock className=\"h-4 w-4\" />\r\n <span className=\"text-xs font-medium uppercase\">{t('externalApps.apis.catalog.columns.maxPageSize')}</span>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.defaultMaxPageSize}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Technical details */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.technical')}</h2>\r\n </div>\r\n <div className=\"p-6 grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.route')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--color-primary-600)]\">\r\n GET {endpoint.routeTemplate}\r\n </code>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.permission')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <Shield className=\"h-4 w-4 text-[var(--warning-text)]\" />\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]\">\r\n {endpoint.requiredPermission}\r\n </code>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.entityType')}</label>\r\n <div className=\"mt-1 flex items-center gap-2\">\r\n <Database className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{endpoint.entityType}</span>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"text-xs font-medium uppercase text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.columns.code')}</label>\r\n <div className=\"mt-1\">\r\n <code className=\"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]\">\r\n {endpoint.code}\r\n </code>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* cURL Example */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Code2 className=\"h-5 w-5 text-[var(--text-tertiary)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.curlExample')}</h2>\r\n </div>\r\n </div>\r\n <div className=\"p-6 relative\">\r\n <CopyButton text={curlExample} />\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto whitespace-pre-wrap\">\r\n {curlExample}\r\n </pre>\r\n </div>\r\n </div>\r\n\r\n {/* Response Schema */}\r\n {schema && (\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileCode2 className=\"h-5 w-5 text-[var(--text-tertiary)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.responseSchema')}</h2>\r\n </div>\r\n {schema.paginated && (\r\n <span className=\"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-xs font-medium text-[var(--info-text)]\">\r\n {t('externalApps.apis.catalog.detail.paginated')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.field')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.type')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.nullable')}</th>\r\n <th className=\"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('externalApps.apis.catalog.detail.fieldDescription')}</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {schema.fields.map((field) => (\r\n <tr key={field.name} className=\"hover:bg-[var(--bg-hover)] transition-colors\">\r\n <td className=\"px-6 py-3\">\r\n <code className=\"text-sm font-mono text-[var(--color-primary-600)]\">{field.name}</code>\r\n </td>\r\n <td className=\"px-6 py-3\">\r\n <code className=\"rounded bg-[var(--bg-secondary)] px-2 py-0.5 text-xs font-mono text-[var(--text-secondary)]\">{field.type}</code>\r\n </td>\r\n <td className=\"px-6 py-3 text-sm text-[var(--text-secondary)]\">\r\n {field.nullable ? '?' : '-'}\r\n </td>\r\n <td className=\"px-6 py-3 text-sm text-[var(--text-secondary)]\">{field.description}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* JSON Example */}\r\n <div className=\"border-t border-[var(--border-color)] p-6\">\r\n <h3 className=\"text-sm font-semibold text-[var(--text-tertiary)] uppercase mb-3\">{t('externalApps.apis.catalog.detail.jsonExample')}</h3>\r\n <div className=\"relative\">\r\n <CopyButton text={jsonExample} />\r\n <pre className=\"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto max-h-96 overflow-y-auto\">\r\n {jsonExample}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* AI Prompt section */}\r\n <div className=\"card border border-[var(--border-color)]\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Brain className=\"h-5 w-5 text-[var(--color-accent-600)]\" />\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">{t('externalApps.apis.catalog.detail.dedicatedPrompt')}</h2>\r\n </div>\r\n <p className=\"mt-1 text-sm text-[var(--text-tertiary)]\">{t('externalApps.apis.catalog.detail.promptDescription')}</p>\r\n </div>\r\n <div className=\"p-6\">\r\n {promptLoading && (\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)]\">\r\n <Loader2 className=\"h-4 w-4 animate-spin\" />\r\n <span className=\"text-sm\">{t('common:loading')}</span>\r\n </div>\r\n )}\r\n {!promptLoading && prompt && (\r\n <LoadedPromptContent t={t} prompt={prompt} />\r\n )}\r\n {!promptLoading && !prompt && (\r\n <GeneratedPromptContent t={t} endpoint={endpoint} generatedPrompt={generatedPrompt} />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["responseSchemas","endpointQueryParams","getJsonExampleValue","type","addAuthSection","lines","addTenantScopingSection","code","addEndpointSection","endpoint","addParamsSection","params","p","buildFieldLines","schema","isNested","indent","i","f","comma","buildPaginatedResponseExample","buildArrayResponseExample","buildResponseExample","isPaginated","addResponseSection","responseLines","addRateLimitSection","addPaginationSection","addRateLimitingDetailSection","addErrorHandlingSection","generateEndpointPrompt","generateCurlExample","baseUrl","route","curl","buildExampleFieldValue","field","buildExampleItem","exampleItem","generateJsonExample","responseBody","CopyButton","text","copied","setCopied","useState","jsx","Check","Copy","PromptBlocksContent","prompt","b","a","block","jsxs","PromptVariablesContent","variables","v","LoadedPromptContent","t","Fragment","GeneratedPromptContent","generatedPrompt","tryLoadPrompt","endpointCode","codesToTry","detail","aiApi","ApiCatalogDetailPage","useTranslation","useParams","navigate","useNavigate","setEndpoint","setPrompt","promptLoading","setPromptLoading","loading","setLoading","error","setError","useEffect","cancelled","endpoints","adminApi","found","ep","err","useMemo","curlExample","jsonExample","Loader2","ArrowLeft","AlertTriangle","Breadcrumb","BookOpen","Layers","Database","Zap","Clock","Shield","Code2","FileCode2","Brain"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),c=require("react"),T=require("react-router-dom"),P=require("react-i18next"),n=require("lucide-react"),S=require("./index-2wUhd9Lu.js"),U=require("./aiApi-CsH8DXgs.js"),m={User:{paginated:!0,fields:[{name:"id",type:"Guid",description:"Unique user identifier"},{name:"email",type:"string",description:"User email address"},{name:"firstName",type:"string",description:"First name",nullable:!0},{name:"lastName",type:"string",description:"Last name",nullable:!0},{name:"displayName",type:"string",description:"Display name",nullable:!0},{name:"isActive",type:"boolean",description:"Account active status"},{name:"createdAt",type:"DateTime",description:"Creation date (UTC)"},{name:"updatedAt",type:"DateTime",description:"Last update date (UTC)",nullable:!0},{name:"roles",type:"string[]",description:"Assigned role names"},{name:"tenantIds",type:"Guid[]",description:"Associated tenant identifiers"}]},Tenant:{paginated:!0,fields:[{name:"id",type:"Guid",description:"Unique tenant identifier"},{name:"name",type:"string",description:"Tenant name"},{name:"slug",type:"string",description:"URL-friendly slug"},{name:"type",type:"string",description:"Tenant type (B2C/B2B)"},{name:"status",type:"string",description:"Current status"},{name:"description",type:"string",description:"Tenant description",nullable:!0},{name:"createdAt",type:"DateTime",description:"Creation date (UTC)"},{name:"updatedAt",type:"DateTime",description:"Last update date (UTC)",nullable:!0},{name:"memberCount",type:"int",description:"Number of active members"}]},Role:{paginated:!0,fields:[{name:"id",type:"Guid",description:"Unique role identifier"},{name:"name",type:"string",description:"Role display name"},{name:"shortName",type:"string",description:"Short name",nullable:!0},{name:"code",type:"string",description:"Unique role code",nullable:!0},{name:"category",type:"string",description:"Role category"},{name:"description",type:"string",description:"Role description",nullable:!0},{name:"isSystem",type:"boolean",description:"System-managed role flag"},{name:"createdAt",type:"DateTime",description:"Creation date (UTC)"},{name:"updatedAt",type:"DateTime",description:"Last update date (UTC)",nullable:!0},{name:"permissions",type:"string[]",description:"Assigned permission codes"}]},Ticket:{paginated:!0,fields:[{name:"id",type:"Guid",description:"Unique ticket identifier"},{name:"title",type:"string",description:"Ticket title"},{name:"type",type:"string",description:"Ticket type (Incident/Request/Task)"},{name:"status",type:"string",description:"Current status"},{name:"priority",type:"string",description:"Priority level"},{name:"assignedToUserId",type:"Guid",description:"Assigned user",nullable:!0},{name:"createdByUserId",type:"Guid",description:"Creator user"},{name:"tenantId",type:"Guid",description:"Owning tenant",nullable:!0},{name:"createdAt",type:"DateTime",description:"Creation date (UTC)"},{name:"updatedAt",type:"DateTime",description:"Last update date (UTC)",nullable:!0},{name:"resolvedAt",type:"DateTime",description:"Resolution date",nullable:!0},{name:"closedAt",type:"DateTime",description:"Closing date",nullable:!0}]},NavigationApplication:{paginated:!1,fields:[{name:"id",type:"Guid",description:"Application identifier"},{name:"code",type:"string",description:"Application code"},{name:"label",type:"string",description:"Display label"},{name:"modules",type:"Module[]",description:"Child modules"},{name:"modules[].id",type:"Guid",description:"Module identifier"},{name:"modules[].code",type:"string",description:"Module code"},{name:"modules[].label",type:"string",description:"Module display label"}]}},I={users:[{name:"tenantId",type:"UUID",default:"(requis)",description:"ID du tenant - scope aux utilisateurs de ce tenant"},{name:"page",type:"int",default:"1",description:"Numero de page (commence a 1)"},{name:"pageSize",type:"int",default:"100",description:"Elements par page (max 1000)"},{name:"modifiedSince",type:"DateTime?",default:"null",description:"Filtre incremental UTC"},{name:"isActive",type:"bool?",default:"null",description:"Filtre par statut actif/inactif"}],tenants:[{name:"tenantId",type:"UUID",default:"(requis)",description:"ID du tenant a exporter"},{name:"page",type:"int",default:"1",description:"Numero de page (commence a 1)"},{name:"pageSize",type:"int",default:"100",description:"Elements par page (max 1000)"},{name:"modifiedSince",type:"DateTime?",default:"null",description:"Filtre incremental UTC"}],roles:[{name:"tenantId",type:"UUID",default:"(requis)",description:"ID du tenant - exporte les roles de ce tenant"},{name:"page",type:"int",default:"1",description:"Numero de page (commence a 1)"},{name:"pageSize",type:"int",default:"100",description:"Elements par page (max 1000)"},{name:"modifiedSince",type:"DateTime?",default:"null",description:"Filtre incremental UTC"}],tickets:[{name:"tenantId",type:"UUID",default:"(requis)",description:"ID du tenant - exporte les tickets de ce tenant"},{name:"page",type:"int",default:"1",description:"Numero de page (commence a 1)"},{name:"pageSize",type:"int",default:"100",description:"Elements par page (max 500)"},{name:"modifiedSince",type:"DateTime?",default:"null",description:"Filtre incremental UTC"}],navigation:[]};function E(e){switch(e){case"Guid":return'"3fa85f64-5717-4562-b3fc-2c963f66afa6"';case"string":return'"..."';case"boolean":return"true";case"int":return"0";case"DateTime":return'"2026-01-15T10:30:00Z"';case"string[]":return'["item1", "item2"]';case"Guid[]":return'["uuid1", "uuid2"]';default:return'"..."'}}function L(e){e.push("## 1. Authentification (HMAC-JWT Assertion)"),e.push(""),e.push("### Etape 1 : Creer une assertion JWT signee HMAC-SHA256"),e.push(""),e.push("```"),e.push('Header: { "alg": "HS256", "typ": "JWT" }'),e.push("Payload: {"),e.push(' "sub": "<YOUR_CLIENT_ID>", // ton clientId'),e.push(' "iat": <timestamp-unix-actuel>, // timestamp Unix actuel'),e.push(' "exp": <timestamp-unix + 300>, // expiration (max 5 min apres iat)'),e.push(' "jti": "<uuid-unique>" // nonce anti-replay'),e.push("}"),e.push("Signature: HMAC-SHA256(header.payload, Base64Decode(clientSecret))"),e.push("```"),e.push(""),e.push("**Important** : Le `clientSecret` est encode en Base64. Tu dois le **decoder** avant de l'utiliser comme cle HMAC."),e.push(""),e.push("### Etape 2 : Echanger l'assertion contre un access token"),e.push(""),e.push("```http"),e.push("POST {baseUrl}/api/auth/external-app/token"),e.push("Content-Type: application/json"),e.push(""),e.push('{ "assertion": "<jwt-assertion-de-etape-1>" }'),e.push("```"),e.push(""),e.push("**Reponse succes (200)** :"),e.push("```json"),e.push("{"),e.push(' "accessToken": "eyJhbGciOiJIUz...",'),e.push(' "expiresAt": "2026-02-25T11:00:00Z",'),e.push(' "permissions": ["administration.users.read", ...]'),e.push("}"),e.push("```"),e.push(""),e.push("Cache le token et renouvelle-le 5 min avant `expiresAt`."),e.push(""),e.push("---"),e.push("")}function k(e,a){a!=="navigation"&&(e.push("## 2. Isolation par tenant (OBLIGATOIRE)"),e.push(""),e.push("Le parametre `tenantId` (UUID) est **obligatoire** en query string. Il scope l'export aux donnees du tenant specifie. Sans ce parametre, l'API retourne une erreur 400."),e.push(""),e.push("---"),e.push(""))}function R(e,a){e.push(`## 3. Endpoint : ${a.name}`),e.push(""),e.push("```http"),e.push(`GET {baseUrl}${a.routeTemplate}`),e.push("Authorization: Bearer <accessToken>"),e.push("```"),e.push("")}function q(e,a){if(a.length>0){e.push("**Parametres (query string)** :"),e.push(""),e.push("| Parametre | Type | Defaut | Description |"),e.push("|-----------|------|--------|-------------|");for(const r of a)e.push(`| \`${r.name}\` | ${r.type} | ${r.default} | ${r.description} |`);e.push("")}else e.push("**Aucun parametre** - appel direct sans query string."),e.push("")}const w=(e,a)=>{const r=[],s=a?" ":" ";for(let o=0;o<e.fields.length;o++){const d=e.fields[o];if(d.name.includes("[]."))continue;const x=o<e.fields.length-1?",":"";r.push(`${s}"${d.name}": ${E(d.type)}${x} // ${d.type}${d.nullable?"?":""} - ${d.description}`)}return r},$=e=>{const a=[];return a.push("**Reponse (paginee)** :"),a.push("```json"),a.push("{"),a.push(' "items": ['),a.push(" {"),a.push(...w(e,!0)),a.push(" }"),a.push(" ],"),a.push(' "page": 1,'),a.push(' "pageSize": 100,'),a.push(' "totalCount": 250,'),a.push(' "totalPages": 3,'),a.push(' "hasMore": true'),a.push("}"),a.push("```"),a},M=e=>{const a=[];return a.push("**Reponse (tableau direct, NON pagine)** :"),a.push("```json"),a.push("["),a.push(" {"),a.push(...w(e,!1)),a.push(" }"),a.push("]"),a.push("```"),a};function G(e,a){return a?$(e):M(e)}function B(e,a){if(a){const r=G(a,a.paginated);e.push(...r),e.push("")}}function H(e,a){e.push(`**Rate limit** : ${a.defaultRateLimitPerMinute} requetes/minute | Page size max : ${a.defaultMaxPageSize}`),e.push(""),e.push("---"),e.push("")}function z(e,a){a?.paginated&&(e.push("## 4. Pagination"),e.push(""),e.push("Boucle tant que `hasMore === true`, en incrementant `page`. Les resultats sont tries par `createdAt ASC`."),e.push(""),e.push("## 5. Synchronisation incrementale"),e.push(""),e.push("Utilise `modifiedSince` pour ne recuperer que les changements :"),e.push("1. Premiere synchro : appelle sans `modifiedSince` (recupere tout)"),e.push("2. Stocke `DateTime.UtcNow` du debut de la synchro"),e.push("3. Synchros suivantes : passe `modifiedSince=<timestamp-stocke>`"),e.push(""),e.push("---"),e.push(""))}function F(e){e.push("## 6. Rate Limiting"),e.push(""),e.push("Quand tu depasses la limite :"),e.push("```"),e.push("HTTP/1.1 429 Too Many Requests"),e.push("Retry-After: 42"),e.push("```"),e.push("Lis le header `Retry-After` et attends. Implemente un backoff exponentiel."),e.push(""),e.push("---"),e.push("")}function O(e){e.push("## 7. Gestion des erreurs"),e.push(""),e.push("| HTTP | Action |"),e.push("|------|--------|"),e.push("| 200 | Traite les donnees |"),e.push("| 400 | tenantId manquant ou invalide |"),e.push("| 401 | Renouvelle le token et relance |"),e.push("| 403 | Acces export non accorde - contacte l'admin |"),e.push("| 404 | Tenant non trouve - verifie le tenantId |"),e.push("| 429 | Attends `Retry-After` secondes |"),e.push("| 500 | Retry avec backoff exponentiel |")}function J(e){const a=m[e.entityType],r=I[e.code]||[],s=[];return s.push("## Contexte"),s.push(""),s.push(`Tu dois implementer un client HTTP qui consomme l'endpoint **${e.name}** de l'API DataExport de SmartStack en mode machine-to-machine (M2M). L'application s'authentifie avec un \`clientId\` et un \`clientSecret\`, obtient un token JWT, puis appelle l'endpoint d'export.`),s.push(""),s.push("---"),s.push(""),L(s),k(s,e.code),R(s,e),q(s,r),B(s,a),H(s,e),z(s,a),F(s),O(s),s.join(`
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),c=require("react"),T=require("react-router-dom"),P=require("react-i18next"),n=require("lucide-react"),S=require("./index-IgLVXPg8.js"),U=require("./aiApi-B20Teu2v.js"),m={User:{paginated:!0,fields:[{name:"id",type:"Guid",description:"Unique user identifier"},{name:"email",type:"string",description:"User email address"},{name:"firstName",type:"string",description:"First name",nullable:!0},{name:"lastName",type:"string",description:"Last name",nullable:!0},{name:"displayName",type:"string",description:"Display name",nullable:!0},{name:"isActive",type:"boolean",description:"Account active status"},{name:"createdAt",type:"DateTime",description:"Creation date (UTC)"},{name:"updatedAt",type:"DateTime",description:"Last update date (UTC)",nullable:!0},{name:"roles",type:"string[]",description:"Assigned role names"},{name:"tenantIds",type:"Guid[]",description:"Associated tenant identifiers"}]},Tenant:{paginated:!0,fields:[{name:"id",type:"Guid",description:"Unique tenant identifier"},{name:"name",type:"string",description:"Tenant name"},{name:"slug",type:"string",description:"URL-friendly slug"},{name:"type",type:"string",description:"Tenant type (B2C/B2B)"},{name:"status",type:"string",description:"Current status"},{name:"description",type:"string",description:"Tenant description",nullable:!0},{name:"createdAt",type:"DateTime",description:"Creation date (UTC)"},{name:"updatedAt",type:"DateTime",description:"Last update date (UTC)",nullable:!0},{name:"memberCount",type:"int",description:"Number of active members"}]},Role:{paginated:!0,fields:[{name:"id",type:"Guid",description:"Unique role identifier"},{name:"name",type:"string",description:"Role display name"},{name:"shortName",type:"string",description:"Short name",nullable:!0},{name:"code",type:"string",description:"Unique role code",nullable:!0},{name:"category",type:"string",description:"Role category"},{name:"description",type:"string",description:"Role description",nullable:!0},{name:"isSystem",type:"boolean",description:"System-managed role flag"},{name:"createdAt",type:"DateTime",description:"Creation date (UTC)"},{name:"updatedAt",type:"DateTime",description:"Last update date (UTC)",nullable:!0},{name:"permissions",type:"string[]",description:"Assigned permission codes"}]},Ticket:{paginated:!0,fields:[{name:"id",type:"Guid",description:"Unique ticket identifier"},{name:"title",type:"string",description:"Ticket title"},{name:"type",type:"string",description:"Ticket type (Incident/Request/Task)"},{name:"status",type:"string",description:"Current status"},{name:"priority",type:"string",description:"Priority level"},{name:"assignedToUserId",type:"Guid",description:"Assigned user",nullable:!0},{name:"createdByUserId",type:"Guid",description:"Creator user"},{name:"tenantId",type:"Guid",description:"Owning tenant",nullable:!0},{name:"createdAt",type:"DateTime",description:"Creation date (UTC)"},{name:"updatedAt",type:"DateTime",description:"Last update date (UTC)",nullable:!0},{name:"resolvedAt",type:"DateTime",description:"Resolution date",nullable:!0},{name:"closedAt",type:"DateTime",description:"Closing date",nullable:!0}]},NavigationApplication:{paginated:!1,fields:[{name:"id",type:"Guid",description:"Application identifier"},{name:"code",type:"string",description:"Application code"},{name:"label",type:"string",description:"Display label"},{name:"modules",type:"Module[]",description:"Child modules"},{name:"modules[].id",type:"Guid",description:"Module identifier"},{name:"modules[].code",type:"string",description:"Module code"},{name:"modules[].label",type:"string",description:"Module display label"}]}},I={users:[{name:"tenantId",type:"UUID",default:"(requis)",description:"ID du tenant - scope aux utilisateurs de ce tenant"},{name:"page",type:"int",default:"1",description:"Numero de page (commence a 1)"},{name:"pageSize",type:"int",default:"100",description:"Elements par page (max 1000)"},{name:"modifiedSince",type:"DateTime?",default:"null",description:"Filtre incremental UTC"},{name:"isActive",type:"bool?",default:"null",description:"Filtre par statut actif/inactif"}],tenants:[{name:"tenantId",type:"UUID",default:"(requis)",description:"ID du tenant a exporter"},{name:"page",type:"int",default:"1",description:"Numero de page (commence a 1)"},{name:"pageSize",type:"int",default:"100",description:"Elements par page (max 1000)"},{name:"modifiedSince",type:"DateTime?",default:"null",description:"Filtre incremental UTC"}],roles:[{name:"tenantId",type:"UUID",default:"(requis)",description:"ID du tenant - exporte les roles de ce tenant"},{name:"page",type:"int",default:"1",description:"Numero de page (commence a 1)"},{name:"pageSize",type:"int",default:"100",description:"Elements par page (max 1000)"},{name:"modifiedSince",type:"DateTime?",default:"null",description:"Filtre incremental UTC"}],tickets:[{name:"tenantId",type:"UUID",default:"(requis)",description:"ID du tenant - exporte les tickets de ce tenant"},{name:"page",type:"int",default:"1",description:"Numero de page (commence a 1)"},{name:"pageSize",type:"int",default:"100",description:"Elements par page (max 500)"},{name:"modifiedSince",type:"DateTime?",default:"null",description:"Filtre incremental UTC"}],navigation:[]};function E(e){switch(e){case"Guid":return'"3fa85f64-5717-4562-b3fc-2c963f66afa6"';case"string":return'"..."';case"boolean":return"true";case"int":return"0";case"DateTime":return'"2026-01-15T10:30:00Z"';case"string[]":return'["item1", "item2"]';case"Guid[]":return'["uuid1", "uuid2"]';default:return'"..."'}}function L(e){e.push("## 1. Authentification (HMAC-JWT Assertion)"),e.push(""),e.push("### Etape 1 : Creer une assertion JWT signee HMAC-SHA256"),e.push(""),e.push("```"),e.push('Header: { "alg": "HS256", "typ": "JWT" }'),e.push("Payload: {"),e.push(' "sub": "<YOUR_CLIENT_ID>", // ton clientId'),e.push(' "iat": <timestamp-unix-actuel>, // timestamp Unix actuel'),e.push(' "exp": <timestamp-unix + 300>, // expiration (max 5 min apres iat)'),e.push(' "jti": "<uuid-unique>" // nonce anti-replay'),e.push("}"),e.push("Signature: HMAC-SHA256(header.payload, Base64Decode(clientSecret))"),e.push("```"),e.push(""),e.push("**Important** : Le `clientSecret` est encode en Base64. Tu dois le **decoder** avant de l'utiliser comme cle HMAC."),e.push(""),e.push("### Etape 2 : Echanger l'assertion contre un access token"),e.push(""),e.push("```http"),e.push("POST {baseUrl}/api/auth/external-app/token"),e.push("Content-Type: application/json"),e.push(""),e.push('{ "assertion": "<jwt-assertion-de-etape-1>" }'),e.push("```"),e.push(""),e.push("**Reponse succes (200)** :"),e.push("```json"),e.push("{"),e.push(' "accessToken": "eyJhbGciOiJIUz...",'),e.push(' "expiresAt": "2026-02-25T11:00:00Z",'),e.push(' "permissions": ["administration.users.read", ...]'),e.push("}"),e.push("```"),e.push(""),e.push("Cache le token et renouvelle-le 5 min avant `expiresAt`."),e.push(""),e.push("---"),e.push("")}function k(e,a){a!=="navigation"&&(e.push("## 2. Isolation par tenant (OBLIGATOIRE)"),e.push(""),e.push("Le parametre `tenantId` (UUID) est **obligatoire** en query string. Il scope l'export aux donnees du tenant specifie. Sans ce parametre, l'API retourne une erreur 400."),e.push(""),e.push("---"),e.push(""))}function R(e,a){e.push(`## 3. Endpoint : ${a.name}`),e.push(""),e.push("```http"),e.push(`GET {baseUrl}${a.routeTemplate}`),e.push("Authorization: Bearer <accessToken>"),e.push("```"),e.push("")}function q(e,a){if(a.length>0){e.push("**Parametres (query string)** :"),e.push(""),e.push("| Parametre | Type | Defaut | Description |"),e.push("|-----------|------|--------|-------------|");for(const r of a)e.push(`| \`${r.name}\` | ${r.type} | ${r.default} | ${r.description} |`);e.push("")}else e.push("**Aucun parametre** - appel direct sans query string."),e.push("")}const w=(e,a)=>{const r=[],s=a?" ":" ";for(let o=0;o<e.fields.length;o++){const d=e.fields[o];if(d.name.includes("[]."))continue;const x=o<e.fields.length-1?",":"";r.push(`${s}"${d.name}": ${E(d.type)}${x} // ${d.type}${d.nullable?"?":""} - ${d.description}`)}return r},$=e=>{const a=[];return a.push("**Reponse (paginee)** :"),a.push("```json"),a.push("{"),a.push(' "items": ['),a.push(" {"),a.push(...w(e,!0)),a.push(" }"),a.push(" ],"),a.push(' "page": 1,'),a.push(' "pageSize": 100,'),a.push(' "totalCount": 250,'),a.push(' "totalPages": 3,'),a.push(' "hasMore": true'),a.push("}"),a.push("```"),a},M=e=>{const a=[];return a.push("**Reponse (tableau direct, NON pagine)** :"),a.push("```json"),a.push("["),a.push(" {"),a.push(...w(e,!1)),a.push(" }"),a.push("]"),a.push("```"),a};function G(e,a){return a?$(e):M(e)}function B(e,a){if(a){const r=G(a,a.paginated);e.push(...r),e.push("")}}function H(e,a){e.push(`**Rate limit** : ${a.defaultRateLimitPerMinute} requetes/minute | Page size max : ${a.defaultMaxPageSize}`),e.push(""),e.push("---"),e.push("")}function z(e,a){a?.paginated&&(e.push("## 4. Pagination"),e.push(""),e.push("Boucle tant que `hasMore === true`, en incrementant `page`. Les resultats sont tries par `createdAt ASC`."),e.push(""),e.push("## 5. Synchronisation incrementale"),e.push(""),e.push("Utilise `modifiedSince` pour ne recuperer que les changements :"),e.push("1. Premiere synchro : appelle sans `modifiedSince` (recupere tout)"),e.push("2. Stocke `DateTime.UtcNow` du debut de la synchro"),e.push("3. Synchros suivantes : passe `modifiedSince=<timestamp-stocke>`"),e.push(""),e.push("---"),e.push(""))}function F(e){e.push("## 6. Rate Limiting"),e.push(""),e.push("Quand tu depasses la limite :"),e.push("```"),e.push("HTTP/1.1 429 Too Many Requests"),e.push("Retry-After: 42"),e.push("```"),e.push("Lis le header `Retry-After` et attends. Implemente un backoff exponentiel."),e.push(""),e.push("---"),e.push("")}function O(e){e.push("## 7. Gestion des erreurs"),e.push(""),e.push("| HTTP | Action |"),e.push("|------|--------|"),e.push("| 200 | Traite les donnees |"),e.push("| 400 | tenantId manquant ou invalide |"),e.push("| 401 | Renouvelle le token et relance |"),e.push("| 403 | Acces export non accorde - contacte l'admin |"),e.push("| 404 | Tenant non trouve - verifie le tenantId |"),e.push("| 429 | Attends `Retry-After` secondes |"),e.push("| 500 | Retry avec backoff exponentiel |")}function J(e){const a=m[e.entityType],r=I[e.code]||[],s=[];return s.push("## Contexte"),s.push(""),s.push(`Tu dois implementer un client HTTP qui consomme l'endpoint **${e.name}** de l'API DataExport de SmartStack en mode machine-to-machine (M2M). L'application s'authentifie avec un \`clientId\` et un \`clientSecret\`, obtient un token JWT, puis appelle l'endpoint d'export.`),s.push(""),s.push("---"),s.push(""),L(s),k(s,e.code),R(s,e),q(s,r),B(s,a),H(s,e),z(s,a),F(s),O(s),s.join(`
|
|
2
2
|
`)}function W(e){const a="https://your-api.smartstack.app",r=e.routeTemplate,s=m[e.entityType]?.paginated;let o=`curl -X GET "${a}${r}`;return s&&(o+="?page=1&pageSize=100"),o+=`" \\
|
|
3
3
|
-H "Authorization: Bearer <API_KEY>" \\
|
|
4
4
|
-H "Accept: application/json"`,o}const Z=e=>{if(e.name==="modules")return[{id:"...",code:"users",label:"Users"}];switch(e.type){case"Guid":return"3fa85f64-5717-4562-b3fc-2c963f66afa6";case"string":return e.nullable?null:`example-${e.name}`;case"boolean":return!0;case"int":return 42;case"DateTime":return e.nullable?null:"2026-02-25T10:00:00Z";case"string[]":return["value1","value2"];case"Guid[]":return["3fa85f64-5717-4562-b3fc-2c963f66afa6"];default:return"..."}},V=e=>{const a={};for(const r of e.fields)r.name.includes("[].")||(a[r.name]=Z(r));return a};function _(e){const a=m[e.entityType];if(!a)return"// Schema not available";const r=V(a),s=a.paginated?{items:[r],page:1,pageSize:100,totalCount:1,totalPages:1,hasMore:!1}:[r];return JSON.stringify(s,null,2)}function u({text:e}){const[a,r]=c.useState(!1),s=async()=>{await navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),2e3)};return t.jsx("button",{onClick:s,className:"absolute top-2 right-2 p-1.5 rounded-md bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)] transition-colors",title:"Copy",children:a?t.jsx(n.Check,{className:"h-4 w-4 text-[var(--success-text)]"}):t.jsx(n.Copy,{className:"h-4 w-4"})})}function Q({prompt:e}){return t.jsx("div",{className:"space-y-3",children:e.blocks.filter(a=>a.isEnabled!==!1).sort((a,r)=>a.displayOrder-r.displayOrder).map(a=>t.jsxs("div",{className:"rounded-lg border border-[var(--border-color)] overflow-hidden",children:[t.jsxs("div",{className:"flex items-center gap-2 px-4 py-2 bg-[var(--bg-secondary)] border-b border-[var(--border-color)]",children:[t.jsx("span",{className:"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2 py-0.5 text-xs font-medium text-[var(--info-text)]",children:a.blockType}),a.label&&t.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:a.label})]}),t.jsxs("div",{className:"relative p-4",children:[t.jsx(u,{text:a.content}),t.jsx("pre",{className:"text-sm font-mono text-[var(--text-secondary)] whitespace-pre-wrap pr-10",children:a.content})]})]},a.id))})}function Y({variables:e,t:a}){return t.jsxs("div",{children:[t.jsx("h4",{className:"text-sm font-medium text-[var(--text-tertiary)] mb-2",children:a("externalApps.apis.catalog.detail.variables")}),t.jsx("div",{className:"flex flex-wrap gap-2",children:e.map(r=>t.jsx("code",{className:"rounded bg-[var(--bg-secondary)] px-2 py-1 text-xs font-mono text-[var(--color-primary-600)]",children:`{${r}}`},r))})]})}function K({t:e,prompt:a}){return t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsxs("div",{children:[t.jsx("h3",{className:"font-medium text-[var(--text-primary)]",children:a.name}),t.jsxs("p",{className:"text-sm text-[var(--text-tertiary)]",children:["v",a.version," · ",a.status,a.description&&t.jsxs(t.Fragment,{children:[" · ",a.description]})]})]}),t.jsx("a",{href:`/administration/ai/skills/${a.id}`,className:"text-sm text-[var(--color-primary-600)] hover:underline",children:e("externalApps.apis.catalog.detail.viewPrompt")})]}),(a.blocks?.length??0)>0&&t.jsx(Q,{prompt:a}),(a.variables?.length??0)>0&&t.jsx(Y,{variables:a.variables,t:e})]})}function X({t:e,endpoint:a,generatedPrompt:r}){return t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsxs("div",{children:[t.jsx("h3",{className:"font-medium text-[var(--text-primary)]",children:e("externalApps.apis.catalog.detail.generatedPromptTitle")}),t.jsx("p",{className:"text-sm text-[var(--text-tertiary)]",children:e("externalApps.apis.catalog.detail.generatedPromptHint",{code:`data-export-${a.code}`})})]}),t.jsx(u,{text:r})]}),t.jsx("pre",{className:"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] whitespace-pre-wrap overflow-x-auto max-h-[600px] overflow-y-auto leading-relaxed",children:r})]})}async function ee(e){const a=[`data-export-${e}`,`export-${e}`,e];for(const r of a)try{const s=await U.aiApi.skills.getByCode(r);if(s)return s}catch{}return null}function te(){const{t:e}=P.useTranslation("admin"),{endpointCode:a}=T.useParams(),r=T.useNavigate(),[s,o]=c.useState(null),[d,x]=c.useState(null),[h,y]=c.useState(!1),[C,v]=c.useState(!0),[b,j]=c.useState(null);c.useEffect(()=>{let i=!1;return(async()=>{try{v(!0);const p=await S.adminApi.externalApps.getApiEndpoints();if(i)return;const g=p.find(l=>l.code===a);if(!g){j("Endpoint not found");return}o(g),y(!0);try{const l=await ee(g.code);!i&&l&&x(l)}catch{}finally{i||y(!1)}}catch(p){i||j(p instanceof Error?p.message:"Failed to load endpoint")}finally{i||v(!1)}})(),()=>{i=!0}},[a]);const f=c.useMemo(()=>s?m[s.entityType]:null,[s]),N=c.useMemo(()=>s?W(s):"",[s]),A=c.useMemo(()=>s?_(s):"",[s]),D=c.useMemo(()=>s?J(s):"",[s]);return C?t.jsx("div",{className:"flex h-96 items-center justify-center",children:t.jsx(n.Loader2,{className:"h-8 w-8 animate-spin text-[var(--color-primary-600)]"})}):b||!s?t.jsxs("div",{className:"space-y-4",children:[t.jsxs("button",{onClick:()=>r(-1),className:"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors",children:[t.jsx(n.ArrowLeft,{className:"h-4 w-4"}),e("common:back")]}),t.jsx("div",{className:"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4",children:t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(n.AlertTriangle,{className:"h-5 w-5 text-[var(--error-text)]"}),t.jsx("p",{className:"text-[var(--error-text)]",children:b||"Endpoint not found"})]})})]}):t.jsxs("div",{className:"space-y-6",children:[t.jsx(S.Breadcrumb,{items:[{label:e("externalApps.navigation.api"),href:"/api"},{label:e("externalApps.apis.catalog.title"),href:"/api/apis/catalog"},{label:s.name}]}),t.jsxs("div",{className:"flex items-start gap-4",children:[t.jsx("button",{onClick:()=>r(-1),className:"mt-1 p-2 rounded-md hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] transition-colors",children:t.jsx(n.ArrowLeft,{className:"h-5 w-5"})}),t.jsxs("div",{className:"flex-1",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx(n.BookOpen,{className:"h-7 w-7 text-[var(--color-accent-600)]"}),t.jsx("h1",{className:"text-3xl font-bold text-[var(--text-primary)]",children:s.name}),t.jsx("div",{className:"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium",children:s.isActive?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--success-text)]"}),t.jsx("span",{className:"text-[var(--success-text)]",children:e("externalApps.apis.catalog.active")})]}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--warning-text)]"}),t.jsx("span",{className:"text-[var(--warning-text)]",children:e("externalApps.apis.catalog.inactive")})]})})]}),s.description&&t.jsx("p",{className:"mt-2 text-[var(--text-secondary)]",children:s.description})]})]}),t.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[t.jsxs("div",{className:"card p-4 border border-[var(--border-color)]",children:[t.jsxs("div",{className:"flex items-center gap-2 text-[var(--text-tertiary)] mb-1",children:[t.jsx(n.Layers,{className:"h-4 w-4"}),t.jsx("span",{className:"text-xs font-medium uppercase",children:e("externalApps.apis.catalog.columns.application")})]}),t.jsx("span",{className:"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-sm font-medium text-[var(--info-text)]",children:s.applicationLabel})]}),t.jsxs("div",{className:"card p-4 border border-[var(--border-color)]",children:[t.jsxs("div",{className:"flex items-center gap-2 text-[var(--text-tertiary)] mb-1",children:[t.jsx(n.Database,{className:"h-4 w-4"}),t.jsx("span",{className:"text-xs font-medium uppercase",children:e("externalApps.apis.catalog.columns.module")})]}),t.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:s.moduleLabel})]}),t.jsxs("div",{className:"card p-4 border border-[var(--border-color)]",children:[t.jsxs("div",{className:"flex items-center gap-2 text-[var(--text-tertiary)] mb-1",children:[t.jsx(n.Zap,{className:"h-4 w-4"}),t.jsx("span",{className:"text-xs font-medium uppercase",children:e("externalApps.apis.catalog.columns.rateLimit")})]}),t.jsxs("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:[s.defaultRateLimitPerMinute,"/min"]})]}),t.jsxs("div",{className:"card p-4 border border-[var(--border-color)]",children:[t.jsxs("div",{className:"flex items-center gap-2 text-[var(--text-tertiary)] mb-1",children:[t.jsx(n.Clock,{className:"h-4 w-4"}),t.jsx("span",{className:"text-xs font-medium uppercase",children:e("externalApps.apis.catalog.columns.maxPageSize")})]}),t.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:s.defaultMaxPageSize})]})]}),t.jsxs("div",{className:"card border border-[var(--border-color)]",children:[t.jsx("div",{className:"px-6 py-4 border-b border-[var(--border-color)]",children:t.jsx("h2",{className:"text-lg font-semibold text-[var(--text-primary)]",children:e("externalApps.apis.catalog.detail.technical")})}),t.jsxs("div",{className:"p-6 grid grid-cols-1 md:grid-cols-2 gap-6",children:[t.jsxs("div",{children:[t.jsx("label",{className:"text-xs font-medium uppercase text-[var(--text-tertiary)]",children:e("externalApps.apis.catalog.columns.route")}),t.jsx("div",{className:"mt-1 flex items-center gap-2",children:t.jsxs("code",{className:"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--color-primary-600)]",children:["GET ",s.routeTemplate]})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"text-xs font-medium uppercase text-[var(--text-tertiary)]",children:e("externalApps.apis.catalog.columns.permission")}),t.jsxs("div",{className:"mt-1 flex items-center gap-2",children:[t.jsx(n.Shield,{className:"h-4 w-4 text-[var(--warning-text)]"}),t.jsx("code",{className:"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]",children:s.requiredPermission})]})]}),t.jsxs("div",{children:[t.jsx("label",{className:"text-xs font-medium uppercase text-[var(--text-tertiary)]",children:e("externalApps.apis.catalog.columns.entityType")}),t.jsxs("div",{className:"mt-1 flex items-center gap-2",children:[t.jsx(n.Database,{className:"h-4 w-4 text-[var(--text-tertiary)]"}),t.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:s.entityType})]})]}),t.jsxs("div",{children:[t.jsx("label",{className:"text-xs font-medium uppercase text-[var(--text-tertiary)]",children:e("externalApps.apis.catalog.columns.code")}),t.jsx("div",{className:"mt-1",children:t.jsx("code",{className:"rounded-md bg-[var(--bg-secondary)] px-3 py-1.5 text-sm font-mono text-[var(--text-primary)]",children:s.code})})]})]})]}),t.jsxs("div",{className:"card border border-[var(--border-color)]",children:[t.jsx("div",{className:"px-6 py-4 border-b border-[var(--border-color)]",children:t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(n.Code2,{className:"h-5 w-5 text-[var(--text-tertiary)]"}),t.jsx("h2",{className:"text-lg font-semibold text-[var(--text-primary)]",children:e("externalApps.apis.catalog.detail.curlExample")})]})}),t.jsxs("div",{className:"p-6 relative",children:[t.jsx(u,{text:N}),t.jsx("pre",{className:"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto whitespace-pre-wrap",children:N})]})]}),f&&t.jsxs("div",{className:"card border border-[var(--border-color)]",children:[t.jsx("div",{className:"px-6 py-4 border-b border-[var(--border-color)]",children:t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(n.FileCode2,{className:"h-5 w-5 text-[var(--text-tertiary)]"}),t.jsx("h2",{className:"text-lg font-semibold text-[var(--text-primary)]",children:e("externalApps.apis.catalog.detail.responseSchema")})]}),f.paginated&&t.jsx("span",{className:"inline-flex items-center rounded-full bg-[var(--info-bg)] px-2.5 py-0.5 text-xs font-medium text-[var(--info-text)]",children:e("externalApps.apis.catalog.detail.paginated")})]})}),t.jsx("div",{className:"overflow-x-auto",children:t.jsxs("table",{className:"w-full",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"bg-[var(--bg-secondary)]",children:[t.jsx("th",{className:"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:e("externalApps.apis.catalog.detail.field")}),t.jsx("th",{className:"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:e("externalApps.apis.catalog.detail.type")}),t.jsx("th",{className:"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:e("externalApps.apis.catalog.detail.nullable")}),t.jsx("th",{className:"text-left px-6 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:e("externalApps.apis.catalog.detail.fieldDescription")})]})}),t.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:f.fields.map(i=>t.jsxs("tr",{className:"hover:bg-[var(--bg-hover)] transition-colors",children:[t.jsx("td",{className:"px-6 py-3",children:t.jsx("code",{className:"text-sm font-mono text-[var(--color-primary-600)]",children:i.name})}),t.jsx("td",{className:"px-6 py-3",children:t.jsx("code",{className:"rounded bg-[var(--bg-secondary)] px-2 py-0.5 text-xs font-mono text-[var(--text-secondary)]",children:i.type})}),t.jsx("td",{className:"px-6 py-3 text-sm text-[var(--text-secondary)]",children:i.nullable?"?":"-"}),t.jsx("td",{className:"px-6 py-3 text-sm text-[var(--text-secondary)]",children:i.description})]},i.name))})]})}),t.jsxs("div",{className:"border-t border-[var(--border-color)] p-6",children:[t.jsx("h3",{className:"text-sm font-semibold text-[var(--text-tertiary)] uppercase mb-3",children:e("externalApps.apis.catalog.detail.jsonExample")}),t.jsxs("div",{className:"relative",children:[t.jsx(u,{text:A}),t.jsx("pre",{className:"rounded-lg bg-[var(--bg-secondary)] p-4 text-sm font-mono text-[var(--text-primary)] overflow-x-auto max-h-96 overflow-y-auto",children:A})]})]})]}),t.jsxs("div",{className:"card border border-[var(--border-color)]",children:[t.jsxs("div",{className:"px-6 py-4 border-b border-[var(--border-color)]",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(n.Brain,{className:"h-5 w-5 text-[var(--color-accent-600)]"}),t.jsx("h2",{className:"text-lg font-semibold text-[var(--text-primary)]",children:e("externalApps.apis.catalog.detail.dedicatedPrompt")})]}),t.jsx("p",{className:"mt-1 text-sm text-[var(--text-tertiary)]",children:e("externalApps.apis.catalog.detail.promptDescription")})]}),t.jsxs("div",{className:"p-6",children:[h&&t.jsxs("div",{className:"flex items-center gap-2 text-[var(--text-tertiary)]",children:[t.jsx(n.Loader2,{className:"h-4 w-4 animate-spin"}),t.jsx("span",{className:"text-sm",children:e("common:loading")})]}),!h&&d&&t.jsx(K,{t:e,prompt:d}),!h&&!d&&t.jsx(X,{t:e,endpoint:s,generatedPrompt:D})]})]})]})}exports.ApiCatalogDetailPage=te;
|
|
5
|
-
//# sourceMappingURL=ApiCatalogDetailPage-
|
|
5
|
+
//# sourceMappingURL=ApiCatalogDetailPage-MPT3Kz6H.js.map
|