from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app.auth.dependencies import get_current_user, require_role from app.auth.security import hash_password from app.database import get_db from app.models.user import User from app.schemas.user import UserCreate, UserUpdate, UserOut, UserWithRole router = APIRouter(prefix="/users", tags=["users"]) require_admin = require_role("admin") @router.get("/me", response_model=UserWithRole) def get_me(current_user: User = Depends(get_current_user)): return current_user @router.get("", response_model=list[UserWithRole]) def list_users(db: Session = Depends(get_db), _=Depends(require_admin)): return db.query(User).all() @router.get("/{user_id}", response_model=UserWithRole) def get_user(user_id: int, db: Session = Depends(get_db), _=Depends(require_admin)): user = db.get(User, user_id) if not user: raise HTTPException(status_code=404, detail="User not found") return user @router.patch("/{user_id}", response_model=UserOut) def update_user(user_id: int, body: UserUpdate, db: Session = Depends(get_db), _=Depends(require_admin)): user = db.get(User, user_id) if not user: raise HTTPException(status_code=404, detail="User not found") for field, value in body.model_dump(exclude_none=True).items(): setattr(user, field, value) db.commit() db.refresh(user) return user @router.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_user(user_id: int, db: Session = Depends(get_db), current_user: User = Depends(require_admin)): if user_id == current_user.id: raise HTTPException(status_code=400, detail="Cannot delete yourself") user = db.get(User, user_id) if not user: raise HTTPException(status_code=404, detail="User not found") db.delete(user) db.commit()