schemas.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from datetime import datetime
  2. from typing import Any, Optional
  3. from pydantic import BaseModel, ConfigDict, Field
  4. class BaseSchema(BaseModel):
  5. model_config = ConfigDict(from_attributes=True)
  6. # === Developer ===
  7. class DeveloperOut(BaseSchema):
  8. id: int
  9. name: str
  10. avatar_url: Optional[str] = None
  11. verified: bool
  12. # === Category ===
  13. class CategoryOut(BaseSchema):
  14. slug: str
  15. name: str
  16. description: Optional[str] = None
  17. icon: Optional[str] = None
  18. class CategoryListResponse(BaseModel):
  19. items: list[CategoryOut]
  20. # === Version ===
  21. class VersionInfo(BaseSchema):
  22. version: str
  23. release_notes: Optional[str] = None
  24. min_client_version: Optional[str] = None
  25. published_at: Optional[datetime] = None
  26. size_bytes: Optional[int] = None
  27. class ManifestOut(BaseModel):
  28. pages: Optional[list[dict[str, Any]]] = None
  29. commands: Optional[list[dict[str, Any]]] = None
  30. permissions: Optional[list[dict[str, Any]]] = None
  31. # === App ===
  32. class AppSummary(BaseSchema):
  33. app_uid: str
  34. name: str
  35. type: str
  36. icon_url: Optional[str] = None
  37. short_description: Optional[str] = None
  38. categories: list[CategoryOut] = Field(default_factory=list)
  39. developer: Optional[DeveloperOut] = None
  40. current_version: Optional[VersionInfo] = None
  41. download_count: int = 0
  42. is_featured: bool = False
  43. publish_time: Optional[datetime] = None
  44. class AppDetail(AppSummary):
  45. description: Optional[str] = None
  46. homepage_url: Optional[str] = None
  47. manifest: Optional[ManifestOut] = None
  48. class AppListResponse(BaseModel):
  49. items: list[AppSummary]
  50. total: int
  51. page: int
  52. page_size: int
  53. # === Download ===
  54. class DownloadInfo(BaseModel):
  55. app_uid: str
  56. version: str
  57. url: Optional[str] = None
  58. checksum_sha256: Optional[str] = None
  59. size_bytes: Optional[int] = None
  60. # === Error ===
  61. class ErrorResponse(BaseModel):
  62. code: str
  63. message: str