2 Commits
Author SHA1 Message Date
NotBigGhostandClaude Opus 5 ec0445fbcb Миграции: объявления отходят от 0013, слияние с рейтингом в 0016
Объявления выпускаются в main раньше рейтинга, а в main последняя миграция —
0013. Если бы 0015 оставалась после 0014, прод, получивший объявления,
встал бы на 0015, и при будущем переходе на dev alembic счёл бы базу
актуальной — рейтинговая 0014 не применилась бы никогда.

Теперь 0015 отходит от 0013 (как и 0014), а пустая 0016 сводит обе ветки
в одну голову: прод на 0015 докатит 0014 и 0016, база на 0014 — 0015 и 0016.
Базы, уже прогнанные прежней версией (0015 после 0014), повторно получат
идемпотентную 0014 — проверено на копии dev-БД, на пустой базе и на такой
базе. #84

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 21:55:43 +03:00
NotBigGhostandClaude Opus 5 a0a0e522ef Объявления: модель, API игрока и админки, очистка HTML
Объявление администрации показывается игроку окном в свой период, пока игрок
не закроет его («Понятно»). Отметка о закрытии хранится на сервере с номером
версии: правка с «показать заново» поднимает версию, и закрывшие прежнюю
увидят объявление снова — ответ помечен updated («обновлено»). Флаг
show_to_new_players=false прячет объявление от зарегистрировавшихся после
начала показа. Пересекающиеся объявления идут от старого к новому.

Текст приходит HTML-ом из редактора админки и сохраняется только после
очистки по белому списку (b, em, mark и mark.red, p, br): атрибуты
отбрасываются, script/style/svg — вместе с содержимым, текст экранируется
заново. Фронт вставляет только этот HTML.

API: GET /api/announcements/pending, POST /api/announcements/{id}/ack;
админка — список со статусом и счётчиком «закрыли N из M», создание, правка,
«снять с показа», удаление, всё в аудит. SSE-событие announcements активным
игрокам. Миграция 0015 идемпотентная.

Тесты: очистка (XSS-попытки, вложенные div), права, период и порядок,
«новые игроки», повторный показ, снятие, удаление, валидация. #84

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 21:20:55 +03:00