import uuid from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, func from ..database import get_db from ..models.session import Session from ..models.candidate import Candidate from ..schemas.session import SessionCreate, SessionResponse router = APIRouter() @router.post("", response_model=SessionResponse, status_code=201) async def create_session(payload: SessionCreate, db: AsyncSession = Depends(get_db)): session = Session(id=uuid.uuid4(), name=payload.name, description=payload.description) db.add(session) await db.commit() await db.refresh(session) return session @router.get("", response_model=list[SessionResponse]) async def list_sessions(db: AsyncSession = Depends(get_db)): result = await db.execute(select(Session).order_by(Session.created_at.desc()).limit(50)) return result.scalars().all() @router.get("/{session_id}", response_model=SessionResponse) async def get_session(session_id: uuid.UUID, db: AsyncSession = Depends(get_db)): result = await db.execute(select(Session).where(Session.id == session_id)) sess = result.scalar_one_or_none() if not sess: raise HTTPException(status_code=404, detail="Session not found") return sess from qdrant_client import QdrantClient from qdrant_client.models import Filter, FieldCondition, MatchValue from ..config import get_settings from ..models.match_result import MatchResult def _get_qdrant() -> QdrantClient: settings = get_settings() return QdrantClient(url=settings.qdrant_url, api_key=settings.qdrant_api_key) @router.delete("/{session_id}", status_code=204) async def delete_session(session_id: uuid.UUID, db: AsyncSession = Depends(get_db)): result = await db.execute(select(Session).where(Session.id == session_id)) sess = result.scalar_one_or_none() if not sess: raise HTTPException(status_code=404, detail="Session not found") session_str = str(session_id) settings = get_settings() try: qdrant = _get_qdrant() qdrant.delete( collection_name=settings.collection_name, points_selector=Filter( must=[ FieldCondition(key="session_id", match=MatchValue(value=session_str)) ] ) ) except Exception as e: print(f"Warning: Failed deleting Qdrant targets for session {session_str}: {e}") await db.execute(MatchResult.__table__.delete().where(MatchResult.session_id == session_id)) await db.execute(Candidate.__table__.delete().where(Candidate.session_id == session_id)) await db.delete(sess) await db.commit()