"""Web authentication routes (session-based).""" from fastapi import APIRouter, Request, Form, Depends, HTTPException from fastapi.responses import RedirectResponse, HTMLResponse from sqlalchemy.orm import Session from ..database import get_db from ..services.auth_service import AuthService from ..utils.security import verify_password from .deps import get_flashed_messages router = APIRouter() @router.get("/login", response_class=HTMLResponse) async def login_page(request: Request): """Show login page.""" # If already logged in, redirect to dashboard if request.session.get("user_id"): return RedirectResponse(url="/dashboard", status_code=303) return request.app.state.templates.TemplateResponse( "auth/login.html", {"request": request, "error": None, "flash_messages": get_flashed_messages(request)} ) @router.post("/login", response_class=HTMLResponse) async def login_submit( request: Request, username: str = Form(...), password: str = Form(...), remember: bool = Form(False), db: Session = Depends(get_db) ): """Process login form.""" auth_service = AuthService(db) user = auth_service.authenticate_user(username, password) if not user: return request.app.state.templates.TemplateResponse( "auth/login.html", {"request": request, "error": "Ungültige Anmeldedaten", "flash_messages": []} ) # Store user in session request.session["user_id"] = user.id request.session["username"] = user.username request.session["role"] = user.role.value request.session["tenant_id"] = user.tenant_id return RedirectResponse(url="/dashboard", status_code=303) @router.get("/logout") async def logout(request: Request): """Logout user.""" request.session.clear() return RedirectResponse(url="/login", status_code=303)