68 lines
2.2 KiB
Python
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
|