Справочник API
Курсы, уроки и шаги
Создание структуры курса, копирование материалов, режимы доступа к урокам и загрузка медиафайлов.
Маршруты раздела
| Метод | Маршрут | Доступ | Назначение |
|---|---|---|---|
GET |
/api/courses |
Зависит от фильтра | Получить доступные курсы или рабочий список преподавателя. |
POST |
/api/courses |
Преподаватель | Создать черновик курса. |
GET |
/api/courses/[id] |
По доступу к курсу | Получить курс по идентификатору или адресу. |
PUT |
/api/courses/[id] |
Редактирование курса | Изменить настройки или опубликовать курс. |
DELETE |
/api/courses/[id] |
Владелец курса | Переместить курс в удалённые. |
POST |
/api/courses/[id]/duplicate |
Управление курсом | Создать независимую копию курса. |
PATCH |
/api/instructor/courses/[id]/content/reorder |
Редактирование курса | Атомарно применить полный порядок модулей, уроков или шагов. |
GET |
/api/sections?courseId=[id] |
Чтение курса | Получить модули курса. |
POST |
/api/sections |
Редактирование курса | Создать модуль. |
GET |
/api/sections/[id] |
Чтение курса | Получить один модуль. |
PUT |
/api/sections/[id] |
Редактирование курса | Изменить или переместить модуль. |
DELETE |
/api/sections/[id] |
Редактирование курса | Удалить модуль. |
GET |
/api/lessons?sectionId=[id] |
Чтение курса | Получить уроки модуля. |
POST |
/api/lessons |
Редактирование курса | Создать урок. |
GET |
/api/lessons/[id] |
Чтение курса | Получить урок. |
PUT |
/api/lessons/[id] |
Редактирование курса | Изменить урок и срок выполнения. |
DELETE |
/api/lessons/[id] |
Редактирование курса | Удалить урок. |
POST |
/api/lessons/[id]/duplicate |
Редактирование курса | Скопировать урок в выбранный модуль. |
GET |
/api/steps?lessonId=[id] |
Редактирование курса | Получить шаги урока для редактора. |
POST |
/api/steps |
Редактирование курса | Создать шаг. |
GET |
/api/steps/[id] |
Редактирование курса | Получить шаг для редактора. |
PUT |
/api/steps/[id] |
Редактирование курса | Изменить шаг или его положение. |
DELETE |
/api/steps/[id] |
Редактирование курса | Удалить шаг. |
POST |
/api/uploads/course-cover |
Преподаватель | Загрузить обложку курса. |
POST |
/api/uploads/lesson-media |
Преподаватель | Загрузить изображение, аудио или WebM для урока. |
Иерархия материалов
Курс состоит из модулей, модуль — из уроков, урок — из шагов:
Курс → Модуль → Урок → Шаг
При создании и изменении поддерживаются как прямой JSON, так и именованная оболочка: { "course": { ... } }, { "lesson": { ... } } и аналогичные варианты.
Как менять порядок без конфликтов
Не отправляйте серию PUT /api/lessons/[id] или PUT /api/steps/[id] с разными position: промежуточные позиции могут конфликтовать. Для сортировки используйте один атомарный запрос PATCH /api/instructor/courses/[id]/content/reorder с полным снимком порядка.
Шаги одного урока:
{ "kind": "STEPS", "lessonId": "lesson-id", "orderedStepIds": ["step-2", "step-1"] }
Все уроки курса, включая перенос между модулями:
{
"kind": "LESSONS",
"sections": [
{ "sectionId": "section-1", "orderedLessonIds": ["lesson-2"] },
{ "sectionId": "section-2", "orderedLessonIds": ["lesson-1"] }
]
}
Модули курса передают и исходный, и новый полный порядок:
{
"kind": "SECTIONS",
"expectedSectionIds": ["section-1", "section-2"],
"orderedSectionIds": ["section-2", "section-1"]
}
Нужен scope CONTENT_WRITE; для PAT курс также должен оставаться в courseIds, а у владельца — актуальное право content:write. Неполный или устаревший снимок возвращает 409 без частичной записи.
Создание курса
Минимальный запрос:
{
"title": "Основы Python",
"description": "Практический курс для начинающих",
"price": 0
}
Новый курс сохраняется черновиком. Перед публикацией сервер строго проверяет структуру и блоки всех шагов.
Режимы доступа к уроку
Поле accessMode принимает:
PUBLIC— урок открывается без регистрации;REGISTERED— нужен аккаунт, но покупка не требуется;PAID— нужен доступ к курсу.
Поле isDemo оставлено для совместимости. В новых интеграциях записывайте accessMode.
Типы шагов
Поддерживаются TEXT, VIDEO, CODE, CHOICE, NUMBER, FREE_TEXT, SORTING, MATCHING и REVIEW. В штатном редакторе тип выбирается при создании. Низкоуровневый PUT /api/steps/[id] также принимает новый type, но вместе с ним обязательно нужно передать новый совместимый block.
Пример числовой задачи:
{
"lessonId": "lesson-id",
"type": "NUMBER",
"block": {
"text": "Сколько будет 6 × 7?",
"answer": 42,
"tolerance": 0,
"correctFeedback": "Верно",
"incorrectFeedback": "Проверьте умножение"
}
}
Правильные ответы, скрытые тесты и подсказки проверяющему возвращаются только в преподавательских ответах.
