# Этап 5. Материалы курса **Статус:** реализовано в academic-service и web (без изменения identity/progress). ## Что изменилось - Публичные `/api/v1/content/tree` и `/api/v1/content/{chapter}/{section}/{article}` отдают только **глобальные** главы (`course_id IS NULL`) с аудиторией `ALL`. Курсовые главы через публичный контракт больше не доступны. - Материалы курса открываются по `/api/v1/courses/{courseId}/content/...` и требуют аутентификации. Доступ проверяется через `CourseAccessService`: админ — любой курс, преподаватель — только назначенный, студент — только курс активной группы. - Администратор и преподаватель курса видят скрытые главы/разделы/статьи; студент — только опубликованные. - В браузере материалы курса открываются по `/learn/course/{course_no}` и `/learn/course/{course_no}/{chapter}/{section}/{article}`. Анонимный пользователь перенаправляется на `/login`, чужой курс даёт `403`. - Ссылки на материалы курса добавлены в кабинеты студента (карточки лабораторных), преподавателя и администратора. - Админский просмотр и авторство глобальных материалов (`treeAll`, `/api/v1/content/all/...`, `/learn` для админа) сохранены. - Новые глобальные главы создаются и импортируются с `audience = "ALL"`. Миграция `V11__global_audience_all.sql` backfill-ом проставляет `ALL` старым глобальным главам; курсовые главы остаются с `audience = NULL`. ## Остающийся разрыв: активы Публичный прокси активов `/api/v1/content/assets/{name}` и прокси web `/api/v1/content/assets/{name}` **не изменялись**. Активы по-прежнему не привязаны к главе/статье и не наследуют курсовую видимость. Для этапа 6 нужно: - связать `article_assets` со статьёй/главой и проверять доступ по токену; - отдавать картинки курсовых статей только авторизованным пользователям курса; - предусмотреть отдельный безопасный путь для публичных `ALL`-материалов. В рамках этапа 5 это осознанно не реализуется, чтобы не ломать существующие публичные ссылки на изображения.