Référence APIPromotions

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

GET/api/v1/promotionssource ↗

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

CodeCause
500Erreur d’accès à la base Postgres

Récupérer une promotion par ID

GET/api/v1/promotions/:promoIdsource ↗
NomTypeLocalisationDescription
promoIdstringpathIdentifiant libre (ex. p1-2024)

Erreurs

CodeCause
404Promotion introuvable

Créer une promotion

POST/api/v1/promotionssource ↗

Body (JSON)

{
  "promoId": "p1-2026",
  "name": "Promotion 1 — 2026"
}
ChampTypeRequisDescription
promoIdstringIdentifiant unique (slug libre)
namestringNom affiché (UNIQUE en base)

Réponse 201

L’objet créé, avec isArchived: false.

Erreurs

CodeCause
400promoId ou name absent
409Une promotion avec ce name existe déjà

Archiver une promotion

POST/api/v1/promotions/:promoId/archivesource ↗

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" }
ChampTypeRequisDescription
reasonstringMotif de l’archivage

Réponse

204 No Content.

Erreurs

CodeCause
400reason absent
404Promotion introuvable

Progression — projets du tronc commun

GET/api/v1/promotions/:eventId/studentssource ↗

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

NomTypeLocalisationDescription
eventIdnumberpathID 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

CodeCause
400eventId absent
500Erreur GraphQL 01 Edu

Exemple

curl $API/api/v1/promotions/72/students

Progression — projets optionnels

GET/api/v1/promotions/:eventId/students/optionalssource ↗

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

GET/api/v1/promotions/:eventId/students/additionalssource ↗

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

NomTypeLocalisationDescription
eventIdnumberpathID 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 :

StatutSignification
setupGroupe créé, projet pas démarré
workingGroupe en train de coder
auditGroupe en attente d’audit
finishedProjet terminé (audit OK)