Commit 12bd77d8 authored by Patrick Ade's avatar Patrick Ade
Browse files

Refactor API routes and add response schemas for sensor data endpoints

parent 0cfce44e
...@@ -4,5 +4,5 @@ from app.routes.sensor import sensor_router ...@@ -4,5 +4,5 @@ from app.routes.sensor import sensor_router
api = NinjaAPI() api = NinjaAPI()
api.add_router("/api", user_router) api.add_router("", user_router)
api.add_router("/api", sensor_router) api.add_router("", sensor_router)
...@@ -6,13 +6,27 @@ from utils.influx import InfluxDBHelper ...@@ -6,13 +6,27 @@ from utils.influx import InfluxDBHelper
from dotenv import load_dotenv from dotenv import load_dotenv
import os import os
from app.schemas.sensor import (
RoomDataRangeResponse,
GetRoomsResponse,
RoomDataCSVResponse,
RoomDataCSVDownloadResponse,
GetRoomsFromBuildingResponse,
GetBauResponse,
RoomAvailabilityResponse,
SensorAvailabilityResponse,
AllRoomsAvailabilityResponse,
AllSensorsAvailabilityResponse,
Error,
)
sensor_router = Router(tags=["sensor"]) sensor_router = Router(tags=["sensor"])
@sensor_router.get("/room_data_range") @sensor_router.get("/room_data_range", response=RoomDataRangeResponse)
def room_data_range(request, room: str, start: str = "-30d", stop: str = "now()"): def room_data_range(request, room: str, start: str = "-30d", stop: str = "now()"):
if not room: if not room:
return JsonResponse({"error": "Missing 'room' parameter"}, status=400) return 400, Error("Missing 'room' parameter")
load_dotenv() load_dotenv()
client = InfluxDBHelper( client = InfluxDBHelper(
...@@ -38,7 +52,7 @@ def room_data_range(request, room: str, start: str = "-30d", stop: str = "now()" ...@@ -38,7 +52,7 @@ def room_data_range(request, room: str, start: str = "-30d", stop: str = "now()"
return {"room": room, "data": data_by_time} return {"room": room, "data": data_by_time}
@sensor_router.get("/get_rooms") @sensor_router.get("/get_rooms", response=GetRoomsResponse)
def get_rooms(request): def get_rooms(request):
client = InfluxDBHelper( client = InfluxDBHelper(
url=os.getenv("INFLUXDB_URL"), url=os.getenv("INFLUXDB_URL"),
...@@ -56,7 +70,7 @@ def get_rooms(request): ...@@ -56,7 +70,7 @@ def get_rooms(request):
return {"rooms": sorted(rooms)} return {"rooms": sorted(rooms)}
@sensor_router.get("/room_data_csv") @sensor_router.get("/room_data_csv", response=RoomDataCSVResponse)
def room_data_csv_view(request, room: str, start: str = "-30d", stop: str = "now()"): def room_data_csv_view(request, room: str, start: str = "-30d", stop: str = "now()"):
if not room: if not room:
return JsonResponse({"error": "Missing 'room' parameter"}, status=400) return JsonResponse({"error": "Missing 'room' parameter"}, status=400)
...@@ -84,7 +98,7 @@ def room_data_csv_view(request, room: str, start: str = "-30d", stop: str = "now ...@@ -84,7 +98,7 @@ def room_data_csv_view(request, room: str, start: str = "-30d", stop: str = "now
return {"room": room, "data": results} return {"room": room, "data": results}
@sensor_router.get("/room_data_csv_download") @sensor_router.get("/room_data_csv_download", response=RoomDataCSVDownloadResponse)
def room_data_csv_download(request, room: str, start: str = "-30d", stop: str = "now()"): def room_data_csv_download(request, room: str, start: str = "-30d", stop: str = "now()"):
if not room: if not room:
return JsonResponse({"error": "Missing 'room' parameter"}, status=400) return JsonResponse({"error": "Missing 'room' parameter"}, status=400)
...@@ -103,7 +117,7 @@ def room_data_csv_download(request, room: str, start: str = "-30d", stop: str = ...@@ -103,7 +117,7 @@ def room_data_csv_download(request, room: str, start: str = "-30d", stop: str =
return response return response
@sensor_router.get("/get_rooms_from_building") @sensor_router.get("/get_rooms_from_building", response=GetRoomsFromBuildingResponse)
def get_rooms_from_building(request, building: str): def get_rooms_from_building(request, building: str):
if not building: if not building:
return JsonResponse({"error": "Missing 'building' parameter"}, status=400) return JsonResponse({"error": "Missing 'building' parameter"}, status=400)
...@@ -127,7 +141,7 @@ def get_rooms_from_building(request, building: str): ...@@ -127,7 +141,7 @@ def get_rooms_from_building(request, building: str):
return {"building": building, "rooms": sorted(rooms)} return {"building": building, "rooms": sorted(rooms)}
@sensor_router.get("/get_bau") @sensor_router.get("/get_bau", response=GetBauResponse)
def get_bau(request): def get_bau(request):
client = InfluxDBHelper( client = InfluxDBHelper(
url=os.getenv("INFLUXDB_URL"), url=os.getenv("INFLUXDB_URL"),
...@@ -149,7 +163,7 @@ def get_bau(request): ...@@ -149,7 +163,7 @@ def get_bau(request):
return {"baus": sorted(baus)} return {"baus": sorted(baus)}
@sensor_router.get("/room_availability") @sensor_router.get("/room_availability", response=RoomAvailabilityResponse)
def room_availability(request, room: str, start: str = "-30d", stop: str = "now()"): def room_availability(request, room: str, start: str = "-30d", stop: str = "now()"):
if not room: if not room:
return JsonResponse({"error": "Missing 'room' parameter"}, status=400) return JsonResponse({"error": "Missing 'room' parameter"}, status=400)
...@@ -166,7 +180,7 @@ def room_availability(request, room: str, start: str = "-30d", stop: str = "now( ...@@ -166,7 +180,7 @@ def room_availability(request, room: str, start: str = "-30d", stop: str = "now(
return {"room": room, "available": availability} return {"room": room, "available": availability}
@sensor_router.get("/sensor_availability") @sensor_router.get("/sensor_availability", response=SensorAvailabilityResponse)
def sensor_availability(request, mac: str, start: str = "-30d", stop: str = "now()"): def sensor_availability(request, mac: str, start: str = "-30d", stop: str = "now()"):
if not mac: if not mac:
return JsonResponse({"error": "Missing 'mac' parameter"}, status=400) return JsonResponse({"error": "Missing 'mac' parameter"}, status=400)
...@@ -183,7 +197,7 @@ def sensor_availability(request, mac: str, start: str = "-30d", stop: str = "now ...@@ -183,7 +197,7 @@ def sensor_availability(request, mac: str, start: str = "-30d", stop: str = "now
return {"sensor_mac": mac, "available": availability} return {"sensor_mac": mac, "available": availability}
@sensor_router.get("/all_rooms_availability") @sensor_router.get("/all_rooms_availability", response=AllRoomsAvailabilityResponse)
def all_rooms_availability(request, start: str = "-30d", stop: str = "now()"): def all_rooms_availability(request, start: str = "-30d", stop: str = "now()"):
client = InfluxDBHelper( client = InfluxDBHelper(
url=os.getenv("INFLUXDB_URL"), url=os.getenv("INFLUXDB_URL"),
...@@ -197,7 +211,7 @@ def all_rooms_availability(request, start: str = "-30d", stop: str = "now()"): ...@@ -197,7 +211,7 @@ def all_rooms_availability(request, start: str = "-30d", stop: str = "now()"):
return {"available_rooms": rooms_available} return {"available_rooms": rooms_available}
@sensor_router.get("/all_sensors_availability") @sensor_router.get("/all_sensors_availability", response=AllSensorsAvailabilityResponse)
def all_sensors_availability(request, start: str = "-30d", stop: str = "now()"): def all_sensors_availability(request, start: str = "-30d", stop: str = "now()"):
client = InfluxDBHelper( client = InfluxDBHelper(
url=os.getenv("INFLUXDB_URL"), url=os.getenv("INFLUXDB_URL"),
......
from ninja import Schema
from typing import List, Dict, Optional
class RoomDataPoint(Schema):
time: str
field: str
value: float
class RoomDataRangeResponse(Schema):
room: str
data: Dict[str, Dict[str, float]]
class GetRoomsResponse(Schema):
rooms: List[str]
class RoomDataCSVResponse(Schema):
room: str
data: List[RoomDataPoint]
class RoomDataCSVDownloadResponse(Schema):
csv_data: str
class GetRoomsFromBuildingResponse(Schema):
building: str
rooms: List[str]
class GetBauResponse(Schema):
baus: List[str]
class RoomAvailabilityResponse(Schema):
room: str
available: bool
class SensorAvailabilityResponse(Schema):
sensor_mac: str
available: bool
class AllRoomsAvailabilityResponse(Schema):
available_rooms: List[str]
class AllSensorsAvailabilityResponse(Schema):
available_sensors: List[str]
class Error(Schema):
message: str
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment