diff --git a/modules/datamodels/datamodelChatbot.py b/modules/datamodels/datamodelChatbot.py index 906757b7..9b6c723a 100644 --- a/modules/datamodels/datamodelChatbot.py +++ b/modules/datamodels/datamodelChatbot.py @@ -34,9 +34,9 @@ class ThreadSummary(BaseModel, ModelMixin): """Summary of a chat thread for list view""" thread_id: str = Field(..., description="Thread ID") - created_at: float = Field(..., description="Thread creation timestamp") - last_message: str = Field(..., description="Last message content") - message_count: int = Field(..., description="Total number of messages") + thread_name: str = Field(..., description="Thread name") + date_created: float = Field(..., description="Thread creation timestamp") + date_updated: float = Field(..., description="Thread last updated timestamp") class ThreadListResponse(BaseModel, ModelMixin): @@ -96,9 +96,9 @@ register_model_labels( {"en": "Thread Summary", "fr": "Résumé du fil"}, { "thread_id": {"en": "Thread ID", "fr": "ID du fil"}, - "created_at": {"en": "Created At", "fr": "Créé le"}, - "last_message": {"en": "Last Message", "fr": "Dernier message"}, - "message_count": {"en": "Message Count", "fr": "Nombre de messages"}, + "thread_name": {"en": "Thread Name", "fr": "Nom du fil"}, + "date_created": {"en": "Date Created", "fr": "Date de création"}, + "date_updated": {"en": "Date Updated", "fr": "Date de mise à jour"}, }, ) diff --git a/modules/features/chatBot/service.py b/modules/features/chatBot/service.py index 05df7f0f..3060081d 100644 --- a/modules/features/chatBot/service.py +++ b/modules/features/chatBot/service.py @@ -13,7 +13,11 @@ from modules.features.chatBot.utils.checkpointer import get_checkpointer from modules.features.chatBot.utils.toolRegistry import get_registry from modules.features.chatBot.utils import permissions from modules.features.chatBot.database import UserThreadMapping -from modules.datamodels.datamodelChatbot import MessageItem, ChatMessageResponse +from modules.datamodels.datamodelChatbot import ( + MessageItem, + ChatMessageResponse, + ThreadSummary, +) from modules.datamodels.datamodelUam import User from langchain_core.messages import HumanMessage, AIMessage @@ -22,6 +26,47 @@ from modules.shared.configuration import APP_CONFIG logger = logging.getLogger(__name__) +async def get_all_threads_for_user( + *, + user: User, + session: AsyncSession, +) -> List[ThreadSummary]: + """Get all chat threads for a user. + + Args: + user: The current user. + session: The database session for querying. + + Returns: + List of ThreadSummary objects sorted by date_updated (newest first). + Returns empty list if no threads found. + """ + logger.info(f"Fetching all threads for user {user.id}") + + # Query all threads for this user, ordered by date_updated descending + stmt = ( + select(UserThreadMapping) + .where(UserThreadMapping.userId == user.id) + .order_by(UserThreadMapping.date_updated.desc()) + ) + result = await session.execute(stmt) + thread_mappings = result.scalars().all() + + # Convert to ThreadSummary objects + threads = [] + for mapping in thread_mappings: + thread_summary = ThreadSummary( + thread_id=mapping.threadId, + thread_name=mapping.threadName, + date_created=mapping.date_created.timestamp(), + date_updated=mapping.date_updated.timestamp(), + ) + threads.append(thread_summary) + + logger.info(f"Found {len(threads)} threads for user {user.id}") + return threads + + async def save_thread_for_user( *, thread_id: str, diff --git a/modules/routes/routeChatbot.py b/modules/routes/routeChatbot.py index e14f38c6..b7faec2d 100644 --- a/modules/routes/routeChatbot.py +++ b/modules/routes/routeChatbot.py @@ -143,40 +143,23 @@ async def post_chat_message( @router.get("/threads", response_model=ThreadListResponse) @limiter.limit("30/minute") async def get_all_threads( - *, request: Request, currentUser: User = Depends(getCurrentUser) + *, + request: Request, + currentUser: User = Depends(getCurrentUser), + session: AsyncSession = Depends(get_async_db_session), ) -> ThreadListResponse: """ Get all chat threads for the current user. - - This endpoint will later fetch from LangGraph's PostgreSQL checkpointer. """ try: - # Return dummy thread data - # In production, this will query LangGraph's checkpointer database - dummy_threads = [ - ThreadSummary( - thread_id="thread_001", - created_at=datetime.now().timestamp() - 86400, # 1 day ago - last_message="Hello, how can I help you?", - message_count=4, - ), - ThreadSummary( - thread_id="thread_002", - created_at=datetime.now().timestamp() - 3600, # 1 hour ago - last_message="Thank you for your help!", - message_count=8, - ), - ThreadSummary( - thread_id="thread_003", - created_at=datetime.now().timestamp() - 300, # 5 minutes ago - last_message="Can you explain this concept?", - message_count=2, - ), - ] + # Get all threads for the current user + threads = await chat_service.get_all_threads_for_user( + user=currentUser, session=session + ) - logger.info(f"User {currentUser.id} retrieved {len(dummy_threads)} threads") + logger.info(f"User {currentUser.id} retrieved {len(threads)} threads") - return ThreadListResponse(threads=dummy_threads) + return ThreadListResponse(threads=threads) except Exception as e: logger.error(