80 lines
2.6 KiB
Python
80 lines
2.6 KiB
Python
from typing import Any
|
|
|
|
|
|
class AppError(Exception):
|
|
"""Basisklasse für alle eigenen Fehler dieser App"""
|
|
def __init__(self, message: str = "Ein unerwarteter Fehler ist aufgetreten."):
|
|
self.message = message
|
|
super().__init__(self.message)
|
|
|
|
|
|
# ==========================================
|
|
# 1. Datenbank- & Ressourcen-Fehler
|
|
# ==========================================
|
|
|
|
class DatabaseError(AppError):
|
|
"""Basisklasse für Datenbank-bezogene Fehler"""
|
|
pass
|
|
|
|
|
|
class NotFoundError(DatabaseError):
|
|
"""Ein angefragter Datensatz existiert nicht"""
|
|
def __init__(self, resource: str = "Ressource", identifier: Any = None):
|
|
if identifier:
|
|
msg = f"{resource} mit ID/Kennung '{identifier}' wurde nicht gefunden."
|
|
else:
|
|
msg = f"{resource} wurde nicht gefunden."
|
|
super().__init__(msg)
|
|
|
|
|
|
class AlreadyExistsError(DatabaseError):
|
|
"""Ein Unique-Constraint wurde verletzt (z. B. doppelte E-Mail)"""
|
|
def __init__(self, resource: str = "Ressource", field: str = "Eintrag", value: Any = None):
|
|
if value:
|
|
msg = f"{resource} mit {field} '{value}' existiert bereits."
|
|
else:
|
|
msg = f"{resource} existiert bereits."
|
|
super().__init__(msg)
|
|
|
|
|
|
# Domänen-spezifische Ressourcen-Fehler
|
|
class UserNotFoundError(NotFoundError):
|
|
def __init__(self, identifier: Any = None):
|
|
super().__init__(resource="User", identifier=identifier)
|
|
|
|
|
|
class UserAlreadyExistsError(AlreadyExistsError):
|
|
def __init__(self, field: str = "E-Mail", value: Any = None):
|
|
super().__init__(resource="User", field=field, value=value)
|
|
|
|
|
|
# ==========================================
|
|
# 2. Authentifizierung & Autorisierung
|
|
# ==========================================
|
|
|
|
class AuthError(AppError):
|
|
"""Basisklasse für Authentifizierungs- und Rechte-Fehler"""
|
|
pass
|
|
|
|
|
|
class UnauthorizedError(AuthError):
|
|
"""Ungültiges Token oder falsche Login-Daten"""
|
|
def __init__(self, message: str = "Ungültige Anmeldedaten oder Token abgelaufen."):
|
|
super().__init__(message)
|
|
|
|
|
|
class ForbiddenError(AuthError):
|
|
"""Fehlende Berechtigungen (z.B. Kein Admin)"""
|
|
def __init__(self, message: str = "Unzureichende Berechtigungen für diese Aktion."):
|
|
super().__init__(message)
|
|
|
|
|
|
# ==========================================
|
|
# 3. Validierungsfehler (Business Logic)
|
|
# ==========================================
|
|
|
|
class ValidationError(AppError):
|
|
"""Fehler in der Business-Logik (unabhängig von Pydantic)"""
|
|
def __init__(self, message: str = "Ungültige Eingabedaten."):
|
|
super().__init__(message)
|