restructured

This commit is contained in:
ben
2026-08-17 16:29:11 +02:00
parent d47a46c81e
commit 80f7f2978d
2 changed files with 72 additions and 15 deletions
+3 -6
View File
@@ -315,12 +315,9 @@ def api_room_whoami(
room_id: int, room_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
): ):
role = whoami( permissions = whoami(room_id, user_id)
room_id,
user_id,
)
if role is None: if not permissions["member"]:
raise HTTPException( raise HTTPException(
status_code=403, status_code=403,
detail="not a room member", detail="not a room member",
@@ -329,7 +326,7 @@ def api_room_whoami(
return { return {
"room_id": room_id, "room_id": room_id,
"user_id": user_id, "user_id": user_id,
"role": role, **permissions,
} }
+68 -8
View File
@@ -8,7 +8,14 @@ ROLE_LEVELS = {
} }
def get_role(room_id: int, user_id: int): 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
@@ -16,7 +23,7 @@ def get_role(room_id: int, user_id: int):
WHERE room_id = ? WHERE room_id = ?
AND user_id = ? AND user_id = ?
""", """,
(room_id, user_id) (room_id, user_id),
) )
if member is None: if member is None:
@@ -28,28 +35,81 @@ def get_role(room_id: int, user_id: int):
def has_role( def has_role(
room_id: int, room_id: int,
user_id: int, user_id: int,
required_role: str required_role: str,
) -> bool: ) -> bool:
role = get_role(room_id, user_id) """
Check whether a user has at least the required role.
if role is None: Role hierarchy:
owner > admin > member
"""
user_role = get_role(room_id, user_id)
if user_role is None:
return False return False
return ROLE_LEVELS.get(role, 0) >= ROLE_LEVELS[required_role] user_level = ROLE_LEVELS.get(user_role, 0)
required_level = ROLE_LEVELS.get(required_role, 0)
if required_level == 0:
return False
return user_level >= required_level
def whoami(room_id: int, user_id: int): def whoami(room_id: int, user_id: int) -> dict:
"""
Return the user's permissions within a room.
"""
role = get_role(room_id, user_id) role = get_role(room_id, user_id)
if role is None: if role is None:
return { return {
"member": False, "member": False,
"role": None, "role": None,
"is_admin": False,
"is_owner": False,
} }
return { return {
"member": True, "member": True,
"role": role, "role": role,
"is_admin": ROLE_LEVELS[role] >= ROLE_LEVELS["admin"], "is_admin": ROLE_LEVELS.get(role, 0) >= ROLE_LEVELS["admin"],
"is_owner": role == "owner", "is_owner": role == "owner",
} }
# PUBLIC
# ├── POST /create-user
# ├── POST /login
# ├── GET /
# └── GET /ascii-art
# AUTHENTICATED
# ├── GET /me
# ├── GET /users/{id}
# ├── GET /database
# ├── POST /create-room
# ├── POST /search-room
# ├── POST /join-room
# └── GET /rooms
# MEMBER
# ├── GET /rooms/{id}
# ├── GET /rooms/{id}/whoami
# ├── GET /rooms/{id}/members
# ├── GET /rooms/{id}/events
# ├── DELETE /rooms/{id}/members/me
# ├── POST /events
# ├── GET /events
# ├── GET /events/{id}
# ├── POST /events/{id}/respond
# └── GET /events/{id}/responses
# ADMIN
# ├── PATCH /rooms/{id}
# ├── POST /rooms/{id}/invite-code
# ├── PATCH /events/{id}
# └── DELETE /events/{id}
# OWNER
# └── DELETE /rooms/{id}