Add event management features to API, including event cancellation, deletion, registration closure, and workflow balance generation. Introduce new roster management endpoints and enhance participant handling with avoided player preferences. Update database schema and service logic to support these changes.
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
CI / compose (push) Has been cancelled

This commit is contained in:
2026-07-19 02:10:02 +03:00
parent 59c0bdb345
commit 4b889fb8a0
30 changed files with 2766 additions and 149 deletions

View File

@@ -2,7 +2,9 @@
## Текущее состояние
Собран и проверен full-stack MVP: Go API с PostgreSQL, Discord OAuth и серверными сессиями, React-интерфейс, календарь и RSVP, административные сценарии, preference-aware балансировка 1/2/2, капитаны, Bo3-драфты и результаты, single-elimination сетка, SSE и RU/EN локализация. Добавлены Docker Compose для локальной разработки и Coolify, миграции, OpenAPI-контракт и CI.
Собран полный вертикальный production-пайплайн скрима: закрытие регистрации → versioned балансировка → ручная правка и подтверждение составов 1/2/2 капитаны → атомарный старт Bo3 или турнира → жеребьёвка → баны карт → баны героев → результаты и завершение. Состояние события, roster draft и серии сохраняется в PostgreSQL с optimistic locking, аудитом и глобальной SSE-синхронизацией без ручного обновления страницы.
Admin UI содержит пошаговый workflow и roster editor с same-role swap, резервом и запуском. Live, spectator и bracket используют реальные API-команды и realtime refresh; demo fixtures остались только локальным showcase.
## Подтверждённые требования
@@ -10,10 +12,11 @@
- backend на Go с Clean Architecture;
- современный frontend на фреймворке;
- Discord OAuth и самостоятельное заполнение игроком рейтингов Tank, Damage и Support;
- выбор игроком предпочитаемых ролей и до трёх желаемых союзников;
- выбор игроком предпочитаемых ролей, до трёх желаемых союзников и до трёх avoid-игроков;
- переключение всего интерфейса между RU и EN;
- календарь запланированных миксов со статусами Going / Maybe / NotGoing;
- административная панель управления событиями, игроками и регистрациями;
- Admin может отменить событие с сохранением его в календаре или полностью удалить событие и связанные данные;
- возможность Admin отметить участие за другого игрока;
- автоматическая балансировка полных команд 1 Tank / 2 Damage / 2 Support;
- резерв для участников, не вошедших в полные команды;
@@ -26,13 +29,15 @@
- production-развёртывание единым Docker Compose resource в Coolify;
- PostgreSQL в том же Compose-стеке с persistent volume;
- мобильный и десктопный интерфейс.
- карточки отменённых событий отображаются красными, завершённых — зелёными, активных — розовыми с меткой LIVE.
## Исходный регламент
- основной Bo3: Control → Hybrid/Escort → Control;
- альтернативный Bo3: Control → Push → Escort;
- первый бан карт определяется жеребьёвкой;
- карты банятся по очереди до одной оставшейся;
- первая карта определяется банами: первый бан задаёт жеребьёвка, затем команды банят по очереди до одной оставшейся;
- вторую и последующие карты напрямую выбирает команда, проигравшая предыдущую карту;
- после ничьей следующую карту выбирает команда, проигравшая начальный жребий;
- тайбрейкер Control не повторяет уже сыгранную Control-карту;
- перед каждой картой команды делают по два бана героев в порядке A → B → A → B;
- два бана одной команды должны относиться к разным ролям;
@@ -53,12 +58,17 @@
- игрок входит через Discord;
- игрок самостоятельно указывает Overwatch-ранг от Bronze 5 до Champion 1 для каждой роли;
- балансировщик автоматически назначает роли и собирает команды 1/2/2;
- предпочтения ролей и союзников учитываются как мягкие штрафы после требований баланса;
- предпочтения ролей, союзников и avoid-списки учитываются как мягкие штрафы после требований баланса;
- участники сверх полного состава остаются в резерве;
- первая турнирная сетка — single elimination;
- игрок отмечается на микс через календарь;
- Admin может изменить RSVP за игрока, а действие сохраняет автора;
- капитан назначается отдельно для каждой команды и должен входить в её состав;
- Admin закрывает регистрацию и фиксирует список участников перед балансировкой;
- до подтверждения составов Admin может менять игроков одной роли местами и заменять игрока резервным;
- подтверждённые составы и капитаны являются обязательным условием запуска скрима;
- запуск скрима создаёт серверную серию и переводит событие в последовательный конечный автомат жеребьёвки, банов и результатов;
- после запуска обычное редактирование составов блокируется; аварийная замена выполняется Admin отдельно и фиксируется в аудите;
- исход карты задаётся как победа одной из команд или ничья;
- сервер автоматически пересчитывает счёт Bo3 и победителя серии;
- frontend, API и PostgreSQL разворачиваются одним Compose-стеком;
@@ -66,6 +76,6 @@
## Ближайший следующий шаг
Развернуть тестовый экземпляр через Coolify, настроить Discord OAuth и выполнить приёмочное тестирование полного сценария на реальных аккаунтах и PostgreSQL.
Проверить миграцию `006_event_workflow.sql` и полный сценарий на staging с реальной PostgreSQL (`TEST_DATABASE_URL`), затем провести первый пробный микс через production UI.
Открытое продуктовое решение, которое не блокирует каркас: как выбирается Hybrid/Escort для второй карты — заранее организатором, случайно или отдельным действием команд.
Публичная вкладка FAQ описывает регистрацию, балансировку, полномочия капитанов, выбор карт, баны героев и подсчёт Bo3.