import html from fastapi import APIRouter, Form, Request from fastapi.responses import HTMLResponse, RedirectResponse from app.auth import authenticate_user, current_user from app.db.audit import log_audit_event from app.templates.layout import page router = APIRouter() @router.get("/login", response_class=HTMLResponse) def login_form(request: Request): if current_user(request): return RedirectResponse(url="/portal/operations", status_code=303) return _render_login() @router.post("/login", response_class=HTMLResponse) def login(request: Request, username: str = Form(...), password: str = Form(...)): user = authenticate_user(username, password) if not user: return _render_login("Neplatné přihlašovací údaje.") request.session.clear() request.session["user_id"] = user["id"] log_audit_event( user, action="login_success", target_type="user", target_id=user.get("id"), metadata={"username": user.get("username")}, ) return RedirectResponse(url="/portal/operations", status_code=303) @router.post("/logout") def logout(request: Request): user = current_user(request) log_audit_event( user, action="logout", target_type="user", target_id=user.get("id") if user else None, metadata={"username": user.get("username")} if user else {}, ) request.session.clear() return RedirectResponse(url="/portal/login", status_code=303) def _render_login(error: str | None = None) -> str: error_html = "" if error: error_html = f'

{html.escape(error)}

' return page( "Přihlášení", f"""

CSBot Services Portal

Přihlaste se interním účtem.

{error_html}



""", )