implement recent data endpoint

This commit is contained in:
Michi 2025-04-09 10:34:30 +02:00
parent 49b01c269a
commit 2c1a95c1a5
3 changed files with 54 additions and 7 deletions

View file

@ -1,5 +1,7 @@
# Webservice # Webservice
Venv aktivieren: venv\Scripts\activate
Developer Mode starten: fastapi dev webservice.py Developer Mode starten: fastapi dev webservice.py
SHA256 Hash generieren: echo -n "string" | shasum -a 256 SHA256 Hash generieren: echo -n "string" | shasum -a 256

View file

@ -2,7 +2,8 @@ import os
from sqlmodel import create_engine, Session from sqlmodel import create_engine, Session
from dotenv import load_dotenv from dotenv import load_dotenv
from models import User, SensorData, Client, Session as SessionModel from models import User, SensorData, Client, Session as SessionModel
from datetime import datetime from datetime import datetime, timedelta
from typing import List, Optional
# Lade Umgebungsvariablen # Lade Umgebungsvariablen
@ -12,6 +13,13 @@ DB_CONNECTION_STRING = os.getenv("DB_CONNECTION_STRING", "postgresql://user:pass
# SQLAlchemy Setup # SQLAlchemy Setup
engine = create_engine(DB_CONNECTION_STRING, echo=True) engine = create_engine(DB_CONNECTION_STRING, echo=True)
def get_db():
db = Session(bind=engine)
try:
yield db
finally:
db.close()
# Funktion zum Speichern von Sensordaten # Funktion zum Speichern von Sensordaten
def save_sensor_data(db: Session, sensor_data: SensorData): def save_sensor_data(db: Session, sensor_data: SensorData):
db.add(sensor_data) # Das Pydantic-Modell kann direkt hinzugefügt werden db.add(sensor_data) # Das Pydantic-Modell kann direkt hinzugefügt werden
@ -57,3 +65,10 @@ def save_token_to_db(db: Session, token: str, user_id: int, valid_until: datetim
db.add(new_session) db.add(new_session)
db.commit() db.commit()
db.refresh(new_session) db.refresh(new_session)
def get_recent_sensor_data(db: Session, client_id: int, start_date: datetime, end_date: datetime) -> List[SensorData]:
return db.query(SensorData).filter(
SensorData.timestamp >= start_date,
SensorData.timestamp < end_date, # Das end_date sollte exklusiv sein
SensorData.clientid == client_id
).all()

View file

@ -2,14 +2,13 @@
# INP21b - Timo Weber & Michael von Ah # INP21b - Timo Weber & Michael von Ah
################ IMPORTS ################ ################ IMPORTS ################
from fastapi import FastAPI, Depends, HTTPException, Header, Body from fastapi import FastAPI, Depends, HTTPException, Header, Body, Query
from sqlmodel import Session from sqlmodel import Session
from dbfunctions import save_sensor_data, get_client_id_by_name, validate_token_with_access, engine, save_token_to_db from dbfunctions import List, Optional, get_db, save_sensor_data, get_client_id_by_name, validate_token_with_access, engine, save_token_to_db, get_recent_sensor_data
from models import SensorDataIn, SensorData, MessageOnly, User, TokenResponse, Session as SessionModel from models import SensorDataIn, SensorData, MessageOnly, User, TokenResponse, Session as SessionModel
from datetime import datetime, timedelta from datetime import datetime, timedelta
from crypto import hash_password, generate_new_token from crypto import hash_password, generate_new_token
################ API ################ ################ API ################
app = FastAPI( app = FastAPI(
title="BBZW-Horizon", title="BBZW-Horizon",
@ -82,3 +81,34 @@ async def generate_token(
# Rückgabe des Tokens und des Ablaufdatums # Rückgabe des Tokens und des Ablaufdatums
return TokenResponse(token=new_token, validuntil=valid_until) return TokenResponse(token=new_token, validuntil=valid_until)
@app.get("/sensors/recent-data", response_model=List[SensorData], tags=["sensors"])
async def get_recent_sensor_data_endpoint(
client: str,
token: str = Header(...), # Token aus dem Header lesen
end_date: Optional[datetime] = Query(None), # Optionales Datum-Parameter
db: Session = Depends(get_db)
):
# Authentifiziere den Benutzer
if not validate_token_with_access(db, token):
raise HTTPException(status_code=401, detail="Invalid or expired token, or insufficient permissions")
# Ermittle die clientid basierend auf dem Client-Namen
client_id = get_client_id_by_name(db, client)
if client_id is None:
raise HTTPException(status_code=404, detail="Client not found")
# Setze den end_date auf heute, falls keiner übergeben wird
if end_date is None:
end_date = datetime.now()
# Berechne den Startzeitpunkt (24 Stunden vor dem end_date)
start_time = end_date - timedelta(days=1)
# Hole die Sensordaten im angegebenen Zeitraum
recent_data = get_recent_sensor_data(db, client_id, start_time, end_date)
if not recent_data:
raise HTTPException(status_code=404, detail="No sensor data found in the specified time range.")
return recent_data # Rückgabe als JSON