30 lines
1.3 KiB
Python
30 lines
1.3 KiB
Python
from fastapi import APIRouter, Depends, Request
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from backend.api.deps import AuthUser, get_current_user
|
|
from backend.db.session import get_session
|
|
from backend.modules.auth.schemas import LoginRequest, TokenResponse
|
|
from backend.modules.auth.service import authenticate_user, build_access_token, create_login_audit
|
|
from backend.modules.users.schemas import UserOut
|
|
|
|
router = APIRouter(prefix="/api/v1/auth", tags=["auth"])
|
|
|
|
|
|
@router.post("/login", response_model=TokenResponse)
|
|
async def login(payload: LoginRequest, request: Request, session: AsyncSession = Depends(get_session)) -> TokenResponse:
|
|
user = await authenticate_user(session, payload.username, payload.password)
|
|
token = build_access_token(user)
|
|
await create_login_audit(session, user, request)
|
|
return TokenResponse(access_token=token, user=UserOut.model_validate(user))
|
|
|
|
|
|
@router.get("/me", response_model=UserOut)
|
|
async def me(auth_user: AuthUser = Depends(get_current_user)) -> UserOut:
|
|
return UserOut.model_validate(auth_user.user)
|
|
|
|
|
|
@router.post("/refresh", response_model=TokenResponse)
|
|
async def refresh(auth_user: AuthUser = Depends(get_current_user)) -> TokenResponse:
|
|
token = build_access_token(auth_user.user)
|
|
return TokenResponse(access_token=token, user=UserOut.model_validate(auth_user.user))
|