Spaces:
Sleeping
Sleeping
| """ | |
| Database models and connection for Neon PostgreSQL. | |
| """ | |
| import os | |
| from datetime import datetime | |
| from sqlalchemy import create_engine, Column, String, Text, DateTime, ForeignKey, JSON | |
| from sqlalchemy.ext.declarative import declarative_base | |
| from sqlalchemy.orm import sessionmaker, relationship | |
| from sqlalchemy.dialects.postgresql import UUID | |
| import uuid | |
| # Get database URL from environment | |
| DATABASE_URL = os.getenv("DATABASE_URL") | |
| # Create SQLAlchemy engine | |
| engine = create_engine(DATABASE_URL) if DATABASE_URL else None | |
| SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) if engine else None | |
| Base = declarative_base() | |
| # Models | |
| class Conversation(Base): | |
| __tablename__ = "conversations" | |
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) | |
| user_id = Column(String, nullable=False, index=True) # Clerk user ID | |
| title = Column(String, nullable=False) | |
| created_at = Column(DateTime, default=datetime.utcnow) | |
| updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) | |
| summary = Column(Text, nullable=True) # Short summary of the conversation | |
| # Relationship | |
| messages = relationship("Message", back_populates="conversation", cascade="all, delete-orphan") | |
| class Message(Base): | |
| __tablename__ = "messages" | |
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) | |
| conversation_id = Column(String, ForeignKey("conversations.id", ondelete="CASCADE"), nullable=False) | |
| role = Column(String, nullable=False) # 'user' or 'assistant' | |
| content = Column(Text, nullable=False) | |
| thoughts = Column(JSON, nullable=True) # Store agent thoughts | |
| created_at = Column(DateTime, default=datetime.utcnow) | |
| # Relationship | |
| conversation = relationship("Conversation", back_populates="messages") | |
| # Database initialization | |
| def init_db(): | |
| """Create all tables in the database.""" | |
| if engine: | |
| Base.metadata.create_all(bind=engine) | |
| print("✅ Database tables created successfully") | |
| else: | |
| print("⚠️ DATABASE_URL not configured") | |
| def get_db(): | |
| """Get database session.""" | |
| if SessionLocal: | |
| db = SessionLocal() | |
| try: | |
| yield db | |
| finally: | |
| db.close() | |
| else: | |
| yield None | |