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
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()
|
|
|