location / отдавал index.html вообще без Cache-Control — браузер кэшировал
его эвристически (по Last-Modified), из-за чего после деплоя часть
пользователей продолжала видеть старую версию (например, без анонимного
входа), пока не делали hard refresh, а на следующей обычной загрузке
снова получали закэшированную старую версию. Симптом воспроизвёлся на
test.cloud-copp74.ru.
no-cache вынуждает браузер всегда идти на сервер за index.html (быстрый
304 по ETag, если файл не менялся) — хэшированные /assets/ ниже как
кэшировались на год, так и кэшируются, инвалидация им не нужна.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Школьники не должны придумывать пароль, чтобы пройти тест. Бэкенд уже
поддерживал это: POST /polls/{poll_id}/responses принимает user_id как
Optional, а Response.group_id/organization_id — самостоятельные nullable
снимки школы/класса, не завязанные на аккаунт. Не хватало только
фронтенда — все роуты были жёстко завёрнуты в ProtectedRoute с
обязательным JWT.
- AuthContext: параллельная "анонимная идентичность" (org+group в
localStorage, без токена и без запроса к API)
- ProtectedRoute пускает по токену ИЛИ анонимной сессии; новый
AccountRoute — строго по токену, для /my-tests, /profile,
/response/:id (у анонимной сессии нет истории — её негде хранить)
- Новая страница /anonymous — выбор школы+класса тем же
SearchableDropdown, что и в регистрации
- PollPage при отправке ответа берёт org/group из анонимной сессии,
если пользователь не залогинен
- HomePage скрывает "Мои тесты" и профиль для анонимов, добавлена
кнопка выхода из анонимного режима
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
web-react/: SPA Vite+React+TS, nginx раздаёт статику и проксирует /api на api:8000 по локалке. docker-compose: web(Flet)->web-react на :80. transfer_crud.backup_restore: чистим содержимое data/radar вместо rmtree точки монтирования (EBUSY).