| 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
|
|
|
|
|
| dbpath = Path(__file__).parent.parent / "database" / "db_logsv2.db"
|
|
|
|
|
| api = FastAPI(
|
| title="SmartRescue API",
|
| description="API to access SmartRescue events",
|
| version="1.0.0",
|
| )
|
|
|
|
|
| @api.get("/", include_in_schema=False)
|
| async def root():
|
| """
|
| Route par défaut, qui redirige vers la page doc
|
| """
|
| return RedirectResponse(url="/docs")
|
|
|
|
|
|
|
|
|
| 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
|
| """
|
|
|
|
|
| @api.get("/data")
|
| 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:
|
|
|
| conn = sqlite3.connect(dbpath)
|
| cursor = conn.cursor()
|
|
|
| query = base_query
|
| params = []
|
|
|
|
|
| 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()
|
|
|
|
|
| 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:
|
|
|
| if "conn" in locals():
|
| conn.close()
|
|
|