from fastapi import Depends, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from jose import JWTError from app.auth.jwt import decode_token from app.database import get_db from app.models.user import HubUser, UserRole bearer = HTTPBearer(auto_error=False) async def get_current_user( credentials: HTTPAuthorizationCredentials | None = Depends(bearer), db: AsyncSession = Depends(get_db), ) -> HubUser: if not credentials: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated") try: payload = decode_token(credentials.credentials) user_id: str = payload.get("sub") if not user_id: raise HTTPException(status_code=401, detail="Invalid token") except JWTError: raise HTTPException(status_code=401, detail="Invalid token") result = await db.execute(select(HubUser).where(HubUser.id == user_id)) user = result.scalar_one_or_none() if not user or not user.is_active: raise HTTPException(status_code=401, detail="User not found or inactive") return user async def require_super_admin(user: HubUser = Depends(get_current_user)) -> HubUser: if user.role != UserRole.super_admin: raise HTTPException(status_code=403, detail="Super admin access required") return user async def require_school_admin(user: HubUser = Depends(get_current_user)) -> HubUser: if user.role not in (UserRole.super_admin, UserRole.school_admin): raise HTTPException(status_code=403, detail="School admin access required") return user