Files
webref/backend/app/boards/schemas.py
2025-11-02 00:36:32 -06:00

68 lines
2.2 KiB
Python

"""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 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