48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
from fastapi import APIRouter, Depends, Form, Request, status
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.database import get_db
|
|
from app.deps import authenticate_admin
|
|
|
|
router = APIRouter(prefix="/admin", tags=["auth"])
|
|
|
|
|
|
@router.get("/login", response_class=HTMLResponse)
|
|
async def login_page(request: Request):
|
|
if request.session.get("admin_id"):
|
|
return RedirectResponse("/admin", status_code=status.HTTP_303_SEE_OTHER)
|
|
return request.app.state.templates.TemplateResponse(
|
|
"admin/login.html",
|
|
{"request": request, "error": None, "app_name": request.app.state.settings.app_name},
|
|
)
|
|
|
|
|
|
@router.post("/login", response_class=HTMLResponse)
|
|
async def login_submit(
|
|
request: Request,
|
|
username: str = Form(...),
|
|
password: str = Form(...),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
user = await authenticate_admin(db, username.strip(), password)
|
|
if not user:
|
|
return request.app.state.templates.TemplateResponse(
|
|
"admin/login.html",
|
|
{
|
|
"request": request,
|
|
"error": "Неверный логин или пароль",
|
|
"app_name": request.app.state.settings.app_name,
|
|
},
|
|
status_code=400,
|
|
)
|
|
request.session["admin_id"] = user.id
|
|
request.session["admin_username"] = user.username
|
|
return RedirectResponse("/admin", status_code=status.HTTP_303_SEE_OTHER)
|
|
|
|
|
|
@router.post("/logout")
|
|
async def logout(request: Request):
|
|
request.session.clear()
|
|
return RedirectResponse("/admin/login", status_code=status.HTTP_303_SEE_OTHER)
|