notify.match_changed рассылает событие match всем участникам группы (_group_member_ids), а обработчик на фронте (useServerEvents) инвалидирует по нему в том числе историю игр, публичные профили и личную статистику получателя.
Что получается: в группе из N человек любой старт, правка, завершение или удаление партии заставляет остальные N−1 открытых вкладок немедленно перезапросить свою историю и открытый профиль, даже если к этой партии они отношения не имеют. staleTime: 15s тут не помогает — инвалидация его обходит.
Широкая инвалидация появилась в #8 сознательно: без неё открытый профиль показывал состав партии до её завершения. Но правильнее сузить не инвалидацию, а событие.
Что нужно: класть в SSE-пейлоуд список участников партии и на клиенте трогать историю/профили только тогда, когда получатель среди них (либо когда открыт профиль одного из участников).
Почему не сделал в рамках #8: это изменение контракта события — правка бэкенда, фронта и регенерация schema.d.ts, то есть отдельная задача, а не чистка кода.
`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
Итог: событие несёт 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.
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.
notify.match_changedрассылает событиеmatchвсем участникам группы (_group_member_ids), а обработчик на фронте (useServerEvents) инвалидирует по нему в том числе историю игр, публичные профили и личную статистику получателя.Что получается: в группе из N человек любой старт, правка, завершение или удаление партии заставляет остальные N−1 открытых вкладок немедленно перезапросить свою историю и открытый профиль, даже если к этой партии они отношения не имеют.
staleTime: 15sтут не помогает — инвалидация его обходит.Широкая инвалидация появилась в #8 сознательно: без неё открытый профиль показывал состав партии до её завершения. Но правильнее сузить не инвалидацию, а событие.
Что нужно: класть в SSE-пейлоуд список участников партии и на клиенте трогать историю/профили только тогда, когда получатель среди них (либо когда открыт профиль одного из участников).
Почему не сделал в рамках #8: это изменение контракта события — правка бэкенда, фронта и регенерация
schema.d.ts, то есть отдельная задача, а не чистка кода.Обнаружено при работе над #8.
Работа выполнена, открыт 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.