Историю партий нельзя править после смены состава группы или набора дополнений #29

Closed
opened 2026-09-09 15:27:06 +03:00 by Agent · 3 comments
Collaborator

match_service.update_match вызывает _validate_roster_basics теми же правилами, что и создание партии: каждый участник должен состоять в группе сейчас, каждая фракция — быть доступной группе сейчас.

Что получается:

  • группа снимает галочку с дополнения «Забытые миры» — и любую прошлую партию, сыгранную на Тау, больше нельзя исправить: 422 FACTION_NOT_AVAILABLE;
  • игрока удалили из группы — и каждая партия с его участием отказывается сохраняться: «Все участники должны состоять в группе».

То есть опечатку в старой партии невозможно исправить, хотя сама партия остаётся в статистике.

Почему не поправил в рамках ревью #8: для создания партии эти проверки верны, для правки истории — нет, и нужен ваш выбор границы:

  1. при правке проверять только формальную корректность (уникальность мест, число игроков), а состав и фракции брать как есть;
  2. разрешать оставлять уже сохранённых участников/фракции, но запрещать добавлять новых вне текущего состава;
  3. оставить как есть и править историю только через админку с отдельным послаблением.

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

`match_service.update_match` вызывает `_validate_roster_basics` теми же правилами, что и создание партии: каждый участник должен состоять в группе **сейчас**, каждая фракция — быть доступной группе **сейчас**. **Что получается:** - группа снимает галочку с дополнения «Забытые миры» — и любую прошлую партию, сыгранную на Тау, больше нельзя исправить: `422 FACTION_NOT_AVAILABLE`; - игрока удалили из группы — и каждая партия с его участием отказывается сохраняться: «Все участники должны состоять в группе». То есть опечатку в старой партии невозможно исправить, хотя сама партия остаётся в статистике. **Почему не поправил в рамках ревью #8:** для создания партии эти проверки верны, для правки истории — нет, и нужен ваш выбор границы: 1. при правке проверять только формальную корректность (уникальность мест, число игроков), а состав и фракции брать как есть; 2. разрешать оставлять уже сохранённых участников/фракции, но запрещать добавлять новых вне текущего состава; 3. оставить как есть и править историю только через админку с отдельным послаблением. Обнаружено при работе над #8.
Agent added this to the v1.35 - промежуточная полировка версии 1.3 milestone 2026-09-09 15:27:06 +03:00
Owner

Есть ещё нюанс, что правка уже завершённой партии доступна только админу, поэтому нужно не только исправить текущее поведение, но и добавить кнопку "Редактировать" в описании партии, и, соответственно, переводить пользователя в меню исправления.

Есть ещё нюанс, что правка уже завершённой партии доступна только админу, поэтому нужно не только исправить текущее поведение, но и добавить кнопку "Редактировать" в описании партии, и, соответственно, переводить пользователя в меню исправления.
NotBigGhost added the Kind/Bug label 2026-09-09 19:11:31 +03:00
Agent self-assigned this 2026-09-09 20:05:14 +03:00
Agent added the
Reviewed
Confirmed
1
label 2026-09-09 20:05:15 +03:00
Author
Collaborator

План выполнения

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

  1. _validate_roster_basics получает необязательные keep_user_ids / keep_faction_ids — то, что уже сохранено в партии, допустимо независимо от текущего состава группы. Остальные проверки (число игроков, дубли) не меняются, создание партии не ослабевает.
  2. update_match передаёт туда участников правимой партии — их всё равно перечитывает для замены строк.
  3. Новый хук useUpdateMatch поверх игроцкого PATCH /api/matches/{id} (был только админский). Инвалидация как у завершения: места меняются, значит меняются лидерборд, история и профили.
  4. На странице завершённой партии при can_modify — кнопка «Редактировать» у блока «Результаты». Режим правки: тот же PlaceEditor, раскладка восстанавливается из сохранённых мест (одинаковое место = ничья, выбывшие отдельно), плюс комментарии и причина победы.
  5. Смена фракций — отдельным блоком со списком «игрок → фракция», а не внутри PlaceEditor: тот занят перетаскиванием, вплетать в него селекты рискованно.
  6. Сохранение шлёт expected_version, так что правка с устаревшей версией отклоняется как раньше.

API не меняется — MatchUpdate уже принимает всё нужное, регенерация schema.d.ts не требуется.

Критерии готовности

  • Партию с выбывшим из группы игроком и фракцией из отключённого дополнения можно сохранить.
  • Вписать постороннего игрока или фракцию, которой в партии не было и у группы нет, по-прежнему нельзя (422).
  • Создание партии проверяется как раньше.
  • Участник группы правит места, ничьи, выбывших, фракции, комментарии и причину победы прямо на странице партии.
  • pytest и npm run build зелёные.

Ветка: issue-29-edit-finished-match от dev

## План выполнения Ваши решения: уже записанные в партию игроки и фракции проходят проверку всегда, новые — только из текущего состава; правка для игрока выглядит как знакомый редактор с перетаскиванием. 1. `_validate_roster_basics` получает необязательные `keep_user_ids` / `keep_faction_ids` — то, что уже сохранено в партии, допустимо независимо от текущего состава группы. Остальные проверки (число игроков, дубли) не меняются, создание партии не ослабевает. 2. `update_match` передаёт туда участников правимой партии — их всё равно перечитывает для замены строк. 3. Новый хук `useUpdateMatch` поверх игроцкого `PATCH /api/matches/{id}` (был только админский). Инвалидация как у завершения: места меняются, значит меняются лидерборд, история и профили. 4. На странице завершённой партии при `can_modify` — кнопка «Редактировать» у блока «Результаты». Режим правки: тот же `PlaceEditor`, раскладка восстанавливается из сохранённых мест (одинаковое место = ничья, выбывшие отдельно), плюс комментарии и причина победы. 5. Смена фракций — отдельным блоком со списком «игрок → фракция», а не внутри `PlaceEditor`: тот занят перетаскиванием, вплетать в него селекты рискованно. 6. Сохранение шлёт `expected_version`, так что правка с устаревшей версией отклоняется как раньше. API не меняется — `MatchUpdate` уже принимает всё нужное, регенерация `schema.d.ts` не требуется. **Критерии готовности** - Партию с выбывшим из группы игроком и фракцией из отключённого дополнения можно сохранить. - Вписать постороннего игрока или фракцию, которой в партии не было и у группы нет, по-прежнему нельзя (422). - Создание партии проверяется как раньше. - Участник группы правит места, ничьи, выбывших, фракции, комментарии и причину победы прямо на странице партии. - `pytest` и `npm run build` зелёные. **Ветка:** `issue-29-edit-finished-match` от `dev`
Agent added the
Status
In Review
label 2026-09-09 20:16:57 +03:00
Author
Collaborator

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

Итог: уже записанные в партию игроки и фракции проходят проверку всегда — историю можно чинить после отключения дополнения или ухода игрока из группы; новые по-прежнему только из текущего состава, так что занести в историю постороннего нельзя. У блока «Результаты» появилась кнопка «Редактировать»: правка идёт тем же перетаскиванием, что и завершение, плюс фракции, причина победы и комментарии, с проверкой версии партии.

Проверки: pytest — 91 passed (4 новых теста); npm run build — зелёный. Ручного прогона в dev не делал, стенд был занят — экран правки стоит глянуть глазами при ревью.

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

Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/39 **Итог:** уже записанные в партию игроки и фракции проходят проверку всегда — историю можно чинить после отключения дополнения или ухода игрока из группы; новые по-прежнему только из текущего состава, так что занести в историю постороннего нельзя. У блока «Результаты» появилась кнопка «Редактировать»: правка идёт тем же перетаскиванием, что и завершение, плюс фракции, причина победы и комментарии, с проверкой версии партии. **Проверки:** `pytest` — 91 passed (4 новых теста); `npm run build` — зелёный. Ручного прогона в dev не делал, стенд был занят — экран правки стоит глянуть глазами при ревью. **Статус:** `Status/In Review` **Осталось за вами:** ревью и мёрж PR — задача закроется автоматически. Дальше по вехе v1.35 беру #30.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NotBigGhost/ForbiddenStarsApp#29