from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from database import get_db from models import User, UserCreate, UserUpdate, UserResponse, PasswordReset from auth import hash_password, get_current_admin router = APIRouter(prefix="/admin", tags=["admin"]) @router.get("/users", response_model=list[UserResponse]) def list_users( db: Session = Depends(get_db), _: User = Depends(get_current_admin), ): return db.query(User).order_by(User.created_at).all() @router.post("/users", response_model=UserResponse, status_code=201) def create_user( user_in: UserCreate, db: Session = Depends(get_db), _: User = Depends(get_current_admin), ): if db.query(User).filter(User.username == user_in.username).first(): raise HTTPException(status_code=400, detail="Username already exists.") if user_in.email and db.query(User).filter(User.email == user_in.email).first(): raise HTTPException(status_code=400, detail="Email already in use.") user = User( username=user_in.username, full_name=user_in.full_name, email=user_in.email, hashed_password=hash_password(user_in.password), is_admin=user_in.is_admin, is_active=True, ) db.add(user) db.commit() db.refresh(user) return user @router.put("/users/{user_id}", response_model=UserResponse) def update_user( user_id: int, user_in: UserUpdate, db: Session = Depends(get_db), current: User = Depends(get_current_admin), ): user = db.query(User).filter(User.id == user_id).first() if not user: raise HTTPException(status_code=404, detail="User not found.") for field, value in user_in.model_dump(exclude_unset=True).items(): setattr(user, field, value) db.commit() db.refresh(user) return user @router.post("/users/{user_id}/reset-password", response_model=UserResponse) def reset_password( user_id: int, body: PasswordReset, db: Session = Depends(get_db), _: User = Depends(get_current_admin), ): user = db.query(User).filter(User.id == user_id).first() if not user: raise HTTPException(status_code=404, detail="User not found.") if not body.new_password or len(body.new_password) < 6: raise HTTPException(status_code=400, detail="Password must be at least 6 characters.") user.hashed_password = hash_password(body.new_password) db.commit() db.refresh(user) return user @router.delete("/users/{user_id}", status_code=204) def delete_user( user_id: int, db: Session = Depends(get_db), current: User = Depends(get_current_admin), ): if user_id == current.id: raise HTTPException(status_code=400, detail="You cannot delete your own account.") 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()