From ceddacf9cb70c3bf945b46c749df926a2d30a6ad Mon Sep 17 00:00:00 2001 From: Yunxiao Xu Date: Wed, 11 Feb 2026 16:09:22 -0800 Subject: [PATCH] feat(api): Implement create conversation endpoint --- src/ea_chatbot/api/routers/history.py | 23 ++++++++++++++++++++++- src/ea_chatbot/api/schemas.py | 5 +++++ tests/api/test_api_history.py | 21 +++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/ea_chatbot/api/routers/history.py b/src/ea_chatbot/api/routers/history.py index 46a2e93..f0b2302 100644 --- a/src/ea_chatbot/api/routers/history.py +++ b/src/ea_chatbot/api/routers/history.py @@ -2,10 +2,31 @@ from fastapi import APIRouter, Depends, HTTPException, status, Response from typing import List, Optional from ea_chatbot.api.dependencies import get_current_user, history_manager, settings from ea_chatbot.history.models import User as UserDB -from ea_chatbot.api.schemas import ConversationResponse, MessageResponse, ConversationUpdate +from ea_chatbot.api.schemas import ConversationResponse, MessageResponse, ConversationUpdate, ConversationCreate router = APIRouter(prefix="/conversations", tags=["history"]) +@router.post("", response_model=ConversationResponse, status_code=status.HTTP_201_CREATED) +async def create_conversation( + conv_in: ConversationCreate, + current_user: UserDB = Depends(get_current_user) +): + """Create a new conversation.""" + state = conv_in.data_state or settings.data_state + conv = history_manager.create_conversation( + user_id=current_user.id, + data_state=state, + name=conv_in.name, + summary=conv_in.summary + ) + return { + "id": str(conv.id), + "name": conv.name, + "summary": conv.summary, + "created_at": conv.created_at, + "data_state": conv.data_state + } + @router.get("", response_model=List[ConversationResponse]) async def list_conversations( current_user: UserDB = Depends(get_current_user), diff --git a/src/ea_chatbot/api/schemas.py b/src/ea_chatbot/api/schemas.py index 3d7cb3f..8be17f3 100644 --- a/src/ea_chatbot/api/schemas.py +++ b/src/ea_chatbot/api/schemas.py @@ -27,6 +27,11 @@ class ConversationResponse(BaseModel): created_at: datetime data_state: str +class ConversationCreate(BaseModel): + name: str + data_state: Optional[str] = None + summary: Optional[str] = None + class MessageResponse(BaseModel): id: str role: str diff --git a/tests/api/test_api_history.py b/tests/api/test_api_history.py index 349d0f9..5e0a76b 100644 --- a/tests/api/test_api_history.py +++ b/tests/api/test_api_history.py @@ -41,6 +41,27 @@ def test_get_conversations_success(auth_header, mock_user): assert len(response.json()) == 1 assert response.json()[0]["name"] == "Conv 1" +def test_create_conversation_success(auth_header, mock_user): + """Test creating a new conversation.""" + with patch("ea_chatbot.api.routers.history.history_manager") as mock_hm: + mock_hm.create_conversation.return_value = Conversation( + id="c2", + name="New Conv", + user_id=mock_user.id, + data_state="nj", + created_at=datetime.now(timezone.utc) + ) + + response = client.post( + "/conversations", + json={"name": "New Conv"}, + headers=auth_header + ) + + assert response.status_code == 201 + assert response.json()["name"] == "New Conv" + assert response.json()["id"] == "c2" + def test_get_messages_success(auth_header): """Test retrieving messages for a conversation.""" with patch("ea_chatbot.api.routers.history.history_manager") as mock_hm: