healthai-api
REST API de la plateforme HealthAI Coach — gestion des utilisateurs, données de santé et datasets IA.
- Repo : HealthAI-Corpo/healthai-api
- Image :
ghcr.io/healthai-corpo/healthai-api - Port :
3001 - Swagger :
http://localhost:3001/api
Stack
| Couche | Technologie |
|---|---|
| Framework | NestJS 11 (Express) |
| Langage | TypeScript 5.7 |
| Base de données | PostgreSQL 15 via TypeORM 0.3 |
| Authentification | Zitadel (OIDC — RS256 JWKS) |
| Validation | class-validator · class-transformer · Joi |
| Sécurité | Helmet · @nestjs/throttler |
| Docs | Swagger / OpenAPI à /api |
| Monitoring | NestJS Terminus (/health) |
| Tests | Jest · Supertest |
Modèle de sécurité
Requête entrante
↓
Rate limiter — 100 req / 60s par IP (configurable)
↓
Zitadel JWT — RS256, issuer + audience validés via JWKS
↓
EndpointL'API ne génère jamais de tokens. Les clés JWKS sont mises en cache 10 minutes — pas d'appel réseau par requête après le premier fetch.
Installation
bash
npm install
cp .env.example .env
npm run migration:run
npm run start:dev
# → http://localhost:3001
# → http://localhost:3001/api (Swagger)Variables d'environnement
| Variable | Requis | Description |
|---|---|---|
DATABASE_URL | Oui | PostgreSQL connection string |
ZITADEL_DOMAIN | Oui | URL de l'instance Zitadel |
JWT_ISSUER | Oui | Doit correspondre au claim iss dans les tokens Zitadel |
JWT_AUDIENCE | Oui | Client ID de l'app NestJS dans Zitadel |
FRONTEND_ORIGIN | Oui | Origines CORS autorisées (séparées par virgule) |
THROTTLE_TTL | Non | Fenêtre rate limit en ms (défaut: 60000) |
THROTTLE_LIMIT | Non | Requêtes max par fenêtre par IP (défaut: 100) |
PORT | Non | Port HTTP (défaut: 3001) |
Endpoints
| Groupe | Base path | Notes |
|---|---|---|
| Auth | GET /auth/validate | Forward-auth Traefik — valide Bearer, injecte X-User-Id |
| Health | GET /health | Public — ping BDD |
| Utilisateurs | CRUD /utilisateurs | |
| Aliments | CRUD /aliments | |
| Exercices | CRUD /exercices | |
| Logs alimentation | CRUD /log-aliment | |
| Logs séances | CRUD /log-seance | |
| Logs santé | CRUD /log-sante | |
| Profils santé | CRUD /profil-sante | Un par utilisateur |
| Dataset régimes | CRUD /datasets/recommandations-regime | Données pré-nettoyées pour l'IA |
| Dataset séances | CRUD /datasets/historique-seance-exercice | Données pré-nettoyées pour l'IA |
Toutes les routes sauf GET /health requièrent un Bearer token Zitadel valide.
Scripts utiles
bash
# Migrations
npm run migration:generate # Générer depuis les changements d'entités
npm run migration:run # Appliquer les migrations en attente
npm run migration:revert # Annuler la dernière migration
# Seed (développement uniquement)
npm run seed:dev-account
# Tests
npm run test # Unitaires
npm run test:cov # Couverture
npm run test:e2e # End-to-endConfiguration Zitadel
- Créer une application API dans ton projet Zitadel
JWT_AUDIENCE= Client ID de l'applicationJWT_ISSUER= URL de l'instance Zitadel- L'API valide les tokens sur
{ZITADEL_DOMAIN}/oauth/v2/keys(JWKS)