from __future__ import annotations from collections.abc import Generator from fastapi import Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer from pydantic import ValidationError from sqlalchemy.orm import Session from backend.app.core.security import decode_access_token from backend.app.db.session import get_db_session from backend.app.models import TokenPayload, UserPublic from backend.app.services.auth import get_user, to_public_user oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/auth/login") async def get_current_user(token: str = Depends(oauth2_scheme)) -> UserPublic: try: payload = TokenPayload(**decode_access_token(token)) except (ValueError, ValidationError) as exc: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) from exc user = get_user(payload.sub) if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="User not found", headers={"WWW-Authenticate": "Bearer"}, ) return to_public_user(user) def get_db() -> Generator[Session, None, None]: yield from get_db_session()