data-api / app.py
AUTO-FRANCE-PARTS
refactor: Update nearby parcel retrieval to return structured response and improve error handling
e6ce7f9
from fastapi import FastAPI, HTTPException, Query
from typing import Dict, Any, List
from api_sources.lexicon import LexiconAPI
from domain.repositories.parcel_repository import ParcelRepository
from domain.use_cases.get_nearby_parcels_by_sampling import GetNearbyParcelsBySamplingUseCase
app = FastAPI(
title="Data API",
description="API pour récupérer des données de parcelles depuis différentes sources",
version="1.0.0"
)
# Instance de l'API Lexicon
lexicon_api = LexiconAPI()
# Repository et use cases
parcel_repository = ParcelRepository(lexicon_api)
@app.get("/")
def greet_json():
return {"Hello": "World!"}
@app.get("/tools/parcel-identifier")
async def get_parcel_identifier(
latitude: float = Query(..., description="Latitude en degrés décimaux"),
longitude: float = Query(..., description="Longitude en degrés décimaux")
) -> Dict[str, Any]:
"""
Récupère les informations d'identification de parcelle à partir des coordonnées GPS.
Args:
latitude: Latitude en degrés décimaux
longitude: Longitude en degrés décimaux
Returns:
Dict contenant les données de la parcelle
"""
try:
# Appel de l'API Lexicon pour récupérer les données
parcel_data = await lexicon_api.get_parcel_from_lat_lon(latitude, longitude)
return parcel_data
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Erreur lors de la récupération des données de parcelle: {str(e)}"
)
@app.get("/tools/get_nearby_parcel")
async def get_nearby_parcels(
latitude: float = Query(..., description="Latitude du point central en degrés décimaux"),
longitude: float = Query(..., description="Longitude du point central en degrés décimaux"),
radius_m: float = Query(200, description="Rayon de recherche en mètres", gt=0),
step_m: float = Query(100, description="Pas d'échantillonnage en mètres (densité des points)", gt=0)
) -> Dict :
"""
Récupère les parcelles à proximité d'un point donné par échantillonnage.
Args:
latitude: Latitude du point central en degrés décimaux
longitude: Longitude du point central en degrés décimaux
radius_m: Rayon de recherche en mètres
step_m: Pas d'échantillonnage en mètres (plus petit = plus dense)
Returns:
Liste des parcelles trouvées dans la zone
"""
try:
# Création du use case avec les paramètres
get_nearby_parcels_use_case = GetNearbyParcelsBySamplingUseCase(
parcel_repository=parcel_repository,
buffer_radius_m=radius_m,
step_m=step_m
)
# Exécution du use case
nearby_parcels = await get_nearby_parcels_use_case(latitude, longitude)
return {
"parcels": nearby_parcels["parcels"],
"number_of_points": nearby_parcels["number_of_points"]
}
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Erreur lors de la récupération des parcelles à proximité: {str(e)}"
)