55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
from datetime import datetime
|
|
|
|
from fastapi import APIRouter, HTTPException, Query, status
|
|
|
|
from app.api.deps import LecteurDep, ReadingServiceDep
|
|
from app.api.openapi import REPONSE_VALIDATION, Reponses
|
|
from app.schemas.errors import ErrorResponse
|
|
from app.schemas.reading import ReadingResponse
|
|
from app.services.reading import FenetreInverseeError, FenetreTropLargeError
|
|
|
|
router = APIRouter()
|
|
|
|
REPONSES_FENETRE: Reponses = {
|
|
**REPONSE_VALIDATION,
|
|
400: {
|
|
"model": ErrorResponse,
|
|
"description": (
|
|
"Fenêtre temporelle invalide : `start` postérieur ou égal à `end`, ou écart entre "
|
|
"les deux supérieur à 90 jours."
|
|
),
|
|
},
|
|
}
|
|
|
|
|
|
@router.get(
|
|
"",
|
|
response_model=list[ReadingResponse],
|
|
summary="Liste l'historique des lectures",
|
|
responses=REPONSES_FENETRE,
|
|
)
|
|
async def list_readings(
|
|
_: LecteurDep,
|
|
service: ReadingServiceDep,
|
|
site_id: str | None = None,
|
|
start: datetime | None = None,
|
|
end: datetime | None = None,
|
|
limit: int = Query(500, ge=1, le=2000),
|
|
offset: int = Query(0, ge=0),
|
|
) -> list[ReadingResponse]:
|
|
try:
|
|
lectures = await service.list_history(
|
|
site_id=site_id, start=start, end=end, limit=limit, offset=offset
|
|
)
|
|
except FenetreInverseeError as erreur:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="`start` doit être strictement antérieur à `end`",
|
|
) from erreur
|
|
except FenetreTropLargeError as erreur:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="L'écart entre `start` et `end` ne peut pas dépasser 90 jours",
|
|
) from erreur
|
|
return [ReadingResponse.model_validate(lecture) for lecture in lectures]
|