51 lines
1.6 KiB
Python
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) |