from __future__ import annotations import uuid from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, String, Text from sqlalchemy.orm import Mapped, mapped_column from .base import Base class AuditEvent(Base): __tablename__ = "audit_events" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) timestamp: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(timezone.utc) ) user_id: Mapped[str | None] = mapped_column( String(36), ForeignKey("users.id", ondelete="SET NULL"), nullable=True ) # Denormalized so display survives user deletion username: Mapped[str] = mapped_column(String(64), nullable=False, default="system") action: Mapped[str] = mapped_column(String(64), nullable=False) entity_type: Mapped[str | None] = mapped_column(String(64), nullable=True) entity_id: Mapped[str | None] = mapped_column(String(255), nullable=True) detail_json: Mapped[str | None] = mapped_column(Text, nullable=True)