"""Standardisierte HTTP-Exceptions — vermeidet inkonsistente Texte in 200+ raise-Statements.""" from fastapi import HTTPException def not_found(msg: str = "Nicht gefunden") -> HTTPException: """404. Beispiel: `raise not_found('Hund nicht gefunden')`.""" return HTTPException(404, msg) def forbidden(msg: str = "Kein Zugriff") -> HTTPException: """403.""" return HTTPException(403, msg) def bad_request(msg: str = "Ungültige Eingabe") -> HTTPException: """400.""" return HTTPException(400, msg) def unauthorized(msg: str = "Nicht angemeldet") -> HTTPException: """401.""" return HTTPException(401, msg) def conflict(msg: str = "Konflikt") -> HTTPException: """409.""" return HTTPException(409, msg) def too_many_requests(msg: str = "Zu viele Anfragen", retry_after: int | None = None) -> HTTPException: """429. Optional mit Retry-After Header (in Sekunden).""" headers = {"Retry-After": str(retry_after)} if retry_after else None return HTTPException(429, msg, headers=headers) def service_unavailable(msg: str = "Dienst gerade nicht verfügbar") -> HTTPException: """503.""" return HTTPException(503, msg) def require_or_404(row, msg: str = "Nicht gefunden"): """Convenience: wirft 404 wenn row None/falsy, sonst gibt row zurück. Beispiel: `dog = require_or_404(conn.execute(...).fetchone(), 'Hund nicht gefunden')`""" if not row: raise not_found(msg) return row