diff --git a/app/router/beatmap.py b/app/router/beatmap.py index 30e2ef1..697cf0a 100644 --- a/app/router/beatmap.py +++ b/app/router/beatmap.py @@ -33,8 +33,10 @@ async def get_beatmap( await db.exec( select(Beatmap) .options( - joinedload(Beatmap.beatmapset).selectinload(Beatmapset.beatmaps) # pyright: ignore[reportArgumentType] - ) + joinedload(Beatmap.beatmapset).selectinload( # pyright: ignore[reportArgumentType] + Beatmapset.beatmaps # pyright: ignore[reportArgumentType] + ) + ) .where(Beatmap.id == bid) ) ).first() @@ -72,9 +74,11 @@ async def batch_get_beatmaps( await db.exec( select(Beatmap) .options( - joinedload(Beatmap.beatmapset).selectinload( # pyright: ignore[reportArgumentType] - Beatmapset.beatmaps # pyright: ignore[reportArgumentType] - ) + joinedload( + Beatmap.beatmapset # pyright: ignore[reportArgumentType] + ).selectinload( + Beatmapset.beatmaps # pyright: ignore[reportArgumentType] + ) ) .order_by(col(Beatmap.last_updated).desc()) .limit(50) @@ -85,9 +89,11 @@ async def batch_get_beatmaps( await db.exec( select(Beatmap) .options( - joinedload(Beatmap.beatmapset).selectinload( # pyright: ignore[reportArgumentType] - Beatmapset.beatmaps # pyright: ignore[reportArgumentType] - ) + joinedload( + Beatmap.beatmapset # pyright: ignore[reportArgumentType] + ).selectinload( + Beatmapset.beatmaps # pyright: ignore[reportArgumentType] + ) ) .where(col(Beatmap.id).in_(b_ids)) .limit(50) @@ -133,7 +139,7 @@ async def get_beatmap_scores( joinedload(Score.beatmap) # pyright: ignore[reportArgumentType] .joinedload(Beatmap.beatmapset) # pyright: ignore[reportArgumentType] .selectinload( - Beatmapset.beatmaps # pyright: ignore[reportArgumentType] + Beatmapset.beatmaps # pyright: ignore[reportArgumentType] ) ) .where(Score.beatmap_id == beatmap) @@ -176,10 +182,13 @@ async def get_user_beatmap_score( .options( joinedload(Score.beatmap) # pyright: ignore[reportArgumentType] .joinedload(Beatmap.beatmapset) # pyright: ignore[reportArgumentType] - .selectinload(Beatmapset.beatmaps) # pyright: ignore[reportArgumentType] + .selectinload( + Beatmapset.beatmaps # pyright: ignore[reportArgumentType] + ) ) .where(Score.beatmap_id == beatmap) .where(Score.user_id == user) + .where(Score.gamemode == mode) .order_by(col(Score.classic_total_score).desc()) ) ).first() @@ -192,4 +201,39 @@ async def get_user_beatmap_score( return BeatmapUserScore( position=user_score.position if user_score.position is not None else 0, score=ScoreResp.from_db(user_score), - ) \ No newline at end of file + ) + + +@router.get( + "/beatmaps/{beatmap}/scores/users/{user}/all", + tags=["beatmap"], + response_model=list[ScoreResp], +) +async def get_user_all_beatmap_scores( + beatmap: int, + user: int, + legacy_only: bool = Query(None), + ruleset: str = Query(None), + current_user: DBUser = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +): + if legacy_only: + raise HTTPException(status_code=404,detail="This server only contains non-legacy scores") + all_user_scores=( + await db.exec( + select(Score) + .options( + joinedload(Score.beatmap) # pyright: ignore[reportArgumentType] + .joinedload(Beatmap.beatmapset) # pyright: ignore[reportArgumentType] + .selectinload( + Beatmapset.beatmaps # pyright: ignore[reportArgumentType] + ) + ) + .where(Score.gamemode==ruleset) + .where(Score.beatmap_id == beatmap) + .where(Score.user_id == user) + .order_by(col(Score.classic_total_score).desc()) + ) + ).all() + + return [ScoreResp.from_db(score) for score in all_user_scores]