update remove_user_as_admin

This commit is contained in:
ben
2026-08-17 17:04:53 +02:00
parent 4e6d58386f
commit c527a3625e
2 changed files with 46 additions and 12 deletions
+23 -5
View File
@@ -20,6 +20,7 @@ from auth import (
from permissions import ( from permissions import (
has_role, has_role,
whoami, whoami,
get_member_role,
) )
from rooms import ( from rooms import (
@@ -372,23 +373,40 @@ def api_leave_room(
} }
@app.delete("/rooms/{room_id}/members/{user_id}") @app.delete("/rooms/{room_id}/members/{user_id}")
def remove_user_as_admin( def api_remove_member(
room_id: int, room_id: int,
user_id: int, user_id: int,
current_user: int = Depends(get_current_user), current_user: int = Depends(get_current_user),
): ):
if not has_role(room_id, current_user, "admin"): current_role = get_member_role(room_id, current_user)
target_role = get_member_role(room_id, user_id)
if current_role is None:
raise HTTPException(
status_code=403,
detail="not a room member",
)
if target_role is None:
raise HTTPException(
status_code=404,
detail="user is not a member of this room",
)
if current_role < 2:
raise HTTPException( raise HTTPException(
status_code=403, status_code=403,
detail="admin permission required", detail="admin permission required",
) )
if not remove_room_member(room_id, user_id): if target_role >= current_role:
raise HTTPException( raise HTTPException(
status_code=404, status_code=403,
detail="user is not a member of this room", detail="cannot remove a member with equal or higher role",
) )
remove_room_member(room_id, user_id)
return { return {
"status": "removed", "status": "removed",
"user_id": user_id, "user_id": user_id,
+23 -7
View File
@@ -9,13 +9,6 @@ ROLE_LEVELS = {
def get_role(room_id: int, user_id: int) -> str | None: def get_role(room_id: int, user_id: int) -> str | None:
"""
Return the user's role in a room.
Returns:
"member", "admin", "owner"
None if the user is not a member.
"""
member = fetch_one( member = fetch_one(
""" """
SELECT role SELECT role
@@ -78,6 +71,29 @@ def whoami(room_id: int, user_id: int) -> dict:
"is_owner": role == "owner", "is_owner": role == "owner",
} }
def get_member_role(room_id, user_id):
member = fetch_one(
"""
SELECT role
FROM room_members
WHERE room_id = ?
AND user_id = ?
""",
(room_id, user_id),
)
if member is None:
return None
roles = {
"member": 1,
"admin": 2,
"owner": 3,
}
return roles.get(member["role"])
# PUBLIC # PUBLIC
# ├── POST /create-user # ├── POST /create-user
# ├── POST /login # ├── POST /login