| 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)}") |