from fastapi import APIRouter, HTTPException, status from pathlib import Path try: from backend.services.chat_service import ChatService from backend.core.config import settings except ImportError: # Docker环境:直接从当前目录导入 from services.chat_service import ChatService from core.config import settings router = APIRouter(prefix="/chat", tags=["chat"]) # 初始化聊天服务 data_path = Path(settings.DATA_PATH) if hasattr(settings, 'DATA_PATH') else Path("data") chat_service = ChatService(data_path) @router.get("", response_model=dict) async def list_all_chats(): """获取所有角色的所有聊天列表""" return chat_service.list_all_chats() @router.get("/{role_name}") async def list_role_chats(role_name: str): """获取指定角色的所有聊天列表""" try: all_chats = chat_service.list_all_chats() # 从所有聊天中筛选出该角色的聊天 role_chats = all_chats.get(role_name, []) return role_chats except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/{role_name}/{chat_name}") async def get_chat(role_name: str, chat_name: str): """获取指定聊天的完整内容""" try: return chat_service.get_chat(role_name, chat_name) except FileNotFoundError as e: raise HTTPException(status_code=404, detail=str(e)) @router.post("/{role_name}", status_code=status.HTTP_201_CREATED) async def create_chat(role_name: str, chat_data: dict): """创建新聊天""" try: chat_name = chat_data.get("chat_name", "新聊天") metadata = chat_data.get("metadata", {}) return chat_service.create_chat(role_name, chat_name, metadata) except FileExistsError as e: raise HTTPException(status_code=400, detail=str(e)) @router.put("/{role_name}/{chat_name}") async def update_chat(role_name: str, chat_name: str, update_data: dict): """更新聊天元数据""" # TODO: 实现更新聊天元数据功能 raise HTTPException(status_code=501, detail="Not Implemented") @router.delete("/{role_name}/{chat_name}") async def delete_chat(role_name: str, chat_name: str): """删除指定聊天""" # TODO: 实现删除聊天功能 raise HTTPException(status_code=501, detail="Not Implemented") @router.get("/{role_name}/{chat_name}/messages") async def list_messages(role_name: str, chat_name: str): """获取聊天的所有消息""" try: chat_data = chat_service.get_chat(role_name, chat_name) return {"messages": chat_data["messages"]} except FileNotFoundError as e: raise HTTPException(status_code=404, detail=str(e)) @router.get("/{role_name}/{chat_name}/messages/{floor}") async def get_message(role_name: str, chat_name: str, floor: int): """获取指定楼层的消息""" try: chat_data = chat_service.get_chat(role_name, chat_name) for msg in chat_data["messages"]: if msg.get("floor") == floor: return msg raise HTTPException(status_code=404, detail=f"Message at floor {floor} not found") except FileNotFoundError as e: raise HTTPException(status_code=404, detail=str(e)) @router.post("/{role_name}/{chat_name}/messages", status_code=status.HTTP_201_CREATED) async def add_message(role_name: str, chat_name: str, message_data: dict): """向聊天添加新消息""" try: return chat_service.add_message(role_name, chat_name, message_data) except FileNotFoundError as e: raise HTTPException(status_code=404, detail=str(e)) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.put("/{role_name}/{chat_name}/messages/{floor}") async def update_message(role_name: str, chat_name: str, floor: int, update_data: dict): """更新指定楼层的消息""" try: return chat_service.update_message(role_name, chat_name, floor, update_data) except FileNotFoundError as e: raise HTTPException(status_code=404, detail=str(e)) except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) @router.delete("/{role_name}/{chat_name}/messages/{floor}") async def delete_message(role_name: str, chat_name: str, floor: int): """删除指定楼层的消息""" try: return chat_service.delete_message(role_name, chat_name, floor) except FileNotFoundError as e: raise HTTPException(status_code=404, detail=str(e)) except ValueError as e: raise HTTPException(status_code=404, detail=str(e))