from datetime import datetime from pydantic import BaseModel, ConfigDict, Field, field_validator class MarketplaceImportJobRequest(BaseModel): """Request schema for triggering marketplace import. Note: vendor_id is injected by middleware, not from request body. """ source_url: str = Field(..., description="URL to CSV file from marketplace") marketplace: str = Field(default="Letzshop", description="Marketplace name") batch_size: int | None = Field( 1000, description="Processing batch size", ge=100, le=10000 ) @field_validator("source_url") @classmethod def validate_url(cls, v): # Basic URL security validation if not v.startswith(("http://", "https://")): raise ValueError("URL must start with http:// or https://") return v.strip() @field_validator("marketplace") @classmethod def validate_marketplace(cls, v): return v.strip() class MarketplaceImportJobResponse(BaseModel): """Response schema for marketplace import job.""" model_config = ConfigDict(from_attributes=True) job_id: int vendor_id: int vendor_code: str # Populated from vendor relationship vendor_name: str # Populated from vendor relationship marketplace: str source_url: str status: str # Counts imported: int = 0 updated: int = 0 total_processed: int = 0 error_count: int = 0 # Error details error_message: str | None = None # Timestamps created_at: datetime started_at: datetime | None = None completed_at: datetime | None = None class MarketplaceImportJobListResponse(BaseModel): """Response schema for list of import jobs.""" jobs: list[MarketplaceImportJobResponse] total: int skip: int limit: int class MarketplaceImportJobStatusUpdate(BaseModel): """Schema for updating import job status (internal use).""" status: str imported_count: int | None = None updated_count: int | None = None error_count: int | None = None total_processed: int | None = None error_message: str | None = None