Promotions
Lister les promotions actives et calculer la progression de leurs apprenants sur les projets du tronc commun, optionnels et additionnels.
Source :
src/api/v1/promotion.ts,src/api/v1/additional.ts,src/services/promotion.service.ts.
Lister les promotions actives
Renvoie l’ensemble des promotions non archivées, lues depuis la table
promotions (Drizzle / Postgres).
Réponse 200
[
{
"promoId": "p1-2024",
"name": "Promotion 1 — 2024",
"isArchived": false,
"archivedAt": null,
"archivedReason": null
}
]Erreurs
| Code | Cause |
|---|---|
| 500 | Erreur d’accès à la base Postgres |
Récupérer une promotion par ID
| Nom | Type | Localisation | Description |
|---|---|---|---|
promoId | string | path | Identifiant libre (ex. p1-2024) |
Erreurs
| Code | Cause |
|---|---|
| 404 | Promotion introuvable |
Créer une promotion
Body (JSON)
{
"promoId": "p1-2026",
"name": "Promotion 1 — 2026"
}| Champ | Type | Requis | Description |
|---|---|---|---|
promoId | string | ✅ | Identifiant unique (slug libre) |
name | string | ✅ | Nom affiché (UNIQUE en base) |
Réponse 201
L’objet créé, avec isArchived: false.
Erreurs
| Code | Cause |
|---|---|
| 400 | promoId ou name absent |
| 409 | Une promotion avec ce name existe déjà |
Archiver une promotion
Marque la promotion comme archivée (isArchived = true), enregistre la
date courante dans archivedAt et le motif dans archivedReason. La
promotion sort alors de la liste renvoyée par GET /api/v1/promotions.
Body (JSON)
{ "reason": "Cohorte terminée — diplômés 2026" }| Champ | Type | Requis | Description |
|---|---|---|---|
reason | string | ✅ | Motif de l’archivage |
Réponse
204 No Content.
Erreurs
| Code | Cause |
|---|---|
| 400 | reason absent |
| 404 | Promotion introuvable |
Progression — projets du tronc commun
Liste, pour un eventId donné, l’avancement de chaque étudiant sur les
projets du tronc commun (projects dans src/services/projects.ts,
ex. Lets-Travel, Travel-Plan, Buy-01, Forum, GraphQL…).
Paramètres
| Nom | Type | Localisation | Description |
|---|---|---|---|
eventId | number | path | ID d’évènement 01 Edu (event.id) |
Réponse 200
{
"progress": [
{
"user": {
"login": "alice",
"firstName": "Alice",
"lastName": "Martin"
},
"grade": 1,
"group": {
"status": "finished",
"id": 1234,
"captainLogin": "alice",
"members": [{ "userLogin": "alice" }, { "userLogin": "bob" }],
"createdAt": "2024-09-12T10:00:00.000Z",
"startedWorkingAt": "2024-09-12T10:30:00.000Z",
"auditors": [{ "createdAt": "…", "auditedAt": "…" }],
"results": [{ "createdAt": "…" }]
},
"object": { "name": "lets-travel" }
}
]
}Erreurs
| Code | Cause |
|---|---|
| 400 | eventId absent |
| 500 | Erreur GraphQL 01 Edu |
Exemple
curl $API/api/v1/promotions/72/studentsProgression — projets optionnels
Identique à l’endpoint précédent mais filtre sur la liste optionalProjects
(ex. Forum-Authentication, Make-Your-Game-History,
Groupie-Tracker-Search-Bar…).
Paramètres
Même que students.
Réponse 200
Mêmes champs que students. Voir aussi
Suivi de progression.
Progression — projets additionnels
Filtre sur la liste additionalProjects (Push-Swap, Tetris-Optimizer,
projets de spécialité, ateliers softskills…).
⚠️ Le payload n’inclut pas
firstName/lastName(différence avec les deux endpoints précédents).
Paramètres
| Nom | Type | Localisation | Description |
|---|---|---|---|
eventId | number | path | ID d’évènement 01 Edu |
Réponse 200
{
"progress": [
{
"user": { "login": "alice" },
"grade": null,
"group": { "status": "working" },
"object": { "name": "push-swap" }
}
]
}Statuts de groupe
L’API ne renvoie que les groupes dans l’un de ces statuts :
| Statut | Signification |
|---|---|
setup | Groupe créé, projet pas démarré |
working | Groupe en train de coder |
audit | Groupe en attente d’audit |
finished | Projet terminé (audit OK) |