client_distribution.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from typing import Optional, List
  2. from pydantic import BaseModel
  3. from datetime import datetime
  4. # Distribution Schemas
  5. class ClientDistributionBase(BaseModel):
  6. name: str
  7. description: Optional[str] = None
  8. icon_url: Optional[str] = None
  9. class ClientDistributionCreate(ClientDistributionBase):
  10. pass
  11. class ClientDistributionUpdate(BaseModel):
  12. name: Optional[str] = None
  13. description: Optional[str] = None
  14. icon_url: Optional[str] = None
  15. class ClientDistributionResponse(ClientDistributionBase):
  16. id: int
  17. owner_id: int
  18. created_at: datetime
  19. updated_at: Optional[datetime] = None
  20. icon_object_key: Optional[str] = None # 原始 object_key,编辑时回传用
  21. class Config:
  22. from_attributes = True
  23. class ClientDistributionList(BaseModel):
  24. total: int
  25. items: List[ClientDistributionResponse]
  26. # Version Schemas
  27. class ClientVersionBase(BaseModel):
  28. version_code: str
  29. version_name: Optional[str] = None
  30. release_notes: Optional[str] = None
  31. platform: Optional[str] = None
  32. class ClientVersionCreate(ClientVersionBase):
  33. object_key: str
  34. file_size: Optional[int] = None
  35. class ClientVersionUpdate(BaseModel):
  36. version_name: Optional[str] = None
  37. release_notes: Optional[str] = None
  38. platform: Optional[str] = None
  39. class ClientVersionResponse(ClientVersionBase):
  40. id: int
  41. distribution_id: int
  42. object_key: str
  43. file_size: Optional[int] = None
  44. created_at: datetime
  45. class Config:
  46. from_attributes = True
  47. class ClientVersionList(BaseModel):
  48. total: int
  49. items: List[ClientVersionResponse]
  50. # Open API - Public download page
  51. class LatestVersionInfo(BaseModel):
  52. id: int
  53. version_code: str
  54. version_name: Optional[str] = None
  55. release_notes: Optional[str] = None
  56. file_size: Optional[int] = None
  57. platform: Optional[str] = None
  58. created_at: datetime
  59. download_url: str # Pre-signed URL
  60. class DistributionPublicResponse(BaseModel):
  61. id: int
  62. name: str
  63. description: Optional[str] = None
  64. icon_url: Optional[str] = None
  65. latest_version: Optional[LatestVersionInfo] = None