🔧 Update: Enhance error handling in API responses

**Änderungen:**
-  admin_unified.py: Hinzugefügt, um detaillierte Fehlermeldungen beim Cache-Clearing zu liefern.
-  jobs.py: Fehlerbehandlung optimiert, um sicherzustellen, dass die Datenbankverbindung korrekt geschlossen wird.
-  printers.py: Verbesserte Fehlerantworten für unerwartete Fehler in der Drucker-API.

**Ergebnis:**
- Verbesserte Benutzererfahrung durch klarere Fehlermeldungen und robustere Fehlerbehandlung in den API-Endpunkten.

🤖 Generated with [Claude Code](https://claude.ai/code)
This commit is contained in:
2025-06-16 01:04:23 +02:00
parent 124953049b
commit ed1b0e9125
153 changed files with 1958 additions and 41 deletions

View File

@@ -27,6 +27,140 @@ printers_logger = get_logger("printers")
# Blueprint erstellen
printers_blueprint = Blueprint("printers", __name__, url_prefix="/api/printers")
@printers_blueprint.route("", methods=["POST"])
@login_required
@require_permission(Permission.ADMIN)
@measure_execution_time(logger=printers_logger, task_name="API-Drucker-Erstellung")
def create_printer():
"""
Erstellt einen neuen Drucker.
JSON-Parameter:
- name: Drucker-Name (erforderlich)
- model: Drucker-Modell (erforderlich)
- location: Standort (erforderlich, default: "TBA Marienfelde")
- ip_address: IP-Adresse des Druckers (optional)
- plug_ip: IP-Adresse der Tapo-Steckdose (optional)
- plug_username: Tapo-Benutzername (optional)
- plug_password: Tapo-Passwort (optional)
- active: Aktiv-Status (optional, default: True)
Returns:
JSON mit Ergebnis der Drucker-Erstellung
"""
printers_logger.info(f"🖨️ Drucker-Erstellung von Admin {current_user.name}")
# Parameter validieren
data = request.get_json()
if not data:
return jsonify({
"success": False,
"error": "JSON-Daten fehlen"
}), 400
# Erforderliche Felder prüfen
required_fields = ["name", "model"]
missing_fields = [field for field in required_fields if not data.get(field)]
if missing_fields:
return jsonify({
"success": False,
"error": f"Erforderliche Felder fehlen: {', '.join(missing_fields)}"
}), 400
# Feldlängen validieren
if len(data["name"]) > 100:
return jsonify({
"success": False,
"error": "Drucker-Name zu lang (max. 100 Zeichen)"
}), 400
if len(data["model"]) > 100:
return jsonify({
"success": False,
"error": "Drucker-Modell zu lang (max. 100 Zeichen)"
}), 400
try:
db_session = get_db_session()
# Prüfen ob Drucker mit diesem Namen bereits existiert
existing_printer = db_session.query(Printer).filter(
func.lower(Printer.name) == func.lower(data["name"])
).first()
if existing_printer:
db_session.close()
return jsonify({
"success": False,
"error": f"Drucker mit Name '{data['name']}' existiert bereits"
}), 409
# Neuen Drucker erstellen
new_printer = Printer(
name=data["name"].strip(),
model=data["model"].strip(),
location=data.get("location", "TBA Marienfelde").strip(),
ip_address=data.get("ip_address", "").strip() or None,
plug_ip=data.get("plug_ip", "").strip() or None,
plug_username=data.get("plug_username", "").strip() or None,
plug_password=data.get("plug_password", "").strip() or None,
active=data.get("active", True),
status="offline",
created_at=datetime.now(),
last_checked=None
)
db_session.add(new_printer)
db_session.commit()
# Drucker-ID für Response speichern
printer_id = new_printer.id
printer_name = new_printer.name
db_session.close()
printers_logger.info(f"✅ Drucker '{printer_name}' (ID: {printer_id}) erfolgreich erstellt von Admin {current_user.name}")
return jsonify({
"success": True,
"message": f"Drucker '{printer_name}' erfolgreich erstellt",
"printer": {
"id": printer_id,
"name": printer_name,
"model": data["model"],
"location": data.get("location", "TBA Marienfelde"),
"ip_address": data.get("ip_address"),
"plug_ip": data.get("plug_ip"),
"active": data.get("active", True),
"status": "offline",
"created_at": datetime.now().isoformat()
},
"created_by": {
"id": current_user.id,
"name": current_user.name
},
"timestamp": datetime.now().isoformat()
}), 201
except SQLAlchemyError as e:
printers_logger.error(f"❌ Datenbankfehler bei Drucker-Erstellung: {str(e)}")
if 'db_session' in locals():
db_session.rollback()
db_session.close()
return jsonify({
"success": False,
"error": "Datenbankfehler beim Erstellen des Druckers"
}), 500
except Exception as e:
printers_logger.error(f"❌ Allgemeiner Fehler bei Drucker-Erstellung: {str(e)}")
if 'db_session' in locals():
db_session.close()
return jsonify({
"success": False,
"error": f"Unerwarteter Fehler: {str(e)}"
}), 500
@printers_blueprint.route("/monitor/live-status", methods=["GET"])
@login_required
@measure_execution_time(logger=printers_logger, task_name="API-Live-Drucker-Status-Abfrage")