main.py comptait 829 lignes et regroupait 9 domaines fonctionnels. Il ne fait plus que l'assemblage de l'application (configuration, middlewares, montage des routeurs), soit 115 lignes. - routers/ : un module par domaine, chacun déclarant sa propre dépendance d'authentification - domain.py : enums UserRole et AuditAction, mapping MONITO_TABLES ; les rôles étaient jusqu'ici répétés en dur à deux endroits - helpers.py : conversion des lignes pyodbc, écriture du journal - rate_limit.py : limiteur partagé, isolé pour éviter un import circulaire entre main.py et le routeur d'authentification Les codes HTTP littéraux (404, 401, 400, 201) passent aux constantes fastapi.status, comme le faisait déjà auth.py. Les actions du journal d'audit passent en paramètre SQL au lieu d'être concaténées. Aucune route modifiée : la comparaison des specs OpenAPI avant/après confirme que les 26 URL existantes sont identiques. conftest patchait main.get_cursor ; chaque routeur important désormais get_cursor dans son propre espace de noms, la fixture remplace le nom dans tous les modules concernés.
111 lines
3.4 KiB
Python
111 lines
3.4 KiB
Python
# ============================================================
|
|
# routers/historique.py — Snapshots journaliers (TABLE_FINAL)
|
|
# ============================================================
|
|
|
|
from datetime import date
|
|
from typing import Optional
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
|
|
from auth import get_current_user
|
|
from config import get_cursor
|
|
from helpers import get_table_name, rows_to_list
|
|
|
|
router = APIRouter(dependencies=[Depends(get_current_user)], tags=["Historique"])
|
|
|
|
|
|
@router.get("")
|
|
def get_historique(
|
|
id_monito : Optional[int] = Query(None),
|
|
date_debut : Optional[date] = Query(None, description="YYYY-MM-DD"),
|
|
date_fin : Optional[date] = Query(None, description="YYYY-MM-DD"),
|
|
service : Optional[str] = Query(None),
|
|
):
|
|
"""Snapshots journaliers (TABLE_FINAL)."""
|
|
query = (
|
|
"SELECT id_monito, nom_monito, nb_erreurs, service, categorie, bdd_source, "
|
|
"CONVERT(NVARCHAR, date_sauvegarde, 23) AS date_sauvegarde "
|
|
"FROM TABLE_FINAL WHERE 1=1"
|
|
)
|
|
params = []
|
|
|
|
if id_monito:
|
|
query += " AND id_monito = ?"
|
|
params.append(id_monito)
|
|
if date_debut:
|
|
query += " AND date_sauvegarde >= ?"
|
|
params.append(str(date_debut))
|
|
if date_fin:
|
|
query += " AND date_sauvegarde <= ?"
|
|
params.append(str(date_fin))
|
|
if service:
|
|
query += " AND service = ?"
|
|
params.append(service)
|
|
|
|
query += " ORDER BY date_sauvegarde ASC, id_monito ASC"
|
|
|
|
with get_cursor() as cursor:
|
|
cursor.execute(query, *params)
|
|
return rows_to_list(cursor, cursor.fetchall())
|
|
|
|
|
|
@router.get("/comparaison")
|
|
def get_comparaison(
|
|
date_debut : Optional[date] = Query(None),
|
|
date_fin : Optional[date] = Query(None),
|
|
):
|
|
"""
|
|
Déprécié — utiliser GET /evolution/par-monitoring à la place.
|
|
Conservé pour compatibilité ascendante.
|
|
"""
|
|
query = (
|
|
"SELECT CONVERT(NVARCHAR, date_sauvegarde, 23) AS date, "
|
|
"id_monito, nom_monito, nb_erreurs, service "
|
|
"FROM TABLE_FINAL WHERE 1=1"
|
|
)
|
|
params = []
|
|
|
|
if date_debut:
|
|
query += " AND date_sauvegarde >= ?"
|
|
params.append(str(date_debut))
|
|
if date_fin:
|
|
query += " AND date_sauvegarde <= ?"
|
|
params.append(str(date_fin))
|
|
|
|
query += " ORDER BY date_sauvegarde ASC, id_monito ASC"
|
|
|
|
with get_cursor() as cursor:
|
|
cursor.execute(query, *params)
|
|
return rows_to_list(cursor, cursor.fetchall())
|
|
|
|
|
|
@router.get("/{id_monito}/evolution")
|
|
def get_evolution(
|
|
id_monito : int,
|
|
date_debut : Optional[date] = Query(None),
|
|
date_fin : Optional[date] = Query(None),
|
|
):
|
|
"""Évolution d'un monitoring — format optimisé Recharts."""
|
|
get_table_name(id_monito) # valide l'existence du monitoring
|
|
|
|
query = (
|
|
"SELECT CONVERT(NVARCHAR, date_sauvegarde, 23) AS date, nb_erreurs "
|
|
"FROM TABLE_FINAL WHERE id_monito = ?"
|
|
)
|
|
params = [id_monito]
|
|
|
|
if date_debut:
|
|
query += " AND date_sauvegarde >= ?"
|
|
params.append(str(date_debut))
|
|
if date_fin:
|
|
query += " AND date_sauvegarde <= ?"
|
|
params.append(str(date_fin))
|
|
|
|
query += " ORDER BY date_sauvegarde ASC"
|
|
|
|
with get_cursor() as cursor:
|
|
cursor.execute(query, *params)
|
|
data = [{"date": r[0], "nb_erreurs": r[1]} for r in cursor.fetchall()]
|
|
|
|
return {"id_monito": id_monito, "points": len(data), "evolution": data}
|