- Add comprehensive unit tests for FeatureService (24 tests) - Add comprehensive unit tests for UsageService (11 tests) - Fix API-002/API-003 architecture violations in feature/usage APIs - Move database queries from API layer to service layer - Create UsageService for usage and limits management - Create custom exceptions (FeatureNotFoundError, TierNotFoundError) - Fix ValidationException usage in content_pages.py - Refactor vendor features API to use proper response models - All 35 new tests passing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
471 lines
14 KiB
Python
471 lines
14 KiB
Python
# app/exceptions/__init__.py
|
|
"""
|
|
Custom exception classes for the API.
|
|
|
|
This module provides frontend-friendly exceptions with consistent error codes,
|
|
messages, and HTTP status mappings.
|
|
"""
|
|
|
|
# Admin exceptions
|
|
from .admin import (
|
|
AdminOperationException,
|
|
BulkOperationException,
|
|
CannotModifyAdminException,
|
|
CannotModifySelfException,
|
|
ConfirmationRequiredException,
|
|
InvalidAdminActionException,
|
|
UserCannotBeDeletedException,
|
|
UserNotFoundException,
|
|
UserRoleChangeException,
|
|
UserStatusChangeException,
|
|
VendorVerificationException,
|
|
)
|
|
|
|
# Authentication exceptions
|
|
from .auth import (
|
|
AdminRequiredException,
|
|
InsufficientPermissionsException,
|
|
InvalidCredentialsException,
|
|
InvalidTokenException,
|
|
TokenExpiredException,
|
|
UserAlreadyExistsException,
|
|
UserNotActiveException,
|
|
)
|
|
|
|
# Base exceptions
|
|
from .base import (
|
|
AuthenticationException,
|
|
AuthorizationException,
|
|
BusinessLogicException,
|
|
ConflictException,
|
|
ExternalServiceException,
|
|
RateLimitException,
|
|
ResourceNotFoundException,
|
|
ServiceUnavailableException,
|
|
ValidationException,
|
|
WizamartException,
|
|
)
|
|
|
|
# Billing exceptions
|
|
from .billing import (
|
|
InvalidWebhookSignatureException,
|
|
NoActiveSubscriptionException,
|
|
PaymentSystemNotConfiguredException,
|
|
StripePriceNotConfiguredException,
|
|
SubscriptionAlreadyCancelledException,
|
|
SubscriptionNotCancelledException,
|
|
TierNotFoundException,
|
|
WebhookMissingSignatureException,
|
|
)
|
|
|
|
# Cart exceptions
|
|
from .cart import (
|
|
CartItemNotFoundException,
|
|
CartValidationException,
|
|
EmptyCartException,
|
|
InsufficientInventoryForCartException,
|
|
InvalidCartQuantityException,
|
|
ProductNotAvailableForCartException,
|
|
)
|
|
|
|
# Code quality exceptions
|
|
from .code_quality import (
|
|
InvalidViolationStatusException,
|
|
ScanExecutionException,
|
|
ScanNotFoundException,
|
|
ScanParseException,
|
|
ScanTimeoutException,
|
|
ViolationNotFoundException,
|
|
ViolationOperationException,
|
|
)
|
|
|
|
# Company exceptions
|
|
from .company import (
|
|
CompanyAlreadyExistsException,
|
|
CompanyHasVendorsException,
|
|
CompanyNotActiveException,
|
|
CompanyNotFoundException,
|
|
CompanyNotVerifiedException,
|
|
CompanyValidationException,
|
|
InvalidCompanyDataException,
|
|
UnauthorizedCompanyAccessException,
|
|
)
|
|
|
|
# Customer exceptions
|
|
from .customer import (
|
|
CustomerAlreadyExistsException,
|
|
CustomerAuthorizationException,
|
|
CustomerNotActiveException,
|
|
CustomerNotFoundException,
|
|
CustomerValidationException,
|
|
DuplicateCustomerEmailException,
|
|
InvalidCustomerCredentialsException,
|
|
)
|
|
|
|
# Invoice exceptions
|
|
from .invoice import (
|
|
InvoiceNotFoundException,
|
|
InvoicePDFGenerationException,
|
|
InvoicePDFNotFoundException,
|
|
InvoiceSettingsAlreadyExistException,
|
|
InvoiceSettingsNotFoundException,
|
|
InvoiceValidationException,
|
|
InvalidInvoiceStatusTransitionException,
|
|
OrderNotFoundException as OrderNotFoundForInvoiceException,
|
|
)
|
|
|
|
# Inventory exceptions
|
|
from .inventory import (
|
|
InsufficientInventoryException,
|
|
InvalidInventoryOperationException,
|
|
InvalidQuantityException,
|
|
InventoryNotFoundException,
|
|
InventoryValidationException,
|
|
LocationNotFoundException,
|
|
NegativeInventoryException,
|
|
)
|
|
|
|
# Message exceptions
|
|
from .message import (
|
|
AttachmentNotFoundException,
|
|
ConversationClosedException,
|
|
ConversationNotFoundException,
|
|
InvalidConversationTypeException,
|
|
InvalidRecipientTypeException,
|
|
MessageAttachmentException,
|
|
MessageNotFoundException,
|
|
UnauthorizedConversationAccessException,
|
|
)
|
|
|
|
# Marketplace import job exceptions
|
|
from .marketplace_import_job import (
|
|
ImportJobAlreadyProcessingException,
|
|
ImportJobCannotBeCancelledException,
|
|
ImportJobCannotBeDeletedException,
|
|
ImportJobNotFoundException,
|
|
ImportJobNotOwnedException,
|
|
ImportRateLimitException,
|
|
InvalidImportDataException,
|
|
InvalidMarketplaceException,
|
|
MarketplaceConnectionException,
|
|
MarketplaceDataParsingException,
|
|
MarketplaceImportException,
|
|
)
|
|
|
|
# Marketplace product exceptions
|
|
from .marketplace_product import (
|
|
InvalidGTINException,
|
|
InvalidMarketplaceProductDataException,
|
|
MarketplaceProductAlreadyExistsException,
|
|
MarketplaceProductCSVImportException,
|
|
MarketplaceProductNotFoundException,
|
|
MarketplaceProductValidationException,
|
|
)
|
|
|
|
# Order exceptions
|
|
from .order import (
|
|
InvalidOrderStatusException,
|
|
OrderAlreadyExistsException,
|
|
OrderCannotBeCancelledException,
|
|
OrderNotFoundException,
|
|
OrderValidationException,
|
|
)
|
|
|
|
# Order item exception exceptions
|
|
from .order_item_exception import (
|
|
ExceptionAlreadyResolvedException,
|
|
InvalidProductForExceptionException,
|
|
OrderHasUnresolvedExceptionsException,
|
|
OrderItemExceptionNotFoundException,
|
|
)
|
|
|
|
# Product exceptions
|
|
from .product import (
|
|
CannotDeleteProductWithInventoryException,
|
|
CannotDeleteProductWithOrdersException,
|
|
InvalidProductDataException,
|
|
ProductAlreadyExistsException,
|
|
ProductNotActiveException,
|
|
ProductNotFoundException,
|
|
ProductNotInCatalogException,
|
|
ProductValidationException,
|
|
)
|
|
|
|
# Team exceptions
|
|
from .team import (
|
|
CannotModifyOwnRoleException,
|
|
CannotRemoveOwnerException,
|
|
InsufficientTeamPermissionsException,
|
|
InvalidInvitationDataException,
|
|
InvalidInvitationTokenException,
|
|
InvalidRoleException,
|
|
MaxTeamMembersReachedException,
|
|
RoleNotFoundException,
|
|
TeamInvitationAlreadyAcceptedException,
|
|
TeamInvitationExpiredException,
|
|
TeamInvitationNotFoundException,
|
|
TeamMemberAlreadyExistsException,
|
|
TeamMemberNotFoundException,
|
|
TeamValidationException,
|
|
UnauthorizedTeamActionException,
|
|
)
|
|
|
|
# Vendor exceptions
|
|
from .vendor import (
|
|
InsufficientVendorPermissionsException,
|
|
InvalidVendorDataException,
|
|
MaxVendorsReachedException,
|
|
UnauthorizedVendorAccessException,
|
|
VendorAccessDeniedException,
|
|
VendorAlreadyExistsException,
|
|
VendorNotActiveException,
|
|
VendorNotFoundException,
|
|
VendorNotVerifiedException,
|
|
VendorOwnerOnlyException,
|
|
VendorValidationException,
|
|
)
|
|
|
|
# Vendor domain exceptions
|
|
from .vendor_domain import (
|
|
DNSVerificationException,
|
|
DomainAlreadyVerifiedException,
|
|
DomainNotVerifiedException,
|
|
DomainVerificationFailedException,
|
|
InvalidDomainFormatException,
|
|
MaxDomainsReachedException,
|
|
MultiplePrimaryDomainsException,
|
|
ReservedDomainException,
|
|
UnauthorizedDomainAccessException,
|
|
VendorDomainAlreadyExistsException,
|
|
VendorDomainNotFoundException,
|
|
)
|
|
|
|
# Vendor theme exceptions
|
|
from .vendor_theme import (
|
|
InvalidColorFormatException,
|
|
InvalidFontFamilyException,
|
|
InvalidThemeDataException,
|
|
ThemeOperationException,
|
|
ThemePresetAlreadyAppliedException,
|
|
ThemePresetNotFoundException,
|
|
ThemeValidationException,
|
|
VendorThemeNotFoundException,
|
|
)
|
|
|
|
# Onboarding exceptions
|
|
from .onboarding import (
|
|
LetzshopConnectionFailedException,
|
|
OnboardingAlreadyCompletedException,
|
|
OnboardingCsvUrlRequiredException,
|
|
OnboardingNotFoundException,
|
|
OnboardingStepOrderException,
|
|
OnboardingSyncJobNotFoundException,
|
|
OnboardingSyncNotCompleteException,
|
|
)
|
|
|
|
# Feature management exceptions
|
|
from .feature import (
|
|
FeatureNotFoundError,
|
|
InvalidFeatureCodesError,
|
|
TierNotFoundError,
|
|
)
|
|
|
|
__all__ = [
|
|
# Base exceptions
|
|
"WizamartException",
|
|
"ValidationException",
|
|
"AuthenticationException",
|
|
"AuthorizationException",
|
|
"ResourceNotFoundException",
|
|
"ConflictException",
|
|
"BusinessLogicException",
|
|
"ExternalServiceException",
|
|
"RateLimitException",
|
|
"ServiceUnavailableException",
|
|
# Auth exceptions
|
|
"InvalidCredentialsException",
|
|
"TokenExpiredException",
|
|
"InvalidTokenException",
|
|
"InsufficientPermissionsException",
|
|
"UserNotActiveException",
|
|
"AdminRequiredException",
|
|
"UserAlreadyExistsException",
|
|
# Customer exceptions
|
|
"CustomerNotFoundException",
|
|
"CustomerAlreadyExistsException",
|
|
"DuplicateCustomerEmailException",
|
|
"CustomerNotActiveException",
|
|
"InvalidCustomerCredentialsException",
|
|
"CustomerValidationException",
|
|
"CustomerAuthorizationException",
|
|
# Team exceptions
|
|
"TeamMemberNotFoundException",
|
|
"TeamMemberAlreadyExistsException",
|
|
"TeamInvitationNotFoundException",
|
|
"TeamInvitationExpiredException",
|
|
"TeamInvitationAlreadyAcceptedException",
|
|
"UnauthorizedTeamActionException",
|
|
"CannotRemoveOwnerException",
|
|
"CannotModifyOwnRoleException",
|
|
"RoleNotFoundException",
|
|
"InvalidRoleException",
|
|
"InsufficientTeamPermissionsException",
|
|
"MaxTeamMembersReachedException",
|
|
"TeamValidationException",
|
|
"InvalidInvitationDataException",
|
|
"InvalidInvitationTokenException",
|
|
# Invoice exceptions
|
|
"InvoiceNotFoundException",
|
|
"InvoiceSettingsNotFoundException",
|
|
"InvoiceSettingsAlreadyExistException",
|
|
"InvoiceValidationException",
|
|
"InvoicePDFGenerationException",
|
|
"InvoicePDFNotFoundException",
|
|
"InvalidInvoiceStatusTransitionException",
|
|
"OrderNotFoundForInvoiceException",
|
|
# Inventory exceptions
|
|
"InventoryNotFoundException",
|
|
"InsufficientInventoryException",
|
|
"InvalidInventoryOperationException",
|
|
"InventoryValidationException",
|
|
"NegativeInventoryException",
|
|
"InvalidQuantityException",
|
|
"LocationNotFoundException",
|
|
# Vendor exceptions
|
|
"InsufficientVendorPermissionsException",
|
|
"InvalidVendorDataException",
|
|
"MaxVendorsReachedException",
|
|
"UnauthorizedVendorAccessException",
|
|
"VendorAccessDeniedException",
|
|
"VendorAlreadyExistsException",
|
|
"VendorNotActiveException",
|
|
"VendorNotFoundException",
|
|
"VendorNotVerifiedException",
|
|
"VendorOwnerOnlyException",
|
|
"VendorValidationException",
|
|
# Vendor Domain
|
|
"VendorDomainNotFoundException",
|
|
"VendorDomainAlreadyExistsException",
|
|
"InvalidDomainFormatException",
|
|
"ReservedDomainException",
|
|
"DomainNotVerifiedException",
|
|
"DomainVerificationFailedException",
|
|
"DomainAlreadyVerifiedException",
|
|
"MultiplePrimaryDomainsException",
|
|
"DNSVerificationException",
|
|
"MaxDomainsReachedException",
|
|
"UnauthorizedDomainAccessException",
|
|
# Vendor Theme
|
|
"VendorThemeNotFoundException",
|
|
"InvalidThemeDataException",
|
|
"ThemePresetNotFoundException",
|
|
"ThemeValidationException",
|
|
"ThemePresetAlreadyAppliedException",
|
|
"InvalidColorFormatException",
|
|
"InvalidFontFamilyException",
|
|
"ThemeOperationException",
|
|
# Product exceptions
|
|
"ProductNotFoundException",
|
|
"ProductAlreadyExistsException",
|
|
"ProductNotInCatalogException",
|
|
"ProductNotActiveException",
|
|
"InvalidProductDataException",
|
|
"ProductValidationException",
|
|
"CannotDeleteProductWithInventoryException",
|
|
"CannotDeleteProductWithOrdersException",
|
|
# Order exceptions
|
|
"OrderNotFoundException",
|
|
"OrderAlreadyExistsException",
|
|
"OrderValidationException",
|
|
"InvalidOrderStatusException",
|
|
"OrderCannotBeCancelledException",
|
|
# Order item exception exceptions
|
|
"OrderItemExceptionNotFoundException",
|
|
"OrderHasUnresolvedExceptionsException",
|
|
"ExceptionAlreadyResolvedException",
|
|
"InvalidProductForExceptionException",
|
|
# Cart exceptions
|
|
"CartItemNotFoundException",
|
|
"EmptyCartException",
|
|
"CartValidationException",
|
|
"InsufficientInventoryForCartException",
|
|
"InvalidCartQuantityException",
|
|
"ProductNotAvailableForCartException",
|
|
# Company exceptions
|
|
"CompanyNotFoundException",
|
|
"CompanyAlreadyExistsException",
|
|
"CompanyNotActiveException",
|
|
"CompanyNotVerifiedException",
|
|
"UnauthorizedCompanyAccessException",
|
|
"InvalidCompanyDataException",
|
|
"CompanyValidationException",
|
|
"CompanyHasVendorsException",
|
|
# MarketplaceProduct exceptions
|
|
"MarketplaceProductNotFoundException",
|
|
"MarketplaceProductAlreadyExistsException",
|
|
"InvalidMarketplaceProductDataException",
|
|
"MarketplaceProductValidationException",
|
|
"InvalidGTINException",
|
|
"MarketplaceProductCSVImportException",
|
|
# Marketplace import exceptions
|
|
"MarketplaceImportException",
|
|
"ImportJobNotFoundException",
|
|
"ImportJobNotOwnedException",
|
|
"InvalidImportDataException",
|
|
"ImportJobCannotBeCancelledException",
|
|
"ImportJobCannotBeDeletedException",
|
|
"MarketplaceConnectionException",
|
|
"MarketplaceDataParsingException",
|
|
"ImportRateLimitException",
|
|
"InvalidMarketplaceException",
|
|
"ImportJobAlreadyProcessingException",
|
|
# Admin exceptions
|
|
"UserNotFoundException",
|
|
"UserStatusChangeException",
|
|
"VendorVerificationException",
|
|
"AdminOperationException",
|
|
"CannotModifyAdminException",
|
|
"CannotModifySelfException",
|
|
"InvalidAdminActionException",
|
|
"BulkOperationException",
|
|
"ConfirmationRequiredException",
|
|
# Code quality exceptions
|
|
"ViolationNotFoundException",
|
|
"ScanNotFoundException",
|
|
"ScanExecutionException",
|
|
"ScanTimeoutException",
|
|
"ScanParseException",
|
|
"ViolationOperationException",
|
|
"InvalidViolationStatusException",
|
|
# Message exceptions
|
|
"ConversationNotFoundException",
|
|
"MessageNotFoundException",
|
|
"ConversationClosedException",
|
|
"MessageAttachmentException",
|
|
"UnauthorizedConversationAccessException",
|
|
"InvalidConversationTypeException",
|
|
"InvalidRecipientTypeException",
|
|
"AttachmentNotFoundException",
|
|
# Billing exceptions
|
|
"PaymentSystemNotConfiguredException",
|
|
"TierNotFoundException",
|
|
"StripePriceNotConfiguredException",
|
|
"NoActiveSubscriptionException",
|
|
"SubscriptionNotCancelledException",
|
|
"SubscriptionAlreadyCancelledException",
|
|
"InvalidWebhookSignatureException",
|
|
"WebhookMissingSignatureException",
|
|
# Onboarding exceptions
|
|
"OnboardingNotFoundException",
|
|
"OnboardingStepOrderException",
|
|
"OnboardingAlreadyCompletedException",
|
|
"LetzshopConnectionFailedException",
|
|
"OnboardingCsvUrlRequiredException",
|
|
"OnboardingSyncJobNotFoundException",
|
|
"OnboardingSyncNotCompleteException",
|
|
# Feature exceptions
|
|
"FeatureNotFoundError",
|
|
"TierNotFoundError",
|
|
"InvalidFeatureCodesError",
|
|
]
|