diagram_ph/app/api/v1/endpoints/refrigerants.py

150 lines
4.3 KiB
Python

"""
Endpoints pour les refrigerants
"""
from fastapi import APIRouter, HTTPException, status
from typing import List
from app.models.refrigerant import (
RefrigerantInfo,
RefrigerantsListResponse
)
from app.core.refrigerant_loader import get_manager
router = APIRouter()
@router.get(
"/",
response_model=RefrigerantsListResponse,
summary="Liste des refrigerants disponibles",
description="Retourne la liste de tous les refrigerants supportes avec leur disponibilite"
)
async def list_refrigerants():
"""
Liste tous les refrigerants disponibles dans le systeme.
Retourne pour chaque refrigerant:
- name: Nom du refrigerant (ex: R134a, R410A)
- available: Si la bibliotheque est disponible
- loaded: Si le refrigerant est actuellement charge en memoire
- error: Message d'erreur si indisponible
Returns:
RefrigerantsListResponse: Liste des refrigerants avec statistiques
"""
try:
manager = get_manager()
refrigerants = manager.get_available_refrigerants()
available_count = sum(1 for r in refrigerants if r.get("available", False))
return RefrigerantsListResponse(
refrigerants=refrigerants,
total=len(refrigerants),
available_count=available_count
)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Erreur lors de la recuperation des refrigerants: {str(e)}"
)
@router.get(
"/{refrigerant_name}",
response_model=RefrigerantInfo,
summary="Informations sur un refrigerant specifique",
description="Retourne les informations detaillees d'un refrigerant"
)
async def get_refrigerant_info(refrigerant_name: str):
"""
Obtient les informations d'un refrigerant specifique.
Args:
refrigerant_name: Nom du refrigerant (ex: R134a, R410A)
Returns:
RefrigerantInfo: Informations du refrigerant
Raises:
404: Si le refrigerant n'existe pas
500: En cas d'erreur interne
"""
try:
manager = get_manager()
refrigerants = manager.get_available_refrigerants()
# Rechercher le refrigerant
refrig_info = next(
(r for r in refrigerants if r["name"] == refrigerant_name),
None
)
if refrig_info is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Refrigerant '{refrigerant_name}' non trouve. "
f"Refrigerants disponibles: {', '.join(r['name'] for r in refrigerants)}"
)
return RefrigerantInfo(**refrig_info)
except HTTPException:
raise
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Erreur lors de la recuperation du refrigerant: {str(e)}"
)
@router.post(
"/{refrigerant_name}/load",
response_model=RefrigerantInfo,
summary="Charger un refrigerant en memoire",
description="Charge explicitement un refrigerant en memoire pour accelerer les calculs"
)
async def load_refrigerant(refrigerant_name: str):
"""
Charge un refrigerant en memoire.
Utile pour precharger les refrigerants frequemment utilises
et ameliorer les performances.
Args:
refrigerant_name: Nom du refrigerant a charger
Returns:
RefrigerantInfo: Informations du refrigerant charge
Raises:
404: Si le refrigerant n'existe pas
500: Si le chargement echoue
"""
try:
manager = get_manager()
# Tenter de charger le refrigerant
lib = manager.load_refrigerant(refrigerant_name)
return RefrigerantInfo(
name=refrigerant_name,
available=True,
loaded=True
)
except ValueError as e:
# Refrigerant non supporte
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=str(e)
)
except Exception as e:
# Erreur de chargement
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Erreur lors du chargement de {refrigerant_name}: {str(e)}"
)