from __future__ import annotations import aiosqlite from fastapi import APIRouter, Depends, Request from fastapi.responses import JSONResponse from fastapi.encoders import jsonable_encoder import persons from common import ProblemDetails, ApiModel from api.deps import get_db, cookie_person, error_response router = APIRouter(prefix="/auth", tags=["auth"]) class LoginBody(ApiModel): username: str @router.post( "/login", response_model=None, operation_id="login", summary="Login and set user_id cookie", responses={ 404: {"model": ProblemDetails, "description": "Person not found", "content": {"application/problem+json": {}}} }, ) async def login(data: LoginBody, conn: aiosqlite.Connection = Depends(get_db), request: Request | None = None) -> persons.Person | JSONResponse: person = await persons.get_by_name(conn, data.username) if not person: return error_response(request, 404, "Person not found") response = JSONResponse(content=jsonable_encoder(person)) response.set_cookie(key="user_id", value=str(person.id)) return response @router.post( "/refresh", operation_id="refresh", summary="Refresh current user from cookie", ) async def current_user(user: persons.Person = Depends(cookie_person)) -> persons.Person: return user