You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
2.1 KiB
47 lines
2.1 KiB
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from sqlalchemy import DateTime, ForeignKey, Index, String
|
|
from sqlalchemy.types import JSON
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
from sqlalchemy.sql import func
|
|
|
|
from app.models.base import BaseModel, ID_TYPE
|
|
|
|
|
|
class AuditLog(BaseModel):
|
|
__tablename__ = "audit_logs"
|
|
__table_args__ = (
|
|
Index("idx_audit_logs_created_at", "created_at"),
|
|
Index("idx_audit_logs_actor_created_at", "actor_user_id", "created_at"),
|
|
Index("idx_audit_logs_action_created_at", "action_type", "created_at"),
|
|
Index("idx_audit_logs_target", "target_type", "target_id", "created_at"),
|
|
)
|
|
|
|
id: Mapped[int] = mapped_column(ID_TYPE, primary_key=True)
|
|
actor_user_id: Mapped[int | None] = mapped_column(
|
|
ID_TYPE,
|
|
ForeignKey("accounts.id", ondelete="SET NULL"),
|
|
nullable=True,
|
|
)
|
|
actor_username: Mapped[str] = mapped_column(String(64), nullable=False)
|
|
actor_display_name: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
|
action_type: Mapped[str] = mapped_column(String(32), nullable=False)
|
|
target_type: Mapped[str] = mapped_column(String(32), nullable=False)
|
|
target_id: Mapped[int | None] = mapped_column(ID_TYPE, nullable=True)
|
|
target_display_name: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
|
before_data_json: Mapped[dict[str, object] | list[object] | None] = mapped_column(JSON, nullable=True)
|
|
after_data_json: Mapped[dict[str, object] | list[object] | None] = mapped_column(JSON, nullable=True)
|
|
request_path: Mapped[str | None] = mapped_column(String(255), nullable=True)
|
|
request_method: Mapped[str | None] = mapped_column(String(16), nullable=True)
|
|
ip_address: Mapped[str | None] = mapped_column(String(45), nullable=True)
|
|
user_agent: Mapped[str | None] = mapped_column(String(512), nullable=True)
|
|
created_at: Mapped[datetime] = mapped_column(
|
|
DateTime,
|
|
nullable=False,
|
|
server_default=func.now(),
|
|
)
|
|
|
|
actor: Mapped[Any] = relationship("Account", back_populates="audit_logs")
|
|
|