Add Phase 3 remote read-only file operations
Introduce dedicated remote file facade for /Clients paths, add agent read/download endpoints, enable remote view/properties/download/image preview in the web UI, and keep remote write operations disabled.
This commit is contained in:
@@ -5,10 +5,11 @@ from fastapi.responses import StreamingResponse
|
||||
from starlette.background import BackgroundTask
|
||||
|
||||
from backend.app.api.schemas import ArchivePrepareRequest, DeleteRequest, FileInfoResponse, MkdirRequest, MkdirResponse, RenameRequest, RenameResponse, SaveRequest, SaveResponse, TaskCreateResponse, TaskDetailResponse, UploadResponse, ViewResponse
|
||||
from backend.app.dependencies import get_archive_download_task_service, get_delete_task_service, get_file_ops_service
|
||||
from backend.app.dependencies import get_archive_download_task_service, get_delete_task_service, get_file_ops_service, get_remote_file_service
|
||||
from backend.app.services.archive_download_task_service import ArchiveDownloadTaskService
|
||||
from backend.app.services.delete_task_service import DeleteTaskService
|
||||
from backend.app.services.file_ops_service import FileOpsService
|
||||
from backend.app.services.remote_file_service import RemoteFileService
|
||||
|
||||
router = APIRouter(prefix="/files")
|
||||
|
||||
@@ -54,7 +55,10 @@ async def view(
|
||||
path: str,
|
||||
for_edit: bool = False,
|
||||
service: FileOpsService = Depends(get_file_ops_service),
|
||||
remote_service: RemoteFileService = Depends(get_remote_file_service),
|
||||
) -> ViewResponse:
|
||||
if remote_service.handles_path(path):
|
||||
return remote_service.view(path=path, for_edit=for_edit)
|
||||
return service.view(path=path, for_edit=for_edit)
|
||||
|
||||
|
||||
@@ -62,7 +66,10 @@ async def view(
|
||||
async def info(
|
||||
path: str,
|
||||
service: FileOpsService = Depends(get_file_ops_service),
|
||||
remote_service: RemoteFileService = Depends(get_remote_file_service),
|
||||
) -> FileInfoResponse:
|
||||
if remote_service.handles_path(path):
|
||||
return remote_service.info(path=path)
|
||||
return service.info(path=path)
|
||||
|
||||
|
||||
@@ -70,8 +77,9 @@ async def info(
|
||||
async def download(
|
||||
path: list[str] = Query(...),
|
||||
service: FileOpsService = Depends(get_file_ops_service),
|
||||
remote_service: RemoteFileService = Depends(get_remote_file_service),
|
||||
) -> StreamingResponse:
|
||||
prepared = service.prepare_download(paths=path)
|
||||
prepared = remote_service.prepare_download(paths=path) if any(remote_service.handles_path(item) for item in path) else service.prepare_download(paths=path)
|
||||
response = StreamingResponse(
|
||||
prepared["content"],
|
||||
headers=prepared["headers"],
|
||||
@@ -143,7 +151,15 @@ async def pdf(
|
||||
async def image(
|
||||
path: str,
|
||||
service: FileOpsService = Depends(get_file_ops_service),
|
||||
remote_service: RemoteFileService = Depends(get_remote_file_service),
|
||||
) -> StreamingResponse:
|
||||
if remote_service.handles_path(path):
|
||||
prepared = remote_service.prepare_image_stream(path=path)
|
||||
return StreamingResponse(
|
||||
prepared["content"],
|
||||
headers=prepared["headers"],
|
||||
media_type=prepared["content_type"],
|
||||
)
|
||||
prepared = service.prepare_image_stream(path=path)
|
||||
return StreamingResponse(
|
||||
prepared["content"],
|
||||
|
||||
Reference in New Issue
Block a user