68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
from datetime import datetime, timedelta
|
|
from uuid import uuid4
|
|
from fastapi import HTTPException
|
|
from app.db.database import db
|
|
|
|
voice_rooms_collection = db.voice_rooms
|
|
|
|
|
|
def _serialize(doc):
|
|
if not doc:
|
|
return None
|
|
doc["_id"] = str(doc["_id"])
|
|
if "created_at" in doc:
|
|
doc["created_at"] = doc["created_at"].isoformat()
|
|
if "expires_at" in doc and doc["expires_at"]:
|
|
doc["expires_at"] = doc["expires_at"].isoformat()
|
|
return doc
|
|
|
|
|
|
class VoiceRoomService:
|
|
|
|
async def list_public_rooms(self):
|
|
rooms = await voice_rooms_collection.find(
|
|
{"public": True}
|
|
).sort("created_at", -1).to_list(100)
|
|
|
|
return [_serialize(r) for r in rooms]
|
|
|
|
async def create_room(
|
|
self,
|
|
name: str,
|
|
owner: str,
|
|
public: bool,
|
|
max_users: int = 5,
|
|
ttl_minutes: int | None = None,
|
|
):
|
|
room_id = str(uuid4())
|
|
invite_code = None if public else uuid4().hex[:6]
|
|
|
|
room = {
|
|
"id": room_id,
|
|
"name": name,
|
|
"public": public,
|
|
"invite_code": invite_code,
|
|
"owner": owner,
|
|
"max_users": max_users,
|
|
"created_at": datetime.utcnow(),
|
|
"expires_at": (
|
|
datetime.utcnow() + timedelta(minutes=ttl_minutes)
|
|
if ttl_minutes else None
|
|
),
|
|
}
|
|
|
|
await voice_rooms_collection.insert_one(room)
|
|
return _serialize(room)
|
|
|
|
async def get_room(self, room_id: str):
|
|
room = await voice_rooms_collection.find_one({"id": room_id})
|
|
if not room:
|
|
raise HTTPException(404, "Room not found")
|
|
return room
|
|
|
|
async def join_by_code(self, code: str):
|
|
room = await voice_rooms_collection.find_one({"invite_code": code})
|
|
if not room:
|
|
raise HTTPException(404, "Invalid invite code")
|
|
return _serialize(room)
|