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)
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/projectsqui renvoie le catalogue local stocké en base (tableprojects). Le catalogue ci-dessous est la liste hardcodée desrc/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", "..."]
}| Champ | Type | Description |
|---|---|---|
total | number | Nombre de projets uniques toutes catégories confondues |
counts | object | Nombre de projets par catégorie |
troncCommun | string[] | Projets obligatoires (Go puis JS/Rust) |
optional | string[] | Projets bonus (sous-tâches du tronc commun) |
additional | string[] | Projets additionnels (spécialités, ateliers softskills) |
specialties | Record<string, string[]> | Sous-listes ordonnées par spécialité |
all | string[] | 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
Réponse 200
[
{
"id": 1,
"name": "Lets-Travel",
"projectTimeWeek": 2,
"category": "tronc-commun",
"sortIndex": 10
}
]Récupérer un projet
| Nom | Type | Localisation | Description |
|---|---|---|---|
id | number | path | ID du projet |
Erreurs
| Code | Cause |
|---|---|
| 404 | Projet introuvable |
Créer un projet
Body (JSON)
{
"name": "Smart-Road",
"projectTimeWeek": 2,
"category": "tronc-commun",
"sortIndex": 42
}| Champ | Type | Requis | Description |
|---|---|---|---|
name | string | ✅ | Nom du projet (kebab-case) |
projectTimeWeek | number | ✅ | Durée prévisionnelle en semaines |
category | string | ✅ | Catégorie libre (tronc-commun, optional, …) |
sortIndex | number | ⛔︎ | Ordre d’affichage (défaut 0) |
Réponse 201
L’objet créé.
Mettre à jour un projet
Tous les champs du body sont optionnels (cf. UpdateProjectDTO).
Erreurs
| Code | Cause |
|---|---|
| 404 | Projet introuvable |
Supprimer un projet
Réponse
204 No Content.