from datetime import datetime from typing import Any, Literal from pydantic import BaseModel, Field CreateType = Literal["shed", "silo", "sketch", "stead"] MemberRole = Literal["editor", "viewer"] Visibility = Literal["private", "members"] class DocumentMember(BaseModel): user_id: int role: MemberRole name: str = "" email: str = "" class DocumentCreate(BaseModel): type: CreateType title: str content: dict[str, Any] = Field(default_factory=dict) template_id: str | None = None stead_id: str | None = None parent_page_id: str | None = None class DocumentUpdate(BaseModel): title: str | None = None content: dict[str, Any] | None = None starred: bool | None = None stead_id: str | None = None parent_page_id: str | None = None class ShareRequest(BaseModel): email_or_username: str role: MemberRole = "editor" class DocumentResponse(BaseModel): id: str type: CreateType title: str template_id: str | None = None stead_id: str | None = None parent_page_id: str | None = None content: dict[str, Any] created_by: str created_at: datetime updated_at: datetime starred: bool = False last_visited_at: datetime | None = None owner_id: int | None = None visibility: Visibility = "private" members: list[DocumentMember] = Field(default_factory=list) class DocumentVersionResponse(BaseModel): id: str document_id: str title: str content: dict[str, Any] created_by: str created_at: datetime reason: str