from datetime import datetime
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Boolean, JSON
from sqlalchemy.orm import relationship
from ..database import Base
class Session(Base):
__tablename__ = 'sessions'
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String, ForeignKey('users.id'), index=True, nullable=False)
title = Column(String, index=True, nullable=True)
provider_name = Column(String, nullable=True)
stt_provider_name = Column(String, nullable=True)
tts_provider_name = Column(String, nullable=True)
feature_name = Column(String, default="default", nullable=False)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
is_archived = Column(Boolean, default=False, nullable=False)
is_cancelled = Column(Boolean, default=False, nullable=False)
sync_workspace_id = Column(String, nullable=True, index=True)
attached_node_ids = Column(JSON, default=[], nullable=True)
node_sync_status = Column(JSON, default={}, nullable=True)
sync_config = Column(JSON, default={}, nullable=True)
messages = relationship("Message", back_populates="session", cascade="all, delete-orphan")
user = relationship("User", back_populates="sessions")
def __repr__(self):
return f"<Session(id={self.id}, title='{self.title}', user_id='{self.user_id}')>"
class Message(Base):
__tablename__ = 'messages'
id = Column(Integer, primary_key=True, index=True)
session_id = Column(Integer, ForeignKey('sessions.id'), nullable=False)
sender = Column(String, nullable=False)
content = Column(Text, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
model_response_time = Column(Integer, nullable=True)
token_count = Column(Integer, nullable=True)
message_metadata = Column(JSON, nullable=True)
reasoning_content = Column(Text, nullable=True)
audio_path = Column(String, nullable=True)
session = relationship("Session", back_populates="messages")
def __repr__(self):
return f"<Message(id={self.id}, session_id={self.session_id}, sender='{self.sender}')>"