Files
live-campus-mcs-p-2027.2/Semaine_08/secuvault/presentation/routes/auth.py
T
gauvainboiche 3315cb2336 feat: Semaine 8
2026-05-11 09:25:19 +02:00

51 lines
1.6 KiB
Python

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)