from datetime import UTC, datetime from enum import StrEnum from uuid import UUID, uuid4 from pydantic import AnyHttpUrl, BaseModel, ConfigDict, Field class State(StrEnum): UNKNOWN = "unknown" UP = "up" DOWN = "down" ERROR = "error" class MonitorCreate(BaseModel): name: str = Field(min_length=1, max_length=100) url: AnyHttpUrl class MonitorUpdate(BaseModel): name: str | None = Field(default=None, min_length=1, max_length=100) url: AnyHttpUrl | None = None class CurrentStatus(BaseModel): state: State = State.UNKNOWN checked_at: datetime | None = None status_code: int | None = None latency_ms: float | None = Field(default=None, ge=0) error: str | None = None class Monitor(BaseModel): model_config = ConfigDict(from_attributes=True) id: UUID = Field(default_factory=uuid4) name: str url: AnyHttpUrl created_at: datetime = Field(default_factory=lambda: datetime.now(UTC)) updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC)) current_status: CurrentStatus = Field(default_factory=CurrentStatus)