Files
calendar/backend/rooms.py
T
2026-08-18 14:43:14 +02:00

367 lines
6.3 KiB
Python

import re
import secrets
import string
from database import execute, fetch_one, fetch_all
DEFAULT_ROLE = "member"
def validate_invite_code(invite_code: str):
if not 6 <= len(invite_code) <= 32:
return False
if not re.fullmatch(r"[A-Za-z0-9]+", invite_code):
return False
return True
def create_room(user_id: int, room_name: str, invite_code: str):
if not validate_invite_code(invite_code):
return {
"status": "failed",
"reason": "invalid_invite_code",
}
room_id = execute(
"""
INSERT INTO rooms (name, owner_id, invite_code)
VALUES (?, ?, ?)
""",
(
room_name,
user_id,
invite_code,
)
)
member_id = execute(
"""
INSERT INTO room_members (room_id, user_id, role)
VALUES (?, ?, ?)
""",
(
room_id,
user_id,
"owner",
)
)
return {
"room_id": room_id,
"member_id": member_id,
}
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,
)
)