from datetime import datetime from typing import Literal from uuid import UUID from pydantic import AnyHttpUrl, BaseModel, ConfigDict, Field, model_validator StatusState = Literal["unknown", "up", "down", "error"] class CheckStatus(BaseModel): state: StatusState = "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 MonitorCreate(BaseModel): name: str = Field(min_length=1, max_length=200) url: AnyHttpUrl class MonitorUpdate(BaseModel): name: str | None = Field(default=None, min_length=1, max_length=200) url: AnyHttpUrl | None = None @model_validator(mode="after") def not_empty(self) -> "MonitorUpdate": if self.name is None and self.url is None: raise ValueError("at least one field is required") return self class Monitor(BaseModel): model_config = ConfigDict(from_attributes=True) id: UUID name: str url: AnyHttpUrl created_at: datetime updated_at: datetime status: CheckStatus class CheckResult(CheckStatus): monitor_id: UUID status_applied: bool = True class HealthResponse(BaseModel): status: Literal["ok", "ready"]