refactor(room): 重构房间相关路由

- 优化了房间列表获取逻辑,增加了对房间状态的筛选
- 重构了单个房间获取路由,提高了代码可读性和性能
- 移除了未使用的导入和冗余代码,提高了代码整洁度
- 增加了对 Redis 的错误处理,提高了系统稳定性
This commit is contained in:
jimmy-sketch
2025-07-29 07:53:34 +00:00
parent 6d736528e3
commit 9402eaece6

View File

@@ -2,14 +2,11 @@ from __future__ import annotations
from app.database.room import RoomIndex from app.database.room import RoomIndex
from app.dependencies.database import get_db, get_redis from app.dependencies.database import get_db, get_redis
from app.models.room import ( from app.dependencies.fetcher import get_fetcher
MultiplayerRoom, from app.fetcher import Fetcher
MultiplayerRoomUser, from app.models.room import MultiplayerRoom, MultiplayerRoomState, Room
Room,
)
from .api_router import router
from api_router import router
from fastapi import Depends, HTTPException, Query from fastapi import Depends, HTTPException, Query
from sqlmodel import select from sqlmodel import select
from sqlmodel.ext.asyncio.session import AsyncSession from sqlmodel.ext.asyncio.session import AsyncSession
@@ -17,51 +14,52 @@ from sqlmodel.ext.asyncio.session import AsyncSession
@router.get("/rooms", tags=["rooms"], response_model=list[Room]) @router.get("/rooms", tags=["rooms"], response_model=list[Room])
async def get_all_rooms( async def get_all_rooms(
mode: str = Query( mode: str = Query(None), # TODO: 对房间根据状态进行筛选
None
), # TODO: lazer源码显示房间不会是除了open以外的其他状态先放在这里
status: str = Query(None), status: str = Query(None),
category: str = Query(None), category: str = Query(None), # TODO: 对房间根据分类进行筛选(真的有人用这功能吗)
db: AsyncSession = Depends(get_db), db: AsyncSession = Depends(get_db),
fetcher: Fetcher = Depends(get_fetcher),
): ):
all_room_ids = (await db.exec(select(RoomIndex).where(True))).all() all_roomID = (await db.exec(select(RoomIndex))).all()
redis = get_redis() redis = get_redis()
roomsList: list[Room] = [] if redis is not None:
if redis: resp: list[Room] = []
for room_index in all_room_ids: for id in all_roomID:
dumped_room = redis.get(str(room_index.id)) dumped_room = redis.get(str(id))
if dumped_room: validated_room = MultiplayerRoom.model_validate_json(str(dumped_room))
actual_room = MultiplayerRoom.model_validate_json(str(dumped_room)) flag: bool = False
actual_room = Room.from_MultiplayerRoom(actual_room) if validated_room.State == MultiplayerRoomState.OPEN and status == "idle":
if actual_room.status == status and actual_room.category == category: flag = True
roomsList.append(actual_room) elif validated_room != MultiplayerRoomState.CLOSED:
return roomsList flag = True
if flag:
resp.append(
await Room.from_mpRoom(
MultiplayerRoom.model_validate_json(str(dumped_room)),
db,
fetcher,
)
)
return resp
else: else:
raise HTTPException(status_code=500, detail="Redis Error") raise HTTPException(status_code=500, detail="Redis Error")
@router.put("/rooms/{room}/users/{user}", tags=["rooms"], response_model=Room) @router.get("/rooms/{room}", tags=["room"], response_model=Room)
async def add_user_to_room( async def get_room(
room: int, user: int, password: str, db: AsyncSession = Depends(dependency=get_db) room: int,
db: AsyncSession = Depends(get_db),
fetcher: Fetcher = Depends(get_fetcher),
): ):
redis = get_redis() redis = get_redis()
if redis: if redis:
dumped_room = redis.get(str(room)) dumped_room = str(redis.get(str(room)))
if not dumped_room: if dumped_room is not None:
raise HTTPException(status_code=404, detail="房间不存在") resp = await Room.from_mpRoom(
actual_room = MultiplayerRoom.model_validate_json(str(dumped_room)) MultiplayerRoom.model_validate_json(str(dumped_room)), db, fetcher
# 验证密码
if password != actual_room.settings.password:
raise HTTPException(status_code=403, detail="Invalid password")
# 继续处理加入房间的逻辑
actual_room.users.append(
MultiplayerRoomUser(
id=user, matchState=None, rulesetId=None, beatmapId=None
) )
) return resp
actual_room = Room.from_MultiplayerRoom(actual_room) else:
return actual_room raise HTTPException(status_code=404, detail="Room Not Found")
else: else:
raise HTTPException(status_code=500, detail="Redis Error") raise HTTPException(status_code=500, detail="Redis error")