refactor: standardize modular architecture patterns

- Rename module definition variables to follow naming convention:
  - catalog/definition.py: module → catalog_module
  - checkout/definition.py: module → checkout_module
  - cart/definition.py: module → cart_module

- Add router attachment functions for lazy loading:
  - get_catalog_module_with_routers()
  - get_checkout_module_with_routers()
  - get_cart_module_with_routers()

- Move billing exceptions to exceptions.py:
  - Add backwards-compatible aliases (BillingServiceError, etc.)
  - Update billing_service.py to import from exceptions.py

- Standardize VendorEmailSettingsService DI pattern:
  - Change from db in __init__ to db as method parameter
  - Create singleton vendor_email_settings_service instance
  - Update routes and tests to use new pattern

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-03 18:40:03 +01:00
parent b769f5a047
commit a76128e016
11 changed files with 209 additions and 142 deletions

View File

@@ -20,7 +20,7 @@ from sqlalchemy.orm import Session
from app.api.deps import get_current_vendor_api
from app.core.database import get_db
from app.modules.cms.services.vendor_email_settings_service import VendorEmailSettingsService
from app.modules.cms.services.vendor_email_settings_service import vendor_email_settings_service
from app.modules.billing.services.subscription_service import subscription_service
from models.schema.auth import UserContext
@@ -137,9 +137,8 @@ def get_email_settings(
Returns settings with sensitive fields masked.
"""
vendor_id = current_user.token_vendor_id
service = VendorEmailSettingsService(db)
settings = service.get_settings(vendor_id)
settings = vendor_email_settings_service.get_settings(db, vendor_id)
if not settings:
return EmailSettingsResponse(
configured=False,
@@ -165,8 +164,7 @@ def get_email_status(
Used by frontend to show warning banner if not configured.
"""
vendor_id = current_user.token_vendor_id
service = VendorEmailSettingsService(db)
status = service.get_status(vendor_id)
status = vendor_email_settings_service.get_status(db, vendor_id)
return EmailStatusResponse(**status)
@@ -181,13 +179,12 @@ def get_available_providers(
Returns list of providers with availability status.
"""
vendor_id = current_user.token_vendor_id
service = VendorEmailSettingsService(db)
# Get vendor's current tier
tier = subscription_service.get_current_tier(db, vendor_id)
return ProvidersResponse(
providers=service.get_available_providers(tier),
providers=vendor_email_settings_service.get_available_providers(tier),
current_tier=tier.value if tier else None,
)
@@ -206,13 +203,13 @@ def update_email_settings(
Raises ValidationException if data is invalid.
"""
vendor_id = current_user.token_vendor_id
service = VendorEmailSettingsService(db)
# Get vendor's current tier for validation
tier = subscription_service.get_current_tier(db, vendor_id)
# Service raises appropriate exceptions (API-003 compliance)
settings = service.create_or_update(
settings = vendor_email_settings_service.create_or_update(
db=db,
vendor_id=vendor_id,
data=data.model_dump(exclude_unset=True),
current_tier=tier,
@@ -240,10 +237,9 @@ def verify_email_settings(
Raises ValidationException if verification fails.
"""
vendor_id = current_user.token_vendor_id
service = VendorEmailSettingsService(db)
# Service raises appropriate exceptions (API-003 compliance)
result = service.verify_settings(vendor_id, data.test_email)
result = vendor_email_settings_service.verify_settings(db, vendor_id, data.test_email)
db.commit()
return EmailVerifyResponse(
@@ -264,10 +260,9 @@ def delete_email_settings(
Raises ResourceNotFoundException if settings not found.
"""
vendor_id = current_user.token_vendor_id
service = VendorEmailSettingsService(db)
# Service raises ResourceNotFoundException if not found (API-003 compliance)
service.delete(vendor_id)
vendor_email_settings_service.delete(db, vendor_id)
db.commit()
return EmailDeleteResponse(