from __future__ import annotations from fastapi import APIRouter, Depends, Request from fastapi.responses import StreamingResponse from backend.app.api.schemas import DeleteRequest, DeleteResponse, FileInfoResponse, MkdirRequest, MkdirResponse, RenameRequest, RenameResponse, SaveRequest, SaveResponse, 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) @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, )