Files
planet/backend/app/models/alert.py

59 lines
2.1 KiB
Python

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),
}