mirror of
https://github.com/michivonah/bbzw-horizon.git
synced 2025-12-22 17:16:27 +01:00
implement recent data endpoint
This commit is contained in:
parent
49b01c269a
commit
2c1a95c1a5
3 changed files with 54 additions and 7 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -56,4 +64,11 @@ def save_token_to_db(db: Session, token: str, user_id: int, valid_until: datetim
|
||||||
new_session = SessionModel(token=token, validuntil=valid_until, userid=user_id)
|
new_session = SessionModel(token=token, validuntil=valid_until, userid=user_id)
|
||||||
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()
|
||||||
|
|
@ -2,13 +2,12 @@
|
||||||
# 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(
|
||||||
|
|
@ -81,4 +80,35 @@ async def generate_token(
|
||||||
db.refresh(new_session)
|
db.refresh(new_session)
|
||||||
|
|
||||||
# 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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue