from functools import lru_cache from fastapi import Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer from jose import JWTError from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models.user import User from app.services.api_key_manager import APIKeyManager from app.services.auth import verify_token oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/login") @lru_cache(maxsize=1) def get_key_manager() -> APIKeyManager: manager = APIKeyManager() manager.load_env_keys() return manager async def get_current_user( token: str = Depends(oauth2_scheme), db: AsyncSession = Depends(get_db), ) -> User: credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) try: payload = verify_token(token) user_id: str | None = payload.get("sub") if user_id is None: raise credentials_exception except (JWTError, ValueError): raise credentials_exception stmt = select(User).where(User.id == user_id) result = await db.execute(stmt) user = result.scalar_one_or_none() if user is None: raise credentials_exception return user