Профиль: история партий игрока и настройки её витрины
Выборки партий по игроку в бэкенде не было — только по группе. Добавлен
stats_service.user_match_list: завершённые партии игрока, свежие сверху;
сборка элементов вынесена из group_match_list в общий _match_items, чтобы
не дублировать её в двух местах.
Витрина профиля задаётся двумя колонками в users (миграция 0011):
history_mode (all/best) и history_detail (compact/full). Режим применяется
на бэкенде, а не на клиенте: это витрина владельца, и в том же виде
профиль видят гости. В режиме best берётся партия с максимальными League
Points из SCORED_CTE (при равных очках — более свежая).
GET /api/users/{user_id}/matches отдаёт список вместе с mode и detail —
гостю хватает одного запроса, чтобы отрисовать историю как задумал владелец.
#1
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -92,6 +92,9 @@ class UserRead(BaseModel):
|
||||
avatar_url: str | None = None
|
||||
# Любимая фракция — выбор игрока (id справочника); None — не выбрана.
|
||||
favorite_faction_id: int | None = None
|
||||
# Витрина истории партий в профиле.
|
||||
history_mode: str = "all"
|
||||
history_detail: str = "compact"
|
||||
|
||||
|
||||
class MeRead(UserRead):
|
||||
@@ -107,6 +110,8 @@ class ProfileUpdate(BaseModel):
|
||||
# (роутер смотрит exclude_unset): правка «О себе» не трогает фракцию.
|
||||
bio: str | None = None
|
||||
favorite_faction_id: int | None = None
|
||||
history_mode: str | None = None
|
||||
history_detail: str | None = None
|
||||
|
||||
|
||||
class ActiveGroupUpdate(BaseModel):
|
||||
@@ -306,6 +311,20 @@ class LeaderboardEntry(OverallStats):
|
||||
avatar_url: str | None = None
|
||||
|
||||
|
||||
class MatchHistory(BaseModel):
|
||||
"""История партий игрока плюс настройки витрины его профиля.
|
||||
|
||||
Настройки едут вместе со списком, чтобы гость отрисовал историю ровно так,
|
||||
как выбрал её владелец, не делая второго запроса за профилем."""
|
||||
|
||||
items: list[MatchListItem] = []
|
||||
total: int
|
||||
limit: int
|
||||
offset: int
|
||||
mode: str
|
||||
detail: str
|
||||
|
||||
|
||||
class Leaderboard(BaseModel):
|
||||
entries: list[LeaderboardEntry] = []
|
||||
provisional: list[LeaderboardEntry] = []
|
||||
|
||||
Reference in New Issue
Block a user