141 lines
4.1 KiB
Python
141 lines
4.1 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("/download")
|
|
async def download(
|
|
path: str,
|
|
service: FileOpsService = Depends(get_file_ops_service),
|
|
) -> StreamingResponse:
|
|
prepared = service.prepare_download(path=path)
|
|
return StreamingResponse(
|
|
prepared["content"],
|
|
headers=prepared["headers"],
|
|
media_type=prepared["content_type"],
|
|
)
|
|
|
|
|
|
@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,
|
|
)
|