40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
from fastapi import APIRouter, Form, Request
|
|
from fastapi.responses import RedirectResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
|
|
from app.core.auth import authenticate_user
|
|
|
|
router = APIRouter()
|
|
templates = Jinja2Templates(directory="app/templates")
|
|
|
|
|
|
@router.get("/login")
|
|
def login_page(request: Request, error: str | None = None):
|
|
if getattr(request.state, "current_user", None):
|
|
return RedirectResponse(url="/", status_code=303)
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="auth/login.html",
|
|
context={"request": request, "error": error},
|
|
)
|
|
|
|
|
|
@router.post("/login")
|
|
def login_submit(request: Request, username: str = Form(...), password: str = Form(...)):
|
|
user = authenticate_user(username, password)
|
|
if not user:
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="auth/login.html",
|
|
context={"request": request, "error": "Invalid username or password."},
|
|
status_code=400,
|
|
)
|
|
request.session["current_user"] = user
|
|
return RedirectResponse(url="/", status_code=303)
|
|
|
|
|
|
@router.post("/logout")
|
|
def logout_submit(request: Request):
|
|
request.session.pop("current_user", None)
|
|
return RedirectResponse(url="/login", status_code=303)
|