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)