from datetime import datetime, timezone from enum import StrEnum from uuid import UUID from pydantic import BaseModel, ConfigDict, Field, HttpUrl def utcnow() -> datetime: return datetime.now(timezone.utc) class State(StrEnum): UNKNOWN = "unknown" UP = "up" DOWN = "down" ERROR = "error" class MonitorInput(BaseModel): model_config = ConfigDict(str_strip_whitespace=True) name: str = Field(min_length=1, max_length=100) url: HttpUrl class CurrentStatus(BaseModel): state: State = State.UNKNOWN checked_at: datetime | None = None latency_ms: float | None = Field(default=None, ge=0) status_code: int | None = Field(default=None, ge=100, le=599) error_code: str | None = None class Monitor(BaseModel): id: UUID name: str url: HttpUrl created_at: datetime updated_at: datetime current_status: CurrentStatus class CheckResult(CurrentStatus): monitor_id: UUID class ErrorBody(BaseModel): code: str message: str class ErrorEnvelope(BaseModel): error: ErrorBody