from fastapi import APIRouter, Depends, Form, Request from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from sqlalchemy.orm import Session from app.core.auth import clear_auth_cookie, create_access_token, set_auth_cookie from app.core.config import get_settings from app.core.database import get_db from app.modules.auth.dependencies import get_current_user from app.modules.auth.schemas import UserOut from app.modules.auth.service import authenticate_user router = APIRouter(prefix="/auth", tags=["auth"]) templates = Jinja2Templates(directory="app/templates") settings = get_settings() _NAV: list[dict] = [] @router.get("/login", response_class=HTMLResponse) async def login_page(request: Request): return templates.TemplateResponse( request, "auth/login.html", {"nav_items": _NAV, "app_version": "0.1.0"} ) @router.post("/login", response_class=HTMLResponse) async def login( request: Request, username: str = Form(...), password: str = Form(...), db: Session = Depends(get_db), ): user = authenticate_user(db, username, password, ldap_enabled=settings.LDAP_ENABLED) if user is None: return templates.TemplateResponse( request, "auth/login.html", {"nav_items": _NAV, "app_version": "0.1.0", "error": "Ungültige Zugangsdaten."}, status_code=200, ) token = create_access_token(username=user.username, is_admin=user.is_admin) response = RedirectResponse(url="/", status_code=303) set_auth_cookie(response, token) return response @router.get("/logout") async def logout(): response = RedirectResponse(url="/auth/login", status_code=303) clear_auth_cookie(response) return response @router.get("/me", response_model=UserOut) async def me(user=Depends(get_current_user)): return user