from datetime import datetime, timezone from enum import StrEnum from uuid import UUID from pydantic import AnyHttpUrl, BaseModel, ConfigDict, Field def utc_now() -> datetime: return datetime.now(timezone.utc) class HealthState(StrEnum): unknown = "unknown" up = "up" down = "down" class MonitorCreate(BaseModel): name: str = Field(min_length=1, max_length=120) url: AnyHttpUrl class MonitorUpdate(MonitorCreate): pass class CurrentStatus(BaseModel): state: HealthState checked_at: datetime latency_ms: float = Field(ge=0) http_status: int | None = None error_code: str | None = None error_message: str | None = None class Monitor(BaseModel): model_config = ConfigDict(frozen=True) id: UUID name: str url: AnyHttpUrl created_at: datetime updated_at: datetime revision: int current_status: CurrentStatus | None = None class CheckResponse(BaseModel): monitor_id: UUID status: CurrentStatus applied: bool class ErrorDetail(BaseModel): code: str message: str