from fastapi import Depends, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from app.utils.security import decode_token bearer_scheme = HTTPBearer() async def get_current_user(credentials: HTTPAuthorizationCredentials = Depends(bearer_scheme)) -> dict: payload = decode_token(credentials.credentials) if payload is None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid or expired token") return payload class RoleChecker: def __init__(self, allowed_roles: list[str]): self.allowed_roles = allowed_roles async def __call__(self, current_user: dict = Depends(get_current_user)) -> dict: role = current_user.get("role", "") if role not in self.allowed_roles: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Insufficient permissions") return current_user # Pre-built checkers require_manager = RoleChecker(["manager"]) require_director = RoleChecker(["director"]) require_leader = RoleChecker(["leader"]) require_director_or_leader = RoleChecker(["director", "leader"]) require_any_role = RoleChecker(["manager", "director", "leader"])