You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

46 lines
1.5 KiB

from __future__ import annotations
from fastapi import APIRouter
from fastapi import Depends
from fastapi import Header
from app.api.dependencies import get_auth_service
from app.api.dependencies import require_current_user
from app.models.entities import User
from app.schemas.auth import AuthMeResponse
from app.schemas.auth import LoginRequest
from app.schemas.auth import LoginResponse
from app.schemas.auth import LogoutResponse
from app.schemas.auth import UserSummary
from app.services.auth_service import AuthService
router = APIRouter()
@router.post("/login", response_model=LoginResponse)
async def login(
payload: LoginRequest,
service: AuthService = Depends(get_auth_service),
) -> LoginResponse:
result = await service.login(username=payload.username, password=payload.password)
return LoginResponse(
access_token=result.access_token,
expires_at=result.expires_at,
user=UserSummary.model_validate(result.user, from_attributes=True),
)
@router.get("/me", response_model=AuthMeResponse)
async def me(
current_user: User = Depends(require_current_user),
) -> AuthMeResponse:
return AuthMeResponse(user=UserSummary.model_validate(current_user, from_attributes=True))
@router.post("/logout", response_model=LogoutResponse)
async def logout(
authorization: str | None = Header(default=None, alias="Authorization"),
service: AuthService = Depends(get_auth_service),
) -> LogoutResponse:
await service.logout(authorization)
return LogoutResponse()