From 9402eaece6e246468fa0375110717d80016306ef Mon Sep 17 00:00:00 2001 From: jimmy-sketch Date: Tue, 29 Jul 2025 07:53:34 +0000 Subject: [PATCH] =?UTF-8?q?refactor(room):=20=E9=87=8D=E6=9E=84=E6=88=BF?= =?UTF-8?q?=E9=97=B4=E7=9B=B8=E5=85=B3=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化了房间列表获取逻辑,增加了对房间状态的筛选 - 重构了单个房间获取路由,提高了代码可读性和性能 - 移除了未使用的导入和冗余代码,提高了代码整洁度 - 增加了对 Redis 的错误处理,提高了系统稳定性 --- app/router/room.py | 82 ++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/app/router/room.py b/app/router/room.py index ebd8326..b19b6f9 100644 --- a/app/router/room.py +++ b/app/router/room.py @@ -2,14 +2,11 @@ from __future__ import annotations from app.database.room import RoomIndex from app.dependencies.database import get_db, get_redis -from app.models.room import ( - MultiplayerRoom, - MultiplayerRoomUser, - Room, -) - -from .api_router import router +from app.dependencies.fetcher import get_fetcher +from app.fetcher import Fetcher +from app.models.room import MultiplayerRoom, MultiplayerRoomState, Room +from api_router import router from fastapi import Depends, HTTPException, Query from sqlmodel import select 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]) async def get_all_rooms( - mode: str = Query( - None - ), # TODO: lazer源码显示房间不会是除了open以外的其他状态,先放在这里 + mode: str = Query(None), # TODO: 对房间根据状态进行筛选 status: str = Query(None), - category: str = Query(None), + category: str = Query(None), # TODO: 对房间根据分类进行筛选(真的有人用这功能吗) 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() - roomsList: list[Room] = [] - if redis: - for room_index in all_room_ids: - dumped_room = redis.get(str(room_index.id)) - if dumped_room: - actual_room = MultiplayerRoom.model_validate_json(str(dumped_room)) - actual_room = Room.from_MultiplayerRoom(actual_room) - if actual_room.status == status and actual_room.category == category: - roomsList.append(actual_room) - return roomsList + if redis is not None: + resp: list[Room] = [] + for id in all_roomID: + dumped_room = redis.get(str(id)) + validated_room = MultiplayerRoom.model_validate_json(str(dumped_room)) + flag: bool = False + if validated_room.State == MultiplayerRoomState.OPEN and status == "idle": + flag = True + elif validated_room != MultiplayerRoomState.CLOSED: + flag = True + if flag: + resp.append( + await Room.from_mpRoom( + MultiplayerRoom.model_validate_json(str(dumped_room)), + db, + fetcher, + ) + ) + return resp else: raise HTTPException(status_code=500, detail="Redis Error") -@router.put("/rooms/{room}/users/{user}", tags=["rooms"], response_model=Room) -async def add_user_to_room( - room: int, user: int, password: str, db: AsyncSession = Depends(dependency=get_db) +@router.get("/rooms/{room}", tags=["room"], response_model=Room) +async def get_room( + room: int, + db: AsyncSession = Depends(get_db), + fetcher: Fetcher = Depends(get_fetcher), ): redis = get_redis() if redis: - dumped_room = redis.get(str(room)) - if not dumped_room: - raise HTTPException(status_code=404, detail="房间不存在") - actual_room = MultiplayerRoom.model_validate_json(str(dumped_room)) - - # 验证密码 - 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 + dumped_room = str(redis.get(str(room))) + if dumped_room is not None: + resp = await Room.from_mpRoom( + MultiplayerRoom.model_validate_json(str(dumped_room)), db, fetcher ) - ) - actual_room = Room.from_MultiplayerRoom(actual_room) - return actual_room + return resp + else: + raise HTTPException(status_code=404, detail="Room Not Found") else: - raise HTTPException(status_code=500, detail="Redis Error") + raise HTTPException(status_code=500, detail="Redis error")