Spaces:
Sleeping
Sleeping
| from datetime import date | |
| from pathlib import Path | |
| from typing import Optional | |
| import sqlite3 | |
| import streamlit as st | |
| from fastapi import FastAPI, Query | |
| from fastapi.responses import RedirectResponse | |
| # Chemin de la base de données | |
| dbpath = Path(__file__).parent.parent / "database" / "db_logsv2.db" | |
| # instanciation de l'API FastAPI | |
| api = FastAPI( | |
| title="SmartRescue API", | |
| description="API to access SmartRescue events", | |
| version="1.0.0", | |
| ) | |
| async def root(): | |
| """ | |
| Route par défaut, qui redirige vers la page doc | |
| """ | |
| return RedirectResponse(url="/docs") | |
| # Requête de base, si l'utilisateur de l'API | |
| # ne spécifie pas de date de début ou de fin | |
| base_query = """ | |
| SELECT log.id_log, log.timestamp, prompt.prompt, prompt.response, | |
| status.status, origin.origin AS origin | |
| FROM log | |
| LEFT JOIN prompt ON log.id_prompt = prompt.id_prompt | |
| LEFT JOIN status ON log.id_status = status.id_status | |
| LEFT JOIN origin ON log.id_origin = origin.id_origin | |
| """ | |
| async def get_data( | |
| start_date: Optional[date] = Query(None, description="Date de début (YYYY-MM-DD)"), | |
| end_date: Optional[date] = Query(None, description="Date de fin (YYYY-MM-DD)"), | |
| ): | |
| """ | |
| Retourne les événements de SmartRescue entre deux dates. | |
| Args: | |
| start_date (Optional[datetime.date]): Date de début (YYYY-MM-DD), optionnelle. | |
| end_date (Optional[datetime.date]): Date de fin (YYYY-MM-DD), optionnelle. | |
| Returns: | |
| List[Dict[str, Any]]: Liste des enregistrements, avec chaque champ de la base de données | |
| comme clé du dictionnaire. | |
| """ | |
| try: | |
| # Connexion à la base de données | |
| conn = sqlite3.connect(dbpath) | |
| cursor = conn.cursor() | |
| query = base_query | |
| params = [] | |
| # Ajout des conditions de date si spécifiées | |
| if start_date or end_date: | |
| query += " WHERE " | |
| conditions = [] | |
| if start_date: | |
| conditions.append("date(log.timestamp) >= ?") | |
| params.append(start_date.isoformat()) | |
| if end_date: | |
| conditions.append("date(log.timestamp) <= ?") | |
| params.append(end_date.isoformat()) | |
| query += " AND ".join(conditions) | |
| query += " ORDER BY log.timestamp DESC" | |
| cursor.execute(query, params) | |
| rows = cursor.fetchall() | |
| # Récupération des enregistrements | |
| columns = [description[0] for description in cursor.description] | |
| result = [dict(zip(columns, row)) for row in rows] | |
| return result | |
| except sqlite3.OperationalError as e: | |
| return {"error": f"Database error: {str(e)}", "path": dbpath} | |
| finally: | |
| # pour cloturer proprement la connexion à la base de données | |
| if "conn" in locals(): | |
| conn.close() | |