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_rooms(self): rooms = await voice_rooms_collection.find({}) \ .sort("created_at", -1) \ .to_list(100) return 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 { "id": room["id"], "name": room["name"], "public": False, "max_users": room.get("max_users"), }