Files
crucible-agent-build-fastap…/app/models.py

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"]