refactor: move letzshop endpoints to marketplace module and add vendor service tests

Move letzshop-related functionality from tenancy to marketplace module:
- Move admin letzshop routes to marketplace/routes/api/admin_letzshop.py
- Move letzshop schemas to marketplace/schemas/letzshop.py
- Remove letzshop code from tenancy module (admin_vendors, vendor_service)
- Update model exports and imports

Add comprehensive unit tests for vendor services:
- test_company_service.py: Company management operations
- test_platform_service.py: Platform management operations
- test_vendor_domain_service.py: Vendor domain operations
- test_vendor_team_service.py: Vendor team management

Update module definitions:
- billing, messaging, payments: Minor definition updates

Add architecture proposals documentation:
- Module dependency redesign session notes
- Decouple modules implementation plan
- Module decoupling proposal

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-04 19:25:00 +01:00
parent 37942ae02b
commit 0583dd2cc4
29 changed files with 3643 additions and 650 deletions

View File

@@ -85,6 +85,10 @@ from app.modules.marketplace.schemas.letzshop import (
LetzshopCachedVendorDetailResponse,
LetzshopVendorDirectorySyncResponse,
LetzshopCreateVendorFromCacheResponse,
# Product Export
LetzshopExportRequest,
LetzshopExportFileInfo,
LetzshopExportResponse,
)
from app.modules.marketplace.schemas.onboarding import (
# Step status
@@ -184,6 +188,10 @@ __all__ = [
"LetzshopCachedVendorDetailResponse",
"LetzshopVendorDirectorySyncResponse",
"LetzshopCreateVendorFromCacheResponse",
# Letzshop - Product Export
"LetzshopExportRequest",
"LetzshopExportFileInfo",
"LetzshopExportResponse",
# Onboarding - Step status
"StepStatus",
"CompanyProfileStepStatus",

View File

@@ -624,3 +624,41 @@ class LetzshopCreateVendorFromCacheResponse(BaseModel):
message: str
vendor: dict[str, Any] | None = None
letzshop_vendor_slug: str
# ============================================================================
# Product Export Schemas
# ============================================================================
class LetzshopExportRequest(BaseModel):
"""Request body for Letzshop export to pickup folder."""
include_inactive: bool = Field(
default=False,
description="Include inactive products in export"
)
class LetzshopExportFileInfo(BaseModel):
"""Info about an exported file."""
language: str
filename: str | None = None
path: str | None = None
size_bytes: int | None = None
error: str | None = None
class LetzshopExportResponse(BaseModel):
"""Response from Letzshop export to folder."""
success: bool
message: str
vendor_code: str
export_directory: str
files: list[LetzshopExportFileInfo]
celery_task_id: str | None = None # Set when using Celery async export
is_async: bool = Field(default=False, serialization_alias="async") # True when queued via Celery
model_config = ConfigDict(populate_by_name=True)