forked from 0xWheatyz/SPARC
e9ad97d1e8
- Enhance GET /admin/rate-limits to return per-IP breakdown, 24h throttled count, and hourly time-series of rejected requests - Add AdminRateLimits React page with auto-refresh (configurable interval), summary cards, throttled-over-time bar chart, endpoint table, and per-IP breakdown table - Add TypeScript types (RateLimitStatsResponse, etc.) and adminApi.getRateLimits() - Wire up /admin/rate-limits route and nav link (admin-only) - Expand unit tests: auth, empty state, per-IP, throttled_24h, time-series, response shape contract (10 tests total) Closes leeworks-agents/SPARC#1686 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
84 lines
2.7 KiB
TypeScript
84 lines
2.7 KiB
TypeScript
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
import { AuthProvider } from './context/AuthContext';
|
|
import { ThemeProvider } from './context/ThemeContext';
|
|
import { Layout } from './components/Layout';
|
|
import { ProtectedRoute } from './components/ProtectedRoute';
|
|
import { Login } from './pages/Login';
|
|
import { Register } from './pages/Register';
|
|
import { Analysis } from './pages/Analysis';
|
|
import { Batch } from './pages/Batch';
|
|
import { AnalyticsPage } from './pages/Analytics';
|
|
import { About } from './pages/About';
|
|
import { AdminUsers } from './pages/AdminUsers';
|
|
import { AdminRateLimits } from './pages/AdminRateLimits';
|
|
import { Compare } from './pages/Compare';
|
|
import { HistoryDiff } from './pages/HistoryDiff';
|
|
|
|
const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
staleTime: 1000 * 60 * 5, // 5 minutes
|
|
retry: 1,
|
|
},
|
|
},
|
|
});
|
|
|
|
function App() {
|
|
return (
|
|
<ThemeProvider>
|
|
<QueryClientProvider client={queryClient}>
|
|
<AuthProvider>
|
|
<BrowserRouter>
|
|
<Routes>
|
|
{/* Public routes */}
|
|
<Route path="/login" element={<Login />} />
|
|
<Route path="/register" element={<Register />} />
|
|
|
|
{/* Protected routes */}
|
|
<Route
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout />
|
|
</ProtectedRoute>
|
|
}
|
|
>
|
|
<Route path="/analysis" element={<Analysis />} />
|
|
<Route path="/batch" element={<Batch />} />
|
|
<Route path="/analytics" element={<AnalyticsPage />} />
|
|
<Route path="/compare" element={<Compare />} />
|
|
<Route path="/history-diff" element={<HistoryDiff />} />
|
|
<Route path="/about" element={<About />} />
|
|
|
|
{/* Admin routes */}
|
|
<Route
|
|
path="/admin/users"
|
|
element={
|
|
<ProtectedRoute requireAdmin>
|
|
<AdminUsers />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/admin/rate-limits"
|
|
element={
|
|
<ProtectedRoute requireAdmin>
|
|
<AdminRateLimits />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
</Route>
|
|
|
|
{/* Default redirect */}
|
|
<Route path="/" element={<Navigate to="/analysis" replace />} />
|
|
<Route path="*" element={<Navigate to="/analysis" replace />} />
|
|
</Routes>
|
|
</BrowserRouter>
|
|
</AuthProvider>
|
|
</QueryClientProvider>
|
|
</ThemeProvider>
|
|
);
|
|
}
|
|
|
|
export default App;
|