2025-10-18 05:50:43 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
import aiosqlite
|
|
|
|
|
from fastapi import APIRouter, Depends, Request
|
2025-10-18 06:05:48 +00:00
|
|
|
from fastapi.responses import JSONResponse
|
|
|
|
|
from fastapi.encoders import jsonable_encoder
|
2025-10-18 05:50:43 +00:00
|
|
|
|
|
|
|
|
import persons
|
2025-10-18 06:05:48 +00:00
|
|
|
from common import ProblemDetails, ApiModel
|
2025-10-18 06:14:03 +00:00
|
|
|
from api.deps import get_db, cookie_person, error_response
|
2025-10-18 05:50:43 +00:00
|
|
|
|
|
|
|
|
router = APIRouter(prefix="/auth", tags=["auth"])
|
|
|
|
|
|
|
|
|
|
|
2025-10-18 06:05:48 +00:00
|
|
|
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
|
2025-10-18 05:50:43 +00:00
|
|
|
|
|
|
|
|
|
2025-10-18 06:05:48 +00:00
|
|
|
@router.post(
|
|
|
|
|
"/refresh",
|
|
|
|
|
operation_id="refresh",
|
|
|
|
|
summary="Refresh current user from cookie",
|
|
|
|
|
)
|
2025-10-18 05:50:43 +00:00
|
|
|
async def current_user(user: persons.Person = Depends(cookie_person)) -> persons.Person:
|
2025-10-18 06:05:48 +00:00
|
|
|
return user
|