SSE-событие партии заставляет перезапрашивать данные всю группу (#33) #44

Merged
NotBigGhost merged 1 commits from issue-33-sse-participants into dev 2026-09-09 20:49:04 +03:00
Collaborator

Что сделано

Событие о партии рассылается всей группе, и клиент по нему инвалидировал историю игр, публичные профили и личную статистику получателя. В группе из шести человек партия двоих заставляла остальные четыре вкладки немедленно перезапросить свою историю и открытый профиль, хотя у них ничего не менялось; staleTime тут не помогает — инвалидация его обходит.

Теперь событие несёт participant_ids, и клиент делит витрины:

  • всем — карточка партии, списки и статистика группы, топ и главная: рейтинг глобальный, чужая партия действительно двигает таблицу;
  • только игравшим — история игр, публичный профиль и личная статистика; открытый профиль участника обновится и у стороннего зрителя, потому что инвалидация идёт по конкретным id.

Рассылка по-прежнему адресована всей группе — это верный адресат для групповых списков; сузилось то, что клиент по событию перезапрашивает.

Отдельно про удаление партии: участники собираются до удаления. Каскад уносит их строки вместе с партией, поэтому собранный после список всегда оказался бы пустым, и у игравших история не обновилась бы. Это закреплено отдельным тестом.

Событие без participant_ids (вкладка открыта до обновления сервера) обрабатывается по-старому, широко — обновление бэкенда не ломает уже открытые страницы.

Свой id на клиенте держится в ref: в зависимостях эффекта он пересоздавал бы SSE-соединение при каждом перезапросе профиля.

Коммиты

  • 2f79b1e SSE: событие партии несёт участников, клиент не дёргает лишних

Проверки

  • pytest — 95 passed (было 93). Новые тесты: событие несёт участников при старте и завершении партии, и — главный случай — при удалении, когда строки участников уже уничтожены каскадом. Существующие тесты SSE прошли без правок
  • npm run build — зелёный
  • schema.d.ts не трогал: события SSE в OpenAPI не описаны, тип ServerEvent живёт на клиенте

Отклонения от плана

Нет.

Closes #33

🤖 Generated with Claude Code

https://claude.ai/code/session_01BoiJK9ux8peeyjLb8TYjFf

## Что сделано Событие о партии рассылается всей группе, и клиент по нему инвалидировал историю игр, публичные профили и личную статистику получателя. В группе из шести человек партия двоих заставляла остальные четыре вкладки немедленно перезапросить свою историю и открытый профиль, хотя у них ничего не менялось; `staleTime` тут не помогает — инвалидация его обходит. Теперь событие несёт `participant_ids`, и клиент делит витрины: - **всем** — карточка партии, списки и статистика группы, топ и главная: рейтинг глобальный, чужая партия действительно двигает таблицу; - **только игравшим** — история игр, публичный профиль и личная статистика; открытый профиль участника обновится и у стороннего зрителя, потому что инвалидация идёт по конкретным id. Рассылка по-прежнему адресована всей группе — это верный адресат для групповых списков; сузилось то, что клиент по событию перезапрашивает. Отдельно про удаление партии: участники собираются **до** удаления. Каскад уносит их строки вместе с партией, поэтому собранный после список всегда оказался бы пустым, и у игравших история не обновилась бы. Это закреплено отдельным тестом. Событие без `participant_ids` (вкладка открыта до обновления сервера) обрабатывается по-старому, широко — обновление бэкенда не ломает уже открытые страницы. Свой id на клиенте держится в `ref`: в зависимостях эффекта он пересоздавал бы SSE-соединение при каждом перезапросе профиля. ## Коммиты - `2f79b1e` SSE: событие партии несёт участников, клиент не дёргает лишних ## Проверки - `pytest` — 95 passed (было 93). Новые тесты: событие несёт участников при старте и завершении партии, и — главный случай — при удалении, когда строки участников уже уничтожены каскадом. Существующие тесты SSE прошли без правок - `npm run build` — зелёный - `schema.d.ts` не трогал: события SSE в OpenAPI не описаны, тип `ServerEvent` живёт на клиенте ## Отклонения от плана Нет. Closes #33 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01BoiJK9ux8peeyjLb8TYjFf
Agent added 1 commit 2026-09-09 20:47:54 +03:00
Событие о партии рассылается всей группе, и клиент по нему инвалидировал историю
игр, публичные профили и личную статистику получателя. В группе из шести человек
любая партия двоих заставляла остальные четыре вкладки перезапрашивать свою
историю и открытый профиль, хотя у них ничего не изменилось.

Теперь событие несёт participant_ids. Общие витрины (карточка партии, списки и
статистика группы, топ и главная) обновляются у всех — рейтинг глобальный, чужая
партия действительно двигает топ. История, публичный профиль и личная статистика
обновляются только у тех, кто играл, и у зрителей их профилей.

При удалении партии участники собираются ДО удаления: каскад уносит их строки
вместе с партией, и собранный после список всегда был бы пустым. Это же
поведение закреплено тестом.

Событие без participant_ids (вкладка открыта до обновления сервера) обрабатывается
по-старому, широко: обновление бэкенда не ломает уже открытые страницы.

#33

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BoiJK9ux8peeyjLb8TYjFf
NotBigGhost merged commit a94de6492a into dev 2026-09-09 20:49:04 +03:00
NotBigGhost deleted branch issue-33-sse-participants 2026-09-09 20:49:05 +03:00
Sign in to join this conversation.