"""Audit-Ereignisse (→ Konzept 13).""" from datetime import datetime from typing import Any from sqlalchemy import JSON, BigInteger, ForeignKey, Identity, String from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base, now class AuditEvent(Base): __tablename__ = "audit_events" id: Mapped[int] = mapped_column(BigInteger, Identity(), primary_key=True) time: Mapped[datetime] = mapped_column(default=now, index=True) user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id")) workspace_id: Mapped[int | None] = mapped_column(ForeignKey("workspaces.id", ondelete="SET NULL"), index=True) action: Mapped[str] = mapped_column(String(100)) # z. B. source.tested target_kind: Mapped[str] = mapped_column(String(50), default="") target_id: Mapped[str] = mapped_column(String(100), default="") # Keine Geheimnisse und keine vollständigen Inhalte (→ Konzept 6.2) data: Mapped[dict[str, Any]] = mapped_column(JSON, default=dict)