from __future__ import annotations import uuid from datetime import datetime from sqlalchemy import DateTime, Enum, ForeignKey, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base, TimestampMixin, UUIDPrimaryKeyMixin from app.models.enums import MonitoringRunStatus, MonitoringRunTrigger class MonitoringRun(Base, UUIDPrimaryKeyMixin, TimestampMixin): __tablename__ = "monitoring_runs" company_id: Mapped[uuid.UUID] = mapped_column( ForeignKey("companies.id", ondelete="CASCADE"), index=True ) trigger_type: Mapped[MonitoringRunTrigger] = mapped_column( Enum(MonitoringRunTrigger, native_enum=False, length=20) ) status: Mapped[MonitoringRunStatus] = mapped_column( Enum(MonitoringRunStatus, native_enum=False, length=20), default=MonitoringRunStatus.QUEUED, ) started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) sources_attempted: Mapped[int] = mapped_column(Integer, default=0) sources_successful: Mapped[int] = mapped_column(Integer, default=0) sources_failed: Mapped[int] = mapped_column(Integer, default=0) items_collected: Mapped[int] = mapped_column(Integer, default=0) changes_detected: Mapped[int] = mapped_column(Integer, default=0) error_summary: Mapped[str | None] = mapped_column(Text, nullable=True) worker_task_id: Mapped[str | None] = mapped_column(String(255), nullable=True)