Author SHA1 Message Date
AnthoandClaude Opus 5 3538d77217 fix: aligne la version exposee sur la 1.1.0 et documente la config de deploiement
Build & Deploy / build (push) Successful in 26s
L'API se declarait en 1.0.0 (config.py et docs/openapi.json) alors que le
CHANGELOG et le dossier annoncent la 1.1.0 comme version livree : GET /health
et Swagger renvoyaient donc une version fausse.

- API_VERSION 1.0.0 -> 1.1.0 (config.py + docs/openapi.json, spec inchangee
  par ailleurs : 29 chemins, 40 operations)
- ajoute api.env.example, modele de configuration sans valeurs
- ignore api.env : il porte la chaine de connexion et la cle JWT

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 10:36:11 +02:00
Antho b7551073f5 docs: clarifie l'intitulé de colonne du tableau de tests
Build & Deploy / build (push) Successful in 20s
« Couverture » prêtait à confusion avec les pourcentages de couverture de
code mesurés (README racine du rendu) : la colonne décrit en réalité le
périmètre fonctionnel de chaque fichier de test, pas un taux.
2026-08-16 15:02:06 +02:00
Antho e8b4a604e9 docs: corrige la référence à GitHub dans le RUNBOOK
Build & Deploy / build (push) Successful in 21s
Les dépôts sont hébergés sur Gitea (git.nfteam.ovh), jamais sur GitHub.
2026-08-16 14:56:41 +02:00
Antho caa0b126b1 chore: supprime testAPI.py, script de test manuel devenu inopérant
Build & Deploy / build (push) Successful in 22s
Ce script interrogeait GET /dashboard sans jeton. Depuis l'ajout de
l'authentification JWT, tous les endpoints de données répondent 401 : le
script échoue systématiquement (vérifié sur l'environnement déployé).

Il est par ailleurs entièrement couvert par la suite pytest, qui teste le
même endpoint avec et sans authentification. Le conserver à la racine du
dépôt laissait croire à un outil de diagnostic utilisable.
2026-08-15 15:38:59 +02:00
Antho 75f9727710 merge: intègre test/couverture-api dans dev
Build & Deploy / build (push) Successful in 21s
2026-08-15 15:01:42 +02:00
7 changed files with 59 additions and 52 deletions
+3
View File
@@ -150,6 +150,9 @@ activemq-data/
# Environments # Environments
.env .env
.envrc .envrc
# Configuration de déploiement : contient la chaîne de connexion et
# la clé JWT. Seul api.env.example (sans valeurs) est versionné.
api.env
.venv .venv
env/ env/
venv/ venv/
+2 -2
View File
@@ -132,8 +132,8 @@ pip install pytest httpx && pytest -q
**82 tests**, curseur SQL simulé (aucune vraie base requise) : **82 tests**, curseur SQL simulé (aucune vraie base requise) :
| Fichier | Couverture | | Fichier | Domaine testé |
|---------|------------| |---------|---------------|
| `test_endpoints.py` | santé, référentiels, authentification, filtres du dashboard, rôles par enum | | `test_endpoints.py` | santé, référentiels, authentification, filtres du dashboard, rôles par enum |
| `test_historique.py` | bornes de dates, validation du format, agrégation des courbes par monitoring et par service | | `test_historique.py` | bornes de dates, validation du format, agrégation des courbes par monitoring et par service |
| `test_securite.py` | protection 401 de chaque route, RBAC 403, jeton forgé rejeté, en-têtes de sécurité, rate-limit 429, compte désactivé, droits RGPD | | `test_securite.py` | protection 401 de chaque route, RBAC 403, jeton forgé rejeté, en-têtes de sécurité, rate-limit 429, compte désactivé, droits RGPD |
+1 -1
View File
@@ -77,4 +77,4 @@ docker compose up -d datasentinel-api
## Contacts ## Contacts
- Hébergement / infra : administrateur homelab (neckfire). - Hébergement / infra : administrateur homelab (neckfire).
- Application / code : A. Coyaud (auteur, dépôts GitHub). - Application / code : A. Coyaud (auteur, dépôts Gitea — git.nfteam.ovh).
+51
View File
@@ -0,0 +1,51 @@
# ============================================================
# Data Sentinel — modèle de configuration de l'API
#
# Copier ce fichier en api.env (à côté du docker-compose.yml)
# et renseigner les valeurs. api.env n'est JAMAIS versionné :
# il est exclu par .gitignore.
#
# cp Api-DataSentinel/api.env.example api.env
# ============================================================
# ---- Base de données ---------------------------------------
# Hôte SQL Server. En conteneur, le nom du service Docker
# (ex. dev-mssql) ; en local, localhost ou HOTE\INSTANCE.
DB_SERVER=dev-mssql
# Port. Laisser VIDE pour une instance nommée (HOTE\INSTANCE).
DB_PORT=1433
DB_NAME=DataSentinel
# Compte applicatif dédié — surtout pas « sa ».
# Création : voir README.md §3.3 (db_datareader + db_datawriter
# sur la seule base DataSentinel).
DB_USER=datasentinel_app
DB_PASSWORD=
# Pilote ODBC embarqué dans l'image.
DB_DRIVER=ODBC Driver 18 for SQL Server
# Mettre à yes pour forcer l'authentification Windows
# (poste de développement uniquement, sans DB_USER).
DB_TRUSTED_CONNECTION=
# ---- Sécurité ----------------------------------------------
# OBLIGATOIRE en déploiement. Sans cette variable, l'API démarre
# mais tire une clé aléatoire à chaque redémarrage : toutes les
# sessions sont alors invalidées au moindre restart.
# Générer : python -c "import secrets; print(secrets.token_urlsafe(64))"
JWT_SECRET=
JWT_ALGORITHM=HS256
JWT_EXPIRE_MINUTES=60
# ---- CORS ---------------------------------------------------
# Origines autorisées, séparées par des virgules. Doit contenir
# l'URL exacte du front (schéma + hôte, sans slash final).
CORS_ORIGINS=https://datasentinel.nfteam.ovh
# ---- Build --------------------------------------------------
# Injecté par la CI (SHA court du commit) et exposé par GET /health.
APP_BUILD=local
+1 -1
View File
@@ -81,7 +81,7 @@ class Config:
# Paramètres API # Paramètres API
API_TITLE = "Data Sentinel API" API_TITLE = "Data Sentinel API"
API_VERSION = "1.0.0" API_VERSION = "1.1.0"
API_DESCRIPTION = "API de monitoring de la qualité des données — XEFI" API_DESCRIPTION = "API de monitoring de la qualité des données — XEFI"
# Identifiant de build injecté par la CI : permet de vérifier quelle # Identifiant de build injecté par la CI : permet de vérifier quelle
+1 -1
View File
File diff suppressed because one or more lines are too long
-47
View File
@@ -1,47 +0,0 @@
import requests
import json
# Configuration
BASE_URL = "http://127.0.0.1:8000"
def test_get_dashboard():
print(f"--- Test de l'endpoint: {BASE_URL}/dashboard ---")
try:
# 1. Envoi de la requête
response = requests.get(f"{BASE_URL}/dashboard")
# 2. Vérification du code statut
if response.status_code == 200:
data = response.json()
if not data:
print("L'API a répondu avec succès, mais le tableau est vide (VUE_CONSO ne contient rien).")
return
# 3. Affichage formaté du tableau
print(f"{'ID':<5} | {'NOM DU MONITORING':<40} | {'ERREURS':<8} | {'SERVICE':<15}")
print("-" * 75)
for item in data:
print(f"{item['id_monito']:<5} | {item['nom_monito'][:38]:<40} | {item['nb_erreurs']:<8} | {item['service']:<15}")
print(f"\nTotal de lignes récupérées : {len(data)}")
else:
print(f"Erreur lors de la requête : {response.status_code}")
print(response.text)
except requests.exceptions.ConnectionError:
print("Erreur : Impossible de se connecter à l'API. Est-ce qu'uvicorn est lancé ?")
if __name__ == "__main__":
# Petit check de santé avant de tester les données
print("Vérification de l'état de l'API...")
health = requests.get(f"{BASE_URL}/health").json()
print(f"Statut API : {health['api']} | Statut DB : {health['database']}\n")
if health['database'] == "ok":
test_get_dashboard()
else:
print("Abandon du test : La base de données n'est pas accessible.")