"""SQLAlchemy ORM models for PostgreSQL.""" from __future__ import annotations import uuid from datetime import datetime, timezone from sqlalchemy import JSON, DateTime, Float, Integer, String, Text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): pass class EventRecord(Base): __tablename__ = "events" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) timestamp: Mapped[datetime] = mapped_column(DateTime(timezone=True)) event_type: Mapped[str] = mapped_column(String(128)) source_ip: Mapped[str | None] = mapped_column(String(64), nullable=True) host: Mapped[str] = mapped_column(String(256), default="unknown") severity: Mapped[str] = mapped_column(String(32)) payload: Mapped[dict] = mapped_column(JSON, default=dict) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) class IncidentRecord(Base): __tablename__ = "incidents" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) title: Mapped[str] = mapped_column(String(512)) summary: Mapped[str] = mapped_column(Text) graph: Mapped[dict] = mapped_column(JSON, default=dict) risk_score: Mapped[float] = mapped_column(Float, default=0) severity: Mapped[str] = mapped_column(String(32)) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) class AlertRecord(Base): __tablename__ = "alerts" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) channel: Mapped[str] = mapped_column(String(64)) title: Mapped[str] = mapped_column(String(512)) body: Mapped[str] = mapped_column(Text) severity: Mapped[str] = mapped_column(String(32)) incident_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) class MetricSnapshot(Base): __tablename__ = "metric_snapshots" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) threats_detected: Mapped[int] = mapped_column(Integer, default=0) active_incidents: Mapped[int] = mapped_column(Integer, default=0) blocked: Mapped[int] = mapped_column(Integer, default=0) recorded_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))