Aller au contenu principal

Référence API

Toutes les routes sont préfixées par /api/v1 (app.setGlobalPrefix('api/v1') dans apps/api/src/main.ts). L'authentification se fait par JWT (header Authorization: Bearer <token>) avec rotation des refresh tokens. La validation des payloads est faite côté backend par les schémas Zod du package @app/contracts (packages/contracts/src/).

Conventions

  • Auth: public — aucun token requis
  • Auth: JWT — token JWT valide requis (n'importe quel rôle)
  • Auth: ADMIN / TEACHER / LEARNER — rôle spécifique requis (RBAC via @Roles)
  • Les schémas référencés (createCourseInputSchema, etc.) sont définis dans packages/contracts/src/<domaine>.ts et exportés via packages/contracts/src/index.ts.
  • Les chemins listés dans les tableaux sont relatifs au préfixe /api/v1 (ex. /auth/login = /api/v1/auth/login).
  • Les paramètres :id sont validés par ParseUUIDPipe ; les payloads JSON le sont par ZodValidationPipe (généré via nestjs-zod) ou directement par ZodValidationPipe pour les unions discriminées.

Santé (/health)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/healthpublicEndpoint de liveness/health-check (uptime, statut DB).{ status, ... } (ad hoc)

Authentification & profil (/auth)

MéthodeCheminAuthDescriptionInput schemaOutput schema
POST/auth/registerpublicInscription d'une apprenante (rôle LEARNER ou TEACHER).registerInputSchemaauthResponseSchema
POST/auth/loginpublicConnexion par identifiant (email ou username) + mot de passe.loginInputSchemaauthResponseSchema
POST/auth/refreshpublicÉchange un refresh token contre une nouvelle paire (rotation).refreshInputSchemaauthResponseSchema
POST/auth/logoutpublicRévoque le refresh token fourni (204).refreshInputSchema
GET/auth/meJWTRetourne le user courant depuis la DB (données fraîches).userPublicSchema
PATCH/auth/meJWTMet à jour le profil du user connecté (name, email, bio…).updateMeInputSchemauserPublicSchema
POST/auth/me/avatarJWTUpload avatar (multipart file, max 2 Mo, png/jpeg/webp).multipart/form-dataavatarUploadResponseSchema
DELETE/auth/me/avatarJWTSupprime l'avatar courant (204).
POST/auth/change-passwordJWTChange le mot de passe et révoque toutes les sessions (204).changePasswordInputSchema
GET/auth/admin-pingADMINEndpoint témoin RBAC (à supprimer en v1.1).{ status, pingedBy, role, at }

Catalogue public (/courses)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/coursespublicListe paginée du catalogue (query : page, pageSize, q).query paramscoursesListPublicSchema
GET/courses/:slugpublicDétail complet d'un cours par slug (modules → sections → blocs).courseDetailPublicSchema

Création de cours — espace teacher (/teacher/courses)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/teacher/coursesTEACHER, ADMINListe les cours créés par la teacher (ADMIN voit tout).coursePublicSchema[]
POST/teacher/coursesTEACHER, ADMINCrée un nouveau cours (slug auto-généré).createCourseInputSchemacoursePublicSchema
GET/teacher/courses/:idTEACHER, ADMINDétail d'un cours (ownership vérifiée).coursePublicSchema
PATCH/teacher/courses/:idTEACHER, ADMINMet à jour un cours.updateCourseInputSchemacoursePublicSchema
POST/teacher/courses/:id/publishTEACHER, ADMINPasse le cours en PUBLISHED.coursePublicSchema
POST/teacher/courses/:id/archiveTEACHER, ADMINPasse le cours en ARCHIVED.coursePublicSchema
DELETE/teacher/courses/:idTEACHER, ADMINSoft delete (204).

Modules teacher (/teacher/modules, /teacher/courses/:courseId/modules)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/teacher/courses/:courseId/modulesTEACHER, ADMINListe les modules d'un cours.modulePublicSchema[]
POST/teacher/courses/:courseId/modulesTEACHER, ADMINCrée un module sous le cours.createModuleInputSchemamodulePublicSchema
PATCH/teacher/courses/:courseId/modules/reorderTEACHER, ADMINRéordonne les modules du cours.reorderInputSchemamodulePublicSchema[]
GET/teacher/modules/:idTEACHER, ADMINDétail d'un module.modulePublicSchema
PATCH/teacher/modules/:idTEACHER, ADMINMet à jour un module.updateModuleInputSchemamodulePublicSchema
POST/teacher/modules/:id/publishTEACHER, ADMINPublie le module.modulePublicSchema
POST/teacher/modules/:id/unpublishTEACHER, ADMINRepasse le module en DRAFT.modulePublicSchema
DELETE/teacher/modules/:idTEACHER, ADMINSoft delete (204).

Chapitres teacher (/teacher/chapters, /teacher/modules/:moduleId/chapters)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/teacher/modules/:moduleId/chaptersTEACHER, ADMINListe les chapitres d'un module.chapterPublicSchema[]
POST/teacher/modules/:moduleId/chaptersTEACHER, ADMINCrée un chapitre sous le module.createChapterInputSchemachapterPublicSchema
PATCH/teacher/modules/:moduleId/chapters/reorderTEACHER, ADMINRéordonne les chapitres.reorderInputSchemachapterPublicSchema[]
GET/teacher/chapters/:idTEACHER, ADMINDétail d'un chapitre.chapterPublicSchema
PATCH/teacher/chapters/:idTEACHER, ADMINMet à jour un chapitre.updateChapterInputSchemachapterPublicSchema
POST/teacher/chapters/:id/publishTEACHER, ADMINPublie le chapitre.chapterPublicSchema
POST/teacher/chapters/:id/unpublishTEACHER, ADMINRepasse le chapitre en DRAFT.chapterPublicSchema
DELETE/teacher/chapters/:idTEACHER, ADMINSoft delete (204).

Sections teacher (/teacher/sections, /teacher/chapters/:chapterId/sections)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/teacher/chapters/:chapterId/sectionsTEACHER, ADMINListe les sections d'un chapitre.sectionPublicSchema[]
POST/teacher/chapters/:chapterId/sectionsTEACHER, ADMINCrée une section.createSectionInputSchemasectionPublicSchema
PATCH/teacher/chapters/:chapterId/sections/reorderTEACHER, ADMINRéordonne les sections.reorderInputSchemasectionPublicSchema[]
GET/teacher/sections/:idTEACHER, ADMINDétail d'une section.sectionPublicSchema
PATCH/teacher/sections/:idTEACHER, ADMINMet à jour une section.updateSectionInputSchemasectionPublicSchema
POST/teacher/sections/:id/publishTEACHER, ADMINPublie la section.sectionPublicSchema
POST/teacher/sections/:id/unpublishTEACHER, ADMINRepasse la section en DRAFT.sectionPublicSchema
DELETE/teacher/sections/:idTEACHER, ADMINSoft delete (204).

Blocs de contenu teacher (/teacher/blocks, /teacher/sections/:sectionId/blocks)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/teacher/sections/:sectionId/blocksTEACHER, ADMINListe les blocs d'une section.contentBlockPublicSchema[]
POST/teacher/sections/:sectionId/blocksTEACHER, ADMINCrée un bloc (TEXT, IMAGE, VIDEO, YOUTUBE).contentBlockInputSchemacontentBlockPublicSchema
PATCH/teacher/sections/:sectionId/blocks/reorderTEACHER, ADMINRéordonne les blocs.reorderInputSchemacontentBlockPublicSchema[]
PATCH/teacher/blocks/:idTEACHER, ADMINRemplace un bloc (type + data).contentBlockInputSchemacontentBlockPublicSchema
DELETE/teacher/blocks/:idTEACHER, ADMINSupprime un bloc (204).

Quiz teacher (/teacher/quizzes, /teacher/chapters/:chapterId/quiz, /teacher/questions)

MéthodeCheminAuthDescriptionInput schemaOutput schema
POST/teacher/chapters/:chapterId/quizTEACHER, ADMINCrée le quiz du chapitre (1:1).createQuizInputSchemaquizPublicSchema
GET/teacher/chapters/:chapterId/quizTEACHER, ADMINRécupère le quiz du chapitre.quizPublicSchema
GET/teacher/quizzes/:idTEACHER, ADMINDétail d'un quiz.quizPublicSchema
PATCH/teacher/quizzes/:idTEACHER, ADMINMet à jour passingScore / isRequired.updateQuizInputSchemaquizPublicSchema
DELETE/teacher/quizzes/:idTEACHER, ADMINSoft delete du quiz (204).
POST/teacher/quizzes/:quizId/questionsTEACHER, ADMINAjoute une question au quiz.questionInputSchemaquestionPublicSchema
GET/teacher/quizzes/:quizId/questionsTEACHER, ADMINListe les questions du quiz.questionPublicSchema[]
PATCH/teacher/quizzes/:quizId/questions/reorderTEACHER, ADMINRéordonne les questions.reorderInputSchemaquestionPublicSchema[]
PATCH/teacher/questions/:idTEACHER, ADMINRemplace une question.questionInputSchemaquestionPublicSchema
DELETE/teacher/questions/:idTEACHER, ADMINSupprime une question (hard delete, 204).

Ressources teacher (/teacher/resources, /teacher/courses/:courseId/resources)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/teacher/courses/:courseId/resourcesTEACHER, ADMINListe les ressources d'un cours.resourcePublicSchema[]
POST/teacher/courses/:courseId/resourcesTEACHER, ADMINAjoute une ressource (PDF ou LIEN).createResourceInputSchemaresourcePublicSchema
PATCH/teacher/resources/:idTEACHER, ADMINMet à jour une ressource.updateResourceInputSchemaresourcePublicSchema
DELETE/teacher/resources/:idTEACHER, ADMINSoft delete (204).

Inscriptions learner (/enrollments)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/enrollments/meJWTListe les inscriptions de l'apprenante (avec résumé du cours).enrollmentWithCourseSchema[]
GET/enrollments/:idJWTDétail d'une inscription (ownership).enrollmentPublicSchema

Quiz learner (/quizzes)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/quizzes/:idJWTVue learner d'un quiz (sans correctIndex).quizLearnerSchema
POST/quizzes/:id/attemptsJWTSoumet une tentative ; le score est calculé serveur.submitQuizAttemptInputSchemaquizAttemptResponseSchema

Progression learner (/sections, /courses)

MéthodeCheminAuthDescriptionInput schemaOutput schema
POST/sections/:id/completeJWTMarque la section comme terminée (idempotent).sectionProgressResponseSchema
GET/courses/:id/progressJWTVue progression complète pour le player (sections, quiz, déblocages).courseProgressSchema

Certificats (/certificates)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/certificates/meJWTListe des certificats émis pour le user courant.certificateMineSchema[]
GET/certificates/:shareTokenpublicVue partageable d'un certificat (token opaque cuid).certificateSharedSchema

Paiements (/payments)

MéthodeCheminAuthDescriptionInput schemaOutput schema
POST/paymentsLEARNER, ADMINDéclenche un paiement (stub MVP : SUCCEEDED + Enrollment en cascade).createPaymentInputSchemapaymentCreateResponseSchema
GET/payments/meJWTHistorique des paiements du user courant.paymentPublicSchema[]
POST/payments/webhookpublicWebhook stub réservé (les gateways réelles signeront via HMAC en v1.1).{ ok: true } (ad hoc)

Tableau de bord teacher (/teacher)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/teacher/stats/dashboardTEACHER, ADMINStatistiques globales de la teacher (revenus, learners, complétion).teacherDashboardStatsSchema
GET/teacher/enrollmentsTEACHER, ADMINInscriptions cross-cours (paginé : page, pageSize, courseId, completed, q).query paramsteacherEnrollmentsListSchema

Espace admin — utilisateurs (/admin/users)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/admin/usersADMINListe paginée des users (filtres : role, includeDeleted).query paramsadminUsersListSchema
GET/admin/users/:idADMINDétail d'un user (avec inscriptions ou cours selon le rôle).adminUserDetailSchema
POST/admin/usersADMINCrée un user TEACHER ou ADMIN (mot de passe temporaire renvoyé).createAdminUserInputSchemaadminUserWithTempPasswordSchema
PATCH/admin/users/:idADMINMet à jour email / name / role d'un user.updateAdminUserInputSchemaadminUserPublicSchema
DELETE/admin/users/:idADMINSoft delete (204).
POST/admin/users/:id/reset-passwordADMINRéinitialise et renvoie un mot de passe temporaire.adminUserWithTempPasswordSchema

Espace admin — cours (/admin/courses)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/admin/coursesADMINListe paginée des cours (filtres : status, includeDeleted).query paramsadminCoursesListSchema
GET/admin/courses/:idADMINDétail admin d'un cours (modules + audience).adminCourseDetailSchema
PATCH/admin/courses/:idADMINOverride du statut directement (DRAFT / PUBLISHED / DISABLED / ARCHIVED).adminUpdateCourseInputSchemaadminCoursePublicSchema

Espace admin — statistiques (/admin/stats)

MéthodeCheminAuthDescriptionInput schemaOutput schema
GET/admin/statsADMINCompteurs users / cours / revenus + inscriptions par mois.adminStatsSchema

Note d'évolution

Cette page est maintenue manuellement : à chaque ajout d'endpoint, pensez à compléter le tableau du domaine concerné (et à référencer le schéma Zod correspondant). Une génération automatique via OpenAPI (à partir des décorateurs NestJS et des schémas @app/contracts) est envisagée en v1.1 pour éliminer ce travail manuel et garantir la cohérence avec le code.