from fastapi import APIRouter, Depends, Form, Request from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from domain import services from domain.exceptions import AuthenticationError from infra.database import get_database_connection from infra.repositories import UserRepository import infra.crypto as crypto router = APIRouter() templates = Jinja2Templates(directory="presentation/templates") def _get_db(): conn = get_database_connection() try: yield conn finally: conn.close() @router.get("/login", response_class=HTMLResponse) def login_page(request: Request): if request.session.get("user_id"): return RedirectResponse(url="/secrets", status_code=302) return templates.TemplateResponse(request, "login.html", {"user": None, "error": None}) @router.post("/login") def login( request: Request, username: str = Form(...), password: str = Form(...), conn=Depends(_get_db), ): user_repo = UserRepository(conn) try: user = services.authenticate_user(username, password, user_repo, crypto) except AuthenticationError as exc: return templates.TemplateResponse( request, "login.html", {"user": None, "error": str(exc)}, status_code=401, ) request.session["user_id"] = user.id request.session["username"] = user.username return RedirectResponse(url="/secrets", status_code=302) @router.get("/logout") def logout(request: Request): request.session.clear() return RedirectResponse(url="/login", status_code=302)