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