from datetime import datetime from typing import Optional from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint from sqlalchemy.dialects.postgresql import ARRAY, JSONB from sqlalchemy.orm import Mapped, mapped_column from .base import Base, TimestampMixin CHECK_STATUS_VALUES = ( "online", "offline", "unknown", "ok", "warn", "failed", ) MONITOR_POLICY_MODES = ("inherit", "include", "exclude") class DashboardCheckDefinition(Base, TimestampMixin): __tablename__ = "dashboard_check_definitions" check_key: Mapped[str] = mapped_column(String(64), primary_key=True) enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) interval_sec_default: Mapped[int] = mapped_column(Integer, nullable=False, default=300) plugin_action: Mapped[str] = mapped_column(String(128), nullable=False) categories: Mapped[list[str]] = mapped_column(ARRAY(String), nullable=False, default=list) timeout_sec: Mapped[int] = mapped_column(Integer, nullable=False, default=30) concurrency: Mapped[int] = mapped_column(Integer, nullable=False, default=20) class DashboardObjectCheckOverride(Base, TimestampMixin): __tablename__ = "dashboard_object_check_overrides" __table_args__ = (UniqueConstraint("object_id", "check_key", name="uq_dashboard_obj_check"),) id: Mapped[int] = mapped_column(Integer, primary_key=True) object_id: Mapped[int] = mapped_column( Integer, ForeignKey("objects.id", ondelete="CASCADE"), nullable=False, index=True ) check_key: Mapped[str] = mapped_column( String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False ) enabled_override: Mapped[Optional[bool]] = mapped_column(Boolean, nullable=True) interval_sec_override: Mapped[Optional[int]] = mapped_column(Integer, nullable=True) categories_override: Mapped[Optional[list[str]]] = mapped_column(ARRAY(String), nullable=True) class DashboardDeviceLiveState(Base): __tablename__ = "dashboard_device_live_state" __table_args__ = (UniqueConstraint("device_id", "check_key", name="uq_dashboard_device_check"),) id: Mapped[int] = mapped_column(Integer, primary_key=True) device_id: Mapped[int] = mapped_column( Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False, index=True ) check_key: Mapped[str] = mapped_column( String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False, index=True ) status: Mapped[str] = mapped_column(String(20), nullable=False, default="unknown") value_json: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True) error: Mapped[Optional[str]] = mapped_column(Text, nullable=True) checked_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, index=True) duration_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True) source: Mapped[str] = mapped_column(String(32), nullable=False, default="dashboard_monitor") class DashboardDeviceCheckHistory(Base): __tablename__ = "dashboard_device_check_history" id: Mapped[int] = mapped_column(Integer, primary_key=True) device_id: Mapped[int] = mapped_column( Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False, index=True ) check_key: Mapped[str] = mapped_column( String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False, index=True ) status: Mapped[str] = mapped_column(String(20), nullable=False, default="unknown") ping_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True) checked_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, index=True) duration_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True) error: Mapped[Optional[str]] = mapped_column(Text, nullable=True) source: Mapped[str] = mapped_column(String(32), nullable=False, default="dashboard_monitor") class DashboardObjectMonitorPolicy(Base, TimestampMixin): __tablename__ = "dashboard_object_monitor_policy" object_id: Mapped[int] = mapped_column( Integer, ForeignKey("objects.id", ondelete="CASCADE"), primary_key=True ) mode: Mapped[str] = mapped_column(String(16), nullable=False, default="inherit") class DashboardTagMonitorPolicy(Base, TimestampMixin): __tablename__ = "dashboard_tag_monitor_policy" tag_id: Mapped[int] = mapped_column( Integer, ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True ) enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) class DashboardMonitorRunState(Base): __tablename__ = "dashboard_monitor_run_state" id: Mapped[int] = mapped_column(Integer, primary_key=True) status: Mapped[str] = mapped_column(String(20), nullable=False, default="idle") run_type: Mapped[Optional[str]] = mapped_column(String(20), nullable=True) scope: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True) started_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) finished_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) last_success_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) last_error: Mapped[Optional[str]] = mapped_column(Text, nullable=True) last_counts: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)