# app/modules/prospecting/exceptions.py """ Prospecting module exceptions. """ from app.exceptions.base import ( BusinessLogicException, ExternalServiceException, ResourceNotFoundException, ) class ProspectNotFoundException(ResourceNotFoundException): # noqa: MOD025 """Raised when a prospect is not found.""" def __init__(self, identifier: str): super().__init__( resource_type="Prospect", identifier=identifier, ) class ScanJobNotFoundException(ResourceNotFoundException): # noqa: MOD025 """Raised when a scan job is not found.""" def __init__(self, identifier: str): super().__init__( resource_type="ScanJob", identifier=identifier, ) class CampaignTemplateNotFoundException(ResourceNotFoundException): # noqa: MOD025 """Raised when a campaign template is not found.""" def __init__(self, identifier: str): super().__init__( resource_type="CampaignTemplate", identifier=identifier, ) class DuplicateDomainException(BusinessLogicException): # noqa: MOD025 """Raised when trying to create a prospect with a domain that already exists.""" def __init__(self, domain_name: str): super().__init__( message=f"A prospect with domain '{domain_name}' already exists", error_code="DUPLICATE_DOMAIN", ) class ScanFailedException(ExternalServiceException): # noqa: MOD025 """Raised when an enrichment scan fails.""" def __init__(self, scan_type: str, domain: str, reason: str): super().__init__( message=f"{scan_type} scan failed for {domain}: {reason}", service_name=f"prospecting_{scan_type}", ) class CampaignRenderException(BusinessLogicException): # noqa: MOD025 """Raised when campaign template rendering fails.""" def __init__(self, template_id: int, reason: str): super().__init__( message=f"Failed to render campaign template {template_id}: {reason}", error_code="CAMPAIGN_RENDER_FAILED", ) __all__ = [ "ProspectNotFoundException", "ScanJobNotFoundException", "CampaignTemplateNotFoundException", "DuplicateDomainException", "ScanFailedException", "CampaignRenderException", ]