Files
popa_minecraft_launcher_api/app/services/voice_rooms.py
2026-01-02 18:17:36 +05:00

73 lines
2.0 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_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"),
}