Aller au contenu
Studeia Docs
AI-assisted translation — last updated 2026-06-03. For original (pt-BR or en-US), use the language switcher.

CMS : cours, modules et leçons

Hiérarchie Studeia : Course → Module → Lesson. CRUD via UI ou API. 8 types de leçon + 6 sous-types interactifs. Clone, import IMS CC, IA auto-génération, publishAt planifié

2026-06-03 6 min
Resposta curta

Studeia organise le contenu selon la hiérarchie Course → Module → Lesson. Chaque cours appartient à un Tenant, peut avoir plusieurs modules (avec sortOrder), chaque module peut avoir plusieurs leçons avec 8 types (slides, video, PDF, rich_text, quiz, assignment, live_class, external_link) + 6 sous-types interactifs. CRUD via UI ou API publique. Prise en charge du clone, import IMS CC, auto-génération par IA (PDF→cours), publication planifiée (publishAt) et ingestion RAG pour le tuteur IA.

Hiérarchie

Tenant (Institution)
  └── Course (titre, slug, status, theme, publishAt, aiTutorEnabled)
      └── CourseModule (titre, sortOrder)
          └── CourseLesson (type, content JSON, sortOrder, isPublished, publishAt)
              ├── CourseLessonMedia (N:N avec MediaAsset)
              └── LessonCompletion (1:N par studentId)

CRUD

Cours

POST   /api/institution/courses                  Créer
GET    /api/institution/courses                  Lister
GET    /api/institution/courses/[id]             Détail
PATCH  /api/institution/courses/[id]             Mettre à jour
DELETE /api/institution/courses/[id]             Supprimer (soft, status=archived)
POST   /api/institution/courses/[id]/clone       Cloner (deep copy)
POST   /api/institution/courses/import           Importer IMS CC

Scopes : courses:read (GET) | courses:write (POST/PATCH/DELETE).

Modules

POST   /api/institution/courses/[id]/modules     Créer
PATCH  /api/institution/courses/[id]/modules/[mid]
DELETE /api/institution/courses/[id]/modules/[mid]
PATCH  /api/institution/courses/[id]/modules/reorder  (bulk sortOrder)

Leçons

POST   /api/institution/courses/[id]/modules/[mid]/lessons       Créer
PATCH  /api/institution/courses/[id]/modules/[mid]/lessons/[lid]
DELETE /api/institution/courses/[id]/modules/[mid]/lessons/[lid]
POST   /api/institution/courses/[id]/lessons/reorder              (bulk)

Statut du cours

Course.status: draft | published | archived

  • draft : non visible pour les étudiants, modifiable
  • published : visible pour les inscrits (en tenant compte de publishAt)
  • archived : non visible, lecture seule pour l'historique

Course.publishAt planifie la publication automatique via cron.

Publication échelonnée

Combinez Course.publishAt avec Lesson.publishAt pour un contrôle granulaire :

Cours publié le 2026-06-01
  Module 1 (sans publishAt)              → disponible depuis le 2026-06-01
    Leçon 1.1 (sans publishAt)            → disponible depuis le 2026-06-01
    Leçon 1.2 (publishAt: 2026-06-08)     → disponible à partir du 2026-06-08
  Module 2 (sans publishAt)
    Leçon 2.1 (publishAt: 2026-06-15)     → disponible à partir du 2026-06-15

checkLessonAvailability() dans apps/web/lib/lesson-availability.ts valide sur TOUS les endpoints de leçon (view, quiz/start, quiz/submit, complete, interactive).

Prérequis entre leçons

Lesson.prerequisiteLessonId pointe vers la leçon qui DOIT être terminée avant d'accéder à la suivante.

checkLessonAvailability(lesson, { checkPrerequisite: true }) valide :

  1. lesson.isPublished === true
  2. lesson.publishAt <= now
  3. Si prerequisiteLessonId : existence d'un LessonCompletion de l'étudiant pour cette leçon

Clone de cours

POST /api/institution/courses/[id]/clone effectue :

  1. Crée un nouveau Course avec le slug {slug}-clone-{n}
  2. Pour chaque Module original → crée une copie
  3. Pour chaque Lesson originale → crée une copie avec le même content JSON
  4. NE copie PAS : Enrollments, LessonCompletions, ClassGroups, QuizAttempts, ingestion RAG
  5. Respecte la limite de cours du plan (checkTenantResourceLimit)

Import IMS Common Cartridge

POST /api/institution/courses/import body multipart/form-data avec .imscc :

  • Parseur : packages/core/src/content/imscc-parser.ts (parseur XML basé sur cheerio)
  • Prise en charge : IMS CC v1.0, v1.1, v1.2, v1.3
  • Ressources prises en charge : web links, file resources, basic LTI links, quizzes QTI 1.2 (mappés vers le Quiz Engine), web content resources
  • NON pris en charge : packages de contenu H5P, SCORM 2004 PIF, IMS CP

Ingestion RAG

Course.autoSyncRag: Boolean contrôle la réingestion automatique. Détails dans RAG Ingestion.

Limitations

  • Maximum 100 modules par cours (soft limit, performance)
  • Maximum 200 leçons par module (soft limit, UX)
  • Content JSON par leçon jusqu'à 5 Mo (validé à la sauvegarde)
  • Le slug doit être unique par tenant + langue

Voir aussi

FAQ

Comment créer un nouveau cours ?

Via UI : /institution/courses > Nouveau Cours. Définissez le titre, le slug, la description, le thème visuel, le statut (draft). Via API : POST /api/institution/courses (scope courses:write). Après la création, ajoutez des modules et des leçons.

Puis-je cloner un cours existant ?

Oui. POST /api/institution/courses/[id]/clone. Crée une copie avec un nouveau slug, les mêmes modules et leçons (deep copy). Utile pour créer de nouveaux groupes à partir d'un cours existant. Respecte la limite de cours du plan.

Puis-je importer du contenu depuis Moodle/Canvas/Blackboard ?

Oui, via IMS Common Cartridge (IMS CC v1.x). POST /api/institution/courses/import avec un fichier .imscc. Le parseur extrait les modules, les leçons, les ressources (PDF, liens, quiz basiques). Limitation : H5P et SCORM 2004 ne sont pas entièrement pris en charge — uniquement IMS CC natif.

Comment publier une leçon avec une date planifiée ?

Définissez lesson.isPublished=false + lesson.publishAt=timestamp. L'étudiant ne voit pas la leçon jusqu'à publishAt. checkLessonAvailability() valide sur tous les endpoints (quiz, complete, view). Se combine avec Course.publishAt pour publier l'intégralité du cours à un moment futur.

Veja tambem

CMS : cours, modules et leçons