from datetime import datetime from enum import StrEnum from uuid import UUID from pydantic import AnyHttpUrl, BaseModel, ConfigDict, Field class MonitorState(StrEnum): UNKNOWN = "unknown" UP = "up" DOWN = "down" ERROR = "error" BLOCKED = "blocked" class MonitorCreate(BaseModel): name: str = Field(min_length=1, max_length=100) url: AnyHttpUrl class MonitorUpdate(MonitorCreate): pass class StatusSnapshot(BaseModel): state: MonitorState = MonitorState.UNKNOWN checked_at: datetime | None = None latency_ms: float | None = Field(default=None, ge=0) http_status: int | None = Field(default=None, ge=100, le=599) error: str | None = None class Monitor(BaseModel): model_config = ConfigDict(from_attributes=True) id: UUID name: str url: AnyHttpUrl created_at: datetime updated_at: datetime status: StatusSnapshot class Health(BaseModel): status: str