Files
boc/landvex-admin-backend/app/core/exceptions.py
T
Bernt aee0f09db8 landvex: Fixar och tester klara för alla komponenter
- Datafabrik: Dockerfile fix, agentorkestrering fungerar
- Vision: Identify-modell, FAISS, OCR alla testade
- API: Alla 7 integrationstester passerade
- Upplösare: Entitetsupplösning verifierad
2026-07-05 06:41:32 +00:00

101 lines
3.2 KiB
Python

"""
LandveX Admin Backend — Custom Exceptions
"""
from fastapi import HTTPException, status
from typing import Optional, Dict, Any
class LandvexException(Exception):
"""Base exception for LandveX application."""
def __init__(
self,
message: str,
status_code: int = 500,
details: Optional[Dict[str, Any]] = None
):
self.message = message
self.status_code = status_code
self.details = details or {}
super().__init__(self.message)
class TenantNotFoundException(LandvexException):
"""Raised when a tenant is not found."""
def __init__(self, tenant_id: str):
super().__init__(
message=f"Tenant not found: {tenant_id}",
status_code=status.HTTP_404_NOT_FOUND,
details={"tenant_id": tenant_id}
)
class TenantAlreadyExistsException(LandvexException):
"""Raised when attempting to create a tenant that already exists."""
def __init__(self, identifier: str, field: str = "slug"):
super().__init__(
message=f"Tenant with {field} '{identifier}' already exists",
status_code=status.HTTP_409_CONFLICT,
details={"field": field, "value": identifier}
)
class TenantValidationException(LandvexException):
"""Raised when tenant data validation fails."""
def __init__(self, message: str, field: Optional[str] = None):
details = {}
if field:
details["field"] = field
super().__init__(
message=message,
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
details=details
)
class TenantSchemaException(LandvexException):
"""Raised when tenant schema operations fail."""
def __init__(self, tenant_id: str, operation: str, original_error: str):
super().__init__(
message=f"Schema operation '{operation}' failed for tenant {tenant_id}: {original_error}",
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
details={"tenant_id": tenant_id, "operation": operation}
)
class UnauthorizedTenantAccessException(LandvexException):
"""Raised when a user tries to access a tenant they don't have permission for."""
def __init__(self, tenant_id: str, user_id: str):
super().__init__(
message=f"User {user_id} is not authorized to access tenant {tenant_id}",
status_code=status.HTTP_403_FORBIDDEN,
details={"tenant_id": tenant_id, "user_id": user_id}
)
class AuditLogException(LandvexException):
"""Raised when audit logging fails."""
def __init__(self, operation: str, original_error: str):
super().__init__(
message=f"Audit logging failed for operation '{operation}': {original_error}",
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
details={"operation": operation}
)
def http_exception_handler(exc: LandvexException) -> HTTPException:
"""Convert LandvexException to FastAPI HTTPException."""
return HTTPException(
status_code=exc.status_code,
detail={
"error": exc.message,
"details": exc.details
}
)