#api/models.py from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Text from sqlalchemy.orm import relationship from sqlalchemy.sql import func from api.database import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String(50), unique=True, nullable=False) hashed_password = Column(String(255), nullable=False) conversations = relationship("Conversation", back_populates="user") documents = relationship("Document", back_populates="user") class Conversation(Base): __tablename__ = "conversations" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) state = Column(Text) # JSON-serialized AgentState messages = relationship("Message", back_populates="conversation", cascade="all, delete-orphan") document = relationship("Document", uselist=False, back_populates="conversation", cascade="all, delete-orphan") def __repr__(self): return f"" user = relationship("User", back_populates="conversations") class Message(Base): __tablename__ = "messages" id = Column(Integer, primary_key=True, index=True) conversation_id = Column(Integer, ForeignKey("conversations.id"), nullable=False) sender = Column(String(20)) # "user" or "assistant" content = Column(Text, nullable=False) timestamp = Column(DateTime(timezone=True), server_default=func.now()) conversation = relationship("Conversation", back_populates="messages") class Document(Base): __tablename__ = "documents" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) conversation_id = Column(Integer, ForeignKey("conversations.id"), unique=True) doc_type = Column(String(100), nullable=False) content = Column(Text, nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) user = relationship("User", back_populates="documents") conversation = relationship("Conversation", back_populates="document")