from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List from app.database import get_db from app.models.user import User from app.schemas.user import UserRead, UserUpdate from app.routers.auth import get_current_user router = APIRouter() def require_admin(current_user: User = Depends(get_current_user)) -> User: """Require admin role.""" if current_user.role != "admin": raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Admin access required" ) return current_user @router.get("/users", response_model=List[UserRead]) def list_users(db: Session = Depends(get_db), admin: User = Depends(require_admin)): """List all users (admin only).""" return db.query(User).all() @router.get("/users/{user_id}", response_model=UserRead) def get_user( user_id: int, db: Session = Depends(get_db), admin: User = Depends(require_admin) ): """Get user by ID (admin only).""" user = db.query(User).filter(User.id == user_id).first() if not user: raise HTTPException(status_code=404, detail="User not found") return user @router.put("/users/{user_id}", response_model=UserRead) def update_user( user_id: int, data: UserUpdate, db: Session = Depends(get_db), admin: User = Depends(require_admin), ): """Update user (admin only).""" user = db.query(User).filter(User.id == user_id).first() if not user: raise HTTPException(status_code=404, detail="User not found") for key, value in data.model_dump(exclude_unset=True).items(): setattr(user, key, value) db.commit() db.refresh(user) return user @router.delete("/users/{user_id}") def delete_user( user_id: int, db: Session = Depends(get_db), admin: User = Depends(require_admin) ): """Delete user (admin only).""" user = db.query(User).filter(User.id == user_id).first() if not user: raise HTTPException(status_code=404, detail="User not found") db.delete(user) db.commit() return {"message": "User deleted"}