Skip to content

Course release lifecycle and scheduled lesson publishing - #145

Merged
TeaCoder52 merged 6 commits into
mainfrom
dev
Oct 28, 2026
Merged

TeaCoder52 merged 6 commits into
mainfrom
dev

Conversation

@TeaCoder52

Copy link
Copy Markdown
Member

What is this PR about?

Поэтапный выпуск курсов. Курс проходит стадии от анонса до завершения, уроки
выходят порциями по расписанию, а покупатели получают письмо о новых уроках.

  • Жизненный цикл курса. Стадия (DRAFT, ANNOUNCED, IN_PRODUCTION,
    COMPLETED, ARCHIVED), публикация, выход на YouTube и монетизация - четыре
    независимых признака, а не один статус. Главный статус для интерфейса
    считается на сервере, фронт его не выводит сам.
  • Ранний доступ. Новый режим PREMIUM_OR_PURCHASE - доступ по подписке или
    разовой покупке на выбор. Анонсированный курс виден в каталоге, но не
    продаётся.
  • Поэтапный выход уроков. Урок можно анонсировать с датой: в программе он
    показывается как «скоро», содержимое закрыто. В назначенное время уроки
    публикуются автоматически.
  • Письма о новых уроках. Уроки одного курса с одинаковой датой выходят
    группой и дают одно письмо со списком названий, а не письмо на каждый урок.
    Публикация подтверждается уведомлением в админ-бот.
  • Синхронизация расписания. POST /admin/releases/sync, команда
    /releases в админ-боте и автоматический прогон при старте приложения.
  • Админ-инструменты очередей. Просмотр очередей, списка задач и одной
    задачи из Redis. Секреты и личные данные в payload задач скрыты.
  • Материалы и домашние задания у уроков - ссылки на источники и задание с
    чеклистом, без сдачи и проверки.
  • Яндекс Сплит как способ оплаты, только для покупки курсов.
  • Исправление: при смене цены открытый счёт больше не переиспользуется -
    создаётся новый по актуальной цене.

Type of change

  • New feature
  • Bug fix
  • Refactoring (no behaviour change)
  • Database schema change
  • Docs, config or tooling

Checklist

  • The branch is based on dev, commits follow Conventional Commits
  • bun run typecheck passes
  • Schema changes come with a new migration; applied migrations are not edited
  • Routes, schemas and fields are described in Russian in OpenAPI
  • New environment variables are validated in config and added to the env example
  • No secrets or personal data in logs and queue payloads
  • Payment, access and auth behaviour is preserved, or the change is described above

API changes

Новые маршруты

  • GET /admin/queues - очереди и счётчики задач
  • GET /admin/jobs - текущие задачи с фильтрами
  • GET /admin/jobs/{queue}/{id} - одна задача
  • POST /admin/releases/sync - поставить публикации уроков в расписание

Все под ролью ADMIN.

Изменённые ответы

  • GET /courses - добавлены status и upcomingLessons, архивные курсы
    исключены из каталога
  • GET /courses/{slug} - добавлены release и entitlements
  • GET /courses/{slug}/lessons - у урока появились isAvailable и
    plannedReleaseAt, в программу попадают анонсированные уроки
  • GET /lessons/{id} - добавлены resources и homework
  • POST /billing/create - новый способ YANDEX_SPLIT (только с courseId),
    анонсированный курс отвечает 409

Новые значения enum: CourseStage, PREMIUM_OR_PURCHASE в accessMode,
YANDEX_SPLIT в способах оплаты.

Deployment notes

Миграции, по порядку:

  • 20261013140000_add_lesson_resources
  • 20261013150000_add_lesson_homework
  • 20261026120000_add_premium_or_purchase_access_mode
  • 20261026120100_course_release_lifecycle
  • 20261027120000_add_announced_course_stage

Существующие курсы получают стадию COMPLETED, если опубликованы, и DRAFT
в остальных случаях. Уроки остаются неанонсированными. Доступы, покупки и
подписки не затрагиваются.

Related issues

@TeaCoder52
TeaCoder52 merged commit 8459ee6 into main Oct 28, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant