Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions backend/routes/sessions.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""Sessions routes — /api/sessions — full CRUD"""

import os
import shutil
import uuid
from fastapi import APIRouter, HTTPException
from models.schemas import SessionCreate, SessionUpdate, BulkSessionRenameRequest
Expand Down Expand Up @@ -87,6 +89,15 @@ async def delete_session(session_id: str):
rag_service.delete_session_index(session_id)
except Exception:
pass

upload_dir = f"./data/uploads/{session_id}"
if os.path.exists(upload_dir):
try:
shutil.rmtree(upload_dir)
except Exception:
# Continue even if directory deletion fails (e.g. file lock)
pass

return {"status": "deleted", "session_id": session_id}


Expand Down
18 changes: 18 additions & 0 deletions backend/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import json
import tempfile
import os
from unittest.mock import AsyncMock, patch

from fastapi.testclient import TestClient
Expand Down Expand Up @@ -61,6 +62,23 @@ def test_delete_session():
assert r2.status_code == 200


def test_delete_session_removes_files():
r = client.post("/api/sessions/", json={"title": "To Delete With Files"})
sid = r.json()["id"]

upload_dir = f"./data/uploads/{sid}"
os.makedirs(upload_dir, exist_ok=True)
with open(os.path.join(upload_dir, "test.txt"), "w") as f:
f.write("dummy")

assert os.path.exists(upload_dir)

r2 = client.delete(f"/api/sessions/{sid}")
assert r2.status_code == 200

assert not os.path.exists(upload_dir)


def test_get_messages_empty():
r = client.post("/api/sessions/", json={"title": "Msg Test"})
sid = r.json()["id"]
Expand Down
Loading