diff --git a/src/endpoint_monitor/models.py b/src/endpoint_monitor/models.py new file mode 100644 index 0000000..757c955 --- /dev/null +++ b/src/endpoint_monitor/models.py @@ -0,0 +1,54 @@ +from datetime import datetime +from enum import Enum +from uuid import UUID + +from pydantic import AnyHttpUrl, BaseModel, ConfigDict, Field + + +class MonitorStatus(str, Enum): + UNKNOWN = "unknown" + UP = "up" + DOWN = "down" + ERROR = "error" + + +class MonitorCreate(BaseModel): + name: str = Field(min_length=1, max_length=100, pattern=r".*\S.*") + url: AnyHttpUrl + + +class MonitorUpdate(BaseModel): + name: str | None = Field(default=None, min_length=1, max_length=100, pattern=r".*\S.*") + url: AnyHttpUrl | None = None + + +class CheckResult(BaseModel): + status: MonitorStatus + checked_at: datetime + latency_ms: float = Field(ge=0) + http_status: int | None = None + final_url: str | None = None + detail: str | None = Field(default=None, max_length=300) + + +class Monitor(BaseModel): + model_config = ConfigDict(from_attributes=True) + + id: UUID + name: str + url: AnyHttpUrl + created_at: datetime + updated_at: datetime + revision: int + status: MonitorStatus = MonitorStatus.UNKNOWN + last_check: CheckResult | None = None + + +class StatusView(BaseModel): + id: UUID + status: MonitorStatus + last_check: CheckResult | None + + +class Health(BaseModel): + status: str