35 lines
1.5 KiB
Python
35 lines
1.5 KiB
Python
from __future__ import annotations
|
|||
|
|
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
from sqlalchemy import DateTime, Integer, JSON, String, Text
|
||
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
||
|
|
|
||
|
|
from app.db.session import Base
|
||
|
|
|
||
|
|
|
||
|
|
class EditorChangeEvent(Base):
|
||
|
|
"""An audit row recording an edit to a mix or an ingredient.
|
||
|
|
|
||
|
|
Written by the editor API whenever a mix or raw material (ingredient) is
|
||
|
|
created or changed, and read back per-entity by the History buttons on the
|
||
|
|
Mix Editor and Ingredients Editor. `changes` holds a list of
|
||
|
|
``{"field", "label", "before", "after"}`` field deltas so the UI can show a
|
||
|
|
readable before/after for each edit.
|
||
|
|
"""
|
||
|
|
|
||
|
|
__tablename__ = "editor_change_events"
|
||
|
|
|
||
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||
|
|
tenant_id: Mapped[str] = mapped_column(String(64), default="default", index=True)
|
||
|
|
# "mix" or "ingredient" — the surface the History button lives on.
|
||
|
|
entity_type: Mapped[str] = mapped_column(String(32), index=True)
|
||
|
|
entity_id: Mapped[int] = mapped_column(Integer, index=True)
|
||
|
|
action: Mapped[str] = mapped_column(String(48))
|
||
|
|
actor_name: Mapped[str] = mapped_column(String(255), default="")
|
||
|
|
actor_email: Mapped[str] = mapped_column(String(255), default="")
|
||
|
|
actor_role: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||
|
|
summary: Mapped[str] = mapped_column(Text, default="")
|
||
|
|
changes: Mapped[list | None] = mapped_column(JSON, nullable=True)
|
||
|
|
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, index=True)
|