@payez/next-mvp 3.0.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/README.md +782 -0
- package/dist/api/auth-handler.d.ts +67 -0
- package/dist/api/auth-handler.js +397 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +19 -0
- package/dist/api-handlers/account/change-password.d.ts +9 -0
- package/dist/api-handlers/account/change-password.js +112 -0
- package/dist/api-handlers/account/masked-info.d.ts +2 -0
- package/dist/api-handlers/account/masked-info.js +41 -0
- package/dist/api-handlers/account/profile.d.ts +3 -0
- package/dist/api-handlers/account/profile.js +63 -0
- package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
- package/dist/api-handlers/account/recovery/initiate.js +26 -0
- package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/send-code.js +28 -0
- package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/verify-code.js +28 -0
- package/dist/api-handlers/account/reset-password.d.ts +2 -0
- package/dist/api-handlers/account/reset-password.js +26 -0
- package/dist/api-handlers/account/send-code.d.ts +24 -0
- package/dist/api-handlers/account/send-code.js +60 -0
- package/dist/api-handlers/account/update-phone.d.ts +27 -0
- package/dist/api-handlers/account/update-phone.js +64 -0
- package/dist/api-handlers/account/validate-password.d.ts +17 -0
- package/dist/api-handlers/account/validate-password.js +81 -0
- package/dist/api-handlers/account/verify-email.d.ts +26 -0
- package/dist/api-handlers/account/verify-email.js +106 -0
- package/dist/api-handlers/account/verify-sms.d.ts +26 -0
- package/dist/api-handlers/account/verify-sms.js +106 -0
- package/dist/api-handlers/admin/analytics.d.ts +20 -0
- package/dist/api-handlers/admin/analytics.js +379 -0
- package/dist/api-handlers/admin/audit.d.ts +20 -0
- package/dist/api-handlers/admin/audit.js +214 -0
- package/dist/api-handlers/admin/index.d.ts +21 -0
- package/dist/api-handlers/admin/index.js +41 -0
- package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
- package/dist/api-handlers/admin/redis-sessions.js +204 -0
- package/dist/api-handlers/admin/sessions.d.ts +21 -0
- package/dist/api-handlers/admin/sessions.js +284 -0
- package/dist/api-handlers/admin/site-logs.d.ts +46 -0
- package/dist/api-handlers/admin/site-logs.js +318 -0
- package/dist/api-handlers/admin/users.d.ts +20 -0
- package/dist/api-handlers/admin/users.js +222 -0
- package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
- package/dist/api-handlers/admin/vibe-data.js +268 -0
- package/dist/api-handlers/anon/preferences.d.ts +37 -0
- package/dist/api-handlers/anon/preferences.js +96 -0
- package/dist/api-handlers/auth/jwks.d.ts +2 -0
- package/dist/api-handlers/auth/jwks.js +24 -0
- package/dist/api-handlers/auth/login.d.ts +42 -0
- package/dist/api-handlers/auth/login.js +178 -0
- package/dist/api-handlers/auth/refresh.d.ts +74 -0
- package/dist/api-handlers/auth/refresh.js +635 -0
- package/dist/api-handlers/auth/signout.d.ts +37 -0
- package/dist/api-handlers/auth/signout.js +187 -0
- package/dist/api-handlers/auth/status.d.ts +8 -0
- package/dist/api-handlers/auth/status.js +26 -0
- package/dist/api-handlers/auth/update-session.d.ts +37 -0
- package/dist/api-handlers/auth/update-session.js +95 -0
- package/dist/api-handlers/auth/validate.d.ts +6 -0
- package/dist/api-handlers/auth/validate.js +43 -0
- package/dist/api-handlers/auth/verify-code.d.ts +43 -0
- package/dist/api-handlers/auth/verify-code.js +94 -0
- package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
- package/dist/api-handlers/session/refresh-viability.js +39 -0
- package/dist/api-handlers/session/viability.d.ts +13 -0
- package/dist/api-handlers/session/viability.js +146 -0
- package/dist/api-handlers/test/force-expire.d.ts +23 -0
- package/dist/api-handlers/test/force-expire.js +65 -0
- package/dist/auth/auth-decision.d.ts +39 -0
- package/dist/auth/auth-decision.js +182 -0
- package/dist/auth/auth-options.d.ts +57 -0
- package/dist/auth/auth-options.js +213 -0
- package/dist/auth/callbacks/index.d.ts +6 -0
- package/dist/auth/callbacks/index.js +12 -0
- package/dist/auth/callbacks/jwt.d.ts +45 -0
- package/dist/auth/callbacks/jwt.js +305 -0
- package/dist/auth/callbacks/session.d.ts +60 -0
- package/dist/auth/callbacks/session.js +170 -0
- package/dist/auth/callbacks/signin.d.ts +23 -0
- package/dist/auth/callbacks/signin.js +44 -0
- package/dist/auth/events/index.d.ts +4 -0
- package/dist/auth/events/index.js +8 -0
- package/dist/auth/events/signout.d.ts +17 -0
- package/dist/auth/events/signout.js +32 -0
- package/dist/auth/providers/credentials.d.ts +32 -0
- package/dist/auth/providers/credentials.js +223 -0
- package/dist/auth/providers/index.d.ts +5 -0
- package/dist/auth/providers/index.js +21 -0
- package/dist/auth/providers/oauth.d.ts +26 -0
- package/dist/auth/providers/oauth.js +105 -0
- package/dist/auth/route-config.d.ts +66 -0
- package/dist/auth/route-config.js +190 -0
- package/dist/auth/types/auth-types.d.ts +417 -0
- package/dist/auth/types/auth-types.js +53 -0
- package/dist/auth/types/index.d.ts +6 -0
- package/dist/auth/types/index.js +22 -0
- package/dist/auth/unauthenticated-routes.d.ts +1 -0
- package/dist/auth/unauthenticated-routes.js +19 -0
- package/dist/auth/utils/idp-client.d.ts +94 -0
- package/dist/auth/utils/idp-client.js +383 -0
- package/dist/auth/utils/index.d.ts +5 -0
- package/dist/auth/utils/index.js +21 -0
- package/dist/auth/utils/token-utils.d.ts +84 -0
- package/dist/auth/utils/token-utils.js +219 -0
- package/dist/client/AuthContext.d.ts +19 -0
- package/dist/client/AuthContext.js +112 -0
- package/dist/client/fetch-with-auth.d.ts +11 -0
- package/dist/client/fetch-with-auth.js +44 -0
- package/dist/client/fetchWithSession.d.ts +3 -0
- package/dist/client/fetchWithSession.js +24 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.js +20 -0
- package/dist/client/useAnonSession.d.ts +36 -0
- package/dist/client/useAnonSession.js +99 -0
- package/dist/components/SessionSync.d.ts +13 -0
- package/dist/components/SessionSync.js +119 -0
- package/dist/components/SignalRHealthCheck.d.ts +10 -0
- package/dist/components/SignalRHealthCheck.js +97 -0
- package/dist/components/account/UserAvatarMenu.d.ts +20 -0
- package/dist/components/account/UserAvatarMenu.js +80 -0
- package/dist/components/account/index.d.ts +7 -0
- package/dist/components/account/index.js +10 -0
- package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
- package/dist/components/admin/AlertSettingsTab.js +351 -0
- package/dist/components/admin/AnalyticsTab.d.ts +22 -0
- package/dist/components/admin/AnalyticsTab.js +167 -0
- package/dist/components/admin/DataBrowserTab.d.ts +19 -0
- package/dist/components/admin/DataBrowserTab.js +252 -0
- package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
- package/dist/components/admin/LoggingSettingsTab.js +339 -0
- package/dist/components/admin/SessionsTab.d.ts +37 -0
- package/dist/components/admin/SessionsTab.js +165 -0
- package/dist/components/admin/StatsTab.d.ts +53 -0
- package/dist/components/admin/StatsTab.js +161 -0
- package/dist/components/admin/VibeAdminContext.d.ts +32 -0
- package/dist/components/admin/VibeAdminContext.js +38 -0
- package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
- package/dist/components/admin/VibeAdminLayout.js +69 -0
- package/dist/components/admin/index.d.ts +29 -0
- package/dist/components/admin/index.js +44 -0
- package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
- package/dist/components/auth/FederatedAuthSection.js +45 -0
- package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
- package/dist/components/auth/ModeAwareLoginPage.js +42 -0
- package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
- package/dist/components/auth/ModeAwareSignupPage.js +78 -0
- package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
- package/dist/components/auth/TraditionalAuthSection.js +20 -0
- package/dist/components/recovery/CompleteStep.d.ts +5 -0
- package/dist/components/recovery/CompleteStep.js +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
- package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
- package/dist/components/recovery/SelectMethodStep.js +8 -0
- package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
- package/dist/components/recovery/SetPasswordStep.js +20 -0
- package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
- package/dist/components/recovery/VerifyCodeStep.js +24 -0
- package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
- package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
- package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
- package/dist/components/reserved/ReservedStatusBox.js +71 -0
- package/dist/components/ui/BetaBadge.d.ts +29 -0
- package/dist/components/ui/BetaBadge.js +38 -0
- package/dist/components/ui/Footer.d.ts +37 -0
- package/dist/components/ui/Footer.js +41 -0
- package/dist/config/env.d.ts +66 -0
- package/dist/config/env.js +57 -0
- package/dist/config/logger.d.ts +57 -0
- package/dist/config/logger.js +73 -0
- package/dist/config/logging-config.d.ts +30 -0
- package/dist/config/logging-config.js +122 -0
- package/dist/config/unauthenticated-routes.d.ts +17 -0
- package/dist/config/unauthenticated-routes.js +24 -0
- package/dist/config/vibe-log-transport.d.ts +79 -0
- package/dist/config/vibe-log-transport.js +203 -0
- package/dist/edge/internal-api-url.d.ts +53 -0
- package/dist/edge/internal-api-url.js +63 -0
- package/dist/edge/middleware.d.ts +14 -0
- package/dist/edge/middleware.js +32 -0
- package/dist/hooks/useAuth.d.ts +23 -0
- package/dist/hooks/useAuth.js +81 -0
- package/dist/hooks/useAuthSettings.d.ts +59 -0
- package/dist/hooks/useAuthSettings.js +93 -0
- package/dist/hooks/useAvailableProviders.d.ts +45 -0
- package/dist/hooks/useAvailableProviders.js +108 -0
- package/dist/hooks/usePasswordValidation.d.ts +27 -0
- package/dist/hooks/usePasswordValidation.js +102 -0
- package/dist/hooks/useProfile.d.ts +15 -0
- package/dist/hooks/useProfile.js +59 -0
- package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
- package/dist/hooks/usePublicAuthSettings.js +131 -0
- package/dist/hooks/useSessionExpiration.d.ts +57 -0
- package/dist/hooks/useSessionExpiration.js +72 -0
- package/dist/hooks/useViabilitySession.d.ts +75 -0
- package/dist/hooks/useViabilitySession.js +268 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +54 -0
- package/dist/lib/anon-session.d.ts +74 -0
- package/dist/lib/anon-session.js +169 -0
- package/dist/lib/api-handler.d.ts +123 -0
- package/dist/lib/api-handler.js +478 -0
- package/dist/lib/app-slug.d.ts +95 -0
- package/dist/lib/app-slug.js +172 -0
- package/dist/lib/demo-mode.d.ts +6 -0
- package/dist/lib/demo-mode.js +16 -0
- package/dist/lib/geolocation.d.ts +64 -0
- package/dist/lib/geolocation.js +235 -0
- package/dist/lib/idp-client-config.d.ts +75 -0
- package/dist/lib/idp-client-config.js +351 -0
- package/dist/lib/idp-fetch.d.ts +14 -0
- package/dist/lib/idp-fetch.js +91 -0
- package/dist/lib/internal-api.d.ts +87 -0
- package/dist/lib/internal-api.js +122 -0
- package/dist/lib/jwt-decode-client.d.ts +10 -0
- package/dist/lib/jwt-decode-client.js +46 -0
- package/dist/lib/jwt-decode.d.ts +48 -0
- package/dist/lib/jwt-decode.js +57 -0
- package/dist/lib/nextauth-secret.d.ts +10 -0
- package/dist/lib/nextauth-secret.js +104 -0
- package/dist/lib/rate-limit-service.d.ts +23 -0
- package/dist/lib/rate-limit-service.js +6 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.js +28 -0
- package/dist/lib/refresh-token-validator.d.ts +13 -0
- package/dist/lib/refresh-token-validator.js +117 -0
- package/dist/lib/roles.d.ts +145 -0
- package/dist/lib/roles.js +168 -0
- package/dist/lib/secret-validation.d.ts +4 -0
- package/dist/lib/secret-validation.js +14 -0
- package/dist/lib/session-store.d.ts +166 -0
- package/dist/lib/session-store.js +537 -0
- package/dist/lib/session.d.ts +21 -0
- package/dist/lib/session.js +26 -0
- package/dist/lib/site-logger.d.ts +214 -0
- package/dist/lib/site-logger.js +210 -0
- package/dist/lib/standardized-client-api.d.ts +161 -0
- package/dist/lib/standardized-client-api.js +786 -0
- package/dist/lib/startup-init.d.ts +40 -0
- package/dist/lib/startup-init.js +261 -0
- package/dist/lib/test-aware-get-token.d.ts +2 -0
- package/dist/lib/test-aware-get-token.js +81 -0
- package/dist/lib/token-expiry.d.ts +14 -0
- package/dist/lib/token-expiry.js +39 -0
- package/dist/lib/token-lifecycle.d.ts +52 -0
- package/dist/lib/token-lifecycle.js +398 -0
- package/dist/lib/types/api-responses.d.ts +128 -0
- package/dist/lib/types/api-responses.js +171 -0
- package/dist/lib/user-agent-parser.d.ts +50 -0
- package/dist/lib/user-agent-parser.js +220 -0
- package/dist/logging/api/admin-analytics.d.ts +3 -0
- package/dist/logging/api/admin-analytics.js +45 -0
- package/dist/logging/api/audit-log.d.ts +3 -0
- package/dist/logging/api/audit-log.js +52 -0
- package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
- package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
- package/dist/logging/components/AuditLogViewer.d.ts +7 -0
- package/dist/logging/components/AuditLogViewer.js +51 -0
- package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
- package/dist/logging/components/ErrorMetricsCard.js +16 -0
- package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
- package/dist/logging/components/HealthMetricsCard.js +19 -0
- package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
- package/dist/logging/hooks/useAdminAnalytics.js +22 -0
- package/dist/logging/hooks/useAuditLog.d.ts +6 -0
- package/dist/logging/hooks/useAuditLog.js +25 -0
- package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
- package/dist/logging/hooks/useErrorMetrics.js +38 -0
- package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
- package/dist/logging/hooks/useHealthMetrics.js +41 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.js +40 -0
- package/dist/logging/types/analytics.d.ts +68 -0
- package/dist/logging/types/analytics.js +3 -0
- package/dist/logging/types/audit.d.ts +29 -0
- package/dist/logging/types/audit.js +2 -0
- package/dist/logging/types/index.d.ts +2 -0
- package/dist/logging/types/index.js +19 -0
- package/dist/middleware/auth-decision.d.ts +33 -0
- package/dist/middleware/auth-decision.js +65 -0
- package/dist/middleware/create-middleware.d.ts +100 -0
- package/dist/middleware/create-middleware.js +445 -0
- package/dist/middleware/rbac-check.d.ts +44 -0
- package/dist/middleware/rbac-check.js +191 -0
- package/dist/middleware/twofa-presets.d.ts +134 -0
- package/dist/middleware/twofa-presets.js +175 -0
- package/dist/models/DecodedAccessToken.d.ts +17 -0
- package/dist/models/DecodedAccessToken.js +2 -0
- package/dist/models/SessionModel.d.ts +122 -0
- package/dist/models/SessionModel.js +136 -0
- package/dist/pages/admin-login/page.d.ts +31 -0
- package/dist/pages/admin-login/page.js +83 -0
- package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
- package/dist/pages/admin-roles/RolesAdminPage.js +78 -0
- package/dist/pages/admin-roles/index.d.ts +8 -0
- package/dist/pages/admin-roles/index.js +15 -0
- package/dist/pages/admin-roles/modals.d.ts +72 -0
- package/dist/pages/admin-roles/modals.js +154 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.js +177 -0
- package/dist/pages/client-admin/index.d.ts +32 -0
- package/dist/pages/client-admin/index.js +37 -0
- package/dist/pages/login/page.d.ts +22 -0
- package/dist/pages/login/page.js +239 -0
- package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
- package/dist/pages/profile/EnhancedProfilePage.js +150 -0
- package/dist/pages/profile/index.d.ts +8 -0
- package/dist/pages/profile/index.js +16 -0
- package/dist/pages/profile/page.d.ts +19 -0
- package/dist/pages/profile/page.js +47 -0
- package/dist/pages/profile/profile-patch.d.ts +1 -0
- package/dist/pages/profile/profile-patch.js +281 -0
- package/dist/pages/recovery/page.d.ts +1 -0
- package/dist/pages/recovery/page.js +142 -0
- package/dist/pages/roles/MyRolesPage.d.ts +24 -0
- package/dist/pages/roles/MyRolesPage.js +71 -0
- package/dist/pages/roles/components.d.ts +63 -0
- package/dist/pages/roles/components.js +108 -0
- package/dist/pages/roles/index.d.ts +8 -0
- package/dist/pages/roles/index.js +19 -0
- package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
- package/dist/pages/security/EnhancedSecurityPage.js +248 -0
- package/dist/pages/security/index.d.ts +8 -0
- package/dist/pages/security/index.js +16 -0
- package/dist/pages/security/page.d.ts +21 -0
- package/dist/pages/security/page.js +212 -0
- package/dist/pages/security/security-patch.d.ts +1 -0
- package/dist/pages/security/security-patch.js +302 -0
- package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
- package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
- package/dist/pages/settings/index.d.ts +8 -0
- package/dist/pages/settings/index.js +16 -0
- package/dist/pages/settings/page.d.ts +7 -0
- package/dist/pages/settings/page.js +26 -0
- package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
- package/dist/pages/showcase/ShowcasePage.js +140 -0
- package/dist/pages/showcase/index.d.ts +12 -0
- package/dist/pages/showcase/index.js +17 -0
- package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
- package/dist/pages/test-env/EmergencyLogoutPage.js +98 -0
- package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
- package/dist/pages/test-env/JwtInspectPage.js +114 -0
- package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
- package/dist/pages/test-env/RefreshTokenPage.js +91 -0
- package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
- package/dist/pages/test-env/TestEnvPage.js +49 -0
- package/dist/pages/test-env/index.d.ts +24 -0
- package/dist/pages/test-env/index.js +32 -0
- package/dist/pages/verify-code/page.d.ts +30 -0
- package/dist/pages/verify-code/page.js +408 -0
- package/dist/routes/account/index.d.ts +28 -0
- package/dist/routes/account/index.js +71 -0
- package/dist/routes/account/masked-info.d.ts +33 -0
- package/dist/routes/account/masked-info.js +39 -0
- package/dist/routes/account/send-code.d.ts +37 -0
- package/dist/routes/account/send-code.js +42 -0
- package/dist/routes/account/update-phone.d.ts +13 -0
- package/dist/routes/account/update-phone.js +17 -0
- package/dist/routes/account/verify-email.d.ts +38 -0
- package/dist/routes/account/verify-email.js +43 -0
- package/dist/routes/account/verify-sms.d.ts +38 -0
- package/dist/routes/account/verify-sms.js +43 -0
- package/dist/routes/auth/index.d.ts +19 -0
- package/dist/routes/auth/index.js +64 -0
- package/dist/routes/auth/logout.d.ts +31 -0
- package/dist/routes/auth/logout.js +113 -0
- package/dist/routes/auth/nextauth.d.ts +19 -0
- package/dist/routes/auth/nextauth.js +72 -0
- package/dist/routes/auth/refresh.d.ts +30 -0
- package/dist/routes/auth/refresh.js +51 -0
- package/dist/routes/auth/session.d.ts +72 -0
- package/dist/routes/auth/session.js +180 -0
- package/dist/routes/auth/settings.d.ts +25 -0
- package/dist/routes/auth/settings.js +55 -0
- package/dist/routes/auth/viability.d.ts +52 -0
- package/dist/routes/auth/viability.js +201 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.js +54 -0
- package/dist/routes/session/index.d.ts +6 -0
- package/dist/routes/session/index.js +10 -0
- package/dist/routes/session/refresh-viability.d.ts +16 -0
- package/dist/routes/session/refresh-viability.js +20 -0
- package/dist/services/signalrActivityService.d.ts +44 -0
- package/dist/services/signalrActivityService.js +257 -0
- package/dist/stores/authStore.d.ts +154 -0
- package/dist/stores/authStore.js +1531 -0
- package/dist/theme/ThemeProvider.d.ts +14 -0
- package/dist/theme/ThemeProvider.js +28 -0
- package/dist/theme/default.d.ts +8 -0
- package/dist/theme/default.js +33 -0
- package/dist/theme/index.d.ts +15 -0
- package/dist/theme/index.js +25 -0
- package/dist/theme/types.d.ts +56 -0
- package/dist/theme/types.js +8 -0
- package/dist/theme/useTheme.d.ts +60 -0
- package/dist/theme/useTheme.js +63 -0
- package/dist/theme/utils.d.ts +13 -0
- package/dist/theme/utils.js +39 -0
- package/dist/types/api.d.ts +134 -0
- package/dist/types/api.js +44 -0
- package/dist/types/auth.d.ts +19 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/logging.d.ts +42 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/recovery.d.ts +48 -0
- package/dist/types/recovery.js +2 -0
- package/dist/types/security.d.ts +1 -0
- package/dist/types/security.js +2 -0
- package/dist/utils/api.d.ts +85 -0
- package/dist/utils/api.js +287 -0
- package/dist/utils/circuitBreaker.d.ts +43 -0
- package/dist/utils/circuitBreaker.js +91 -0
- package/dist/utils/error-message.d.ts +1 -0
- package/dist/utils/error-message.js +103 -0
- package/dist/utils/layout/reservedSpace.d.ts +59 -0
- package/dist/utils/layout/reservedSpace.js +102 -0
- package/dist/utils/logout.d.ts +14 -0
- package/dist/utils/logout.js +32 -0
- package/dist/vibe/client.d.ts +261 -0
- package/dist/vibe/client.js +445 -0
- package/dist/vibe/errors.d.ts +83 -0
- package/dist/vibe/errors.js +146 -0
- package/dist/vibe/generic.d.ts +234 -0
- package/dist/vibe/generic.js +369 -0
- package/dist/vibe/hooks/index.d.ts +169 -0
- package/dist/vibe/hooks/index.js +252 -0
- package/dist/vibe/index.d.ts +23 -0
- package/dist/vibe/index.js +67 -0
- package/dist/vibe/sessions.d.ts +161 -0
- package/dist/vibe/sessions.js +391 -0
- package/dist/vibe/types.d.ts +353 -0
- package/dist/vibe/types.js +315 -0
- package/package.json +855 -0
- package/scripts/check-internal-url-usage.sh +73 -0
- package/scripts/dev-broker.ps1 +35 -0
- package/scripts/dev-local.ps1 +45 -0
- package/src/api/auth-handler.ts +550 -0
- package/src/api/index.ts +18 -0
- package/src/api-handlers/account/change-password.ts +145 -0
- package/src/api-handlers/account/masked-info.ts +45 -0
- package/src/api-handlers/account/profile.ts +80 -0
- package/src/api-handlers/account/recovery/initiate.ts +23 -0
- package/src/api-handlers/account/recovery/send-code.ts +25 -0
- package/src/api-handlers/account/recovery/verify-code.ts +25 -0
- package/src/api-handlers/account/reset-password.ts +23 -0
- package/src/api-handlers/account/send-code.ts +76 -0
- package/src/api-handlers/account/update-phone.ts +79 -0
- package/src/api-handlers/account/validate-password.ts +118 -0
- package/src/api-handlers/account/verify-email.ts +125 -0
- package/src/api-handlers/account/verify-sms.ts +125 -0
- package/src/api-handlers/admin/analytics.ts +445 -0
- package/src/api-handlers/admin/audit.ts +225 -0
- package/src/api-handlers/admin/index.ts +59 -0
- package/src/api-handlers/admin/redis-sessions.ts +253 -0
- package/src/api-handlers/admin/sessions.ts +320 -0
- package/src/api-handlers/admin/site-logs.ts +367 -0
- package/src/api-handlers/admin/users.ts +244 -0
- package/src/api-handlers/admin/vibe-data.ts +326 -0
- package/src/api-handlers/anon/preferences.ts +123 -0
- package/src/api-handlers/auth/jwks.ts +20 -0
- package/src/api-handlers/auth/login.ts +240 -0
- package/src/api-handlers/auth/refresh.ts +687 -0
- package/src/api-handlers/auth/signout.ts +212 -0
- package/src/api-handlers/auth/status.ts +23 -0
- package/src/api-handlers/auth/update-session.ts +125 -0
- package/src/api-handlers/auth/validate.ts +44 -0
- package/src/api-handlers/auth/verify-code.ts +129 -0
- package/src/api-handlers/session/refresh-viability.ts +36 -0
- package/src/api-handlers/session/viability.ts +166 -0
- package/src/api-handlers/test/force-expire.ts +67 -0
- package/src/auth/auth-decision.ts +230 -0
- package/src/auth/auth-options.ts +237 -0
- package/src/auth/callbacks/index.ts +7 -0
- package/src/auth/callbacks/jwt.ts +382 -0
- package/src/auth/callbacks/session.ts +243 -0
- package/src/auth/callbacks/signin.ts +56 -0
- package/src/auth/events/index.ts +5 -0
- package/src/auth/events/signout.ts +33 -0
- package/src/auth/providers/credentials.ts +256 -0
- package/src/auth/providers/index.ts +6 -0
- package/src/auth/providers/oauth.ts +114 -0
- package/src/auth/route-config.ts +220 -0
- package/src/auth/types/auth-types.ts +555 -0
- package/src/auth/types/index.ts +7 -0
- package/src/auth/unauthenticated-routes.ts +3 -0
- package/src/auth/utils/idp-client.ts +444 -0
- package/src/auth/utils/index.ts +6 -0
- package/src/auth/utils/token-utils.ts +244 -0
- package/src/client/AuthContext.tsx +140 -0
- package/src/client/fetch-with-auth.ts +48 -0
- package/src/client/fetchWithSession.ts +21 -0
- package/src/client/index.ts +13 -0
- package/src/client/useAnonSession.ts +131 -0
- package/src/components/SessionSync.tsx +137 -0
- package/src/components/SignalRHealthCheck.tsx +131 -0
- package/src/components/account/UserAvatarMenu.tsx +217 -0
- package/src/components/account/index.ts +8 -0
- package/src/components/admin/AlertSettingsTab.tsx +728 -0
- package/src/components/admin/AnalyticsTab.tsx +703 -0
- package/src/components/admin/DataBrowserTab.tsx +505 -0
- package/src/components/admin/LoggingSettingsTab.tsx +665 -0
- package/src/components/admin/SessionsTab.tsx +414 -0
- package/src/components/admin/StatsTab.tsx +379 -0
- package/src/components/admin/VibeAdminContext.tsx +87 -0
- package/src/components/admin/VibeAdminLayout.tsx +185 -0
- package/src/components/admin/index.ts +59 -0
- package/src/components/auth/FederatedAuthSection.tsx +95 -0
- package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
- package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
- package/src/components/auth/TraditionalAuthSection.tsx +99 -0
- package/src/components/recovery/CompleteStep.tsx +36 -0
- package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
- package/src/components/recovery/SelectMethodStep.tsx +73 -0
- package/src/components/recovery/SetPasswordStep.tsx +97 -0
- package/src/components/recovery/VerifyCodeStep.tsx +90 -0
- package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
- package/src/components/reserved/ReservedStatusBox.tsx +118 -0
- package/src/components/ui/BetaBadge.tsx +58 -0
- package/src/components/ui/Footer.tsx +93 -0
- package/src/config/env.ts +57 -0
- package/src/config/logger.ts +62 -0
- package/src/config/logging-config.ts +82 -0
- package/src/config/unauthenticated-routes.ts +19 -0
- package/src/config/vibe-log-transport.ts +250 -0
- package/src/edge/internal-api-url.ts +65 -0
- package/src/edge/middleware.ts +42 -0
- package/src/hooks/useAuth.ts +115 -0
- package/src/hooks/useAuthSettings.ts +97 -0
- package/src/hooks/useAvailableProviders.ts +118 -0
- package/src/hooks/usePasswordValidation.ts +127 -0
- package/src/hooks/useProfile.ts +75 -0
- package/src/hooks/usePublicAuthSettings.ts +149 -0
- package/src/hooks/useSessionExpiration.ts +102 -0
- package/src/hooks/useViabilitySession.ts +335 -0
- package/src/index.ts +63 -0
- package/src/lib/anon-session.ts +213 -0
- package/src/lib/api-handler.ts +625 -0
- package/src/lib/app-slug.ts +178 -0
- package/src/lib/demo-mode.ts +13 -0
- package/src/lib/geolocation.ts +265 -0
- package/src/lib/idp-client-config.ts +442 -0
- package/src/lib/idp-fetch.ts +101 -0
- package/src/lib/internal-api.ts +171 -0
- package/src/lib/jwt-decode-client.ts +45 -0
- package/src/lib/jwt-decode.ts +83 -0
- package/src/lib/nextauth-secret.ts +126 -0
- package/src/lib/rate-limit-service.ts +9 -0
- package/src/lib/redis.ts +27 -0
- package/src/lib/refresh-token-validator.ts +64 -0
- package/src/lib/roles.ts +177 -0
- package/src/lib/secret-validation.ts +8 -0
- package/src/lib/session-store.ts +637 -0
- package/src/lib/session.ts +34 -0
- package/src/lib/site-logger.ts +245 -0
- package/src/lib/standardized-client-api.ts +896 -0
- package/src/lib/startup-init.ts +247 -0
- package/src/lib/test-aware-get-token.ts +30 -0
- package/src/lib/token-expiry.ts +40 -0
- package/src/lib/token-lifecycle.ts +477 -0
- package/src/lib/types/api-responses.ts +336 -0
- package/src/lib/user-agent-parser.ts +252 -0
- package/src/logging/api/admin-analytics.ts +51 -0
- package/src/logging/api/audit-log.ts +53 -0
- package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
- package/src/logging/components/AuditLogViewer.tsx +125 -0
- package/src/logging/components/ErrorMetricsCard.tsx +98 -0
- package/src/logging/components/HealthMetricsCard.tsx +70 -0
- package/src/logging/hooks/useAdminAnalytics.ts +22 -0
- package/src/logging/hooks/useAuditLog.ts +24 -0
- package/src/logging/hooks/useErrorMetrics.ts +40 -0
- package/src/logging/hooks/useHealthMetrics.ts +44 -0
- package/src/logging/index.ts +18 -0
- package/src/logging/types/analytics.ts +81 -0
- package/src/logging/types/audit.ts +31 -0
- package/src/logging/types/index.ts +3 -0
- package/src/middleware/auth-decision.ts +43 -0
- package/src/middleware/create-middleware.ts +626 -0
- package/src/middleware/rbac-check.ts +244 -0
- package/src/middleware/twofa-presets.ts +224 -0
- package/src/models/DecodedAccessToken.ts +17 -0
- package/src/models/SessionModel.ts +258 -0
- package/src/pages/admin-login/page.tsx +229 -0
- package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
- package/src/pages/admin-roles/index.ts +9 -0
- package/src/pages/admin-roles/modals.tsx +469 -0
- package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
- package/src/pages/client-admin/index.ts +33 -0
- package/src/pages/login/page.tsx +463 -0
- package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
- package/src/pages/profile/index.ts +9 -0
- package/src/pages/profile/page.tsx +166 -0
- package/src/pages/recovery/page.tsx +234 -0
- package/src/pages/roles/MyRolesPage.tsx +211 -0
- package/src/pages/roles/components.tsx +294 -0
- package/src/pages/roles/index.ts +17 -0
- package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
- package/src/pages/security/index.ts +9 -0
- package/src/pages/security/page.tsx +507 -0
- package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
- package/src/pages/settings/index.ts +9 -0
- package/src/pages/settings/page.tsx +47 -0
- package/src/pages/showcase/ShowcasePage.tsx +530 -0
- package/src/pages/showcase/index.ts +13 -0
- package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
- package/src/pages/test-env/JwtInspectPage.tsx +418 -0
- package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
- package/src/pages/test-env/TestEnvPage.tsx +116 -0
- package/src/pages/test-env/index.ts +25 -0
- package/src/pages/verify-code/page.tsx +648 -0
- package/src/routes/account/index.ts +32 -0
- package/src/routes/account/masked-info.ts +37 -0
- package/src/routes/account/send-code.ts +40 -0
- package/src/routes/account/update-phone.ts +13 -0
- package/src/routes/account/verify-email.ts +41 -0
- package/src/routes/account/verify-sms.ts +41 -0
- package/src/routes/auth/index.ts +23 -0
- package/src/routes/auth/logout.ts +127 -0
- package/src/routes/auth/nextauth.ts +71 -0
- package/src/routes/auth/refresh.ts +54 -0
- package/src/routes/auth/session.ts +193 -0
- package/src/routes/auth/settings.ts +75 -0
- package/src/routes/auth/viability.ts +220 -0
- package/src/routes/index.ts +18 -0
- package/src/routes/session/index.ts +7 -0
- package/src/routes/session/refresh-viability.ts +17 -0
- package/src/services/signalrActivityService.ts +258 -0
- package/src/stores/authStore.ts +1904 -0
- package/src/templates/instrumentation.ts +41 -0
- package/src/theme/ThemeProvider.tsx +39 -0
- package/src/theme/default.ts +33 -0
- package/src/theme/index.ts +31 -0
- package/src/theme/types.ts +69 -0
- package/src/theme/useTheme.ts +57 -0
- package/src/theme/utils.ts +40 -0
- package/src/types/api.ts +13 -0
- package/src/types/auth.d.ts +15 -0
- package/src/types/auth.ts +22 -0
- package/src/types/logging.ts +11 -0
- package/src/types/next-auth.d.ts +15 -0
- package/src/types/recovery.ts +54 -0
- package/src/types/security.ts +1 -0
- package/src/utils/api.ts +353 -0
- package/src/utils/circuitBreaker.ts +40 -0
- package/src/utils/error-message.ts +108 -0
- package/src/utils/layout/reservedSpace.ts +124 -0
- package/src/utils/logout.ts +30 -0
- package/src/vibe/client.ts +590 -0
- package/src/vibe/errors.ts +185 -0
- package/src/vibe/generic.ts +429 -0
- package/src/vibe/hooks/index.ts +367 -0
- package/src/vibe/index.ts +121 -0
- package/src/vibe/sessions.ts +551 -0
- package/src/vibe/types.ts +577 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
// ========================================================================================
|
|
2
|
+
// BULLETPROOF API RESPONSE TYPES - ENFORCES STANDARDIZED FORMAT
|
|
3
|
+
// ========================================================================================
|
|
4
|
+
// These types ENFORCE the standardized response format from our Identity API
|
|
5
|
+
// If the API doesn't return this exact structure, TypeScript will break the build
|
|
6
|
+
// NO MORE data.data.data.data NONSENSE - EVER!
|
|
7
|
+
// ========================================================================================
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* BASE STANDARDIZED RESPONSE FORMAT
|
|
11
|
+
* This is THE ONLY acceptable response format from our APIs
|
|
12
|
+
*/
|
|
13
|
+
export interface StandardizedApiResponse<TData = unknown> {
|
|
14
|
+
/** REQUIRED: Operation success status */
|
|
15
|
+
success: true;
|
|
16
|
+
/** REQUIRED: The actual data payload */
|
|
17
|
+
data: TData;
|
|
18
|
+
/** REQUIRED: Human-readable success message */
|
|
19
|
+
message: string;
|
|
20
|
+
/** REQUIRED: Unique operation code for tracking */
|
|
21
|
+
operation_code: string;
|
|
22
|
+
/** Optional: Server timestamp */
|
|
23
|
+
timestamp?: string;
|
|
24
|
+
/** Optional: Request ID for tracing */
|
|
25
|
+
request_id?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* STANDARDIZED ERROR RESPONSE FORMAT
|
|
30
|
+
* This is THE ONLY acceptable error format from our APIs
|
|
31
|
+
*/
|
|
32
|
+
export interface StandardizedErrorResponse {
|
|
33
|
+
/** REQUIRED: Always false for errors */
|
|
34
|
+
success: false;
|
|
35
|
+
/** REQUIRED: Standard error code */
|
|
36
|
+
error_code: string;
|
|
37
|
+
/** REQUIRED: Human-readable error message */
|
|
38
|
+
message: string;
|
|
39
|
+
/** REQUIRED: Operation that failed */
|
|
40
|
+
operation: string;
|
|
41
|
+
/** Optional: Additional error details - can be any structure from IDP */
|
|
42
|
+
details?: unknown;
|
|
43
|
+
/** Optional: Validation errors */
|
|
44
|
+
validation_errors?: Record<string, string[]>;
|
|
45
|
+
/** Optional: Server timestamp */
|
|
46
|
+
timestamp?: string;
|
|
47
|
+
/** Optional: Request ID for tracing */
|
|
48
|
+
request_id?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* STANDARDIZED PAGINATED RESPONSE FORMAT
|
|
53
|
+
* For endpoints that return paged data
|
|
54
|
+
*/
|
|
55
|
+
export interface StandardizedPagedResponse<TData = unknown> {
|
|
56
|
+
/** REQUIRED: Always true for success */
|
|
57
|
+
success: true;
|
|
58
|
+
/** REQUIRED: Array of data items */
|
|
59
|
+
data: TData[];
|
|
60
|
+
/** REQUIRED: Human-readable success message */
|
|
61
|
+
message: string;
|
|
62
|
+
/** REQUIRED: Unique operation code */
|
|
63
|
+
operation_code: string;
|
|
64
|
+
/** REQUIRED: Pagination metadata */
|
|
65
|
+
pagination: {
|
|
66
|
+
/** Current page number (1-based) */
|
|
67
|
+
current_page: number;
|
|
68
|
+
/** Total number of pages */
|
|
69
|
+
total_pages: number;
|
|
70
|
+
/** Number of items per page */
|
|
71
|
+
page_size: number;
|
|
72
|
+
/** Total number of items across all pages */
|
|
73
|
+
total_items: number;
|
|
74
|
+
/** True if there are more pages after current */
|
|
75
|
+
has_next_page: boolean;
|
|
76
|
+
/** True if there are pages before current */
|
|
77
|
+
has_previous_page: boolean;
|
|
78
|
+
};
|
|
79
|
+
/** Optional: Server timestamp */
|
|
80
|
+
timestamp?: string;
|
|
81
|
+
/** Optional: Request ID for tracing */
|
|
82
|
+
request_id?: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* VALIDATION ERROR RESPONSE FORMAT
|
|
87
|
+
* For input validation failures
|
|
88
|
+
*/
|
|
89
|
+
export interface StandardizedValidationResponse {
|
|
90
|
+
/** REQUIRED: Always false for validation errors */
|
|
91
|
+
success: false;
|
|
92
|
+
/** REQUIRED: Always 'VALIDATION_ERROR' */
|
|
93
|
+
error_code: 'VALIDATION_ERROR';
|
|
94
|
+
/** REQUIRED: Summary message */
|
|
95
|
+
message: string;
|
|
96
|
+
/** REQUIRED: Operation that failed */
|
|
97
|
+
operation: string;
|
|
98
|
+
/** REQUIRED: Field-specific validation errors */
|
|
99
|
+
payload: {
|
|
100
|
+
/** Field name mapped to array of error messages */
|
|
101
|
+
validation_errors: Record<string, string[]>;
|
|
102
|
+
/** The invalid value that caused the error */
|
|
103
|
+
invalid_value?: unknown;
|
|
104
|
+
/** The field that caused the primary error */
|
|
105
|
+
primary_field?: string;
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ========================================================================================
|
|
110
|
+
// RESPONSE TYPE UNION - THE ONLY VALID API RESPONSES
|
|
111
|
+
// ========================================================================================
|
|
112
|
+
|
|
113
|
+
/** ALL POSSIBLE STANDARDIZED RESPONSES */
|
|
114
|
+
export type StandardizedResponse<TData = unknown> =
|
|
115
|
+
| StandardizedApiResponse<TData>
|
|
116
|
+
| StandardizedPagedResponse<TData>
|
|
117
|
+
| StandardizedErrorResponse
|
|
118
|
+
| StandardizedValidationResponse;
|
|
119
|
+
|
|
120
|
+
// ========================================================================================
|
|
121
|
+
// TYPE GUARDS FOR RUNTIME VALIDATION
|
|
122
|
+
// ========================================================================================
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Type guard to check if response is a success response
|
|
126
|
+
* THROWS if response doesn't match standardized format
|
|
127
|
+
*/
|
|
128
|
+
export function isSuccessResponse<TData = unknown>(
|
|
129
|
+
response: unknown
|
|
130
|
+
): response is StandardizedApiResponse<TData> {
|
|
131
|
+
if (!response || typeof response !== 'object') {
|
|
132
|
+
throw new Error('INVALID_API_RESPONSE: Response is not an object');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const r = response as any;
|
|
136
|
+
|
|
137
|
+
if (r.success !== true) {
|
|
138
|
+
return false; // This is an error response, not invalid format
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// SUCCESS RESPONSE VALIDATION - BE STRICT!
|
|
142
|
+
if (!('data' in r)) {
|
|
143
|
+
throw new Error('INVALID_API_RESPONSE: Success response missing required "data" field');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (!('message' in r) || typeof r.message !== 'string') {
|
|
147
|
+
throw new Error('INVALID_API_RESPONSE: Success response missing required "message" field');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!('operation_code' in r) || typeof r.operation_code !== 'string') {
|
|
151
|
+
throw new Error('INVALID_API_RESPONSE: Success response missing required "operation_code" field');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Type guard to check if response is a paged success response
|
|
159
|
+
* THROWS if response doesn't match standardized format
|
|
160
|
+
*/
|
|
161
|
+
export function isPagedResponse<TData = unknown>(
|
|
162
|
+
response: unknown
|
|
163
|
+
): response is StandardizedPagedResponse<TData> {
|
|
164
|
+
if (!isSuccessResponse(response)) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const r = response as any;
|
|
169
|
+
|
|
170
|
+
// Check if it has pagination metadata
|
|
171
|
+
if (!('pagination' in r) || typeof r.pagination !== 'object') {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const pagination = r.pagination;
|
|
176
|
+
const requiredPaginationFields = [
|
|
177
|
+
'current_page', 'total_pages', 'page_size', 'total_items',
|
|
178
|
+
'has_next_page', 'has_previous_page'
|
|
179
|
+
];
|
|
180
|
+
|
|
181
|
+
for (const field of requiredPaginationFields) {
|
|
182
|
+
if (!(field in pagination)) {
|
|
183
|
+
throw new Error(`INVALID_API_RESPONSE: Paged response missing required pagination.${field}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Ensure data is an array for paged responses
|
|
188
|
+
if (!Array.isArray(r.data)) {
|
|
189
|
+
throw new Error('INVALID_API_RESPONSE: Paged response data must be an array');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Type guard to check if response is an error response
|
|
197
|
+
* THROWS if response doesn't match standardized format
|
|
198
|
+
*/
|
|
199
|
+
export function isErrorResponse(
|
|
200
|
+
response: unknown
|
|
201
|
+
): response is StandardizedErrorResponse {
|
|
202
|
+
if (!response || typeof response !== 'object') {
|
|
203
|
+
throw new Error('INVALID_API_RESPONSE: Response is not an object');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const r = response as any;
|
|
207
|
+
|
|
208
|
+
if (r.success !== false) {
|
|
209
|
+
return false; // This is a success response, not invalid format
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// ERROR RESPONSE VALIDATION - BE STRICT!
|
|
213
|
+
if (!('error_code' in r) || typeof r.error_code !== 'string') {
|
|
214
|
+
throw new Error('INVALID_API_RESPONSE: Error response missing required "error_code" field');
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (!('message' in r) || typeof r.message !== 'string') {
|
|
218
|
+
throw new Error('INVALID_API_RESPONSE: Error response missing required "message" field');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (!('operation' in r) || typeof r.operation !== 'string') {
|
|
222
|
+
throw new Error('INVALID_API_RESPONSE: Error response missing required "operation" field');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Type guard to check if response is a validation error
|
|
230
|
+
* THROWS if response doesn't match standardized format
|
|
231
|
+
*/
|
|
232
|
+
export function isValidationErrorResponse(
|
|
233
|
+
response: unknown
|
|
234
|
+
): response is StandardizedValidationResponse {
|
|
235
|
+
if (!isErrorResponse(response)) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const r = response as any;
|
|
240
|
+
|
|
241
|
+
if (r.error_code !== 'VALIDATION_ERROR') {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// VALIDATION ERROR RESPONSE VALIDATION - BE STRICT!
|
|
246
|
+
if (!('payload' in r) || typeof r.payload !== 'object') {
|
|
247
|
+
throw new Error('INVALID_API_RESPONSE: Validation error missing required "payload" field');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (!('validation_errors' in r.payload) || typeof r.payload.validation_errors !== 'object') {
|
|
251
|
+
throw new Error('INVALID_API_RESPONSE: Validation error missing required "payload.validation_errors" field');
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// ========================================================================================
|
|
258
|
+
// RESPONSE VALIDATOR - ENFORCES COMPLIANCE AT RUNTIME
|
|
259
|
+
// ========================================================================================
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* VALIDATES AND NORMALIZES API RESPONSES
|
|
263
|
+
* This function BREAKS THE BUILD if responses don't match our standard
|
|
264
|
+
* NO EXCEPTIONS - ZERO TOLERANCE FOR BAD RESPONSES
|
|
265
|
+
*/
|
|
266
|
+
export function validateStandardizedResponse<TData = unknown>(
|
|
267
|
+
response: unknown,
|
|
268
|
+
endpoint?: string
|
|
269
|
+
): StandardizedResponse<TData> {
|
|
270
|
+
const context = endpoint ? ` for endpoint: ${endpoint}` : '';
|
|
271
|
+
|
|
272
|
+
try {
|
|
273
|
+
// First, basic object validation
|
|
274
|
+
if (!response || typeof response !== 'object') {
|
|
275
|
+
throw new Error(`CRITICAL_API_ERROR: Invalid response object${context}`);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const r = response as any;
|
|
279
|
+
|
|
280
|
+
// Check for success field (REQUIRED)
|
|
281
|
+
if (!('success' in r) || typeof r.success !== 'boolean') {
|
|
282
|
+
throw new Error(`CRITICAL_API_ERROR: Response missing required boolean "success" field${context}`);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Route to appropriate validator based on success status
|
|
286
|
+
if (r.success === true) {
|
|
287
|
+
// Check if it's a paged response
|
|
288
|
+
if ('pagination' in r) {
|
|
289
|
+
if (isPagedResponse<TData>(response)) {
|
|
290
|
+
return response as StandardizedPagedResponse<TData>;
|
|
291
|
+
}
|
|
292
|
+
} else {
|
|
293
|
+
if (isSuccessResponse<TData>(response)) {
|
|
294
|
+
return response as StandardizedApiResponse<TData>;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
} else if (r.success === false) {
|
|
298
|
+
// Check if it's a validation error
|
|
299
|
+
if (r.error_code === 'VALIDATION_ERROR') {
|
|
300
|
+
if (isValidationErrorResponse(response)) {
|
|
301
|
+
return response as StandardizedValidationResponse;
|
|
302
|
+
}
|
|
303
|
+
} else {
|
|
304
|
+
if (isErrorResponse(response)) {
|
|
305
|
+
return response as StandardizedErrorResponse;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// If we reach here, the response format is invalid
|
|
311
|
+
throw new Error(`CRITICAL_API_ERROR: Response format validation failed${context}. Response: ${JSON.stringify(response, null, 2)}`);
|
|
312
|
+
|
|
313
|
+
} catch (error) {
|
|
314
|
+
// Re-throw validation errors with context
|
|
315
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown validation error';
|
|
316
|
+
throw new Error(`${errorMessage}${context}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// ========================================================================================
|
|
321
|
+
// CONVENIENCE TYPE EXTRACTORS
|
|
322
|
+
// ========================================================================================
|
|
323
|
+
|
|
324
|
+
/** Extract the data type from a standardized response */
|
|
325
|
+
export type ExtractResponseData<T> = T extends StandardizedApiResponse<infer U>
|
|
326
|
+
? U
|
|
327
|
+
: T extends StandardizedPagedResponse<infer U>
|
|
328
|
+
? U[]
|
|
329
|
+
: never;
|
|
330
|
+
|
|
331
|
+
/** Extract the error code from an error response */
|
|
332
|
+
export type ExtractErrorCode<T> = T extends StandardizedErrorResponse
|
|
333
|
+
? T['error_code']
|
|
334
|
+
: T extends StandardizedValidationResponse
|
|
335
|
+
? T['error_code']
|
|
336
|
+
: never;
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* =============================================================================
|
|
3
|
+
* USER AGENT PARSER
|
|
4
|
+
* =============================================================================
|
|
5
|
+
*
|
|
6
|
+
* Lightweight user agent parsing without external dependencies.
|
|
7
|
+
* Extracts device type, browser, and OS information from user agent strings.
|
|
8
|
+
*
|
|
9
|
+
* USAGE:
|
|
10
|
+
* ------
|
|
11
|
+
* import { parseUserAgent, DeviceInfo } from '@payez/next-mvp/lib/user-agent-parser';
|
|
12
|
+
*
|
|
13
|
+
* const info = parseUserAgent(request.headers.get('user-agent'));
|
|
14
|
+
* console.log(info.browser); // 'Chrome'
|
|
15
|
+
* console.log(info.deviceType); // 'desktop'
|
|
16
|
+
*
|
|
17
|
+
* =============================================================================
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
// -----------------------------------------------------------------------------
|
|
21
|
+
// TYPES
|
|
22
|
+
// -----------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
export type DeviceType = 'desktop' | 'mobile' | 'tablet' | 'unknown';
|
|
25
|
+
|
|
26
|
+
export interface DeviceInfo {
|
|
27
|
+
deviceType: DeviceType;
|
|
28
|
+
browser: string;
|
|
29
|
+
browserVersion?: string;
|
|
30
|
+
os: string;
|
|
31
|
+
osVersion?: string;
|
|
32
|
+
isMobile: boolean;
|
|
33
|
+
isTablet: boolean;
|
|
34
|
+
isDesktop: boolean;
|
|
35
|
+
isBot: boolean;
|
|
36
|
+
raw: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// -----------------------------------------------------------------------------
|
|
40
|
+
// DETECTION PATTERNS
|
|
41
|
+
// -----------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
const MOBILE_KEYWORDS = [
|
|
44
|
+
'Mobile',
|
|
45
|
+
'Android',
|
|
46
|
+
'iPhone',
|
|
47
|
+
'iPod',
|
|
48
|
+
'BlackBerry',
|
|
49
|
+
'IEMobile',
|
|
50
|
+
'Opera Mini',
|
|
51
|
+
'Opera Mobi',
|
|
52
|
+
'Windows Phone',
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
const TABLET_KEYWORDS = [
|
|
56
|
+
'iPad',
|
|
57
|
+
'Tablet',
|
|
58
|
+
'PlayBook',
|
|
59
|
+
'Silk',
|
|
60
|
+
'Kindle',
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
const BOT_KEYWORDS = [
|
|
64
|
+
'bot',
|
|
65
|
+
'spider',
|
|
66
|
+
'crawler',
|
|
67
|
+
'slurp',
|
|
68
|
+
'googlebot',
|
|
69
|
+
'bingbot',
|
|
70
|
+
'yandex',
|
|
71
|
+
'baidu',
|
|
72
|
+
'duckduckbot',
|
|
73
|
+
'facebookexternalhit',
|
|
74
|
+
'twitterbot',
|
|
75
|
+
'linkedinbot',
|
|
76
|
+
'pinterest',
|
|
77
|
+
'semrush',
|
|
78
|
+
'ahref',
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
// Browser detection patterns (order matters - more specific first)
|
|
82
|
+
const BROWSER_PATTERNS: Array<{ name: string; pattern: RegExp }> = [
|
|
83
|
+
{ name: 'Edge', pattern: /Edg(?:e|A|iOS)?\/(\d+(?:\.\d+)*)/ },
|
|
84
|
+
{ name: 'Opera', pattern: /(?:OPR|Opera)\/(\d+(?:\.\d+)*)/ },
|
|
85
|
+
{ name: 'Samsung Browser', pattern: /SamsungBrowser\/(\d+(?:\.\d+)*)/ },
|
|
86
|
+
{ name: 'UC Browser', pattern: /UCBrowser\/(\d+(?:\.\d+)*)/ },
|
|
87
|
+
{ name: 'Firefox', pattern: /Firefox\/(\d+(?:\.\d+)*)/ },
|
|
88
|
+
{ name: 'Chrome', pattern: /Chrome\/(\d+(?:\.\d+)*)/ },
|
|
89
|
+
{ name: 'Safari', pattern: /Version\/(\d+(?:\.\d+)*).*Safari/ },
|
|
90
|
+
{ name: 'Safari', pattern: /Safari\/(\d+(?:\.\d+)*)/ },
|
|
91
|
+
{ name: 'IE', pattern: /(?:MSIE |rv:)(\d+(?:\.\d+)*)/ },
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
// OS detection patterns
|
|
95
|
+
const OS_PATTERNS: Array<{ name: string; pattern: RegExp; versionPattern?: RegExp }> = [
|
|
96
|
+
{ name: 'iOS', pattern: /iPhone|iPad|iPod/, versionPattern: /OS (\d+[_\.]\d+(?:[_\.]\d+)?)/ },
|
|
97
|
+
{ name: 'Android', pattern: /Android/, versionPattern: /Android (\d+(?:\.\d+)*)/ },
|
|
98
|
+
{ name: 'Windows', pattern: /Windows/, versionPattern: /Windows NT (\d+(?:\.\d+)*)/ },
|
|
99
|
+
{ name: 'macOS', pattern: /Mac OS X/, versionPattern: /Mac OS X (\d+[_\.]\d+(?:[_\.]\d+)?)/ },
|
|
100
|
+
{ name: 'Linux', pattern: /Linux/, versionPattern: undefined },
|
|
101
|
+
{ name: 'Chrome OS', pattern: /CrOS/, versionPattern: undefined },
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
// Windows NT version mapping
|
|
105
|
+
const WINDOWS_VERSIONS: Record<string, string> = {
|
|
106
|
+
'10.0': '10/11',
|
|
107
|
+
'6.3': '8.1',
|
|
108
|
+
'6.2': '8',
|
|
109
|
+
'6.1': '7',
|
|
110
|
+
'6.0': 'Vista',
|
|
111
|
+
'5.1': 'XP',
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// -----------------------------------------------------------------------------
|
|
115
|
+
// PARSER FUNCTION
|
|
116
|
+
// -----------------------------------------------------------------------------
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Parse a user agent string to extract device, browser, and OS information.
|
|
120
|
+
*
|
|
121
|
+
* @param userAgent - The user agent string from request headers
|
|
122
|
+
* @returns Parsed device information
|
|
123
|
+
*/
|
|
124
|
+
export function parseUserAgent(userAgent?: string | null): DeviceInfo {
|
|
125
|
+
const ua = userAgent || '';
|
|
126
|
+
const uaLower = ua.toLowerCase();
|
|
127
|
+
|
|
128
|
+
// Default result
|
|
129
|
+
const result: DeviceInfo = {
|
|
130
|
+
deviceType: 'unknown',
|
|
131
|
+
browser: 'Unknown',
|
|
132
|
+
os: 'Unknown',
|
|
133
|
+
isMobile: false,
|
|
134
|
+
isTablet: false,
|
|
135
|
+
isDesktop: false,
|
|
136
|
+
isBot: false,
|
|
137
|
+
raw: ua,
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
if (!ua) return result;
|
|
141
|
+
|
|
142
|
+
// Check for bots first
|
|
143
|
+
result.isBot = BOT_KEYWORDS.some(keyword => uaLower.includes(keyword));
|
|
144
|
+
|
|
145
|
+
// Detect device type
|
|
146
|
+
result.isTablet = TABLET_KEYWORDS.some(keyword => ua.includes(keyword));
|
|
147
|
+
result.isMobile = !result.isTablet && MOBILE_KEYWORDS.some(keyword => ua.includes(keyword));
|
|
148
|
+
result.isDesktop = !result.isMobile && !result.isTablet && !result.isBot;
|
|
149
|
+
|
|
150
|
+
if (result.isTablet) {
|
|
151
|
+
result.deviceType = 'tablet';
|
|
152
|
+
} else if (result.isMobile) {
|
|
153
|
+
result.deviceType = 'mobile';
|
|
154
|
+
} else if (result.isDesktop) {
|
|
155
|
+
result.deviceType = 'desktop';
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Detect browser
|
|
159
|
+
for (const { name, pattern } of BROWSER_PATTERNS) {
|
|
160
|
+
const match = ua.match(pattern);
|
|
161
|
+
if (match) {
|
|
162
|
+
result.browser = name;
|
|
163
|
+
result.browserVersion = match[1];
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Detect OS
|
|
169
|
+
for (const { name, pattern, versionPattern } of OS_PATTERNS) {
|
|
170
|
+
if (pattern.test(ua)) {
|
|
171
|
+
result.os = name;
|
|
172
|
+
if (versionPattern) {
|
|
173
|
+
const versionMatch = ua.match(versionPattern);
|
|
174
|
+
if (versionMatch) {
|
|
175
|
+
let version = versionMatch[1].replace(/_/g, '.');
|
|
176
|
+
|
|
177
|
+
// Map Windows NT versions to friendly names
|
|
178
|
+
if (name === 'Windows' && WINDOWS_VERSIONS[version]) {
|
|
179
|
+
version = WINDOWS_VERSIONS[version];
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
result.osVersion = version;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// -----------------------------------------------------------------------------
|
|
193
|
+
// HELPER FUNCTIONS
|
|
194
|
+
// -----------------------------------------------------------------------------
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Get a short, human-readable description of the device
|
|
198
|
+
*/
|
|
199
|
+
export function getDeviceDescription(info: DeviceInfo): string {
|
|
200
|
+
const parts: string[] = [];
|
|
201
|
+
|
|
202
|
+
if (info.browser !== 'Unknown') {
|
|
203
|
+
parts.push(info.browser);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (info.os !== 'Unknown') {
|
|
207
|
+
let osDesc = info.os;
|
|
208
|
+
if (info.osVersion) {
|
|
209
|
+
osDesc += ` ${info.osVersion}`;
|
|
210
|
+
}
|
|
211
|
+
parts.push(osDesc);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (parts.length === 0) {
|
|
215
|
+
if (info.isBot) return 'Bot';
|
|
216
|
+
return info.deviceType.charAt(0).toUpperCase() + info.deviceType.slice(1);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return parts.join(' / ');
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Get device type icon (emoji)
|
|
224
|
+
*/
|
|
225
|
+
export function getDeviceIcon(deviceType: DeviceType): string {
|
|
226
|
+
switch (deviceType) {
|
|
227
|
+
case 'mobile':
|
|
228
|
+
return '📱';
|
|
229
|
+
case 'tablet':
|
|
230
|
+
return '📲';
|
|
231
|
+
case 'desktop':
|
|
232
|
+
return '💻';
|
|
233
|
+
default:
|
|
234
|
+
return '🔌';
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get browser icon (emoji)
|
|
240
|
+
*/
|
|
241
|
+
export function getBrowserIcon(browser: string): string {
|
|
242
|
+
const browserLower = browser.toLowerCase();
|
|
243
|
+
|
|
244
|
+
if (browserLower.includes('chrome')) return '🌐';
|
|
245
|
+
if (browserLower.includes('firefox')) return '🦊';
|
|
246
|
+
if (browserLower.includes('safari')) return '🧭';
|
|
247
|
+
if (browserLower.includes('edge')) return '🌐';
|
|
248
|
+
if (browserLower.includes('opera')) return '🔴';
|
|
249
|
+
if (browserLower.includes('ie') || browserLower.includes('internet explorer')) return '🌐';
|
|
250
|
+
|
|
251
|
+
return '🌐';
|
|
252
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ErrorMetrics, HealthMetrics, TimeRange } from '../types';
|
|
2
|
+
|
|
3
|
+
const API_BASE = process.env.NEXT_PUBLIC_VIBE_API_URL || 'http://localhost:32786';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Get admin token from app's auth implementation
|
|
7
|
+
* Apps should override this via their own auth logic
|
|
8
|
+
*/
|
|
9
|
+
function getAdminToken(): string {
|
|
10
|
+
if (typeof window !== 'undefined' && window.localStorage) {
|
|
11
|
+
return localStorage.getItem('admin_token') || '';
|
|
12
|
+
}
|
|
13
|
+
return '';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function getErrorMetrics(timeRange: TimeRange = '24h') {
|
|
17
|
+
// Convert timeRange to hours for backend API
|
|
18
|
+
const hoursMap: Record<TimeRange, number> = {
|
|
19
|
+
'1h': 1,
|
|
20
|
+
'24h': 24,
|
|
21
|
+
'7d': 168,
|
|
22
|
+
'30d': 720
|
|
23
|
+
};
|
|
24
|
+
const hours = hoursMap[timeRange];
|
|
25
|
+
|
|
26
|
+
const res = await fetch(`${API_BASE}/v1/admin/analytics/errors?hours=${hours}`, {
|
|
27
|
+
headers: {
|
|
28
|
+
Authorization: `Bearer ${getAdminToken()}`
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
throw new Error(`Failed to fetch error metrics: ${res.statusText}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return res.json();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function getHealthMetrics(timeRange: TimeRange = '1h') {
|
|
40
|
+
const res = await fetch(`${API_BASE}/v1/admin/analytics/health?timeRange=${timeRange}`, {
|
|
41
|
+
headers: {
|
|
42
|
+
Authorization: `Bearer ${getAdminToken()}`
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (!res.ok) {
|
|
47
|
+
throw new Error(`Failed to fetch health metrics: ${res.statusText}`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return res.json();
|
|
51
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { AuditLogEntry, AuditLogQuery, AuditLogResponse } from '../types';
|
|
2
|
+
|
|
3
|
+
const API_BASE = process.env.NEXT_PUBLIC_VIBE_API_URL || 'http://localhost:32786';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Get admin token from app's auth implementation
|
|
7
|
+
*/
|
|
8
|
+
function getAdminToken(): string {
|
|
9
|
+
if (typeof window !== 'undefined' && window.localStorage) {
|
|
10
|
+
return localStorage.getItem('admin_token') || '';
|
|
11
|
+
}
|
|
12
|
+
return '';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function writeAuditLog(entry: Omit<AuditLogEntry, 'id' | 'timestamp'>) {
|
|
16
|
+
const res = await fetch(`${API_BASE}/v1/audit`, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
Authorization: `Bearer ${getAdminToken()}`
|
|
21
|
+
},
|
|
22
|
+
body: JSON.stringify(entry)
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
throw new Error(`Failed to write audit log: ${res.statusText}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return res.json();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function queryAuditLog(query: AuditLogQuery): Promise<AuditLogResponse> {
|
|
33
|
+
const params = new URLSearchParams();
|
|
34
|
+
|
|
35
|
+
if (query.category) params.append('category', query.category);
|
|
36
|
+
if (query.userId) params.append('userId', query.userId.toString());
|
|
37
|
+
if (query.startDate) params.append('startDate', query.startDate);
|
|
38
|
+
if (query.endDate) params.append('endDate', query.endDate);
|
|
39
|
+
if (query.page) params.append('page', query.page.toString());
|
|
40
|
+
if (query.pageSize) params.append('pageSize', query.pageSize.toString());
|
|
41
|
+
|
|
42
|
+
const res = await fetch(`${API_BASE}/v1/audit?${params.toString()}`, {
|
|
43
|
+
headers: {
|
|
44
|
+
Authorization: `Bearer ${getAdminToken()}`
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
throw new Error(`Failed to query audit log: ${res.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return res.json();
|
|
53
|
+
}
|