День игры — контракт и фон
День игры трогает три вещи: эндпоинты стойки регистрации, фоновые напоминания и операцию старта, которая фиксирует состав.
Эндпоинты стойки
Заголовок раздела «Эндпоинты стойки»| Метод и путь | Кто может |
|---|---|
POST /tournaments/{id}/check-in |
owner, td |
POST /tournaments/{id}/cancel-check-in |
owner, td |
POST /tournaments/{id}/walk-in |
owner, td |
GET /tournaments/{id}/registrations |
owner, td |
Чек-ин возможен только из статуса registered и только пока турнир в
registration. Полный контракт модуля — в статье
Запись: контракт и переходы.
Walk-in
Заголовок раздела «Walk-in»Принимает телефон и имя. Логика поиска человека:
- телефон принадлежит существующему пользователю → запись привязывается к нему;
- иначе заводится
GuestPlayer, который клеймится при первом входе владельца телефона.
Операция идемпотентна: повтор и гонка возвращают ту же строку. Доступна
пока турнир registration или running — то есть это же и поздняя
дорегистрация. capacity намеренно не проверяется.
Фоновые напоминания
Заголовок раздела «Фоновые напоминания»pg-boss на том же PostgreSQL, без Redis; стартует по DI-токену BOSS, в тестах
подменён FakeBoss.
| Джоба | Расписание | Что делает |
|---|---|---|
tournament-reminders |
*/5 * * * * |
пуш за 24 ч до старта и пуш в момент дедлайна отмены |
season-rollover |
5 0 * * * UTC |
архивирует истёкший сезон, заводит текущий квартал |
Окно поиска равно периоду запуска — пять минут. Дедупликация идёт по журналу
Notification: ключ складывается из kind, payload.tournamentId и
payload.window, поэтому повторный тик или ручной перезапуск джобы не задваивает
напоминание. Гости без аккаунта пропускаются — им некуда слать.
Дедлайн отмены у каждого организатора свой: organizer.cancelDeadlineHours,
по умолчанию 3.
Что делает старт турнира
Заголовок раздела «Что делает старт турнира»Требует минимум двух записей в checked_in. В одной операции:
- рассадка — случайно и равномерно,
SEATS_PER_TABLE = 9, разброс между столами не больше одного игрока; - всем, кто остался в
registered, ставитсяno_showи выдаётся страйк; - запускается серверный таймер блайндов с первого уровня.
Отсюда важное следствие для отладки: после старта состав уже зафиксирован, и «потерянный» игрок — это почти всегда несделанный чек-ин, а не сбой рассадки.
Реалтайм
Заголовок раздела «Реалтайм»Живое состояние турнира отдаёт GET /tournaments/{id}/live, подписка — namespace
/live через socket.io. Гейт /live требует JWT на handshake: приложение
организатора передаёт auth: { token } при подключении. Молчащий сокет чаще
всего означает отсутствующий или протухший токен, а не потерянное соединение.
Что рядом
Заголовок раздела «Что рядом»- День игры и чек-ин — те же правила словами продукта.
- Запись: контракт и переходы — статусы и коды ошибок.
- poker-api — как запустить сервис локально.