GST_RAG_BACKEND / app /api /sessions.py
Samaksh25's picture
fix(retrieval): CrossEncoder ms-marco + PRF + synonym expansion
6733714
Raw
History Blame Contribute Delete
3.95 kB
from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel
from typing import List, Optional, Dict
from datetime import datetime
import uuid
from app.database import get_session_collection
from app.security import get_current_user
router = APIRouter()
class SessionCreate(BaseModel):
title: Optional[str] = "New Chat"
class Session(BaseModel):
session_id: str
title: str
created_at: datetime
updated_at: datetime
messages: List[Dict] = []
@router.post("/new", response_model=Session)
def create_session(data: SessionCreate, current_user: dict = Depends(get_current_user)):
collection = get_session_collection()
session_id = str(uuid.uuid4())
user_id = current_user["username"]
new_session = {
"session_id": session_id,
"user_id": user_id,
"title": data.title,
"created_at": datetime.now(),
"updated_at": datetime.now(),
"messages": []
}
if collection is not None:
collection.insert_one(new_session)
new_session.pop("_id")
return new_session
else:
return new_session
@router.get("/list", response_model=List[Session])
def list_sessions(current_user: dict = Depends(get_current_user)):
collection = get_session_collection()
if collection is None:
return []
user_id = current_user["username"]
sessions_cursor = collection.find(
{"user_id": user_id},
{"_id": 0, "messages": 0}
).sort("updated_at", -1)
return list(sessions_cursor)
@router.get("/{session_id}", response_model=Session)
def get_session(session_id: str, current_user: dict = Depends(get_current_user)):
collection = get_session_collection()
if collection is None:
return {"session_id": session_id, "title": "Offline Chat", "created_at": datetime.now(), "updated_at": datetime.now(), "messages": []}
user_id = current_user["username"]
session = collection.find_one({"session_id": session_id, "user_id": user_id}, {"_id": 0})
if not session:
raise HTTPException(status_code=404, detail="Session not found")
return session
class SessionRename(BaseModel):
title: str
@router.patch("/{session_id}/rename")
def rename_session(session_id: str, data: SessionRename, current_user: dict = Depends(get_current_user)):
collection = get_session_collection()
if collection is None:
return {"session_id": session_id, "title": data.title}
user_id = current_user["username"]
result = collection.update_one(
{"session_id": session_id, "user_id": user_id},
{"$set": {"title": data.title, "updated_at": datetime.now()}}
)
if result.matched_count == 0:
raise HTTPException(status_code=404, detail="Session not found")
return {"session_id": session_id, "title": data.title}
@router.get("/search", response_model=List[Session])
def search_sessions(q: str, current_user: dict = Depends(get_current_user)):
collection = get_session_collection()
if collection is None:
return []
user_id = current_user["username"]
regex = {"$regex": q, "$options": "i"}
sessions_cursor = collection.find(
{"user_id": user_id, "$or": [
{"title": regex},
{"messages.content": regex},
]},
{"_id": 0, "messages": 0}
).sort("updated_at", -1).limit(20)
return list(sessions_cursor)
@router.delete("/{session_id}")
def delete_session(session_id: str, current_user: dict = Depends(get_current_user)):
collection = get_session_collection()
if collection is None:
return {"status": "deleted (offline)", "session_id": session_id}
user_id = current_user["username"]
result = collection.delete_one({"session_id": session_id, "user_id": user_id})
if result.deleted_count == 0:
raise HTTPException(status_code=404, detail="Session not found")
return {"status": "deleted", "session_id": session_id}