"""Board Pydantic schemas for request/response validation.""" from datetime import datetime from uuid import UUID from pydantic import BaseModel, ConfigDict, Field, field_validator class ViewportState(BaseModel): """Viewport state for canvas position and zoom.""" x: float = Field(default=0, description="Horizontal pan position") y: float = Field(default=0, description="Vertical pan position") zoom: float = Field(default=1.0, ge=0.1, le=5.0, description="Zoom level (0.1 to 5.0)") rotation: float = Field(default=0, ge=0, le=360, description="Canvas rotation in degrees (0 to 360)") class BoardCreate(BaseModel): """Schema for creating a new board.""" title: str = Field(..., min_length=1, max_length=255, description="Board title") description: str | None = Field(default=None, description="Optional board description") class ViewportStateUpdate(BaseModel): """Schema for updating viewport state only.""" x: float = Field(..., description="Horizontal pan position") y: float = Field(..., description="Vertical pan position") zoom: float = Field(..., ge=0.1, le=5.0, description="Zoom level (0.1 to 5.0)") rotation: float = Field(..., ge=0, le=360, description="Canvas rotation in degrees (0 to 360)") class BoardUpdate(BaseModel): """Schema for updating board metadata.""" title: str | None = Field(None, min_length=1, max_length=255, description="Board title") description: str | None = Field(None, description="Board description") viewport_state: ViewportState | None = Field(None, description="Viewport state") class BoardSummary(BaseModel): """Summary schema for board list view.""" model_config = ConfigDict(from_attributes=True) id: UUID title: str description: str | None = None image_count: int = Field(default=0, description="Number of images on board") thumbnail_url: str | None = Field(default=None, description="URL to board thumbnail") created_at: datetime updated_at: datetime class BoardDetail(BaseModel): """Detailed schema for single board view with all data.""" model_config = ConfigDict(from_attributes=True) id: UUID user_id: UUID title: str description: str | None = None viewport_state: ViewportState created_at: datetime updated_at: datetime is_deleted: bool = False @field_validator("viewport_state", mode="before") @classmethod def convert_viewport_state(cls, v): """Convert dict to ViewportState if needed.""" if isinstance(v, dict): return ViewportState(**v) return v