Прохождение курса внутри темы
Нажимаем на тему в меню курса.
Запрашиваем тему: GET /api/v1/view/course/theme/{theme_id} Внутри находятся блоки, которые отрисовываются в списке блоков. По параметру passed внутри блока помечаем блоки в списке, как пройденные.
Тип прохождения
Свободный
Все блоки в списке доступны для прохождения сразу.
Выбирается первый блок, либо указанный в url.
[Здесь нужно отправить незаметный запрос с {block_id}, чтобы получить данные о прохождении блока. По аналогии GET /api/v1/view/course/block/{model_id}, но без получения всех данных блока, так как и так получаются в теме. В результате получаем passed: true | false и если true, то помечаем блок в списке, как пройденный.]
После выбора блока дальнейшие действия зависят от его типа. Если блок текстовый или видео, то его данные у нас есть и мы его показываем. Запрос GET /api/v1/view/course/block/{model_id} вернул passed: true и мы помечаем блок в списке.
Если блок - вопрос, то данных по нему у нас в теме нет и нужно их получить по запросу POST api/v1/test/result. Пока вопрос не загрузился, показываем плейсхолдер загрузки.
После ответа на вопрос по запросу PUT test/result/block/${resultId}, получаем внутри passed: true | false в зависимости от ответа. Если ответ верный и passed: true, то отмечаем текущий блок в списке.
Адаптивная
От свободной темы прохождение отличается тем, что блоки открываются последовательно, по мере прохождения.
Первый блок в списке блоков должен прийти с данными, чтобы его сразу можно было показывать без загрузок. В блоках имеется параметр adaptive_disabled: true | false от которого зависят
Выбирается первый блок, либо указанный в url (если у него adaptive_disabled: false, иначе показываем крайний справа по доступности).
[Здесь нужно отправить незаметный запрос с {block_id}, чтобы получить данные о прохождении блока. По аналогии GET /api/v1/view/course/block/{model_id}, но без получения всех данных блока. В результате получаем passed: true | false и если true, то помечаем блок в списке, как пройденный.]
Если passed: true, то сразу запрашиваем по GET /api/v1/view/course/block/{model_id} следующий блок, чтобы для пользователя процесс загрузки был максимально незаметен. При переходе на следующий блок он сразу же показывается, запрашивается прохождение и если passed: true, то следующий блок. И так далее.
Если блок оказался не прогружен, то, ничего не поделаешь, отправляем GET /api/v1/view/course/block/{model_id} и показываем загрузку.
Если блок - вопрос, то данных по нему у нас в теме нет и нужно их получить по запросу POST api/v1/test/result. Пока вопрос не загрузился, показываем плейсхолдер загрузки.
После ответа на вопрос по запросу PUT test/result/block/${resultId}, получаем внутри passed: true | false в зависимости от ответа. Если ответ верный и passed: true, то отмечаем текущий блок в списке и сразу запрашиваем следующий блок в цепочке.