from __future__ import annotations from fastapi import Depends, HTTPException, status from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from jose import JWTError, jwt from sqlalchemy.orm import Session from app.core.config import settings from app.db.session import get_session from app.models.user import User, UserRole bearer = HTTPBearer() def current_user( credentials: HTTPAuthorizationCredentials = Depends(bearer), session: Session = Depends(get_session), ) -> User: try: payload = jwt.decode( credentials.credentials, settings.jwt_secret, algorithms=[settings.jwt_algorithm], ) user_id = payload.get("sub") except JWTError as exc: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token") from exc user = session.get(User, user_id) if user is None or not user.is_active: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Inactive user") return user def require_role(*roles: UserRole): def dependency(user: User = Depends(current_user)) -> User: if user.role not in roles: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Forbidden") return user return dependency def current_admin(user: User = Depends(current_user)) -> User: if user.role != UserRole.ADMIN.value: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Forbidden") return user