restructured
This commit is contained in:
+3
-6
@@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+69
-9
@@ -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}
|
||||||
Reference in New Issue
Block a user