SmartRescue / app /api.py
maxenceLIOGIER's picture
Upload folder using huggingface_hub
50ac51e verified
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",
)
@api.get("/", include_in_schema=False)
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
"""
@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:
# 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()