Projects

Catalogue interne des projets pédagogiques (nom, catégorie, durée prévisionnelle en semaines, ordre d’affichage). Stocké dans la table projects (Drizzle / Postgres).

Source : src/api/v1/projects.ts, src/db/schema/projects.schema.ts, src/services/dto/projects.dto.ts.

Voir aussi le schéma Project.


Catalogue complet (tronc commun + optionnels + additionnels + spécialités)

GET/api/v1/projects/catalogsource ↗

Renvoie tous les projets connus de l’API, toutes catégories confondues (Go, JS/Rust, Java, spécialités, ateliers). C’est la source de vérité utilisée par les filtres GraphQL des routes /promotions/.../students* et /specialties/.../students.

⚠️ Différent de GET /api/v1/projects qui renvoie le catalogue local stocké en base (table projects). Le catalogue ci-dessous est la liste hardcodée de src/services/projects.ts.

Réponse 200

{
  "total": 124,
  "counts": {
    "troncCommun": 27,
    "optional": 24,
    "additional": 75
  },
  "troncCommun": ["Lets-Travel", "Travel-Plan", "Neo-4-Flix", "..."],
  "optional": ["0-Shell-Scripting", "Forum-Authentication", "..."],
  "additional": ["Math-Skills", "Push-Swap", "Kaggle-Titanic", "..."],
  "specialties": {
    "cybersecurity": ["Passive", "Inspector-Image", "..."],
    "ai": ["Kaggle-Titanic", "NLP-Scrapper", "..."],
    "blockchain": ["NFT-Marketplace", "..."],
    "devops": ["Deep-In-Net", "..."],
    "game": ["Firing-Range", "..."],
    "mobile-application": ["Twenty-Forty-Eight", "..."]
  },
  "all": ["Active", "Add-VM", "..."]
}
ChampTypeDescription
totalnumberNombre de projets uniques toutes catégories confondues
countsobjectNombre de projets par catégorie
troncCommunstring[]Projets obligatoires (Go puis JS/Rust)
optionalstring[]Projets bonus (sous-tâches du tronc commun)
additionalstring[]Projets additionnels (spécialités, ateliers softskills)
specialtiesRecord<string, string[]>Sous-listes ordonnées par spécialité
allstring[]Union dédupliquée des trois catégories, triée alpha

Exemple

curl $API/api/v1/projects/catalog | jq '.counts'
# {
#   "troncCommun": 27,
#   "optional": 24,
#   "additional": 75
# }

Lister les projets de la base locale

GET/api/v1/projectssource ↗

Réponse 200

[
  {
    "id": 1,
    "name": "Lets-Travel",
    "projectTimeWeek": 2,
    "category": "tronc-commun",
    "sortIndex": 10
  }
]

Récupérer un projet

GET/api/v1/projects/:idsource ↗
NomTypeLocalisationDescription
idnumberpathID du projet

Erreurs

CodeCause
404Projet introuvable

Créer un projet

POST/api/v1/projectssource ↗

Body (JSON)

{
  "name": "Smart-Road",
  "projectTimeWeek": 2,
  "category": "tronc-commun",
  "sortIndex": 42
}
ChampTypeRequisDescription
namestringNom du projet (kebab-case)
projectTimeWeeknumberDurée prévisionnelle en semaines
categorystringCatégorie libre (tronc-commun, optional, …)
sortIndexnumber⛔︎Ordre d’affichage (défaut 0)

Réponse 201

L’objet créé.


Mettre à jour un projet

PUT/api/v1/projects/:idsource ↗

Tous les champs du body sont optionnels (cf. UpdateProjectDTO).

Erreurs

CodeCause
404Projet introuvable

Supprimer un projet

DELETE/api/v1/projects/:idsource ↗

Réponse

204 No Content.