feat: Semaine 8
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user