"""Audit log model for compliance and security tracking.""" from datetime import datetime from enum import Enum from uuid import UUID, uuid4 from sqlalchemy import String, ForeignKey, JSON, INET, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database import Base class AuditSeverity(str, Enum): INFO = "info" WARNING = "warning" CRITICAL = "critical" class AuditLog(Base): __tablename__ = "audit_logs" id: Mapped[UUID] = mapped_column(primary_key=True, default=uuid4) tenant_id: Mapped[UUID | None] = mapped_column(ForeignKey("tenants.id")) user_id: Mapped[UUID | None] = mapped_column(ForeignKey("users.id")) action: Mapped[str] = mapped_column(String(50), nullable=False) resource_type: Mapped[str] = mapped_column(String(50), nullable=False) resource_id: Mapped[UUID | None] details: Mapped[dict] = mapped_column(JSON, default=dict) ip_address: Mapped[str | None] = mapped_column(INET) user_agent: Mapped[str | None] = mapped_column(Text) severity: Mapped[AuditSeverity] = mapped_column(default=AuditSeverity.INFO) created_at: Mapped[datetime] = mapped_column(default=datetime.utcnow) # Relationships tenant: Mapped["Tenant | None"] = relationship(back_populates="audit_logs") user: Mapped["User | None"] = relationship(back_populates="audit_logs") def __repr__(self) -> str: return f""