From 375ca1bb2be1a804caf9d475ef1154c7df354276 Mon Sep 17 00:00:00 2001 From: furyhawk Date: Sun, 12 Apr 2026 21:52:47 +0800 Subject: [PATCH] feat: Update humidity, pressure, and temperature endpoints to support search with date range and limit --- app/api/endpoints/humidity.py | 25 ++++++++++++++++++------- app/api/endpoints/pressure.py | 25 ++++++++++++++++++------- app/api/endpoints/temperature.py | 25 ++++++++++++++++++------- 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/app/api/endpoints/humidity.py b/app/api/endpoints/humidity.py index a6b425e..60a41bb 100644 --- a/app/api/endpoints/humidity.py +++ b/app/api/endpoints/humidity.py @@ -1,4 +1,6 @@ -from fastapi import APIRouter, Depends, status +from datetime import datetime + +from fastapi import APIRouter, Depends, Query, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession @@ -27,15 +29,24 @@ async def create_new_humidity( @router.get( - "/all", + "/search", response_model=list[HumidityResponse], status_code=status.HTTP_200_OK, - description="Get humidity of the city.", + description="Search humidity readings with optional date range and limit.", ) -async def get_humidity( +async def search_humidity( session: AsyncSession = Depends(deps.get_session), + limit: int = Query(100, ge=1, le=1000), + start_date: datetime | None = Query(None, description="Filter readings from this date (ISO 8601)"), + end_date: datetime | None = Query(None, description="Filter readings until this date (ISO 8601)"), ) -> list[Humidity]: - humidity_list = await session.scalars( - select(Humidity).order_by(Humidity.create_time.desc()) - ) + query = select(Humidity) + + if start_date: + query = query.where(Humidity.create_time >= start_date) + if end_date: + query = query.where(Humidity.create_time <= end_date) + + query = query.order_by(Humidity.create_time.desc()).limit(limit) + humidity_list = await session.scalars(query) return list(humidity_list.all()) diff --git a/app/api/endpoints/pressure.py b/app/api/endpoints/pressure.py index 18e6e4d..01b31ec 100644 --- a/app/api/endpoints/pressure.py +++ b/app/api/endpoints/pressure.py @@ -1,4 +1,6 @@ -from fastapi import APIRouter, Depends, status +from datetime import datetime + +from fastapi import APIRouter, Depends, Query, status from sqlalchemy import ScalarResult, select from sqlalchemy.ext.asyncio import AsyncSession @@ -27,15 +29,24 @@ async def create_new_pressure( @router.get( - "/all", + "/search", response_model=list[PressureResponse], status_code=status.HTTP_200_OK, - description="Get pressure of the city.", + description="Search pressure readings with optional date range and limit.", ) -async def get_pressure( +async def search_pressure( session: AsyncSession = Depends(deps.get_session), + limit: int = Query(100, ge=1, le=1000), + start_date: datetime | None = Query(None, description="Filter readings from this date (ISO 8601)"), + end_date: datetime | None = Query(None, description="Filter readings until this date (ISO 8601)"), ) -> list[Pressure]: - pressure_list: ScalarResult[Pressure] = await session.scalars( - select(Pressure).order_by(Pressure.create_time.desc()) - ) + query = select(Pressure) + + if start_date: + query = query.where(Pressure.create_time >= start_date) + if end_date: + query = query.where(Pressure.create_time <= end_date) + + query = query.order_by(Pressure.create_time.desc()).limit(limit) + pressure_list: ScalarResult[Pressure] = await session.scalars(query) return list(pressure_list.all()) diff --git a/app/api/endpoints/temperature.py b/app/api/endpoints/temperature.py index d9bd72c..0ac0de2 100644 --- a/app/api/endpoints/temperature.py +++ b/app/api/endpoints/temperature.py @@ -1,4 +1,6 @@ -from fastapi import APIRouter, Depends, status +from datetime import datetime + +from fastapi import APIRouter, Depends, Query, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession @@ -27,15 +29,24 @@ async def create_new_temperature( @router.get( - "/all", + "/search", response_model=list[TemperatureResponse], status_code=status.HTTP_200_OK, - description="Get temperature of the city.", + description="Search temperature readings with optional date range and limit.", ) -async def get_temperature( +async def search_temperature( session: AsyncSession = Depends(deps.get_session), + limit: int = Query(100, ge=1, le=1000), + start_date: datetime | None = Query(None, description="Filter readings from this date (ISO 8601)"), + end_date: datetime | None = Query(None, description="Filter readings until this date (ISO 8601)"), ) -> list[Temperature]: - temperature_list = await session.scalars( - select(Temperature).order_by(Temperature.create_time.desc()) - ) + query = select(Temperature) + + if start_date: + query = query.where(Temperature.create_time >= start_date) + if end_date: + query = query.where(Temperature.create_time <= end_date) + + query = query.order_by(Temperature.create_time.desc()).limit(limit) + temperature_list = await session.scalars(query) return list(temperature_list.all())