Files
wordcloud/backend/service/schemas.py
T

176 lines
3.6 KiB
Python

from __future__ import annotations
from datetime import datetime
from pathlib import Path
from typing import Literal
from pydantic import BaseModel, Field
class JobCreateResponse(BaseModel):
job_id: str
class JobEvent(BaseModel):
type: Literal["log", "status"]
stage: str
progress_percent: int = Field(ge=0, le=100)
message: str
timestamp: datetime
elapsed_seconds: float | None = None
class JobStatus(BaseModel):
job_id: str
status: Literal["queued", "running", "success", "failed"]
stage: str
progress_percent: int = Field(ge=0, le=100)
message: str
created_at: datetime
updated_at: datetime
artifacts: dict[str, str]
error: str = ""
elapsed_seconds: float | None = None
class JobDetail(BaseModel):
status: JobStatus
recent_events: list[JobEvent]
class JobResult(BaseModel):
job_id: str
status: Literal["queued", "running", "success", "failed"]
image_url: str = ""
svg_url: str = ""
svg_stroke_url: str = ""
db_url: str = ""
metrics_url: str = ""
elapsed_seconds: float | None = None
class WordLocation(BaseModel):
id: int
name: str
x: int
y: int
font_size: int
color: str = ""
orientation: Literal["horizontal", "vertical"] = "horizontal"
box_x: int
box_y: int
box_width: int
box_height: int
class JobLocationSearchResult(BaseModel):
job_id: str
query: str = ""
mode: Literal["exact", "contains"] = "exact"
total: int = 0
canvas_width: int = 0
canvas_height: int = 0
matches: list[WordLocation] = Field(default_factory=list)
class JobPaths(BaseModel):
root: Path
input_dir: Path
output_dir: Path
mask_path: Path
excel_path: Path
config_path: Path
class Template(BaseModel):
id: str
name: str
width: int
height: int
aspect_ratio: str
description: str = ""
class Asset(BaseModel):
asset_id: str
name: str
type: str
mime_type: str
width: int
height: int
file_size: int
file_url: str
job_id: str = ""
created_at: datetime
class LineSpacingAnalysisRequest(BaseModel):
percentile: float = Field(default=3, ge=0, le=100)
elementWidth: float = Field(gt=0)
elementHeight: float = Field(gt=0)
sampleStep: float = Field(default=2, gt=0)
class LineSpacingClosestPoints(BaseModel):
ax: float
ay: float
bx: float
by: float
class LineSpacingAnalysisSummary(BaseModel):
percentile: float
spacingPx: float
spacingMm: float
minSpacingPx: float
minSpacingMm: float
sampleStep: float
curveCount: int
segmentCount: int
nearestCount: int
sourceWidth: float
sourceHeight: float
elementWidth: float
elementHeight: float
computedAt: str
closestPoints: LineSpacingClosestPoints | None = None
class DesignTemplate(BaseModel):
template_id: str
name: str
description: str = ""
document: dict
reference_asset_ids: list[str] = Field(default_factory=list)
cover_asset_id: str = ""
created_at: datetime
updated_at: datetime
class Project(BaseModel):
project_id: str
name: str
template_id: str
background_color: str
stickers: list[dict] = Field(default_factory=list)
created_at: datetime
updated_at: datetime
class ProjectSummary(BaseModel):
project_id: str
name: str
template_id: str
background_color: str
sticker_count: int = 0
created_at: datetime
updated_at: datetime
class Font(BaseModel):
font_id: str
name: str
filename: str
file_size: int
created_at: datetime