Coverage for app / models / monitor.py: 100%
20 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-05 17:54 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-05 17:54 +0000
1import uuid
2from datetime import datetime, timezone
4from sqlalchemy import ForeignKey, Integer, String, Boolean, DateTime, func, Index
5from sqlalchemy.orm import Mapped, mapped_column, relationship
7from app.db.base import Base
10class Monitor(Base):
11 __tablename__ = "monitors"
13 __table_args__ = (
14 Index("ix_monitors_user_id", "user_id"),
15 Index("ix_monitors_active_next_check", "is_active", "next_check_at"),
16 )
18 id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
19 user_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("users.id"), nullable=False)
21 url: Mapped[str] = mapped_column(String(2048), nullable=False)
22 interval_seconds: Mapped[int] = mapped_column(Integer, nullable=False, default=300)
23 is_active: Mapped[bool] = mapped_column(Boolean, default=True)
25 alert_status: Mapped[str] = mapped_column(String(10), default="UP")
26 last_alerted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
27 next_check_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
29 created_at: Mapped[datetime] = mapped_column(
30 DateTime(timezone=True),
31 server_default=func.now(),
32 default=lambda: datetime.now(timezone.utc),
33 )
34 updated_at: Mapped[datetime] = mapped_column(
35 DateTime(timezone=True),
36 server_default=func.now(),
37 onupdate=lambda: datetime.now(timezone.utc),
38 )
40 user: Mapped["User"] = relationship("User", back_populates="monitors")
41 ping_logs: Mapped[list["PingLog"]] = relationship(
42 "PingLog", back_populates="monitor", cascade="all, delete-orphan"
43 )