refactor(api): use Annotated-style dependency injection

This commit is contained in:
MingxuanGame
2025-10-03 05:41:31 +00:00
parent 37b4eadf79
commit 346c2557cf
45 changed files with 623 additions and 577 deletions

View File

@@ -1,24 +1,22 @@
from __future__ import annotations
from datetime import datetime
from typing import Literal
from typing import Annotated, Literal
from app.database.beatmap import Beatmap, calculate_beatmap_attributes
from app.database.beatmap_playcounts import BeatmapPlaycounts
from app.database.beatmapset import Beatmapset
from app.database.favourite_beatmapset import FavouriteBeatmapset
from app.database.score import Score
from app.dependencies.database import Database, get_redis
from app.dependencies.fetcher import get_fetcher
from app.fetcher import Fetcher
from app.dependencies.database import Database, Redis
from app.dependencies.fetcher import Fetcher
from app.models.beatmap import BeatmapRankStatus, Genre, Language
from app.models.mods import int_to_mods
from app.models.score import GameMode
from .router import AllStrModel, router
from fastapi import Depends, Query
from redis.asyncio import Redis
from fastapi import Query
from sqlmodel import col, func, select
from sqlmodel.ext.asyncio.session import AsyncSession
@@ -148,18 +146,18 @@ class V1Beatmap(AllStrModel):
)
async def get_beatmaps(
session: Database,
since: datetime | None = Query(None, description="自指定时间后拥有排行榜的谱面"),
beatmapset_id: int | None = Query(None, alias="s", description="谱面集 ID"),
beatmap_id: int | None = Query(None, alias="b", description="谱面 ID"),
user: str | None = Query(None, alias="u", description=""),
type: Literal["string", "id"] | None = Query(None, description="用户类型string 用户名称 / id 用户 ID"),
ruleset_id: int | None = Query(None, alias="m", description="Ruleset ID", ge=0, le=3), # TODO
convert: bool = Query(False, alias="a", description="转谱"), # TODO
checksum: str | None = Query(None, alias="h", description="谱面文件 MD5"),
limit: int = Query(500, ge=1, le=500, description="返回结果数量限制"),
mods: int = Query(0, description="应用到谱面属性的 MOD"),
redis: Redis = Depends(get_redis),
fetcher: Fetcher = Depends(get_fetcher),
redis: Redis,
fetcher: Fetcher,
since: Annotated[datetime | None, Query(description="自指定时间后拥有排行榜的谱面")] = None,
beatmapset_id: Annotated[int | None, Query(alias="s", description="面集 ID")] = None,
beatmap_id: Annotated[int | None, Query(alias="b", description="谱面 ID")] = None,
user: Annotated[str | None, Query(alias="u", description="谱师")] = None,
type: Annotated[Literal["string", "id"] | None, Query(description="用户类型string 用户名称 / id 用户 ID")] = None,
ruleset_id: Annotated[int | None, Query(alias="m", description="Ruleset ID", ge=0, le=3)] = None, # TODO
convert: Annotated[bool, Query(alias="a", description="转谱")] = False, # TODO
checksum: Annotated[str | None, Query(alias="h", description="谱面文件 MD5")] = None,
limit: Annotated[int, Query(ge=1, le=500, description="返回结果数量限制")] = 500,
mods: Annotated[int, Query(description="应用到谱面属性的 MOD")] = 0,
):
beatmaps: list[Beatmap] = []
results = []

View File

@@ -1,6 +1,6 @@
from __future__ import annotations
from typing import Literal
from typing import Annotated, Literal
from app.database.statistics import UserStatistics
from app.database.user import User
@@ -181,9 +181,9 @@ async def _count_online_users_optimized(redis):
)
async def api_get_player_info(
session: Database,
scope: Literal["stats", "events", "info", "all"] = Query(..., description="信息范围"),
id: int | None = Query(None, ge=3, le=2147483647, description="用户 ID"),
name: str | None = Query(None, regex=r"^[\w \[\]-]{2,32}$", description="用户名"),
scope: Annotated[Literal["stats", "events", "info", "all"], Query(..., description="信息范围")],
id: Annotated[int | None, Query(ge=3, le=2147483647, description="用户 ID")] = None,
name: Annotated[str | None, Query(regex=r"^[\w \[\]-]{2,32}$", description="用户名")] = None,
):
"""
获取指定玩家的信息

View File

@@ -2,15 +2,14 @@ from __future__ import annotations
import base64
from datetime import date
from typing import Literal
from typing import Annotated, Literal
from app.database.counts import ReplayWatchedCount
from app.database.score import Score
from app.dependencies.database import Database
from app.dependencies.storage import get_storage_service
from app.dependencies.storage import StorageService
from app.models.mods import int_to_mods
from app.models.score import GameMode
from app.storage import StorageService
from .router import router
@@ -34,18 +33,20 @@ class ReplayModel(BaseModel):
)
async def download_replay(
session: Database,
beatmap: int = Query(..., alias="b", description="谱面 ID"),
user: str = Query(..., alias="u", description="用户"),
ruleset_id: int | None = Query(
None,
alias="m",
description="Ruleset ID",
ge=0,
),
score_id: int | None = Query(None, alias="s", description="成绩 ID"),
type: Literal["string", "id"] | None = Query(None, description="用户类型string 用户名称 / id 用户 ID"),
mods: int = Query(0, description="成绩的 MOD"),
storage_service: StorageService = Depends(get_storage_service),
beatmap: Annotated[int, Query(..., alias="b", description="谱面 ID")],
user: Annotated[str, Query(..., alias="u", description="用户")],
storage_service: StorageService,
ruleset_id: Annotated[
int | None,
Query(
alias="m",
description="Ruleset ID",
ge=0,
),
] = None,
score_id: Annotated[int | None, Query(alias="s", description="成绩 ID")] = None,
type: Annotated[Literal["string", "id"] | None, Query(description="用户类型string 用户名称 / id 用户 ID")] = None,
mods: Annotated[int, Query(description="成绩的 MOD")] = 0,
):
mods_ = int_to_mods(mods)
if score_id is not None:

View File

@@ -1,7 +1,7 @@
from __future__ import annotations
from datetime import datetime, timedelta
from typing import Literal
from typing import Annotated, Literal
from app.database.best_scores import PPBestScore
from app.database.score import Score, get_leaderboard
@@ -69,10 +69,10 @@ class V1Score(AllStrModel):
)
async def get_user_best(
session: Database,
user: str = Query(..., alias="u", description="用户"),
ruleset_id: int = Query(0, alias="m", description="Ruleset ID", ge=0),
type: Literal["string", "id"] | None = Query(None, description="用户类型string 用户名称 / id 用户 ID"),
limit: int = Query(10, ge=1, le=100, description="返回的成绩数量"),
user: Annotated[str, Query(..., alias="u", description="用户")],
ruleset_id: Annotated[int, Query(alias="m", description="Ruleset ID", ge=0)] = 0,
type: Annotated[Literal["string", "id"] | None, Query(description="用户类型string 用户名称 / id 用户 ID")] = None,
limit: Annotated[int, Query(ge=1, le=100, description="返回的成绩数量")] = 10,
):
try:
scores = (
@@ -101,10 +101,10 @@ async def get_user_best(
)
async def get_user_recent(
session: Database,
user: str = Query(..., alias="u", description="用户"),
ruleset_id: int = Query(0, alias="m", description="Ruleset ID", ge=0),
type: Literal["string", "id"] | None = Query(None, description="用户类型string 用户名称 / id 用户 ID"),
limit: int = Query(10, ge=1, le=100, description="返回的成绩数量"),
user: Annotated[str, Query(..., alias="u", description="用户")],
ruleset_id: Annotated[int, Query(alias="m", description="Ruleset ID", ge=0)] = 0,
type: Annotated[Literal["string", "id"] | None, Query(description="用户类型string 用户名称 / id 用户 ID")] = None,
limit: Annotated[int, Query(ge=1, le=100, description="返回的成绩数量")] = 10,
):
try:
scores = (
@@ -133,12 +133,12 @@ async def get_user_recent(
)
async def get_scores(
session: Database,
user: str | None = Query(None, alias="u", description="用户"),
beatmap_id: int = Query(alias="b", description="谱面 ID"),
ruleset_id: int = Query(0, alias="m", description="Ruleset ID", ge=0),
type: Literal["string", "id"] | None = Query(None, description="用户类型string 用户名称 / id 用户 ID"),
limit: int = Query(10, ge=1, le=100, description="返回的成绩数量"),
mods: int = Query(0, description="成绩的 MOD"),
beatmap_id: Annotated[int, Query(alias="b", description="谱面 ID")],
user: Annotated[str | None, Query(alias="u", description="用户")] = None,
ruleset_id: Annotated[int, Query(alias="m", description="Ruleset ID", ge=0)] = 0,
type: Annotated[Literal["string", "id"] | None, Query(description="用户类型string 用户名称 / id 用户 ID")] = None,
limit: Annotated[int, Query(ge=1, le=100, description="返回的成绩数量")] = 10,
mods: Annotated[int, Query(description="成绩的 MOD")] = 0,
):
try:
if user is not None:

View File

@@ -1,7 +1,7 @@
from __future__ import annotations
from datetime import datetime
from typing import Literal
from typing import Annotated, Literal
from app.database.statistics import UserStatistics, UserStatisticsResp
from app.database.user import User
@@ -104,10 +104,10 @@ class V1User(AllStrModel):
async def get_user(
session: Database,
background_tasks: BackgroundTasks,
user: str = Query(..., alias="u", description="用户"),
ruleset_id: int | None = Query(None, alias="m", description="Ruleset ID", ge=0),
type: Literal["string", "id"] | None = Query(None, description="用户类型string 用户名称 / id 用户 ID"),
event_days: int = Query(default=1, ge=1, le=31, description="从现在起所有事件的最大天数"),
user: Annotated[str, Query(..., alias="u", description="用户")],
ruleset_id: Annotated[int | None, Query(alias="m", description="Ruleset ID", ge=0)] = None,
type: Annotated[Literal["string", "id"] | None, Query(description="用户类型string 用户名称 / id 用户 ID")] = None,
event_days: Annotated[int, Query(ge=1, le=31, description="从现在起所有事件的最大天数")] = 1,
):
redis = get_redis()
cache_service = get_user_cache_service(redis)