from datetime import datetime from enum import Enum from typing import Optional from sqlalchemy import Column, Integer, String, DateTime, Text, ForeignKey, Enum as SQLEnum from sqlalchemy.orm import relationship from app.core.time import to_iso8601_utc from app.db.session import Base class AlertSeverity(str, Enum): CRITICAL = "critical" WARNING = "warning" INFO = "info" class AlertStatus(str, Enum): ACTIVE = "active" ACKNOWLEDGED = "acknowledged" RESOLVED = "resolved" class Alert(Base): __tablename__ = "alerts" id = Column(Integer, primary_key=True, index=True) severity = Column(SQLEnum(AlertSeverity), default=AlertSeverity.WARNING) status = Column(SQLEnum(AlertStatus), default=AlertStatus.ACTIVE) datasource_id = Column(Integer, nullable=True, index=True) datasource_name = Column(String(255), nullable=True) message = Column(Text) alert_metadata = Column(Text, nullable=True) acknowledged_by = Column(Integer, nullable=True) resolved_by = Column(Integer, nullable=True) resolution_notes = Column(Text, nullable=True) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) acknowledged_at = Column(DateTime, nullable=True) resolved_at = Column(DateTime, nullable=True) def to_dict(self): return { "id": self.id, "severity": self.severity.value if self.severity else None, "status": self.status.value if self.status else None, "datasource_id": self.datasource_id, "datasource_name": self.datasource_name, "message": self.message, "alert_metadata": self.alert_metadata, "acknowledged_by": self.acknowledged_by, "resolved_by": self.resolved_by, "resolution_notes": self.resolution_notes, "created_at": to_iso8601_utc(self.created_at), "updated_at": to_iso8601_utc(self.updated_at), "acknowledged_at": to_iso8601_utc(self.acknowledged_at), "resolved_at": to_iso8601_utc(self.resolved_at), }