refactor: move LetzshopExportRequest to schema layer

Follows architecture rule: Pydantic schemas belong in models/schema/

- Moved LetzshopExportRequest to models/schema/vendor.py
- Added LetzshopExportFileInfo and LetzshopExportResponse schemas
- Updated API endpoint to use proper response_model
- Removed inline BaseModel import from API file

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-20 22:17:55 +01:00
parent f2ed1362a0
commit d910c1b0b3
2 changed files with 37 additions and 8 deletions

View File

@@ -11,7 +11,6 @@ Architecture Notes:
import logging import logging
from fastapi import APIRouter, Body, Depends, Path, Query from fastapi import APIRouter, Body, Depends, Path, Query
from pydantic import BaseModel
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.api.deps import get_current_admin_api from app.api.deps import get_current_admin_api
@@ -23,6 +22,8 @@ from app.services.vendor_service import vendor_service
from models.database.user import User from models.database.user import User
from models.schema.stats import VendorStatsResponse from models.schema.stats import VendorStatsResponse
from models.schema.vendor import ( from models.schema.vendor import (
LetzshopExportRequest,
LetzshopExportResponse,
VendorCreate, VendorCreate,
VendorCreateResponse, VendorCreateResponse,
VendorDetailResponse, VendorDetailResponse,
@@ -366,13 +367,7 @@ def export_vendor_products_letzshop(
) )
class LetzshopExportRequest(BaseModel): @router.post("/{vendor_identifier}/export/letzshop", response_model=LetzshopExportResponse)
"""Request body for Letzshop export to pickup folder."""
include_inactive: bool = False
@router.post("/{vendor_identifier}/export/letzshop")
def export_vendor_products_letzshop_to_folder( def export_vendor_products_letzshop_to_folder(
vendor_identifier: str = Path(..., description="Vendor ID or vendor_code"), vendor_identifier: str = Path(..., description="Vendor ID or vendor_code"),
request: LetzshopExportRequest = None, request: LetzshopExportRequest = None,

View File

@@ -293,3 +293,37 @@ class VendorSummary(BaseModel):
# NOTE: Vendor ownership transfer schemas have been removed. # NOTE: Vendor ownership transfer schemas have been removed.
# Ownership transfer is now handled at the Company level. # Ownership transfer is now handled at the Company level.
# See models/schema/company.py for CompanyTransferOwnership and CompanyTransferOwnershipResponse. # See models/schema/company.py for CompanyTransferOwnership and CompanyTransferOwnershipResponse.
# ============================================================================
# LETZSHOP 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]