Событие о партии рассылается всей группе, и клиент по нему инвалидировал историю игр, публичные профили и личную статистику получателя. В группе из шести человек партия двоих заставляла остальные четыре вкладки немедленно перезапросить свою историю и открытый профиль, хотя у них ничего не менялось; 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 живёт на клиенте
## Что сделано
Событие о партии рассылается всей группе, и клиент по нему инвалидировал историю игр, публичные профили и личную статистику получателя. В группе из шести человек партия двоих заставляла остальные четыре вкладки немедленно перезапросить свою историю и открытый профиль, хотя у них ничего не менялось; `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
Событие о партии рассылается всей группе, и клиент по нему инвалидировал историю
игр, публичные профили и личную статистику получателя. В группе из шести человек
любая партия двоих заставляла остальные четыре вкладки перезапрашивать свою
историю и открытый профиль, хотя у них ничего не изменилось.
Теперь событие несёт participant_ids. Общие витрины (карточка партии, списки и
статистика группы, топ и главная) обновляются у всех — рейтинг глобальный, чужая
партия действительно двигает топ. История, публичный профиль и личная статистика
обновляются только у тех, кто играл, и у зрителей их профилей.
При удалении партии участники собираются ДО удаления: каскад уносит их строки
вместе с партией, и собранный после список всегда был бы пустым. Это же
поведение закреплено тестом.
Событие без participant_ids (вкладка открыта до обновления сервера) обрабатывается
по-старому, широко: обновление бэкенда не ломает уже открытые страницы.
#33
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BoiJK9ux8peeyjLb8TYjFf
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что сделано
Событие о партии рассылается всей группе, и клиент по нему инвалидировал историю игр, публичные профили и личную статистику получателя. В группе из шести человек партия двоих заставляла остальные четыре вкладки немедленно перезапросить свою историю и открытый профиль, хотя у них ничего не менялось;
staleTimeтут не помогает — инвалидация его обходит.Теперь событие несёт
participant_ids, и клиент делит витрины:Рассылка по-прежнему адресована всей группе — это верный адресат для групповых списков; сузилось то, что клиент по событию перезапрашивает.
Отдельно про удаление партии: участники собираются до удаления. Каскад уносит их строки вместе с партией, поэтому собранный после список всегда оказался бы пустым, и у игравших история не обновилась бы. Это закреплено отдельным тестом.
Событие без
participant_ids(вкладка открыта до обновления сервера) обрабатывается по-старому, широко — обновление бэкенда не ломает уже открытые страницы.Свой id на клиенте держится в
ref: в зависимостях эффекта он пересоздавал бы SSE-соединение при каждом перезапросе профиля.Коммиты
2f79b1eSSE: событие партии несёт участников, клиент не дёргает лишнихПроверки
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