refactor(database): use a new 'On-Demand' design (#86)
Technical Details: https://blog.mxgame.top/2025/11/22/An-On-Demand-Design-Within-SQLModel/
This commit is contained in:
@@ -1,20 +1,29 @@
|
||||
from typing import Annotated
|
||||
|
||||
from app.database import FavouriteBeatmapset, MeResp, User
|
||||
from app.database import FavouriteBeatmapset, User
|
||||
from app.database.user import UserModel
|
||||
from app.dependencies.database import Database
|
||||
from app.dependencies.user import UserAndToken, get_current_user, get_current_user_and_token
|
||||
from app.models.score import GameMode
|
||||
from app.utils import api_doc
|
||||
|
||||
from .router import router
|
||||
|
||||
from fastapi import Path, Security
|
||||
from fastapi.responses import RedirectResponse
|
||||
from pydantic import BaseModel
|
||||
from sqlmodel import select
|
||||
|
||||
ME_INCLUDES = [*User.USER_INCLUDES, "session_verified", "session_verification_method"]
|
||||
|
||||
|
||||
class BeatmapsetIds(BaseModel):
|
||||
beatmapset_ids: list[int]
|
||||
|
||||
|
||||
@router.get(
|
||||
"/me/beatmapset-favourites",
|
||||
response_model=list[int],
|
||||
response_model=BeatmapsetIds,
|
||||
name="获取当前用户收藏的谱面集 ID 列表",
|
||||
description="获取当前登录用户收藏的谱面集 ID 列表。",
|
||||
tags=["用户", "谱面集"],
|
||||
@@ -26,37 +35,39 @@ async def get_user_beatmapset_favourites(
|
||||
beatmapset_ids = await session.exec(
|
||||
select(FavouriteBeatmapset.beatmapset_id).where(FavouriteBeatmapset.user_id == current_user.id)
|
||||
)
|
||||
return beatmapset_ids.all()
|
||||
return BeatmapsetIds(beatmapset_ids=list(beatmapset_ids.all()))
|
||||
|
||||
|
||||
@router.get(
|
||||
"/me/{ruleset}",
|
||||
response_model=MeResp,
|
||||
responses={200: api_doc("当前用户信息(含指定 ruleset 统计)", UserModel, ME_INCLUDES)},
|
||||
name="获取当前用户信息 (指定 ruleset)",
|
||||
description="获取当前登录用户信息 (含指定 ruleset 统计)。",
|
||||
tags=["用户"],
|
||||
)
|
||||
async def get_user_info_with_ruleset(
|
||||
session: Database,
|
||||
ruleset: Annotated[GameMode, Path(description="指定 ruleset")],
|
||||
user_and_token: Annotated[UserAndToken, Security(get_current_user_and_token, scopes=["identify"])],
|
||||
):
|
||||
user_resp = await MeResp.from_db(user_and_token[0], session, ruleset, token_id=user_and_token[1].id)
|
||||
user_resp = await UserModel.transform(
|
||||
user_and_token[0], ruleset=ruleset, token_id=user_and_token[1].id, includes=ME_INCLUDES
|
||||
)
|
||||
return user_resp
|
||||
|
||||
|
||||
@router.get(
|
||||
"/me/",
|
||||
response_model=MeResp,
|
||||
responses={200: api_doc("当前用户信息", UserModel, ME_INCLUDES)},
|
||||
name="获取当前用户信息",
|
||||
description="获取当前登录用户信息。",
|
||||
tags=["用户"],
|
||||
)
|
||||
async def get_user_info_default(
|
||||
session: Database,
|
||||
user_and_token: Annotated[UserAndToken, Security(get_current_user_and_token, scopes=["identify"])],
|
||||
):
|
||||
user_resp = await MeResp.from_db(user_and_token[0], session, None, token_id=user_and_token[1].id)
|
||||
user_resp = await UserModel.transform(
|
||||
user_and_token[0], ruleset=None, token_id=user_and_token[1].id, includes=ME_INCLUDES
|
||||
)
|
||||
return user_resp
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user