Files
leocrm/app/models/entity_history.py
T

41 lines
1.6 KiB
Python
Raw Normal View History

2026-07-23 08:42:26 +02:00
"""EntityHistory model — snapshot history for undo/restore functionality."""
from __future__ import annotations
import uuid
from datetime import datetime
from typing import Any
from sqlalchemy import DateTime, ForeignKey, String, func
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.dialects.postgresql import UUID as PGUUID
from sqlalchemy.orm import Mapped, mapped_column
from app.core.db import Base, TenantMixin
class EntityHistory(Base, TenantMixin):
"""Snapshot history for undo/restore functionality.
Every CRUD action (create/update/delete) stores a full entity snapshot
so users can undo changes or revert to previous versions.
"""
__tablename__ = "entity_history"
id: Mapped[uuid.UUID] = mapped_column(
PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4
)
user_id: Mapped[uuid.UUID | None] = mapped_column(
PGUUID(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True
)
entity_type: Mapped[str] = mapped_column(String(50), nullable=False, index=True)
entity_id: Mapped[uuid.UUID] = mapped_column(PGUUID(as_uuid=True), nullable=False, index=True)
action: Mapped[str] = mapped_column(String(20), nullable=False) # 'create', 'update', 'delete'
snapshot_before: Mapped[dict[str, Any] | None] = mapped_column(JSONB, nullable=True)
snapshot_after: Mapped[dict[str, Any] | None] = mapped_column(JSONB, nullable=True)
changes: Mapped[dict[str, Any] | None] = mapped_column(JSONB, nullable=True)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), nullable=False, server_default=func.now(), index=True
)