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)