From 63b4ee2a6fad40487461b9457eec40b79146f52b Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 18 Aug 2026 14:43:14 +0200 Subject: [PATCH] kaas --- backend/main.py | 27 ++++ backend/rooms.py | 314 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 340 insertions(+), 1 deletion(-) diff --git a/backend/main.py b/backend/main.py index 892c505..30b366f 100644 --- a/backend/main.py +++ b/backend/main.py @@ -37,6 +37,7 @@ from permissions import ( from rooms import ( create_room, + search_room, accept_room, get_rooms, get_room, @@ -375,6 +376,32 @@ def api_create_room( **result, } + +@app.post( + "/search-room", + summary="Search for a room", + description="Searches for a room using its invite code.", +) +def api_search_room( + room: RoomSearch, + user_id: int = Depends(get_current_user), +): + room_name = search_room( + room.invite_code, + ) + + if room_name is None: + return { + "status": "failed", + "reason": "room_not_found", + } + + return { + "status": "found", + "room_name": room_name, + } + + @app.post( "/join-room", summary="Join a room", diff --git a/backend/rooms.py b/backend/rooms.py index e4078c9..f37bde2 100644 --- a/backend/rooms.py +++ b/backend/rooms.py @@ -52,4 +52,316 @@ def create_room(user_id: int, room_name: str, invite_code: str): return { "room_id": room_id, "member_id": member_id, - } \ No newline at end of file + } + + +def search_room(invite_code: str): + + room = fetch_one( + """ + SELECT name + FROM rooms + WHERE invite_code = ? + """, + (invite_code,) + ) + + if room is None: + return None + + return room["name"] + + +def accept_room(user_id: int, invite_code: str): + + room = fetch_one( + """ + SELECT id + FROM rooms + WHERE invite_code = ? + """, + (invite_code,) + ) + + if room is None: + return None + + room_id = room["id"] + + existing = fetch_one( + """ + SELECT * + FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + room_id, + user_id, + ) + ) + + if existing: + return None + + member_id = execute( + """ + INSERT INTO room_members + (room_id, user_id, role) + VALUES (?, ?, ?) + """, + ( + room_id, + user_id, + DEFAULT_ROLE, + ) + ) + + return { + "room_id": room_id, + "member_id": member_id, + } + + +def get_rooms(user_id: int): + + return fetch_all( + """ + SELECT + rooms.id, + rooms.name, + rooms.owner_id, + rooms.invite_code, + room_members.role + FROM rooms + JOIN room_members + ON rooms.id = room_members.room_id + WHERE room_members.user_id = ? + """, + (user_id,) + ) + + +def delete_room(room_id: int): + + room = fetch_one( + """ + SELECT id + FROM rooms + WHERE id = ? + """, + (room_id,) + ) + + if not room: + return {"error": "room not found"} + + execute( + """ + DELETE FROM rooms + WHERE id = ? + """, + (room_id,) + ) + + return {"status": "deleted"} + + +def get_room(room_id: int, user_id: int): + + room = fetch_one( + """ + SELECT + rooms.id, + rooms.name, + rooms.owner_id, + room_members.role + FROM rooms + JOIN room_members + ON rooms.id = room_members.room_id + WHERE rooms.id = ? + AND room_members.user_id = ? + """, + ( + room_id, + user_id, + ) + ) + + if room is None: + return None + + members = fetch_all( + """ + SELECT + users.id, + users.username, + room_members.role + FROM room_members + JOIN users + ON users.id = room_members.user_id + WHERE room_members.room_id = ? + """, + (room_id,) + ) + + events = fetch_all( + """ + SELECT * + FROM events + WHERE room_id = ? + ORDER BY start_time + """, + (room_id,) + ) + + return { + "room": dict(room), + "members": [dict(member) for member in members], + "events": [dict(event) for event in events], + } + + +def get_room_members(room_id: int): + + return fetch_all( + """ + SELECT + users.id, + users.username, + room_members.role + FROM room_members + JOIN users + ON users.id = room_members.user_id + WHERE room_members.room_id = ? + """, + (room_id,) + ) + + +def leave_room(room_id: int, user_id: int): + + execute( + """ + DELETE FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + room_id, + user_id, + ) + ) + + +def change_room_name(room_id: int, new_name: str, user_id: int): + + room = fetch_one( + """ + SELECT id + FROM rooms + WHERE id = ? + """, + (room_id,) + ) + + if not room: + return { + "status": "error", + "reason": "room_not_found", + } + + execute( + """ + UPDATE rooms + SET name = ? + WHERE id = ? + """, + ( + new_name, + room_id, + ) + ) + + return { + "status": "updated", + "new_name": new_name, + "room_id": room_id, + "updated_by": user_id, + } + + +def regenerate_invite_code(room_id: int): + + new_code = ''.join( + secrets.choice(string.ascii_uppercase + string.digits) + for _ in range(8) + ) + + execute( + """ + UPDATE rooms + SET invite_code = ? + WHERE id = ? + """, + ( + new_code, + room_id, + ) + ) + + return { + "status": "updated", + "room_id": room_id, + "invite_code": new_code, + } + + +def remove_room_member(room_id: int, user_id: int): + + member = fetch_one( + """ + SELECT 1 + FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + room_id, + user_id, + ) + ) + + if member is None: + return False + + execute( + """ + DELETE FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + room_id, + user_id, + ) + ) + + return True + + +def update_member_role(room_id: int, user_id: int, role: str): + + execute( + """ + UPDATE room_members + SET role = ? + WHERE room_id = ? + AND user_id = ? + """, + ( + role, + room_id, + user_id, + ) + ) \ No newline at end of file