Add user editing functionality to admin panel with improved UI and self-protection safeguards
Implemented comprehensive user editing in admin dashboard with PATCH endpoint for updating email, display name, role, password, and disabled status. Added validation to prevent admins from demoting or disabling themselves, and duplicate email detection. Refactored AdminPanel to modal-based editor with separate create/edit modes, form state management, and save/cancel actions. Enhanced UI with field labels, checkbox for account status, action
This commit is contained in:
@@ -61,11 +61,48 @@ def delete_user(req: Request, user_id: str, db: Session = Depends(get_db)):
|
||||
if not u:
|
||||
raise HTTPException(404, "not found")
|
||||
|
||||
if u.role == Role.admin.value:
|
||||
raise HTTPException(400, "cannot delete admin user")
|
||||
|
||||
# soft delete
|
||||
u.disabled = True
|
||||
db.add(u)
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@router.patch("/users/{user_id}")
|
||||
def update_user(req: Request, user_id: str, data: dict, db: Session = Depends(get_db)):
|
||||
admin = require_admin(req, db)
|
||||
user = db.query(User).filter(User.id == user_id).first()
|
||||
if not user:
|
||||
raise HTTPException(404, "not found")
|
||||
|
||||
email = (data.get("email") or user.email).lower().strip()
|
||||
display_name = (data.get("display_name") if "display_name" in data else user.display_name or "").strip()
|
||||
role = data.get("role") or user.role
|
||||
password = data.get("password") or ""
|
||||
|
||||
if not email or "@" not in email:
|
||||
raise HTTPException(400, "valid email required")
|
||||
if role not in (Role.admin.value, Role.user.value):
|
||||
raise HTTPException(400, "invalid role")
|
||||
if password and len(password) < 8:
|
||||
raise HTTPException(400, "password too short (min 8)")
|
||||
if admin.id == user_id and role != Role.admin.value:
|
||||
raise HTTPException(400, "cannot demote yourself")
|
||||
if admin.id == user_id and data.get("disabled") is True:
|
||||
raise HTTPException(400, "cannot disable yourself")
|
||||
|
||||
duplicate = db.query(User).filter(User.email == email, User.id != user_id).first()
|
||||
if duplicate:
|
||||
raise HTTPException(409, "email exists")
|
||||
|
||||
user.email = email
|
||||
user.display_name = display_name
|
||||
user.role = role
|
||||
if password:
|
||||
user.password_hash = hash_password(password)
|
||||
if "disabled" in data:
|
||||
user.disabled = bool(data["disabled"])
|
||||
|
||||
db.add(user)
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
|
||||
Reference in New Issue
Block a user