3.1 KiB
3.1 KiB
Этап 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.sqlbackfill-ом проставляетALLстарым глобальным главам; курсовые главы остаются сaudience = NULL.
Остающийся разрыв: активы
Публичный прокси активов /api/v1/content/assets/{name} и прокси web
/api/v1/content/assets/{name} не изменялись. Активы по-прежнему не привязаны
к главе/статье и не наследуют курсовую видимость. Для этапа 6 нужно:
- связать
article_assetsсо статьёй/главой и проверять доступ по токену; - отдавать картинки курсовых статей только авторизованным пользователям курса;
- предусмотреть отдельный безопасный путь для публичных
ALL-материалов.
В рамках этапа 5 это осознанно не реализуется, чтобы не ломать существующие публичные ссылки на изображения.