đ„ FoodLog API - Suivi Nutritionnel Intelligent
June 23, 2025 · View on GitHub
API REST sécurisée pour le suivi nutritionnel avec authentification JWT, logique métier avancée et suggestions compensatoires automatiques.
đ Table des matiĂšres
- đŻ PrĂ©sentation du projet
- đïž Architecture
- đ Installation et lancement
- đ Authentification
- đ Logique mĂ©tier
- đ Documentation des routes
- đ§Ș Test de l'API
- đ Structure du projet
- đŻ Points techniques
đŻ PrĂ©sentation du projet
FoodLog est une API complĂšte de suivi nutritionnel permettant aux utilisateurs de :
- Suivre leurs repas avec calculs nutritionnels automatiques
- Recevoir des objectifs personnalisés basés sur leur profil (BMR/TDEE)
- Obtenir des suggestions compensatoires intelligentes
- Valider leurs journées selon des rÚgles métier strictes
⚠Fonctionnalités clés
- â Authentification JWT sĂ©curisĂ©e avec bcrypt (12 rounds)
- â Calculs nutritionnels automatiques (BMR, TDEE, objectifs personnalisĂ©s)
- â Validation intelligente des journĂ©es nutritionnelles
- â Suggestions compensatoires basĂ©es sur les dĂ©ficits
- â Base de donnĂ©es de 150+ aliments prĂ©-configurĂ©s
- â Architecture modulaire NestJS + TypeORM + PostgreSQL
- â Isolation des donnĂ©es par utilisateur
đïž Architecture
đ FoodLog API
âââ đ Auth Module (JWT + Passport)
âââ đ€ Users Module (Profils utilisateurs)
âââ đœïž Meals Module (Gestion des repas)
âââ đ„ FoodItems Module (Base d'aliments)
âââ đ DaySummary Module (RĂ©sumĂ©s nutritionnels)
âââ đ§ Nutrition Module (Logique mĂ©tier)
đ ïž Stack technique
- Backend : NestJS (Node.js 20)
- Base de données : PostgreSQL 15
- ORM : TypeORM avec relations
- Authentification : JWT + Passport
- Validation : class-validator + class-transformer
- Containerisation : Docker + Docker Compose
- Sécurité : Bcrypt, Guards, Variable d'environnement
đ Installation et lancement
Prérequis
- Docker et Docker Compose installés
- Git installé
- Ports 4000 et 5432 disponibles
1. Clonage du projet
git clone <repository-url>
cd foodlog-api
2. Configuration
Le projet est pré-configuré avec un fichier .env :
# Vérifiez que le fichier .env existe
cat .env
# Variables principales configurées :
# - DB_HOST=db
# - DB_PORT=5432
# - JWT_SECRET=<clé sécurisée>
# - APP_PORT=4000
3. Lancement avec Docker
# Démarrer tous les services
docker compose up --build
# L'API sera disponible sur http://localhost:4000
# La base de données sur localhost:5432
4. Seeding de la base de données
# Dans un nouveau terminal, aprÚs que l'API soit démarrée
docker compose exec app npm run seed
# Résultat attendu : 150+ aliments ajoutés automatiquement
5. Vérification
# Test simple de l'API
curl http://localhost:4000/food-items
# Devrait retourner la liste des aliments
đ Authentification
SystĂšme d'authentification
- JWT tokens avec expiration (24h par défaut)
- Passwords hashés avec bcrypt (12 rounds)
- Protection des routes via Guards
- Validation stricte des données utilisateur
Inscription
POST /auth/register
Content-Type: application/json
{
"email": "utilisateur@example.com",
"password": "motdepasse123",
"weight": 70,
"height": 175,
"age": 25,
"sex": "male",
"activityLevel": "moderate",
"goal": "maintenance"
}
Connexion
POST /auth/login
Content-Type: application/json
{
"email": "utilisateur@example.com",
"password": "motdepasse123"
}
Réponse :
{
"statusCode": 200,
"message": "Connexion réussie",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"email": "utilisateur@example.com",
"weight": 70,
"height": 175,
"age": 25,
"sex": "male",
"activityLevel": "moderate",
"goal": "maintenance"
}
}
}
đ Logique mĂ©tier
đ§ź Calculs nutritionnels automatiques
-
BMR (Métabolisme de Base) - Formule Mifflin-St Jeor
- Homme :
10Ăpoids + 6.25Ătaille - 5ĂĂąge + 5 - Femme :
10Ăpoids + 6.25Ătaille - 5ĂĂąge - 161
- Homme :
-
TDEE (DĂ©pense ĂnergĂ©tique Totale) - BMR Ă Facteur d'activitĂ©
- Sédentaire : BMR à 1.2
- Modéré : BMR à 1.55
- Actif : BMR Ă 1.75
-
Objectifs personnalisés selon le goal utilisateur
- Maintenance : TDEE
- Perte de poids : TDEE Ă 0.8 (-20%)
- Prise de poids : TDEE Ă 1.15 (+15%)
-
Répartition des macronutriments
- Protéines : 25% des calories (÷4 pour grammes)
- Lipides : 25% des calories (Ă·9 pour grammes)
- Glucides : 50% des calories (Ă·4 pour grammes)
â ïž RĂšgles de validation
L'API applique des rĂšgles strictes de validation nutritionnelle :
-
Refus automatique si :
- Dépassement > 30% des calories cibles
- Apport protéique < 70% de l'objectif
-
Statuts des journées :
under_goal: Objectifs non atteintsbalanced: Objectifs atteints (±10%)over_goal: Léger dépassement (10-30%)extreme_over: Dépassement critique (>30%)
đœïž SystĂšme de suggestions compensatoires
L'API génÚre automatiquement des repas compensatoires intelligents :
- Analyse des déficits en calories et protéines
- Sélection d'aliments optimisés nutritionnellement
- Calcul des quantités automatique
- Base de données de 12 aliments compensatoires
Exemple de suggestion :
{
"name": "Repas compensatoire suggéré",
"foodItems": [
{
"name": "Blanc de poulet",
"quantity": 100,
"unit": "g",
"calories": 165,
"protein": 31,
"carbs": 0,
"fat": 4
}
],
"totalCalories": 165,
"totalProtein": 31,
"totalCarbs": 0,
"totalFat": 4
}
đ Documentation des routes
Routes d'authentification
| Méthode | Route | Description | Auth requise |
|---|---|---|---|
| POST | /auth/register | Inscription d'un utilisateur | â |
| POST | /auth/login | Connexion utilisateur | â |
| GET | /auth/profile | Profil utilisateur connectĂ© | â |
| PUT | /auth/profile | Modification du profil | â |
| PUT | /auth/change-password | Changement de mot de passe | â |
Routes des aliments
| Méthode | Route | Description | Auth requise |
|---|---|---|---|
| GET | /food-items | Liste complĂšte des aliments | â |
| GET | /food-items/search?q=query | Recherche d'aliments | â |
| POST | /food-items | CrĂ©er un nouvel aliment | â |
| GET | /food-items/:id | DĂ©tail d'un aliment | â |
| PUT | /food-items/:id | Modifier un aliment | â |
| DELETE | /food-items/:id | Supprimer un aliment | â |
Routes des repas
| Méthode | Route | Description | Auth requise |
|---|---|---|---|
| POST | /meals | CrĂ©er un repas | â |
| GET | /meals | Repas de l'utilisateur | â |
| GET | /meals?date=YYYY-MM-DD | Repas par date | â |
| GET | /meals/stats/:date | Statistiques du jour | â |
| GET | /meals/:id | DĂ©tail d'un repas | â |
| PUT | /meals/:id | Modifier un repas | â |
| DELETE | /meals/:id | Supprimer un repas | â |
| DELETE | /meals/:mealId/food-items/:foodItemId | Retirer un aliment | â |
Routes des résumés nutritionnels
| Méthode | Route | Description | Auth requise |
|---|---|---|---|
| GET | /day-summary/:date | RĂ©sumĂ© d'une journĂ©e | â |
| POST | /day-summary/:date/validate | Valider une journĂ©e | â |
| GET | /day-summary/:date/suggestions | Suggestions compensatoires | â |
| GET | /day-summary/goals/calculate | Calcul des objectifs | â |
đ§Ș Test de l'API
Workflow de test recommandé
-
Inscription/Connexion
- Créer un compte utilisateur
- Se connecter et récupérer le token JWT
-
Exploration des aliments
- Lister tous les aliments disponibles
- Rechercher des aliments spécifiques
-
Création de repas
- Créer un petit-déjeuner avec
foodItemIds - Créer un déjeuner, collation, dßner
- Vérifier les associations alimentaires
- Créer un petit-déjeuner avec
-
Analyse nutritionnelle
- Consulter le résumé de la journée
- Vérifier les calculs automatiques
- Tester les suggestions compensatoires
Exemples de requĂȘtes
Création d'un repas :
POST /meals
Authorization: Bearer <token>
Content-Type: application/json
{
"type": "petit-déjeuner",
"datetime": "2025-05-18T08:00:00.000Z",
"foodItemIds": [6, 8, 25]
}
Résumé nutritionnel :
GET /day-summary/2025-05-18
Authorization: Bearer <token>
Réponse type :
{
"statusCode": 200,
"message": "Day summary retrieved successfully",
"data": {
"date": "2025-05-18T00:00:00.000Z",
"nutrition": {
"totalCalories": 1654,
"totalProtein": 121,
"totalCarbs": 182,
"totalFat": 58
},
"goals": {
"calories": 1850,
"protein": 115,
"carbs": 231,
"fat": 51
},
"status": "balanced",
"isValid": true,
"violations": [],
"suggestion": null,
"mealsCount": 4
}
}
đ Structure du projet
src/
âââ auth/ # Module d'authentification
â âââ auth.controller.ts
â âââ auth.service.ts
â âââ strategies/ # JWT et Local strategies
â â âââ jwt.strategy.ts
â â âââ local.strategy.ts
â âââ guards/ # Guards de protection
â â âââ jwt-auth.guard.ts
â â âââ local-auth.guard.ts
â âââ decorators/ # DĂ©corateurs personnalisĂ©s
â â âââ current-user.decorator.ts
â âââ dto/ # DTOs de validation
â âââ register.dto.ts
â âââ login.dto.ts
â âââ update-profile.dto.ts
âââ users/ # Gestion des utilisateurs
â âââ user.entity.ts
â âââ users.module.ts
âââ meals/ # Gestion des repas
â âââ meal.entity.ts
â âââ meals.controller.ts
â âââ meals.service.ts
â âââ meals.module.ts
â âââ dto/
âââ food-items/ # Base d'aliments
â âââ food-item.entity.ts
â âââ food-items.controller.ts
â âââ food-items.service.ts
â âââ food-items.module.ts
â âââ dto/
âââ day-summary/ # RĂ©sumĂ©s nutritionnels
â âââ day-summary.entity.ts
â âââ day-summary.controller.ts
â âââ day-summary.module.ts
âââ nutrition/ # Logique mĂ©tier nutritionnelle
â âââ nutrition.module.ts
â âââ nutrition-calculator.service.ts # Calculs BMR/TDEE
â âââ meal-suggestion.service.ts # Suggestions compensatoires
â âââ day-validation.service.ts # Validation journĂ©es
âââ database/
âââ seeds/ # DonnĂ©es initiales
â âââ food-items.seed.ts
âââ seed.script.ts # Script de seeding
đŻ Points techniques
Fonctionnalités avancées
â
Architecture modulaire avec séparation claire des responsabilités
â
Authentification sécurisée JWT + bcrypt avec stratégies Passport
â
Base de données relationnelle avec TypeORM et migrations
â
Validation stricte des données avec class-validator
â
Variables d'environnement pour la configuration
â
Containerisation complĂšte avec Docker Compose
â
Logs structurés et gestion d'erreurs appropriée
Logique métier complexe
â
Calculs nutritionnels automatiques et personnalisés
â
Algorithme de validation avec rÚgles métier strictes
â
SystÚme de suggestions basé sur l'analyse des déficits
â
Auto-mise à jour des résumés aprÚs modifications
â
Isolation sécurisée des données par utilisateur
â
Relations complexes entre entités (User, Meal, FoodItem)
Qualité du code
â
TypeScript strict avec interfaces typées
â
Pattern Repository avec services dédiés
â
Separation of Concerns entre contrĂŽleurs et services
â
DTOs de validation pour toutes les entrées
â
Guards personnalisés pour la sécurité
â
Seeding automatisé pour les données de test
đ DĂ©marrage rapide
# 1. Cloner et démarrer
git clone <repository-url>
cd foodlog-api
docker compose up --build
# 2. Seeding des données (nouveau terminal)
docker compose exec app npm run seed
# 3. Tester l'API
curl http://localhost:4000/food-items
L'API est maintenant opérationnelle sur http://localhost:4000 avec :
- đ Authentification JWT fonctionnelle
- đœïž Base de 150+ aliments
- đ Logique mĂ©tier complĂšte
- đ§Ș Toutes les routes accessibles
đŻ Validation des CompĂ©tences CDA - FoodLog API
Analyse des compétences du Titre Professionnel Concepteur Développeur d'Applications validées par le projet FoodLog API
đ RĂ©sultat Global
CompĂ©tences CDA : 11/11 â
Taux de validation : 100% đ
â CompĂ©tences ValidĂ©es
CCP 1 - Développer une application sécurisée
| Compétence | Statut | Preuve |
|---|---|---|
| Installer et configurer son environnement | â | Docker Compose + variables d'environnement |
| DĂ©velopper des interfaces utilisateur | â | 25+ endpoints REST bien documentĂ©s |
| DĂ©velopper des composants mĂ©tier | â | Services NestJS + logique nutritionnelle complexe |
| Contribuer Ă la gestion d'un projet | â | Architecture modulaire + documentation complĂšte |
CCP 2 - Concevoir et développer une application organisée en couches
| Compétence | Statut | Preuve |
|---|---|---|
| Analyser les besoins et maquetter | â | Documentation fonctionnelle dĂ©taillĂ©e |
| DĂ©finir l'architecture logicielle | â | Architecture multicouche NestJS |
| Concevoir une base de donnĂ©es | â | PostgreSQL + TypeORM + relations complexes |
| DĂ©velopper l'accĂšs aux donnĂ©es | â | Repository pattern + requĂȘtes optimisĂ©es |
CCP 3 - Préparer le déploiement d'une application sécurisée
| Compétence | Statut | Preuve |
|---|---|---|
| PrĂ©parer et exĂ©cuter les plans de tests | â | Workflow de test + exemples de validation |
| PrĂ©parer et documenter le dĂ©ploiement | â | Docker Compose + instructions complĂštes |
| Contribuer Ă la mise en production DevOps | â | Containerisation + architecture cloud-ready |
đ SĂ©curitĂ© IntĂ©grĂ©e
- â Authentification JWT avec bcrypt (12 rounds)
- â Guards de protection des routes
- â Validation stricte des donnĂ©es
- â Isolation utilisateur sĂ©curisĂ©e
đïž Points Techniques ClĂ©s
- Docker : Containerisation complĂšte (API + DB)
- NestJS : Architecture modulaire et scalable
- TypeORM : ORM relationnel avec migrations
- PostgreSQL : Base de données relationnelle
- JWT + Bcrypt : Sécurité authentification
- Logique métier : Calculs BMR/TDEE + suggestions compensatoires
test