"""Эндпоинты аутентификации.""" from fastapi import APIRouter, Depends from sqlalchemy.orm import Session as DBSession from app.api.deps import get_current_session, get_current_user, require_roles from app.db.session import get_db from app.models.enums import RoleCode from app.models.user import User from app.models.user import Session as UserSession from app.schemas.auth import ( LoginRequest, LoginResponse, LoginTokenCreate, LoginTokenOut, RefreshRequest, TokenPair, UserOut, ) from app.services import auth as auth_service router = APIRouter(prefix="/auth", tags=["auth"]) @router.post("/login-token", response_model=LoginTokenOut, status_code=201) def create_login_token( data: LoginTokenCreate, user: User = Depends(require_roles(RoleCode.COORDINATOR, RoleCode.ADMIN)), db: DBSession = Depends(get_db), ) -> LoginTokenOut: lt, url = auth_service.create_login_token(db, data, issued_by=user.id) return LoginTokenOut(id=lt.id, url=url, expires_at=lt.expires_at) @router.post("/login", response_model=LoginResponse) def login(data: LoginRequest, db: DBSession = Depends(get_db)) -> LoginResponse: tokens, user = auth_service.login(db, data) return LoginResponse( **tokens.model_dump(), user=auth_service.build_user_out(db, user) ) @router.post("/refresh", response_model=TokenPair) def refresh(data: RefreshRequest, db: DBSession = Depends(get_db)) -> TokenPair: return auth_service.refresh(db, data.refresh_token) @router.post("/logout", status_code=204) def logout( session: UserSession = Depends(get_current_session), db: DBSession = Depends(get_db), ) -> None: auth_service.logout(db, session.id) @router.get("/me", response_model=UserOut) def me( user: User = Depends(get_current_user), db: DBSession = Depends(get_db), ) -> UserOut: return auth_service.build_user_out(db, user)