from datetime import datetime from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, func from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.base import Base class ChatSession(Base): __tablename__ = "chat_sessions" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) title: Mapped[str] = mapped_column(String(255), default="Новый чат") created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now() ) messages: Mapped[list["Message"]] = relationship( back_populates="session", cascade="all, delete-orphan", order_by="Message.created_at" ) class Message(Base): __tablename__ = "messages" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) session_id: Mapped[int] = mapped_column(ForeignKey("chat_sessions.id", ondelete="CASCADE"), index=True) role: Mapped[str] = mapped_column(String(32)) content: Mapped[str] = mapped_column(Text, default="") tool_calls_json: Mapped[str | None] = mapped_column(Text, nullable=True) tool_call_id: Mapped[str | None] = mapped_column(String(64), nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) session: Mapped["ChatSession"] = relationship(back_populates="messages") class PomodoroSession(Base): __tablename__ = "pomodoro_sessions" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) status: Mapped[str] = mapped_column(String(32), default="idle") duration_min: Mapped[int] = mapped_column(Integer, default=25) task_note: Mapped[str] = mapped_column(Text, default="") result: Mapped[str | None] = mapped_column(Text, nullable=True) completed: Mapped[bool] = mapped_column(Boolean, default=False) started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) paused_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) elapsed_seconds: Mapped[int] = mapped_column(Integer, default=0) finished_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())