Files
LMS/docs/15-stage5-course-materials.md

3.1 KiB
Raw Blame History

Этап 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 это осознанно не реализуется, чтобы не ломать существующие публичные ссылки на изображения.