from __future__ import annotations import uuid from datetime import datetime from typing import TYPE_CHECKING, Any from sqlalchemy import JSON, Boolean, DateTime, Enum, ForeignKey, Integer, String from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.base import Base, TimestampMixin, UUIDPrimaryKeyMixin from app.models.enums import MonitoringFrequency, SeverityLevel if TYPE_CHECKING: from app.models.company import Company class MonitorConfiguration(Base, UUIDPrimaryKeyMixin, TimestampMixin): __tablename__ = "monitor_configurations" company_id: Mapped[uuid.UUID] = mapped_column( ForeignKey("companies.id", ondelete="CASCADE"), unique=True, index=True ) frequency_type: Mapped[MonitoringFrequency] = mapped_column( Enum(MonitoringFrequency, native_enum=False, length=30), default=MonitoringFrequency.WEEKLY, ) # Only meaningful when frequency_type == CUSTOM: interval_minutes takes # precedence if set, otherwise cron_expression is used. interval_minutes: Mapped[int | None] = mapped_column(Integer, nullable=True) cron_expression: Mapped[str | None] = mapped_column(String(120), nullable=True) timezone: Mapped[str] = mapped_column(String(64), default="America/New_York") enabled: Mapped[bool] = mapped_column(Boolean, default=True) next_run: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) last_run: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) severity_threshold: Mapped[SeverityLevel] = mapped_column( Enum(SeverityLevel, native_enum=False, length=20), default=SeverityLevel.MEDIUM ) source_configuration: Mapped[dict[str, Any]] = mapped_column(JSON, default=dict) company: Mapped[Company] = relationship(back_populates="monitor_configuration")