diff --git a/webservice/README.md b/webservice/README.md index cd89eba..630a13e 100644 --- a/webservice/README.md +++ b/webservice/README.md @@ -1,5 +1,7 @@ # Webservice +Venv aktivieren: venv\Scripts\activate + Developer Mode starten: fastapi dev webservice.py SHA256 Hash generieren: echo -n "string" | shasum -a 256 diff --git a/webservice/dbfunctions.py b/webservice/dbfunctions.py index 2e379b7..77625b0 100644 --- a/webservice/dbfunctions.py +++ b/webservice/dbfunctions.py @@ -2,7 +2,8 @@ import os from sqlmodel import create_engine, Session from dotenv import load_dotenv 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 @@ -12,6 +13,13 @@ DB_CONNECTION_STRING = os.getenv("DB_CONNECTION_STRING", "postgresql://user:pass # SQLAlchemy Setup 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 def save_sensor_data(db: Session, sensor_data: SensorData): 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) db.add(new_session) db.commit() - db.refresh(new_session) \ No newline at end of file + 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() \ No newline at end of file diff --git a/webservice/webservice.py b/webservice/webservice.py index fe0a2fa..335f0b2 100644 --- a/webservice/webservice.py +++ b/webservice/webservice.py @@ -2,13 +2,12 @@ # INP21b - Timo Weber & Michael von Ah ################ IMPORTS ################ -from fastapi import FastAPI, Depends, HTTPException, Header, Body +from fastapi import FastAPI, Depends, HTTPException, Header, Body, Query 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 datetime import datetime, timedelta -from crypto import hash_password, generate_new_token - +from crypto import hash_password, generate_new_token ################ API ################ app = FastAPI( @@ -81,4 +80,35 @@ async def generate_token( db.refresh(new_session) # Rückgabe des Tokens und des Ablaufdatums - return TokenResponse(token=new_token, validuntil=valid_until) \ No newline at end of file + 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 \ No newline at end of file