Профиль: история партий игрока и настройки её витрины
Выборки партий по игроку в бэкенде не было — только по группе. Добавлен
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:
@@ -0,0 +1,50 @@
|
||||
"""Пользователь: настройки витрины истории партий в профиле.
|
||||
|
||||
Идемпотентна: на свежей БД столбцы создаёт 0001 (create_all из актуальных моделей) -> no-op;
|
||||
на существующей БД добавляет столбцы. render_as_batch включён в env.py (для SQLite).
|
||||
|
||||
Revision ID: 0011_user_history_prefs
|
||||
Revises: 0010_user_favorite_faction
|
||||
Create Date: 2026-09-07
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import inspect
|
||||
|
||||
from alembic import op
|
||||
|
||||
revision: str = "0011_user_history_prefs"
|
||||
down_revision: Union[str, None] = "0010_user_favorite_faction"
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
bind = op.get_bind()
|
||||
insp = inspect(bind)
|
||||
cols = {c["name"] for c in insp.get_columns("users")}
|
||||
with op.batch_alter_table("users") as b:
|
||||
if "history_mode" not in cols:
|
||||
b.add_column(
|
||||
sa.Column(
|
||||
"history_mode", sa.String(8), nullable=False, server_default="all"
|
||||
)
|
||||
)
|
||||
if "history_detail" not in cols:
|
||||
b.add_column(
|
||||
sa.Column(
|
||||
"history_detail", sa.String(8), nullable=False, server_default="compact"
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
bind = op.get_bind()
|
||||
insp = inspect(bind)
|
||||
cols = {c["name"] for c in insp.get_columns("users")}
|
||||
with op.batch_alter_table("users") as b:
|
||||
if "history_detail" in cols:
|
||||
b.drop_column("history_detail")
|
||||
if "history_mode" in cols:
|
||||
b.drop_column("history_mode")
|
||||
Reference in New Issue
Block a user