Files
webmanager-mvp/webui/backend/app/api/routes_files.py
T
2026-03-14 07:48:29 +01:00

128 lines
3.8 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends, File, Form, Request, UploadFile
from fastapi.responses import StreamingResponse
from backend.app.api.schemas import DeleteRequest, DeleteResponse, FileInfoResponse, MkdirRequest, MkdirResponse, RenameRequest, RenameResponse, SaveRequest, SaveResponse, UploadResponse, ViewResponse
from backend.app.dependencies import get_file_ops_service
from backend.app.services.file_ops_service import FileOpsService
router = APIRouter(prefix="/files")
@router.post("/mkdir", response_model=MkdirResponse)
async def mkdir(
request: MkdirRequest,
service: FileOpsService = Depends(get_file_ops_service),
) -> MkdirResponse:
return service.mkdir(parent_path=request.parent_path, name=request.name)
@router.post("/rename", response_model=RenameResponse)
async def rename(
request: RenameRequest,
service: FileOpsService = Depends(get_file_ops_service),
) -> RenameResponse:
return service.rename(path=request.path, new_name=request.new_name)
@router.post("/delete", response_model=DeleteResponse)
async def delete(
request: DeleteRequest,
service: FileOpsService = Depends(get_file_ops_service),
) -> DeleteResponse:
return service.delete(path=request.path, recursive=request.recursive)
@router.post("/upload", response_model=UploadResponse)
async def upload(
target_path: str = Form(...),
overwrite: bool = Form(False),
file: UploadFile = File(...),
service: FileOpsService = Depends(get_file_ops_service),
) -> UploadResponse:
return service.upload(target_path=target_path, upload_file=file, overwrite=overwrite)
@router.get("/view", response_model=ViewResponse)
async def view(
path: str,
for_edit: bool = False,
service: FileOpsService = Depends(get_file_ops_service),
) -> ViewResponse:
return service.view(path=path, for_edit=for_edit)
@router.get("/info", response_model=FileInfoResponse)
async def info(
path: str,
service: FileOpsService = Depends(get_file_ops_service),
) -> FileInfoResponse:
return service.info(path=path)
@router.get("/video")
async def video(
path: str,
request: Request,
service: FileOpsService = Depends(get_file_ops_service),
) -> StreamingResponse:
prepared = service.prepare_video_stream(path=path, range_header=request.headers.get("range"))
return StreamingResponse(
prepared["content"],
status_code=prepared["status_code"],
headers=prepared["headers"],
media_type=prepared["content_type"],
)
@router.get("/pdf")
async def pdf(
path: str,
service: FileOpsService = Depends(get_file_ops_service),
) -> StreamingResponse:
prepared = service.prepare_pdf_stream(path=path)
return StreamingResponse(
prepared["content"],
headers=prepared["headers"],
media_type=prepared["content_type"],
)
@router.get("/image")
async def image(
path: str,
service: FileOpsService = Depends(get_file_ops_service),
) -> StreamingResponse:
prepared = service.prepare_image_stream(path=path)
return StreamingResponse(
prepared["content"],
headers=prepared["headers"],
media_type=prepared["content_type"],
)
@router.get("/thumbnail")
async def thumbnail(
path: str,
service: FileOpsService = Depends(get_file_ops_service),
) -> StreamingResponse:
prepared = service.prepare_thumbnail_stream(path=path)
return StreamingResponse(
prepared["content"],
headers=prepared["headers"],
media_type=prepared["content_type"],
)
@router.post("/save", response_model=SaveResponse)
async def save(
request: SaveRequest,
service: FileOpsService = Depends(get_file_ops_service),
) -> SaveResponse:
return service.save(
path=request.path,
content=request.content,
expected_modified=request.expected_modified,
)