"""白板接口 DTO。""" from __future__ import annotations from datetime import datetime from typing import Any from pydantic import BaseModel, Field class Stroke(BaseModel): """一条笔画:点序列 + 样式。结构宽松(Any)以兼容前端扩展字段。""" points: list[list[float]] = Field(default_factory=list, description="[[x,y],...]") color: str = Field(default="#1565c0", description="笔画颜色") width: float = Field(default=3, description="笔画宽度") class WhiteboardOut(BaseModel): """白板完整内容(GET /whiteboard/{id} 与 WS init 帧)。""" board_id: str strokes: list[Any] = Field(default_factory=list, description="笔画数组") stroke_count: int = Field(0, description="累计修改次数") created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class WhiteboardListItem(BaseModel): """管理页列表项。""" board_id: str stroke_count: int created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class WhiteboardListResponse(BaseModel): """管理页列表响应。""" total: int items: list[WhiteboardListItem] class StrokeOp(BaseModel): """WS 笔画操作(type=stroke 时携带)。""" type: str = Field(..., description="add / clear") stroke: dict[str, Any] | None = Field(None, description="type=add 时携带的笔画对象")