đŸ„— 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

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

  1. 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
  2. TDEE (DĂ©pense ÉnergĂ©tique Totale) - BMR × Facteur d'activitĂ©

    • SĂ©dentaire : BMR × 1.2
    • ModĂ©rĂ© : BMR × 1.55
    • Actif : BMR × 1.75
  3. Objectifs personnalisés selon le goal utilisateur

    • Maintenance : TDEE
    • Perte de poids : TDEE × 0.8 (-20%)
    • Prise de poids : TDEE × 1.15 (+15%)
  4. 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 atteints
    • balanced : 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éthodeRouteDescriptionAuth requise
POST/auth/registerInscription d'un utilisateur❌
POST/auth/loginConnexion utilisateur❌
GET/auth/profileProfil utilisateur connectĂ©âœ…
PUT/auth/profileModification du profil✅
PUT/auth/change-passwordChangement de mot de passe✅

Routes des aliments

MéthodeRouteDescriptionAuth requise
GET/food-itemsListe complùte des aliments❌
GET/food-items/search?q=queryRecherche d'aliments❌
POST/food-itemsCrĂ©er un nouvel aliment❌
GET/food-items/:idDĂ©tail d'un aliment❌
PUT/food-items/:idModifier un aliment❌
DELETE/food-items/:idSupprimer un aliment❌

Routes des repas

MéthodeRouteDescriptionAuth requise
POST/mealsCrĂ©er un repas✅
GET/mealsRepas de l'utilisateur✅
GET/meals?date=YYYY-MM-DDRepas par date✅
GET/meals/stats/:dateStatistiques du jour✅
GET/meals/:idDĂ©tail d'un repas✅
PUT/meals/:idModifier un repas✅
DELETE/meals/:idSupprimer un repas✅
DELETE/meals/:mealId/food-items/:foodItemIdRetirer un aliment✅

Routes des résumés nutritionnels

MéthodeRouteDescriptionAuth requise
GET/day-summary/:dateRĂ©sumĂ© d'une journĂ©e✅
POST/day-summary/:date/validateValider une journĂ©e✅
GET/day-summary/:date/suggestionsSuggestions compensatoires✅
GET/day-summary/goals/calculateCalcul des objectifs✅

đŸ§Ș Test de l'API

Workflow de test recommandé

  1. Inscription/Connexion

    • CrĂ©er un compte utilisateur
    • Se connecter et rĂ©cupĂ©rer le token JWT
  2. Exploration des aliments

    • Lister tous les aliments disponibles
    • Rechercher des aliments spĂ©cifiques
  3. 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
  4. 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étenceStatutPreuve
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étenceStatutPreuve
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étenceStatutPreuve
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