"""block.py — Block 相关 Schema""" from typing import Optional from pydantic import BaseModel, Field class BlockBase(BaseModel): """Block 基础信息""" id: str = Field(..., validation_alias="id", serialization_alias="id") block_order: int = Field(..., validation_alias="blockOrder", serialization_alias="blockOrder") type: str = Field(..., validation_alias="type", serialization_alias="type") level: int = Field(..., validation_alias="level", serialization_alias="level") index: int = Field(..., validation_alias="index", serialization_alias="index") content: str | dict | list = Field(..., validation_alias="content", serialization_alias="content") word_style: str = Field(..., validation_alias="wordStyle", serialization_alias="wordStyle") style: dict = Field(..., validation_alias="style", serialization_alias="style") metadata: dict = Field(..., validation_alias="metadata", serialization_alias="metadata") class Config: populate_by_name = True class BlockUpdate(BaseModel): """Block 更新请求""" content: Optional[str | dict | list] = None style: Optional[dict] = None word_style: Optional[str] = None metadata: Optional[dict] = None class BlockCreate(BaseModel): """Block 创建请求(id/index/block_order 自动生成,heading 需 level 1-6,其他类型 level=0)""" type: str level: int = 0 # heading 类型必填(1-6),其他类型默认 0 content: str | dict | list word_style: str = "" style: dict = {} metadata: dict = {} after_block_id: Optional[str] = None # 在哪个 block 后插入(null = 末尾) class TOCContent(BaseModel): """TOC Block content 结构""" title: str = "目录" class TOCConfig(BaseModel): """TOC 配置""" levels: str = "1-1" # 包含的标题层级 use_hyperlinks: bool = True use_page_numbers: bool = True hide_page_numbers_in_web: bool = True use_outline_levels: bool = True show_leader_dots: bool = True leader_char: str = "." class TOCMetadata(BaseModel): """TOC Block metadata 结构""" toc_config: TOCConfig is_auto_generated: bool = True readonly: bool = True deletable: bool = True class TOCBlock(BaseModel): """完整的 TOC Block""" id: str block_order: int = Field(..., serialization_alias="blockOrder") type: str = "toc" level: int = 0 index: int = 0 content: TOCContent word_style: str = "TOC" metadata: TOCMetadata class Config: populate_by_name = True class TOCItem(BaseModel): """目录树节点""" id: str level: int content: str children: list['TOCItem'] = [] class BlockSearchResult(BaseModel): """Block 搜索结果""" blocks: list[BlockBase] total: int class BlockStats(BaseModel): """Block 统计信息""" total: int by_type: dict[str, int] = Field(..., alias="byType") class Config: populate_by_name = True