fix(signalr): use custom msgpack to encode/decode

This commit is contained in:
MingxuanGame
2025-07-30 06:01:17 +00:00
parent a53c63a33a
commit 4a5a1c86c6
17 changed files with 1191 additions and 892 deletions

View File

@@ -4,7 +4,6 @@ from typing import Literal
from app.database import User as DBUser
from app.dependencies.database import get_db
from app.dependencies import get_current_user
from app.models.score import INT_TO_MODE
from app.models.user import User as ApiUser
from app.utils import convert_db_user_to_api_user
@@ -20,24 +19,18 @@ from sqlmodel.sql.expression import col
# ---------- Shared Utility ----------
async def get_user_by_lookup(
db: AsyncSession,
lookup: str,
key: str = "id"
db: AsyncSession, lookup: str, key: str = "id"
) -> DBUser | None:
"""根据查找方式获取用户"""
if key == "id":
try:
user_id = int(lookup)
result = await db.exec(
select(DBUser).where(DBUser.id == user_id)
)
result = await db.exec(select(DBUser).where(DBUser.id == user_id))
return result.first()
except ValueError:
return None
elif key == "username":
result = await db.exec(
select(DBUser).where(DBUser.name == lookup)
)
result = await db.exec(select(DBUser).where(DBUser.name == lookup))
return result.first()
else:
return None
@@ -50,6 +43,7 @@ class BatchUserResponse(BaseModel):
@router.get("/users", response_model=BatchUserResponse)
@router.get("/users/lookup", response_model=BatchUserResponse)
@router.get("/users/lookup/", response_model=BatchUserResponse)
async def get_users(
user_ids: list[int] = Query(default_factory=list, alias="ids[]"),
include_variant_statistics: bool = Query(default=False), # TODO: future use
@@ -75,41 +69,43 @@ async def get_users(
)
# ---------- Individual User ----------
@router.get("/users/{user_lookup}/{mode}", response_model=ApiUser)
@router.get("/users/{user_lookup}/{mode}/", response_model=ApiUser)
async def get_user_with_mode(
user_lookup: str,
mode: Literal["osu", "taiko", "fruits", "mania"],
key: Literal["id", "username"] = Query("id"),
current_user: DBUser = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
"""获取指定游戏模式的用户信息"""
user = await get_user_by_lookup(db, user_lookup, key)
if not user:
raise HTTPException(status_code=404, detail="User not found")
# # ---------- Individual User ----------
# @router.get("/users/{user_lookup}/{mode}", response_model=ApiUser)
# @router.get("/users/{user_lookup}/{mode}/", response_model=ApiUser)
# async def get_user_with_mode(
# user_lookup: str,
# mode: Literal["osu", "taiko", "fruits", "mania"],
# key: Literal["id", "username"] = Query("id"),
# current_user: DBUser = Depends(get_current_user),
# db: AsyncSession = Depends(get_db),
# ):
# """获取指定游戏模式的用户信息"""
# user = await get_user_by_lookup(db, user_lookup, key)
# if not user:
# raise HTTPException(status_code=404, detail="User not found")
return await convert_db_user_to_api_user(user, mode)
# return await convert_db_user_to_api_user(user, mode)
@router.get("/users/{user_lookup}", response_model=ApiUser)
@router.get("/users/{user_lookup}/", response_model=ApiUser)
async def get_user_default(
user_lookup: str,
key: Literal["id", "username"] = Query("id"),
current_user: DBUser = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
"""获取用户信息默认使用osu模式但包含所有模式的统计信息"""
user = await get_user_by_lookup(db, user_lookup, key)
if not user:
raise HTTPException(status_code=404, detail="User not found")
# @router.get("/users/{user_lookup}", response_model=ApiUser)
# @router.get("/users/{user_lookup}/", response_model=ApiUser)
# async def get_user_default(
# user_lookup: str,
# key: Literal["id", "username"] = Query("id"),
# current_user: DBUser = Depends(get_current_user),
# db: AsyncSession = Depends(get_db),
# ):
# """获取用户信息默认使用osu模式但包含所有模式的统计信息"""
# user = await get_user_by_lookup(db, user_lookup, key)
# if not user:
# raise HTTPException(status_code=404, detail="User not found")
return await convert_db_user_to_api_user(user, "osu")
# return await convert_db_user_to_api_user(user, "osu")
@router.get("/users/{user}/{ruleset}", response_model=ApiUser)
@router.get("/users/{user}/", response_model=ApiUser)
@router.get("/users/{user}", response_model=ApiUser)
async def get_user_info(
user: str,
ruleset: Literal["osu", "taiko", "fruits", "mania"] = "osu",