""" Router FastAPI pour les endpoints JSON /api/*. Chaque endpoint ouvre sa propre connexion SQLite (via config.DB_PATH), appelle la fonction de queries.py correspondante, puis ferme la connexion. """ import sqlite3 from fastapi import APIRouter, HTTPException import tickettracker.config as config from tickettracker.db.schema import get_connection from tickettracker.web.queries import ( get_all_receipts, get_compare_prices, get_dashboard_stats, get_product_history, get_receipt_detail, ) router = APIRouter(prefix="/api") @router.get("/stats") def api_stats(): """Statistiques globales (nb tickets, total dépensé, etc.).""" conn = get_connection(config.DB_PATH) try: return get_dashboard_stats(conn) finally: conn.close() @router.get("/compare") def api_compare(): """Comparaison de prix Picnic vs Leclerc pour les produits communs.""" conn = get_connection(config.DB_PATH) try: return get_compare_prices(conn) finally: conn.close() @router.get("/product/{name:path}/history") def api_product_history(name: str): """Historique des prix d'un produit normalisé. Retourne 404 si le produit est inconnu. Le paramètre {name:path} autorise les '/' dans le nom normalisé. """ conn = get_connection(config.DB_PATH) try: data = get_product_history(conn, name) finally: conn.close() if data is None: raise HTTPException(status_code=404, detail="Produit introuvable") return data @router.get("/receipts") def api_receipts(): """Liste tous les tickets avec leur nombre d'articles.""" conn = get_connection(config.DB_PATH) try: return get_all_receipts(conn) finally: conn.close() @router.get("/receipt/{receipt_id}") def api_receipt_detail(receipt_id: int): """Détail d'un ticket et de ses articles. Retourne 404 si l'id est inconnu. """ conn = get_connection(config.DB_PATH) try: data = get_receipt_detail(conn, receipt_id) finally: conn.close() if data is None: raise HTTPException(status_code=404, detail="Ticket introuvable") return data