from fastapi import Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models.user import User from app.services.auth_service import decode_access_token from app.crud import crud_user oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/login") async def get_current_user( token: str = Depends(oauth2_scheme), db: AsyncSession = Depends(get_db), ) -> User: payload = decode_access_token(token) if payload is None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid or expired token") user = await crud_user.get_by_id(db, payload["sub"]) if user is None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="User not found") return user async def get_approved_user(current_user: User = Depends(get_current_user)) -> User: if current_user.status != "approved": raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Account not yet approved") return current_user async def get_organizer(current_user: User = Depends(get_approved_user)) -> User: if current_user.role not in ("organizer", "admin"): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Organizer access required") return current_user async def get_admin(current_user: User = Depends(get_approved_user)) -> User: if current_user.role != "admin": raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Admin access required") return current_user