from datetime import datetime from typing import Any from sqlalchemy import JSON, DateTime, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base from app.models.user import utcnow class AuditEvent(Base): __tablename__ = "audit_events" id: Mapped[int] = mapped_column(primary_key=True) # строковый тип события (индексируется); event_type: Mapped[str] = mapped_column(String(100), index=True) # внешний ключ на `users.id`, может быть NULL для анонимных событий; actor_id: Mapped[int | None] = mapped_column(ForeignKey("users.id"), nullable=True) # строковый идентификатор клиента (если применимо); client_id: Mapped[str | None] = mapped_column(String(64), nullable=True) # откуда пришло событие; ip: Mapped[str | None] = mapped_column(String(45), nullable=True) user_agent: Mapped[str | None] = mapped_column(String(512), nullable=True) # JSON-поле для произвольных данных; metadata_json: Mapped[dict[str, Any] | None] = mapped_column(JSON, nullable=True) # created_at created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=utcnow )