from typing import Optional, List from pydantic import BaseModel from datetime import datetime # Distribution Schemas class ClientDistributionBase(BaseModel): name: str description: Optional[str] = None icon_url: Optional[str] = None class ClientDistributionCreate(ClientDistributionBase): pass class ClientDistributionUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None icon_url: Optional[str] = None class ClientDistributionResponse(ClientDistributionBase): id: int owner_id: int created_at: datetime updated_at: Optional[datetime] = None icon_object_key: Optional[str] = None # 原始 object_key,编辑时回传用 class Config: from_attributes = True class ClientDistributionList(BaseModel): total: int items: List[ClientDistributionResponse] # Version Schemas class ClientVersionBase(BaseModel): version_code: str version_name: Optional[str] = None release_notes: Optional[str] = None platform: Optional[str] = None class ClientVersionCreate(ClientVersionBase): object_key: str file_size: Optional[int] = None class ClientVersionUpdate(BaseModel): version_name: Optional[str] = None release_notes: Optional[str] = None platform: Optional[str] = None class ClientVersionResponse(ClientVersionBase): id: int distribution_id: int object_key: str file_size: Optional[int] = None created_at: datetime class Config: from_attributes = True class ClientVersionList(BaseModel): total: int items: List[ClientVersionResponse] # Open API - Public download page class LatestVersionInfo(BaseModel): id: int version_code: str version_name: Optional[str] = None release_notes: Optional[str] = None file_size: Optional[int] = None platform: Optional[str] = None created_at: datetime download_url: str # Pre-signed URL class DistributionPublicResponse(BaseModel): id: int name: str description: Optional[str] = None icon_url: Optional[str] = None latest_version: Optional[LatestVersionInfo] = None