from fastapi import APIRouter, Request, HTTPException, Depends from datetime import datetime from bson.objectid import ObjectId from auth import get_current_user from database import get_db router = APIRouter(prefix="/api", tags=["Conversations"]) db = get_db() @router.get("/conversations") async def get_conversations(current_user: dict = Depends(get_current_user)): try: user_id = str(current_user["_id"]) conversations = list(db.conversations.find( {"user_id": user_id}, {"_id": 1, "title": 1, "date": 1, "time": 1, "last_message": 1, "created_at": 1} ).sort("created_at", -1)) for conv in conversations: conv["_id"] = str(conv["_id"]) return {"conversations": conversations} except Exception as e: raise HTTPException(status_code=500, detail=f"Erreur serveur: {str(e)}") @router.post("/conversations") async def create_conversation(request: Request, current_user: dict = Depends(get_current_user)): try: data = await request.json() user_id = str(current_user["_id"]) conversation = { "user_id": user_id, "title": data.get("title", "Nouvelle conversation"), "date": data.get("date"), "time": data.get("time"), "last_message": data.get("message", ""), "created_at": datetime.utcnow() } result = db.conversations.insert_one(conversation) return {"conversation_id": str(result.inserted_id)} except Exception as e: raise HTTPException(status_code=500, detail=f"Erreur serveur: {str(e)}") @router.post("/conversations/{conversation_id}/messages") async def add_message(conversation_id: str, request: Request, current_user: dict = Depends(get_current_user)): try: data = await request.json() user_id = str(current_user["_id"]) print(f"Ajout message: conversation_id={conversation_id}, sender={data.get('sender')}, text={data.get('text')[:20]}...") conversation = db.conversations.find_one({ "_id": ObjectId(conversation_id), "user_id": user_id }) if not conversation: raise HTTPException(status_code=404, detail="Conversation non trouvée") message = { "conversation_id": conversation_id, "user_id": user_id, "sender": data.get("sender", "user"), "text": data.get("text", ""), "timestamp": datetime.utcnow() } db.messages.insert_one(message) db.conversations.update_one( {"_id": ObjectId(conversation_id)}, {"$set": {"last_message": data.get("text", ""), "updated_at": datetime.utcnow()}} ) return {"success": True} except Exception as e: print(f"Erreur lors de l'ajout d'un message: {str(e)}") raise HTTPException(status_code=500, detail=f"Erreur serveur: {str(e)}") @router.get("/conversations/{conversation_id}/messages") async def get_messages(conversation_id: str, current_user: dict = Depends(get_current_user)): try: user_id = str(current_user["_id"]) conversation = db.conversations.find_one({ "_id": ObjectId(conversation_id), "user_id": user_id }) if not conversation: raise HTTPException(status_code=404, detail="Conversation non trouvée") messages = list(db.messages.find( {"conversation_id": conversation_id} ).sort("timestamp", 1)) deduplicated_messages = [] seen_texts = set() for msg in messages: msg["_id"] = str(msg["_id"]) if "timestamp" in msg: msg["timestamp"] = msg["timestamp"].isoformat() timestamp_rounded = msg.get("timestamp", "")[:19] dedup_key = f"{msg['sender']}:{msg['text'][:50]}:{timestamp_rounded}" if dedup_key not in seen_texts: seen_texts.add(dedup_key) deduplicated_messages.append(msg) if msg["sender"] == "assistant" and deduplicated_messages and deduplicated_messages[-1]["sender"] == "bot": if deduplicated_messages[-1]["text"] == msg["text"]: deduplicated_messages.pop() return {"messages": deduplicated_messages} except Exception as e: raise HTTPException(status_code=500, detail=f"Erreur serveur: {str(e)}") @router.delete("/conversations/{conversation_id}") async def delete_conversation(conversation_id: str, current_user: dict = Depends(get_current_user)): try: user_id = str(current_user["_id"]) result = db.conversations.delete_one({ "_id": ObjectId(conversation_id), "user_id": user_id }) if result.deleted_count == 0: raise HTTPException(status_code=404, detail="Conversation non trouvée") db.messages.delete_many({"conversation_id": conversation_id}) return {"success": True} except Exception as e: raise HTTPException(status_code=500, detail=f"Erreur serveur: {str(e)}")