from fastapi import FastAPI, Query from typing import List from app import database from fastapi.middleware.cors import CORSMiddleware app = FastAPI( title="Articles API", description="API pour récupérer articles et tags depuis SQLite", version="1.0" ) # CORS pour permettre l'accès depuis le navigateur app.add_middleware( CORSMiddleware, allow_origins=["*"], # autorise toutes les origines allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/get_tags") def get_tags(): """ Récupère la liste de tous les tags disponibles via l'API. Returns: Dict: Un dictionnaire contenant soit la liste des tags, soit les informations d'erreur. - Si succès : { "tags": List[str] # Liste des noms de tags triés par ordre alphabétique } - En cas d'erreur : { "status": "error", "code": str, # Nom de l'exception "message": str # Message de l'exception } Notes: - L'appel de cet endpoint effectue un accès à la base de données via la fonction `fetch_tags`. - En cas de problème avec la base de données, un message d'erreur détaillé est retourné. """ try: dict_result = database.fetch_tags() if dict_result["status"] == "ok": return {"tags": dict_result["result"]} else: return dict_result except Exception as e: return {"status": "error", "code": type(e).__name__, "message": str(e)} @app.get("/get_articles_with_tags") def get_articles_with_tags(tags: List[str] = Query(..., description="Liste des tags à filtrer")): """ Récupère les articles associés à une ou plusieurs tags spécifiés. Args: tags (List[str]): Liste des noms de tags utilisés pour filtrer les articles. Doit contenir au moins un tag. Returns: Dict: Un dictionnaire contenant soit les articles correspondants, soit les informations d'erreur. - Si succès : { "tags": List[str], # Tags utilisés pour filtrer "articles": List[Dict] # Liste des articles correspondants } Chaque article est un dictionnaire contenant : - 'article_id': int, ID de l'article - 'article_title': str, Titre de l'article - 'article_url': str, URL de l'article - En cas d'erreur : { "status": "error", "code": str, # Code d'erreur ou nom de l'exception "message": str # Message d'erreur } Notes: - Si la liste `tags` est vide, la fonction retourne une erreur avec le code "no_tags". - L'appel de cet endpoint utilise la fonction `fetch_articles_by_tags` pour récupérer les articles. """ try: dict_result = database.fetch_articles_by_tags(tags) if dict_result["status"] == "ok": return {"tags": tags, "articles": dict_result["result"]} else: return dict_result except Exception as e: return {"status": "error", "code": type(e).__name__, "message": str(e)}