52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
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"]
|