block.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """block.py — Block 相关 Schema"""
  2. from typing import Optional
  3. from pydantic import BaseModel, Field
  4. class BlockBase(BaseModel):
  5. """Block 基础信息"""
  6. id: str = Field(..., validation_alias="id", serialization_alias="id")
  7. block_order: int = Field(..., validation_alias="blockOrder", serialization_alias="blockOrder")
  8. type: str = Field(..., validation_alias="type", serialization_alias="type")
  9. level: int = Field(..., validation_alias="level", serialization_alias="level")
  10. index: int = Field(..., validation_alias="index", serialization_alias="index")
  11. content: str | dict | list = Field(..., validation_alias="content", serialization_alias="content")
  12. word_style: str = Field(..., validation_alias="wordStyle", serialization_alias="wordStyle")
  13. style: dict = Field(..., validation_alias="style", serialization_alias="style")
  14. metadata: dict = Field(..., validation_alias="metadata", serialization_alias="metadata")
  15. class Config:
  16. populate_by_name = True
  17. class BlockUpdate(BaseModel):
  18. """Block 更新请求"""
  19. content: Optional[str | dict | list] = None
  20. style: Optional[dict] = None
  21. word_style: Optional[str] = None
  22. metadata: Optional[dict] = None
  23. class BlockCreate(BaseModel):
  24. """Block 创建请求"""
  25. type: str
  26. level: int = 0
  27. index: int = 0
  28. content: str | dict | list
  29. word_style: str = ""
  30. style: dict = {}
  31. metadata: dict = {}
  32. after_block_id: Optional[str] = None # 在哪个 block 后插入
  33. class TOCItem(BaseModel):
  34. """目录树节点"""
  35. id: str
  36. level: int
  37. content: str
  38. children: list['TOCItem'] = []
  39. class BlockSearchResult(BaseModel):
  40. """Block 搜索结果"""
  41. blocks: list[BlockBase]
  42. total: int
  43. class BlockStats(BaseModel):
  44. """Block 统计信息"""
  45. total: int
  46. by_type: dict[str, int] = Field(..., alias="byType")
  47. class Config:
  48. populate_by_name = True