# app/exceptions/product.py """ Product management specific exceptions. """ from typing import Any, Dict, Optional from .base import ResourceNotFoundException, ConflictException, ValidationException, BusinessLogicException class ProductNotFoundException(ResourceNotFoundException): """Raised when a product is not found.""" def __init__(self, product_id: str): super().__init__( resource_type="Product", identifier=product_id, message=f"Product with ID '{product_id}' not found", error_code="PRODUCT_NOT_FOUND", ) class ProductAlreadyExistsException(ConflictException): """Raised when trying to create a product that already exists.""" def __init__(self, product_id: str): super().__init__( message=f"Product with ID '{product_id}' already exists", error_code="PRODUCT_ALREADY_EXISTS", details={"product_id": product_id}, ) class InvalidProductDataException(ValidationException): """Raised when product data is invalid.""" def __init__( self, message: str = "Invalid product data", field: Optional[str] = None, details: Optional[Dict[str, Any]] = None, ): super().__init__( message=message, field=field, details=details, ) self.error_code = "INVALID_PRODUCT_DATA" class ProductValidationException(ValidationException): """Raised when product validation fails.""" def __init__( self, message: str, field: Optional[str] = None, validation_errors: Optional[Dict[str, str]] = None, ): details = {} if validation_errors: details["validation_errors"] = validation_errors super().__init__( message=message, field=field, details=details, ) self.error_code = "PRODUCT_VALIDATION_FAILED" class InvalidGTINException(ValidationException): """Raised when GTIN format is invalid.""" def __init__(self, gtin: str, message: str = "Invalid GTIN format"): super().__init__( message=f"{message}: {gtin}", field="gtin", details={"gtin": gtin}, ) self.error_code = "INVALID_GTIN" class ProductCSVImportException(BusinessLogicException): """Raised when product CSV import fails.""" def __init__( self, message: str = "Product CSV import failed", row_number: Optional[int] = None, errors: Optional[Dict[str, Any]] = None, ): details = {} if row_number: details["row_number"] = row_number if errors: details["errors"] = errors super().__init__( message=message, error_code="PRODUCT_CSV_IMPORT_FAILED", details=details, )