from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from db.base import Base def _utcnow() -> datetime: return datetime.now(timezone.utc) class ThreadState(Base): """Состояние треда для state machine (Спринт 5). Одна строка на тред: какая ветка сейчас ведёт разговор, на каком шаге она внутри своего сценария и какие слоты собраны. `slots_json` — произвольный JSON, формат определяется конкретной веткой. """ __tablename__ = "thread_state" thread_id: Mapped[int] = mapped_column( ForeignKey("threads.id", ondelete="CASCADE"), primary_key=True ) current_intent_code: Mapped[str | None] = mapped_column(String(50), nullable=True) current_step: Mapped[int] = mapped_column(Integer, nullable=False, default=0) current_step_code: Mapped[str | None] = mapped_column(String(50), nullable=True) slots_json: Mapped[str] = mapped_column(Text, nullable=False, default="{}") updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=_utcnow, onupdate=_utcnow, nullable=False )