""" API 의존성 """ from fastapi import Depends, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from typing import Optional from ..core.database import get_db from ..core.security import verify_token, get_user_id_from_token from ..models.user import User # HTTP Bearer 토큰 스키마 security = HTTPBearer() async def get_current_user( credentials: HTTPAuthorizationCredentials = Depends(security), db: AsyncSession = Depends(get_db) ) -> User: """현재 로그인된 사용자 가져오기""" try: # 토큰에서 사용자 ID 추출 user_id = get_user_id_from_token(credentials.credentials) # 데이터베이스에서 사용자 조회 result = await db.execute(select(User).where(User.id == user_id)) user = result.scalar_one_or_none() if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="User not found" ) if not user.is_active: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Inactive user" ) return user except Exception as e: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials" ) async def get_current_active_user( current_user: User = Depends(get_current_user) ) -> User: """활성 사용자 확인""" if not current_user.is_active: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Inactive user" ) return current_user async def get_current_admin_user( current_user: User = Depends(get_current_active_user) ) -> User: """관리자 권한 확인""" if not current_user.is_admin: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Not enough permissions" ) return current_user async def get_optional_current_user( credentials: Optional[HTTPAuthorizationCredentials] = Depends(security), db: AsyncSession = Depends(get_db) ) -> Optional[User]: """선택적 사용자 인증 (토큰이 없어도 됨)""" if not credentials: return None try: return await get_current_user(credentials, db) except HTTPException: return None