103 lines
3.4 KiB
Python
103 lines
3.4 KiB
Python
# server/wsgi.py
|
||
import glob
|
||
import os
|
||
from flask import Flask, jsonify, send_from_directory, request
|
||
from sqlalchemy.orm import sessionmaker
|
||
from sqlalchemy import create_engine, and_
|
||
from models import Client, Base, Event
|
||
|
||
DB_USER = os.getenv("DB_USER")
|
||
DB_PASSWORD = os.getenv("DB_PASSWORD")
|
||
DB_HOST = os.getenv("DB_HOST")
|
||
DB_NAME = os.getenv("DB_NAME")
|
||
|
||
# Datenbank-Engine und Session anlegen (passe ggf. die DB-URL an)
|
||
DB_URL = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}"
|
||
engine = create_engine(DB_URL, echo=False)
|
||
Session = sessionmaker(bind=engine)
|
||
|
||
app = Flask(__name__)
|
||
|
||
@app.route("/health")
|
||
def health():
|
||
return jsonify(status="ok")
|
||
|
||
# Optional: Test-Route
|
||
@app.route("/")
|
||
def index():
|
||
return "Hello from Infoscreen‐API!"
|
||
|
||
# (Weitere Endpunkte, Blueprints, Datenbank-Initialisierung usw. kommen hierher)
|
||
@app.route("/screenshots/<uuid>")
|
||
def get_screenshot(uuid):
|
||
"""Liefert den aktuellen Screenshot für die angegebene UUID zurück."""
|
||
print(f"Anfrage für Screenshot mit UUID: {uuid}")
|
||
pattern = os.path.join("screenshots", f"{uuid}*.jpg")
|
||
files = glob.glob(pattern)
|
||
if not files:
|
||
return jsonify({"error": "Screenshot not found"}), 404
|
||
# Es gibt nur eine Datei pro UUID
|
||
filename = os.path.basename(files[0])
|
||
print(filename)
|
||
print("Arbeitsverzeichnis:", os.getcwd())
|
||
print("Suchmuster:", pattern)
|
||
print("Gefundene Dateien:", files)
|
||
return send_from_directory("screenshots", filename)
|
||
|
||
@app.route("/api/clients")
|
||
def get_clients():
|
||
# from models import Client # Import lokal, da im selben Container
|
||
print("Abrufen der Clients aus der Datenbank...")
|
||
session = Session()
|
||
clients = session.query(Client).all()
|
||
result = [
|
||
{
|
||
"uuid": c.uuid,
|
||
"location": c.location,
|
||
"hardware_hash": c.hardware_hash,
|
||
"ip_address": c.ip_address,
|
||
"last_alive": c.last_alive.isoformat() if c.last_alive else None
|
||
}
|
||
for c in clients
|
||
]
|
||
session.close()
|
||
return jsonify(result)
|
||
|
||
@app.route("/api/events")
|
||
def get_events():
|
||
"""
|
||
Liefert Events für einen Zeitraum (start, end) als FullCalendar-kompatible Objekte.
|
||
Query-Parameter: start, end (ISO-Format), optional: client_uuid
|
||
"""
|
||
session = Session()
|
||
start = request.args.get("start")
|
||
end = request.args.get("end")
|
||
client_uuid = request.args.get("client_uuid")
|
||
query = session.query(Event).filter(Event.is_active == True)
|
||
if start and end:
|
||
query = query.filter(and_(Event.start < end, Event.end > start))
|
||
if client_uuid:
|
||
query = query.filter(Event.client_uuid == client_uuid)
|
||
events = query.all()
|
||
result = []
|
||
for e in events:
|
||
result.append({
|
||
"id": str(e.id),
|
||
"title": e.title,
|
||
"start": e.start.isoformat() if e.start else None,
|
||
"end": e.end.isoformat() if e.end else None,
|
||
"allDay": False,
|
||
"classNames": [e.event_type.value] if e.event_type else [],
|
||
"extendedProps": {
|
||
"description": e.description,
|
||
"client_uuid": e.client_uuid,
|
||
"event_type": e.event_type.value if e.event_type else None,
|
||
"created_by": e.created_by,
|
||
"updated_by": e.updated_by,
|
||
}
|
||
})
|
||
session.close()
|
||
return jsonify(result)
|
||
|
||
if __name__ == "__main__":
|
||
app.run(host="0.0.0.0", port=8000, debug=True) |