mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-07-02 22:01:05 +02:00
Merge pull request #839 from AnishSarkar22/feat/document-test
fix: enhanced document upload, page limit, upload limit tests
This commit is contained in:
commit
2f08dc9cf4
26 changed files with 473 additions and 562 deletions
|
|
@ -28,6 +28,7 @@ from app.schemas import (
|
|||
DocumentWithChunksRead,
|
||||
PaginatedResponse,
|
||||
)
|
||||
from app.services.task_dispatcher import TaskDispatcher, get_task_dispatcher
|
||||
from app.users import current_active_user
|
||||
from app.utils.rbac import check_permission
|
||||
|
||||
|
|
@ -120,6 +121,7 @@ async def create_documents_file_upload(
|
|||
search_space_id: int = Form(...),
|
||||
session: AsyncSession = Depends(get_async_session),
|
||||
user: User = Depends(current_active_user),
|
||||
dispatcher: TaskDispatcher = Depends(get_task_dispatcher),
|
||||
):
|
||||
"""
|
||||
Upload files as documents with real-time status tracking.
|
||||
|
|
@ -290,14 +292,10 @@ async def create_documents_file_upload(
|
|||
for doc in created_documents:
|
||||
await session.refresh(doc)
|
||||
|
||||
# ===== PHASE 2: Dispatch Celery tasks for each file =====
|
||||
# ===== PHASE 2: Dispatch tasks for each file =====
|
||||
# Each task will update document status: pending → processing → ready/failed
|
||||
from app.tasks.celery_tasks.document_tasks import (
|
||||
process_file_upload_with_document_task,
|
||||
)
|
||||
|
||||
for document, temp_path, filename in files_to_process:
|
||||
process_file_upload_with_document_task.delay(
|
||||
await dispatcher.dispatch_file_processing(
|
||||
document_id=document.id,
|
||||
temp_path=temp_path,
|
||||
filename=filename,
|
||||
|
|
|
|||
50
surfsense_backend/app/services/task_dispatcher.py
Normal file
50
surfsense_backend/app/services/task_dispatcher.py
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
"""Task dispatcher abstraction for background document processing.
|
||||
|
||||
Decouples the upload endpoint from Celery so tests can swap in a
|
||||
synchronous (inline) implementation that needs only PostgreSQL.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Protocol
|
||||
|
||||
|
||||
class TaskDispatcher(Protocol):
|
||||
async def dispatch_file_processing(
|
||||
self,
|
||||
*,
|
||||
document_id: int,
|
||||
temp_path: str,
|
||||
filename: str,
|
||||
search_space_id: int,
|
||||
user_id: str,
|
||||
) -> None: ...
|
||||
|
||||
|
||||
class CeleryTaskDispatcher:
|
||||
"""Production dispatcher — fires Celery tasks via Redis broker."""
|
||||
|
||||
async def dispatch_file_processing(
|
||||
self,
|
||||
*,
|
||||
document_id: int,
|
||||
temp_path: str,
|
||||
filename: str,
|
||||
search_space_id: int,
|
||||
user_id: str,
|
||||
) -> None:
|
||||
from app.tasks.celery_tasks.document_tasks import (
|
||||
process_file_upload_with_document_task,
|
||||
)
|
||||
|
||||
process_file_upload_with_document_task.delay(
|
||||
document_id=document_id,
|
||||
temp_path=temp_path,
|
||||
filename=filename,
|
||||
search_space_id=search_space_id,
|
||||
user_id=user_id,
|
||||
)
|
||||
|
||||
|
||||
async def get_task_dispatcher() -> TaskDispatcher:
|
||||
return CeleryTaskDispatcher()
|
||||
Loading…
Add table
Add a link
Reference in a new issue