from sqlalchemy import create_engine, Column, String, Text, ForeignKey, DateTime from sqlalchemy.orm import sessionmaker, declarative_base, relationship from datetime import datetime # Database Configuration DATABASE_URL = "sqlite:///./chats.db" engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(String, primary_key=True, unique=True, nullable=False) email = Column(String, unique=True, nullable=False) name = Column(String, nullable=False) chats = relationship("Chat", back_populates="user", cascade="all, delete-orphan") class Chat(Base): __tablename__ = "chats" chat_id = Column(String, primary_key=True, unique=True, nullable=False) user_id = Column(String, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) title = Column(String, nullable=False) timestamp = Column(DateTime, default=datetime.utcnow, nullable=False) messages = relationship("ChatMessage", back_populates="chat", cascade="all, delete-orphan") documents = relationship("Document", back_populates="chat", cascade="all, delete-orphan") user = relationship("User", back_populates="chats") class ChatMessage(Base): __tablename__ = "chat_messages" id = Column(String, primary_key=True, unique=True, nullable=False) chat_id = Column(String, ForeignKey("chats.chat_id", ondelete="CASCADE"), nullable=False) type = Column(String, nullable=False) # 'user' or 'assistant' content = Column(Text, nullable=False) timestamp = Column(DateTime, default=datetime.utcnow, nullable=False) referenced_docs = Column(Text, nullable=True) # JSON string of referenced documents chat = relationship("Chat", back_populates="messages") class Document(Base): __tablename__ = "documents" id = Column(String, primary_key=True, unique=True, nullable=False) chat_id = Column(String, ForeignKey("chats.chat_id", ondelete="CASCADE"), nullable=False) name = Column(String, nullable=False) content = Column(Text, nullable=False) timestamp = Column(DateTime, default=datetime.utcnow, nullable=False) chat = relationship("Chat", back_populates="documents") Base.metadata.create_all(bind=engine) def get_db(): db = SessionLocal() try: yield db finally: db.close()