1
0
This repository has been archived on 2025-11-01. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
contaminus/backend/fastapi/endpoints/sensors.py
2025-03-02 22:51:31 +01:00

67 lines
2.9 KiB
Python

from fastapi import APIRouter, Body, HTTPException, Query
from fastapi import APIRouter, Body, HTTPException, Query
from typing import Optional
from pydantic import BaseModel
from sqlalchemy import select, insert
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from models.sql.Sensor import sensor_mq_data
from db import database
from models.schemas.SensorModel import SensorModel
router = APIRouter()
@router.get("")
async def get_all(
_sort: Optional[str] = Query(None, alias="_sort", description="Campo por el cual ordenar los resultados"),
_order: Optional[str] = Query("asc", description="Orden de los resultados, 'asc' o 'desc'"),
_limit: Optional[int] = Query(100, ge=1, description="Número máximo de resultados a mostrar"),
):
query = select(sensor_mq_data)
if _sort:
if _order == "desc":
query = query.order_by(getattr(sensor_mq_data.c, _sort).desc())
else:
query = query.order_by(getattr(sensor_mq_data.c, _sort))
if _limit:
query = query.limit(_limit)
async with database.transaction():
result = await database.fetch_all(query)
return result
@router.get("/sensor")
async def get_by_params(
id: Optional[int] = Query(None, alias="id", description="ID del sensor a buscar"),
sensor_type: Optional[str] = Query(None, alias="sensor_type", description="Tipo de sensor"),
min_value: Optional[float] = Query(None, alias="min_value", description="Valor mínimo del sensor"),
max_value: Optional[float] = Query(None, alias="max_value", description="Valor máximo del sensor"),
min_temp: Optional[float] = Query(None, alias="min_temp", description="Temperatura mínima"),
max_temp: Optional[float] = Query(None, alias="max_temp", description="Temperatura máxima"),
min_humidity: Optional[float] = Query(None, alias="min_humidity", description="Humedad mínima"),
max_humidity: Optional[float] = Query(None, alias="max_humidity", description="Humedad máxima"),
):
query = select(sensor_mq_data)
if id is not None:
query = query.where(sensor_mq_data.c.id == id)
if sensor_type is not None:
query = query.where(sensor_mq_data.c.sensor_type == sensor_type)
if min_value is not None:
query = query.where(sensor_mq_data.c.value >= min_value)
if max_value is not None:
query = query.where(sensor_mq_data.c.value <= max_value)
if min_temp is not None:
query = query.where(sensor_mq_data.c.temperature >= min_temp)
if max_temp is not None:
query = query.where(sensor_mq_data.c.temperature <= max_temp)
if min_humidity is not None:
query = query.where(sensor_mq_data.c.humidity >= min_humidity)
if max_humidity is not None:
query = query.where(sensor_mq_data.c.humidity <= max_humidity)
async with database.transaction():
result = await database.fetch_all(query)
return result