agreg-server/server/backend/adapters/http/readings.py

37 lines
1.3 KiB
Python
Raw Normal View History

import logging
2026-05-10 12:36:38 +02:00
from datetime import datetime
from typing import Annotated
from fastapi import APIRouter, Depends, Query, HTTPException, Path
from pydantic import constr
2026-05-10 12:36:38 +02:00
from domain.value_objects import Granularity
from domain.exceptions import ValidationError, DatabaseError
from services.consumption_service import ConsumptionService
from dependencies import get_consumption_service
from ._readings_schemas import ConsumptionResponseSchema
log = logging.getLogger(__name__)
2026-05-10 12:36:38 +02:00
readings_router = APIRouter(prefix="/readings", tags=["readings"])
DevEUI = Annotated[constr(max_length=64, pattern=r'^[0-9A-Fa-f]+$'), Path()]
2026-05-10 12:36:38 +02:00
@readings_router.get("/{dev_eui}", response_model=ConsumptionResponseSchema)
def get_consumption(
dev_eui: DevEUI,
2026-05-10 12:36:38 +02:00
start: Annotated[datetime, Query()],
end: Annotated[datetime, Query()],
granularity: Annotated[Granularity, Query()] = "day",
service: ConsumptionService = Depends(get_consumption_service),
):
try:
result = service.get_consumption(dev_eui, start, end, granularity)
return ConsumptionResponseSchema.from_domain(result)
except ValidationError as e:
raise HTTPException(status_code=422, detail=str(e))
except DatabaseError as e:
log.error("DatabaseError: %s", e)
raise HTTPException(status_code=500, detail="Erreur interne du serveur")