Tous les changements notables de ce projet seront documentés dans ce fichier.
Le format est basé sur Keep a Changelog, et ce projet adhère à Semantic Versioning.
- Cache ETag étendu : Activation du cache ETag sur 2 endpoints additionnels
/v1/generiques/{groupID}: Cache ETag pour les groupes génériques/v1/medicaments?cip={cip}: Cache ETag pour la recherche par CIP- Réduit la charge serveur et améliore les performances pour les clients
- Route des présentations : Correction du trailing slash (/v1/presentations/ → /v1/presentations)
- Retourne désormais une erreur 400 cohérente si le paramètre CIP est manquant
- Cache ETag : Émission de weak ETags (W/"...") pour préserver le caching derrière Cloudflare
- Améliore la compatibilité avec les proxys et CDNs
- Spécification OpenAPI : Ajout des headers ETag et Last-Modified pour les endpoints concernés
- robots.txt : Ajout de règles de contrôle des crawlers
- Bloque les endpoints système (/health, /v1/diagnostics, /metrics)
- Empêche l'indexation des endpoints legacy
- Améliore le SEO et réduit le trafic indésirable
- Permissions des logs : Modification des permissions de fichiers de log (0600 → 0644)
- Permet aux outils de monitoring de lire les fichiers de log
- Maintient l'accès en écriture uniquement pour les non-propriétaires
- Métriques : Utilisation du label "404" pour les routes inconnues
- Améliore la visibilité des erreurs 404 dans le monitoring
1.2.1 - 2026-03-06
- Méta-données sociales (Open Graph tags) pour améliorer le partage sur les réseaux sociaux
- Balises meta Open Graph pour le titre, la description et l'image
- Image de partage sociale servie sur
/share-image.png - Amélioration de l'aperçu lors du partage sur LinkedIn, Twitter, Facebook
- Chaîne de certificats TLS : Intégration du certificat intermédiaire Certigna Services CA
- Le serveur base-donnees-publique.medicaments.gouv.fr n'envoie pas la chaîne complète
- Le certificat intermédiaire est maintenant embarqué dans le binaire (
//go:embed) - Évite les erreurs de validation TLS lors des téléchargements
- Mise à jour des signatures de fonction pour injecter le client HTTP configuré
- Mise à jour des tests pour prendre en compte les nouvelles signatures de fonction
- Tests unitaires du parser mis à jour pour passer le client HTTP
- Tests d'intégration mis à jour avec création de client HTTP avec Certigna
- Ajout de
createTestHTTPClient()helper pour les tests unitaires - Ajout de
createTestHTTPClient(t *testing.T)pour les tests d'intégration
1.2.0 - 2026-02-23
- Paramètre
pageSizepour pagination personnalisée (1-200 éléments par page)- Permet de contrôler le nombre d'éléments retournés par page
- Compatible avec
/v1/medicaments?page={n} - Valeur par défaut : 10, maximum : 200
- Limites de résultats de recherche pour prévenir les abus
- Maximum 250 résultats pour
/v1/medicaments?search - Maximum 100 résultats pour
/v1/generiques?libelle - Retourne HTTP 400 si les limites sont dépassées
- Utilisez
/v1/medicaments/exportpour le jeu de données complet
- Maximum 250 résultats pour
- Support multi-architecture Docker (amd64, arm64)
- Détection automatique de l'architecture hôte
- Builds optimisés pour Apple Silicon et x86_64
- Gestion des secrets Docker pour Grafana
- Mot de passe Grafana sécurisé via Docker secrets
- Commande
make setup-secretspour la configuration initiale
- Variable d'environnement
DISABLE_RATE_LIMITER- Permet de désactiver explicitement le rate limiting
- Utiliser avec prudence en production
- Stack d'observabilité avec Grafana, Loki, Prometheus et Alloy
- Collecte centralisée des logs et métriques
- Tableaux de bord Grafana préconfigurés
- Détection des menaces de sécurité dans les logs
- Versioning automatique depuis les tags Git
- Makefile détecte automatiquement la version depuis les tags
- Injection de version au build-time dans Docker
- Simplification des vérifications de sécurité pour des temps de réponse plus rapides
- Niveaux de logging en production : DEBUG supprimé en console (fichiers toujours en DEBUG)
- Normalisation des noms :
HTTPHandlerImpl→Handler(conventions Go idiomatic) - Optimisation du logger rotatif avec timeout configurable et nettoyage basé sur le nom de fichier
- Métriques Prometheus : utilisation des motifs de route Chi au lieu des chemins bruts
- Amélioration de la validation : support des apostrophes et messages d'erreur améliorés
- Optimisation du build Docker : cache, copie HTML, suppression de git du builder
- Makefile unifié remplace
docker-build.shavec améliorations UX
- Health checks : fermeture correcte du corps de réponse et timeout pour éviter les blocages
- Création des logs dans Docker : corrigé les problèmes de création de fichiers de logs
- Support des apostrophes dans les requêtes de recherche
- Pattern de métriques : corrigé pour utiliser les motifs de route Chi
- Memory leaks : réduit les allocations via une instance unique de logger de secours
- Documentation Docker complète avec stack d'observabilité
- Documentation éliminée les sections redondantes entre les fichiers
- Traduction du changelog en français
- Refactorisation de la documentation d'observabilité (déléguée au submodule)
- Couverture de tests améliorée pour la configuration et les rapports de qualité des données
- Tests v1/diagnostics ajoutés
- Refactorisation de la configuration du serveur de tests
- Amélioration des tests de validation CIP/CIS
- Optimisations multiples des performances
- Simplification des vérifications de sécurité pour des temps de réponse plus rapides
- Réduction des allocations de mémoire via optimisations du logger rotatif
- Build Docker optimisé avec cache et suppression des dépendances inutiles
- Réduction des fuites de mémoire (memory leaks)
- Détection des menaces de sécurité dans Alloy logging
- Gestion sécurisée des secrets Docker pour Grafana
- Validation des entrées améliorée avec support des apostrophes
- Vérification X-Forwarded-For pour un meilleur suivi des IP
1.1.0 - 2026-02-13
- API RESTful v1 avec 9 nouveaux endpoints utilisant le routage par chemin
- Recherche de médicaments par CIS, CIP ou recherche multi-mots
- Endpoints de présentation et de groupes génériques
/v1/diagnosticspour les métriques système et les rapports de qualité des données
- Métriques Prometheus sur le port 9090 (compteur de requêtes, histogramme de durée, jauge en cours)
- Recherche multi-mots avec logique AND (jusqu'à 6 mots)
- Cache ETag avec validation basée sur SHA256
- Numérotation séquentielle des journaux pour éviter une croissance non bornée (
_01,_02, etc.) - Suivi des présentations orphelines dans
/v1/diagnostics- Affiche les codes CIP pour les présentations avec CIS inexistant
- Nouvelle structure de documentation avec le dossier
docs/pour une meilleure organisationdocs/ARCHITECTURE.md- Architecture système, interfaces, middleware, disposition mémoiredocs/DEVELOPMENT.md- Guide de construction, test, lint et développementdocs/PERFORMANCE.md- Benchmarks, optimisations et profilagedocs/MIGRATION.md- Guide de migration v1 avec changements majeurs et exemplesdocs/TESTING.md- Stratégies de test, benchmarks et guide de couverture
- Réorganisation de la documentation : README.md simplifié de 1 196 à 328 lignes (-73 %)
- Meilleure séparation des préoccupations : page d'accueil vs documentation détaillée
- Navigation améliorée pour les utilisateurs finaux et les contributeurs
- Référence des endpoints déplacée vers la spécification OpenAPI
- Détails de l'architecture et des performances déplacés vers des docs dédiés
- Spécification OpenAPI mise à jour : Ajout de liens vers la documentation externe pour le guide de migration
- Noms normalisés pré-calculés : recherche 5x plus rapide, 170x moins d'allocations
- Recherche de médicaments : 3 500ns → 750ns (4,7x plus rapide)
- Recherche de génériques : 3 500ns → 75ns (46,7x plus rapide)
- Optimisation de la validation des entrées : 5-10x plus rapide via string.Contains() et pré-compilation de regex
- Mise en pool des rédacteurs de réponse réduit les allocations de 2,2 Mo/s à haut débit
- Journalisation rapide pour les endpoints /health et /metrics
- LOG_LEVEL maintenant fonctionnel avec repli basé sur l'environnement (console uniquement)
- Coûts des endpoints mis à jour pour le rate limiting (5-200 tokens par requête)
- Version Go requise : 1.21 → 1.26+ (dernière version stable)
- Endpoints d'API hérités (Date de fin de vie : 2026-07-31)
/database→ Utiliser/v1/medicaments/export/database/{page}→ Utiliser/v1/medicaments?page={n}/medicament/{nom}→ Utiliser/v1/medicaments?search={nom}/medicament/id/{cis}→ Utiliser/v1/medicaments/{cis}/medicament/cip/{cip}→ Utiliser/v1/medicaments?cip={cip}/generiques/{libelle}→ Utiliser/v1/generiques?libelle={libelle}/generiques/group/{id}→ Utiliser/v1/generiques/{id}
En-têtes de dépréciation renvoyés :
Deprecation: true
Sunset: 2026-07-31T23:59:59Z
Link: </v1/...>; rel="successor-version"
Warning: 299 - "Deprecated endpoint..."
- Conditions de course dans le logger rotatif (fuites de ressources + problèmes de concurrence)
- /v1/medicaments retourne 404 lorsqu'il n'est pas trouvé (au lieu d'un tableau vide)
- Validation des génériques : plage groupID 1-9999 avec messages d'erreur clairs
- Validation des entrées ASCII uniquement avec messages de rejet utiles pour les caractères accentués
- Journalisation de l'arrêt du serveur corrigée
- Gestion des cas limites TSV avec statistiques de saut pour les lignes malformées
- Bug de décalage de 1 dans la validation corrigé
- Encodage de jeu de caractères : Détection automatique UTF-8/ISO8859-1 dans le téléchargeur
- Gestion des erreurs de timeout HTTP et scanner (timeout de téléchargement de 5 minutes pour les fichiers BDPM, tampon de scanner de 1 Mo pour un parsing robuste, vérification des erreurs après chaque fichier)
- Arrêt gracieux des serveurs de métriques/profilage (annulation de contexte, évite les fuites de goroutine, arrêts plus propres avec timeout de 5 secondes)
Élimination de la normalisation de chaînes à l'exécution en calculant une fois lors du parsing. Cette optimisation réduit les allocations par requête et améliore considérablement la latence de recherche.
| Metric | Avant | Après | Amélioration |
|---|---|---|---|
| Débit HTTP | |||
| └ Médicaments search | 1,000 req/s | 5,000 req/s | 5x (+400%) |
| └ Génériques search | 5,000 req/s | 20,000 req/s | 4x (+300%) |
| Benchmarks algorithmiques | |||
| └ Médicaments - Reqs/sec | 250 | 1,250 | 5x |
| └ Médicaments - Latence | 3,500µs | 750µs | 4.7x plus rapide |
| └ Génériques - Reqs/sec | 1,500 | 15,000 | 10x |
| └ Génériques - Latence | 3,500µs | 75µs | 46.7x plus rapide |
| Allocations par recherche | 16,000 | 94 | 170x réduction |
Compromis mémoire : 0,75 Mo supplémentaire pour stocker les chaînes normalisées pré-calculées
- Mise en pool des rédacteurs de réponse réduit les allocations de 2,2 Mo/s à haut débit
- Journalisation rapide saute les opérations coûteuses pour les endpoints health/metrics
- Recherche CIP/CIS à temps constant (O(1)) en utilisant des hash maps
- Pré-compilation de regex au niveau du package
- Détection de motifs dangereux basée sur des chaînes (5-10x plus rapide que regex)
- Validation CIP/CIS directe via strconv.Atoi() sans regex
Les optimisations combinées ont entraîné des gains de performance significatifs sur tous les endpoints :
| Endpoint | Avant | Après | Amélioration |
|---|---|---|---|
/v1/presentations/{cip} |
35K req/s | 77K req/s | +120% |
/v1/medicaments/{cis} |
13K req/s | 78K req/s | +500% |
/v1/medicaments?cip={code} |
35K req/s | 75K req/s | +114% |
/v1/medicaments?page={n} |
20K req/s | 41K req/s | +105% |
/v1/generiques?libelle={nom} |
5K req/s | 36K req/s | +620% |
/v1/medicaments?search={query} |
1K req/s | 6.1K req/s | +510% |
/health |
30K req/s | 92K req/s | +207% |
Memory : 55-80MB stable (67.5MB median)
- Motif de validation des entrées :
^[a-zA-Z0-9\s\-\.\+']+$(ASCII uniquement)- Rejette les caractères accentués avec un message d'erreur utile
- Prend en charge alphanumérique + espaces + trait d'union/point/apostrophe/signe plus
- Détection de motifs dangereux via tableau de chaînes (injection SQL, XSS, injection de commande, traversal de chemin)
- Limite de recherche multi-mots : Maximum 6 mots (prévention DoS)
- Rate limiting variable : 5-200 tokens par endpoint (1 000 tokens, recharge 3/sec)
- Détection de motifs dangereux : injection SQL, XSS, injection de commande, traversal de chemin (5-10x plus rapide que regex)
- Validation CIP/CIS directe via strconv.Atoi() sans regex
1. Structure de réponse du groupe générique (MAJEUR)
Avant (GET /generiques/group/{id}) :
{
"cis": 12345678,
"group": 100,
"libelle": "Paracétamol",
"type": "princeps"
}Après (GET /v1/generiques/{groupID}) :
{
"groupID": 100,
"libelle": "Paracétamol",
"medicaments": [
{
"cis": 12345678,
"elementPharmaceutique": "PARACETAMOL 500 mg, comprimé",
"formePharmaceutique": "Comprimé",
"type": "princeps",
"composition": [...]
}
],
"orphanCIS": [87654321, 98765432]
}Mappage des champs :
group→groupID(renommé)cis→ supprimé (maintenant dans le tableau medicaments)type→ supprimé (maintenant dans chaque médicament du tableau)- NOUVEAU : tableau
medicamentsavec les données complètes de composition - NOUVEAU : tableau
orphanCISpour le suivi de la qualité des données
Impact : Les clients s'attendant à l'ancienne structure cesseront de fonctionner. Doivent migrer vers la nouvelle structure.
2. Endpoint de santé simplifié
Les métriques système ont été déplacées de /health vers /v1/diagnostics
/health: Retourne uniquement le statut de base (endpoint rapide)/v1/diagnostics: Métriques système détaillées et rapports de qualité des données
3. Version Go requise
Version Go minimum : 1.21 → 1.26+ (dernière version stable)
Guide de migration complet disponible dans docs/MIGRATION.md avec les changements majeurs, les exemples et la liste de contrôle
Référence rapide :
// Hérité
fetch("https://medicaments-api.giygas.dev/medicament/paracetamol");
// V1
fetch("https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol");- Couverture globale : 78,5 %
- Handlers : 85,6 %
- Parser de médicaments : 84,2 %
- Nouveaux fichiers de test : Tests de fumée, validation ETag, endpoints v1, cohérence inter-fichiers
- Benchmarks CI : Non bloquants avec tolérance de 25 % de variance