add voice_rooms
This commit is contained in:
67
app/services/voice_rooms.py
Normal file
67
app/services/voice_rooms.py
Normal file
@ -0,0 +1,67 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user