refactor(room): 重构房间相关路由
- 优化了房间列表获取逻辑,增加了对房间状态的筛选 - 重构了单个房间获取路由,提高了代码可读性和性能 - 移除了未使用的导入和冗余代码,提高了代码整洁度 - 增加了对 Redis 的错误处理,提高了系统稳定性
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user