File size: 5,516 Bytes
92343a7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
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)}") |