diff --git a/src/api/node.py b/src/api/node.py new file mode 100644 index 0000000..a9fa397 --- /dev/null +++ b/src/api/node.py @@ -0,0 +1,60 @@ +from flask import abort, request +from time import time + +class Node: + def __init__(self, id: int, name: str): + self.id = id + self.name = name + self.temperature_readings = [] + self.humidity_readings = [] + + def add_temperature_reading(self, temperature: float): + self.temperature_readings.append((temperature, time())) + + def add_humidity_reading(self, humidity: float): + self.humidity_readings.append((humidity, time())) + + def get_temperature_readings(self) -> list[tuple[float, float]]: + return self.temperature_readings + + def get_humidity_readings(self)-> list[tuple[float, float]]: + return self.humidity_readings + + def get_name(self) -> str: + return self.name + + def set_name(self, name: str): + self.name = name + +def node_register(request: request, state: dict) -> str: + state["max_id"] += 1 + id = state["max_id"] + + name = request.form.get("name") + if name is None: + name = request.remote_addr + + state["nodes"][f"{id}"] = Node(id, name) + + return f"{id}" + +def node_reading(id: int, request: request, state: dict) -> str: + node = state["nodes"].get(f"{id}") + if node is None: + abort(403) + + request_json = request.get_json() + + temperature = request_json.get("temperature") + humidity = request_json.get("humidity") + + if temperature is None and humidity is None: + abort(400) + + if temperature is not None: + node.add_temperature_reading(temperature) + + if humidity is not None: + node.add_humidity_reading(humidity) + + return "OK" diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..be8635c --- /dev/null +++ b/src/main.py @@ -0,0 +1,38 @@ +from re import L +from flask import Flask, request + +from api.node import node_reading, node_register + +import json + +app = Flask(__name__) + +state = { + "nodes": {}, + "max_id": 0 +} + +@app.route("/") +def test(): + out = "" + for node in state["nodes"].values(): + most_recent_temperature = node.get_temperature_readings()[-1] + most_recent_humidity = node.get_humidity_readings()[-1] + + out += f"

{node.get_name()}

\n" + out += f"Temperature: {most_recent_temperature[0]}C Humidity: {most_recent_humidity[0]}%\n" + out += "

Temperature Readings

\n" + out += f"{json.dumps(node.get_temperature_readings())}\n" + out += "

Humidity Readings

\n" + out += f"{json.dumps(node.get_humidity_readings())}\n" + + return out + +# API functions +@app.route("/api/register", methods=["POST"]) +def route_api_register(): + return node_register(request, state) + +@app.route("/api//reading", methods=["POST"]) +def route_api_reading(node_id: int): + return node_reading(node_id, request, state)