bbzw-horizon/webservice/webservice.py
2025-03-26 08:39:47 +01:00

94 lines
2.8 KiB
Python

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy import Column, Integer, Float, String, DateTime, create_engine, ForeignKey
from sqlalchemy.orm import sessionmaker, declarative_base, Session, relationship
from datetime import datetime
import os
DATABASE_URL = os.getenv("DB_CONNECTION_STRING", "postgresql://user:password@localhost/sensordb")
Base = declarative_base()
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
app = FastAPI()
# Neue Clients-Tabelle
class Client(Base):
__tablename__ = "clients"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, unique=True, index=True)
class SensorData(Base):
__tablename__ = "sensor_data"
id = Column(Integer, primary_key=True, index=True)
clientid = Column(Integer, ForeignKey("clients.id"), index=True)
timestamp = Column(DateTime, default=datetime.utcnow)
temperature = Column(Float)
humidity = Column(Float)
pressure = Column(Float)
voc = Column(Float)
gas = Column(Float)
client = relationship("Client")
class SessionToken(Base):
__tablename__ = "sessions"
id = Column(Integer, primary_key=True, index=True)
token = Column(String, unique=True, index=True)
validuntil = Column(DateTime)
userid = Column(Integer, ForeignKey("user.id"))
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
def verify_token(token: str, db: Session):
session = db.query(SessionToken).filter(SessionToken.token == token).first()
if not session or session.validuntil < datetime.utcnow():
raise HTTPException(status_code=401, detail="Invalid or expired token")
return session
@app.post("/sensor-data/")
def receive_sensor_data(
token: str,
clientname: str, # Ändert clientid zu clientname
temperature: float,
humidity: float,
pressure: float,
voc: float,
gas: float,
db: Session = Depends(get_db)
):
verify_token(token, db)
# Suche die Client-ID anhand des Client-Namens
client = db.query(Client).filter(Client.name == clientname).first()
if not client:
raise HTTPException(status_code=404, detail="Client not found")
sensor_data = SensorData(
clientid=client.id, # Verwende die gefundene ID
temperature=temperature,
humidity=humidity,
pressure=pressure,
voc=voc,
gas=gas
)
db.add(sensor_data)
db.commit()
db.refresh(sensor_data)
return {"message": "Data received", "id": sensor_data.id}
@app.get("/sensor-data/")
def get_sensor_data(db: Session = Depends(get_db)):
data = db.query(SensorData).all()
return data
# Erstelle die Tabellen, falls sie noch nicht existieren
Base.metadata.create_all(bind=engine)