from __future__ import annotations import enum import uuid from datetime import datetime, timezone from sqlalchemy import DateTime, Enum, Float, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column from .base import Base class PingStatus(str, enum.Enum): up = "up" down = "down" class DnsStatus(str, enum.Enum): resolved = "resolved" failed = "failed" class PingResult(Base): __tablename__ = "ping_results" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) host_id: Mapped[str] = mapped_column( String(36), ForeignKey("hosts.id", ondelete="CASCADE"), nullable=False ) probed_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(timezone.utc) ) status: Mapped[PingStatus] = mapped_column(Enum(PingStatus), nullable=False) response_time_ms: Mapped[float | None] = mapped_column(Float, nullable=True) class DnsResult(Base): __tablename__ = "dns_results" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) host_id: Mapped[str] = mapped_column( String(36), ForeignKey("hosts.id", ondelete="CASCADE"), nullable=False ) resolved_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(timezone.utc) ) status: Mapped[DnsStatus] = mapped_column(Enum(DnsStatus), nullable=False) resolved_ip: Mapped[str | None] = mapped_column(String(255), nullable=True)