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

Closed
opened 2026-09-09 18:52:46 +03:00 by Agent · 1 comment
Collaborator

notify.match_changed рассылает событие match всем участникам группы (_group_member_ids), а обработчик на фронте (useServerEvents) инвалидирует по нему в том числе историю игр, публичные профили и личную статистику получателя.

Что получается: в группе из N человек любой старт, правка, завершение или удаление партии заставляет остальные N−1 открытых вкладок немедленно перезапросить свою историю и открытый профиль, даже если к этой партии они отношения не имеют. staleTime: 15s тут не помогает — инвалидация его обходит.

Широкая инвалидация появилась в #8 сознательно: без неё открытый профиль показывал состав партии до её завершения. Но правильнее сузить не инвалидацию, а событие.

Что нужно: класть в SSE-пейлоуд список участников партии и на клиенте трогать историю/профили только тогда, когда получатель среди них (либо когда открыт профиль одного из участников).

Почему не сделал в рамках #8: это изменение контракта события — правка бэкенда, фронта и регенерация schema.d.ts, то есть отдельная задача, а не чистка кода.

Обнаружено при работе над #8.

`notify.match_changed` рассылает событие `match` всем участникам группы (`_group_member_ids`), а обработчик на фронте (`useServerEvents`) инвалидирует по нему в том числе историю игр, публичные профили и личную статистику получателя. **Что получается:** в группе из N человек любой старт, правка, завершение или удаление партии заставляет остальные N−1 открытых вкладок немедленно перезапросить свою историю и открытый профиль, даже если к этой партии они отношения не имеют. `staleTime: 15s` тут не помогает — инвалидация его обходит. Широкая инвалидация появилась в #8 сознательно: без неё открытый профиль показывал состав партии до её завершения. Но правильнее сузить не инвалидацию, а событие. **Что нужно:** класть в SSE-пейлоуд список участников партии и на клиенте трогать историю/профили только тогда, когда получатель среди них (либо когда открыт профиль одного из участников). **Почему не сделал в рамках #8:** это изменение контракта события — правка бэкенда, фронта и регенерация `schema.d.ts`, то есть отдельная задача, а не чистка кода. Обнаружено при работе над #8.
Agent added this to the v1.35 - промежуточная полировка версии 1.3 milestone 2026-09-09 18:52:46 +03:00
NotBigGhost added the Kind/Enhancement label 2026-09-09 19:14:47 +03:00
Agent self-assigned this 2026-09-09 20:44:15 +03:00
Agent added the
Reviewed
Confirmed
1
label 2026-09-09 20:44:16 +03:00
Agent added the
Status
In Review
label 2026-09-09 20:47:59 +03:00
Author
Collaborator

Работа выполнена, открыт PR: #44

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

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

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

Проверки: pytest — 95 passed (2 новых теста), существующие тесты SSE прошли без правок; npm run build — зелёный. schema.d.ts не трогал: события SSE в OpenAPI не описаны.

Статус: Status/In Review
Осталось за вами: ревью и мёрж PR — задача закроется автоматически. Это была последняя открытая задача вехи v1.35.

Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/44 **Итог:** событие несёт `participant_ids`. Общие витрины (карточка партии, списки и статистика группы, топ, главная) обновляются у всех — рейтинг глобальный, чужая партия действительно двигает таблицу. История, публичный профиль и личная статистика — только у игравших и у зрителей их профилей. Главная тонкость оказалась в удалении партии: участники собираются до удаления, потому что каскад уносит их строки вместе с партией и собранный после список всегда был бы пустым. Отдельный тест это фиксирует. Событие без `participant_ids` (вкладка открыта до обновления сервера) обрабатывается по-старому, широко — обновление бэкенда не ломает уже открытые страницы. **Проверки:** `pytest` — 95 passed (2 новых теста), существующие тесты SSE прошли без правок; `npm run build` — зелёный. `schema.d.ts` не трогал: события SSE в OpenAPI не описаны. **Статус:** `Status/In Review` **Осталось за вами:** ревью и мёрж PR — задача закроется автоматически. Это была последняя открытая задача вехи v1.35.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NotBigGhost/ForbiddenStarsApp#33