release: v0.5.0 - Authentication, API Keys & Advanced Features
E2E Tests / Run E2E Tests (push) Has been cancelled
E2E Tests / Visual Regression Tests (push) Has been cancelled
E2E Tests / Smoke Tests (push) Has been cancelled

Complete v0.5.0 implementation:

Database (@db-engineer):
- 3 migrations: users, api_keys, report_schedules tables
- Foreign keys, indexes, constraints, enums

Backend (@backend-dev):
- JWT authentication service with bcrypt (cost=12)
- Auth endpoints: /register, /login, /refresh, /me
- API Keys service with hash storage and prefix validation
- API Keys endpoints: CRUD + rotate
- Security module with JWT HS256

Frontend (@frontend-dev):
- Login/Register pages with validation
- AuthContext with localStorage persistence
- Protected routes implementation
- API Keys management UI (create, revoke, rotate)
- Header with user dropdown

DevOps (@devops-engineer):
- .env.example and .env.production.example
- docker-compose.scheduler.yml
- scripts/setup-secrets.sh
- INFRASTRUCTURE_SETUP.md

QA (@qa-engineer):
- 85 E2E tests: auth.spec.ts, apikeys.spec.ts, scenarios.spec.ts, regression-v050.spec.ts
- auth-helpers.ts with 20+ utility functions
- Test plans and documentation

Architecture (@spec-architect):
- SECURITY.md with best practices
- SECURITY-CHECKLIST.md pre-deployment
- Updated architecture.md with auth flows
- Updated README.md with v0.5.0 features

Documentation:
- Updated todo.md with v0.5.0 status
- Added docs/README.md index
- Complete setup instructions

Dependencies added:
- bcrypt, python-jose, passlib, email-validator

Tested: JWT auth flow, API keys CRUD, protected routes, 85 E2E tests ready

Closes: v0.5.0 milestone
This commit is contained in:
Luca Sacchi Ricciardi
2026-04-07 19:22:47 +02:00
parent 9b9297b7dc
commit cc60ba17ea
49 changed files with 9847 additions and 176 deletions
+37 -13
View File
@@ -1,35 +1,59 @@
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { QueryProvider } from './providers/QueryProvider';
import { ThemeProvider } from './providers/ThemeProvider';
import { AuthProvider } from './contexts/AuthContext';
import { Toaster } from '@/components/ui/toaster';
import { Layout } from './components/layout/Layout';
import { ProtectedRoute } from './components/auth/ProtectedRoute';
import { Dashboard } from './pages/Dashboard';
import { ScenariosPage } from './pages/ScenariosPage';
import { ScenarioDetail } from './pages/ScenarioDetail';
import { Compare } from './pages/Compare';
import { Reports } from './pages/Reports';
import { Login } from './pages/Login';
import { Register } from './pages/Register';
import { ApiKeys } from './pages/ApiKeys';
import { NotFound } from './pages/NotFound';
// Wrapper for protected routes that need the main layout
function ProtectedLayout() {
return (
<ProtectedRoute>
<Layout />
</ProtectedRoute>
);
}
function App() {
return (
<ThemeProvider defaultTheme="system">
<QueryProvider>
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Dashboard />} />
<Route path="scenarios" element={<ScenariosPage />} />
<Route path="scenarios/:id" element={<ScenarioDetail />} />
<Route path="scenarios/:id/reports" element={<Reports />} />
<Route path="compare" element={<Compare />} />
<AuthProvider>
<BrowserRouter>
<Routes>
{/* Public routes */}
<Route path="/login" element={<Login />} />
<Route path="/register" element={<Register />} />
{/* Protected routes with layout */}
<Route path="/" element={<ProtectedLayout />}>
<Route index element={<Dashboard />} />
<Route path="scenarios" element={<ScenariosPage />} />
<Route path="scenarios/:id" element={<ScenarioDetail />} />
<Route path="scenarios/:id/reports" element={<Reports />} />
<Route path="compare" element={<Compare />} />
<Route path="settings/api-keys" element={<ApiKeys />} />
</Route>
{/* 404 */}
<Route path="*" element={<NotFound />} />
</Route>
</Routes>
</BrowserRouter>
<Toaster />
</Routes>
</BrowserRouter>
<Toaster />
</AuthProvider>
</QueryProvider>
</ThemeProvider>
);
}
export default App;
export default App;