Skip to content

Commit c7d7d58

Browse files
authored
Merge pull request #61 from ClipABit/redelete
added lost pagination
2 parents 307bda0 + 694c220 commit c7d7d58

File tree

4 files changed

+58
-13
lines changed

4 files changed

+58
-13
lines changed

backend/api/fastapi_router.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,12 @@ async def search(self, query: str, namespace: str = "", top_k: int = 10):
133133
logger.error(f"[Search] Error: {e}")
134134
raise HTTPException(status_code=500, detail=str(e))
135135

136-
async def list_videos(self, namespace: str = "__default__"):
136+
async def list_videos(
137+
self,
138+
namespace: str = "__default__",
139+
page_size: int = 20,
140+
page_token: str | None = None,
141+
):
137142
"""
138143
List all videos stored in R2 for the given namespace.
139144
@@ -146,13 +151,30 @@ async def list_videos(self, namespace: str = "__default__"):
146151
Raises:
147152
HTTPException: If fetching videos fails (500 Internal Server Error)
148153
"""
149-
logger.info(f"[List Videos] Fetching videos for namespace: {namespace}")
154+
if page_size <= 0:
155+
raise HTTPException(status_code=400, detail="page_size must be positive")
156+
157+
logger.info(
158+
"[List Videos] Fetching videos for namespace: %s (page_size=%s, page_token=%s)",
159+
namespace,
160+
page_size,
161+
page_token,
162+
)
150163
try:
151-
video_data = self.server_instance.r2_connector.fetch_all_video_data(namespace)
164+
videos, next_token, total_videos, total_pages = (
165+
self.server_instance.r2_connector.list_videos_page(
166+
namespace=namespace,
167+
page_size=page_size,
168+
continuation_token=page_token,
169+
)
170+
)
152171
return {
153172
"status": "success",
154173
"namespace": namespace,
155-
"videos": video_data
174+
"videos": videos,
175+
"next_page_token": next_token,
176+
"total_videos": total_videos,
177+
"total_pages": total_pages,
156178
}
157179
except Exception as e:
158180
logger.error(f"[List Videos] Error fetching videos: {e}")

backend/database/r2_connector.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def __init__(
5252

5353
logger.info(f"Initialized R2Connector for bucket: {self.bucket_name}")
5454

55-
self.url_cache_connnector = UrlCacheConnector(environment=environment)
55+
self._url_cache = UrlCacheConnector(environment=environment)
5656

5757
def _sanitize_filename(self, filename: str) -> str:
5858
"""
@@ -442,14 +442,14 @@ def list_videos_page(
442442
total_videos: Optional[int] = None
443443
cache_hit = False
444444

445-
if self.url_cache_connnector:
446-
cached = self.url_cache_connnector.get_page(namespace, normalized_token, page_size)
445+
if self._url_cache:
446+
cached = self._url_cache.get_page(namespace, normalized_token, page_size)
447447
if cached:
448448
videos = cached.get("videos", [])
449449
next_token = cached.get("next_token")
450450
cache_hit = True
451451

452-
metadata = self.url_cache_connnector.get_namespace_metadata(namespace)
452+
metadata = self._url_cache.get_namespace_metadata(namespace)
453453
if metadata is not None:
454454
total_videos = metadata.get("total_videos")
455455

@@ -459,13 +459,13 @@ def list_videos_page(
459459
page_size=page_size,
460460
continuation_token=normalized_token,
461461
)
462-
if self.url_cache_connnector:
463-
self.url_cache_connnector.set_page(namespace, normalized_token, page_size, videos, next_token)
462+
if self._url_cache:
463+
self._url_cache.set_page(namespace, normalized_token, page_size, videos, next_token)
464464

465465
if total_videos is None:
466466
total_videos = self.count_videos(namespace=namespace)
467-
if self.url_cache_connnector:
468-
self.url_cache_connnector.set_namespace_metadata(
467+
if self._url_cache:
468+
self._url_cache.set_namespace_metadata(
469469
namespace,
470470
{
471471
"total_videos": int(total_videos),
@@ -557,4 +557,4 @@ def fetch_all_video_data(
557557
return video_data_list
558558

559559
def clear_cache(self, namespace: str) -> int:
560-
return self.url_cache_connnector.clear_namespace(namespace or "__default__")
560+
return self._url_cache.clear_namespace(namespace or "__default__")

backend/tests/conftest.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,3 +391,12 @@ def pytest_configure(config):
391391
config.addinivalue_line(
392392
"markers", "slow: marks tests as slow (deselect with '-m \"not slow\"')"
393393
)
394+
395+
396+
def pytest_collection_modifyitems(session, config, items):
397+
"""Ensure API endpoint tests execute after the rest for isolation."""
398+
api_items = [item for item in items if "tests/integration/test_api_endpoints.py" in item.nodeid]
399+
if not api_items:
400+
return
401+
remaining = [item for item in items if item not in api_items]
402+
items[:] = remaining + api_items

backend/tests/integration/test_api_endpoints.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,17 @@ def fetch_all_video_data(self, namespace: str) -> List[Dict[str, Any]]:
5252
self.last_namespace = namespace
5353
return self.videos
5454

55+
def list_videos_page(
56+
self,
57+
namespace: str,
58+
page_size: int,
59+
continuation_token: str | None,
60+
) -> Tuple[List[Dict[str, Any]], str | None, int, int]:
61+
self.last_namespace = namespace
62+
total_videos = len(self.videos)
63+
total_pages = 1 if total_videos else 0
64+
return self.videos[:page_size], None, total_videos, total_pages
65+
5566

5667
class ServerStub:
5768
"""
@@ -126,6 +137,9 @@ def test_list_videos_returns_data(test_client_internal: Tuple[TestClient, Server
126137
assert data["namespace"] == "ns1"
127138
assert isinstance(data["videos"], list)
128139
assert data["videos"][0]["file_name"] == "sample.mp4"
140+
assert data["total_videos"] == 1
141+
assert data["total_pages"] == 1
142+
assert data["next_page_token"] is None
129143
assert server.r2_connector.last_namespace == "ns1"
130144

131145

0 commit comments

Comments
 (0)