# app/exceptions/code_quality.py """ Code Quality Domain Exceptions These exceptions are raised by the code quality service layer and converted to HTTP responses by the global exception handler. """ from app.exceptions.base import ( BusinessLogicException, ExternalServiceException, ResourceNotFoundException, ValidationException, ) class ViolationNotFoundException(ResourceNotFoundException): """Raised when a violation is not found.""" def __init__(self, violation_id: int): super().__init__( resource_type="Violation", identifier=str(violation_id), error_code="VIOLATION_NOT_FOUND", ) class ScanNotFoundException(ResourceNotFoundException): """Raised when a scan is not found.""" def __init__(self, scan_id: int): super().__init__( resource_type="Scan", identifier=str(scan_id), error_code="SCAN_NOT_FOUND", ) class ScanExecutionException(ExternalServiceException): """Raised when architecture scan execution fails.""" def __init__(self, reason: str): super().__init__( service_name="ArchitectureValidator", message=f"Scan execution failed: {reason}", error_code="SCAN_EXECUTION_FAILED", ) class ScanTimeoutException(ExternalServiceException): """Raised when architecture scan times out.""" def __init__(self, timeout_seconds: int = 300): super().__init__( service_name="ArchitectureValidator", message=f"Scan timed out after {timeout_seconds} seconds", error_code="SCAN_TIMEOUT", ) class ScanParseException(BusinessLogicException): """Raised when scan results cannot be parsed.""" def __init__(self, reason: str): super().__init__( message=f"Failed to parse scan results: {reason}", error_code="SCAN_PARSE_FAILED", ) class ViolationOperationException(BusinessLogicException): """Raised when a violation operation fails.""" def __init__(self, operation: str, violation_id: int, reason: str): super().__init__( message=f"Failed to {operation} violation {violation_id}: {reason}", error_code="VIOLATION_OPERATION_FAILED", details={ "operation": operation, "violation_id": violation_id, "reason": reason, }, ) class InvalidViolationStatusException(ValidationException): """Raised when a violation status transition is invalid.""" def __init__(self, violation_id: int, current_status: str, target_status: str): super().__init__( message=f"Cannot change violation {violation_id} from '{current_status}' to '{target_status}'", field="status", value=target_status, ) self.error_code = "INVALID_VIOLATION_STATUS"