from fastapi import Depends, HTTPException, Request, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.core.security import decode_access_token from app.database.session import get_db from app.models.user import User async def get_current_user( request: Request, db: AsyncSession = Depends(get_db), ) -> User | None: token = request.cookies.get("access_token") if not token: return None payload = decode_access_token(token) if not payload: return None user_id: str | None = payload.get("sub") if not user_id: return None result = await db.execute(select(User).where(User.id == user_id)) user = result.scalar_one_or_none() return user if (user and user.is_active) else None async def require_auth( user: User | None = Depends(get_current_user), ) -> User: if user is None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated") return user async def require_admin( user: User | None = Depends(get_current_user), ) -> User: if user is None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated") if not user.is_admin: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Admin access required") return user