37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
import calendar
|
|
from datetime import date
|
|
from typing import Any
|
|
|
|
from fastapi import APIRouter, HTTPException, Query
|
|
|
|
router = APIRouter(tags=["lunaire"])
|
|
|
|
# Cache en mémoire : {mois_str: list[dict]}
|
|
_CACHE: dict[str, list[dict]] = {}
|
|
|
|
|
|
@router.get("/lunar")
|
|
def get_lunar(
|
|
month: str = Query(..., description="Format YYYY-MM"),
|
|
) -> list[dict[str, Any]]:
|
|
if month in _CACHE:
|
|
return _CACHE[month]
|
|
try:
|
|
year, mon = int(month[:4]), int(month[5:7])
|
|
except (ValueError, IndexError):
|
|
raise HTTPException(400, "Format attendu : YYYY-MM")
|
|
last_day = calendar.monthrange(year, mon)[1]
|
|
start = date(year, mon, 1)
|
|
end = date(year, mon, last_day)
|
|
try:
|
|
from app.services.lunar import build_calendar
|
|
from dataclasses import asdict
|
|
|
|
result = [asdict(d) for d in build_calendar(start, end)]
|
|
except ImportError:
|
|
raise HTTPException(503, "Service lunaire non disponible (skyfield non installé)")
|
|
except Exception as e:
|
|
raise HTTPException(500, f"Erreur calcul lunaire : {e}")
|
|
_CACHE[month] = result
|
|
return result
|