""" Router "file" provides: - listing files - finding files by name prefix - getting files by name prefix """ import re from io import BytesIO from logging import getLogger from fastapi import APIRouter, Depends from fastapi.responses import StreamingResponse from magic import Magic from ...core.dav_common import webdav_ensure_files, webdav_ensure_path from ...core.webdav import WebDAV from ._common import filter_prefix, filter_prefix_unique, get_remote_path, list_files _logger = getLogger(__name__) _magic = Magic(mime=True) _PATH_NAME = "file_dir" router = APIRouter(prefix="/file", tags=["file"]) _ls = list_files( path_name=_PATH_NAME, re=re.compile( r"[^/]$", flags=re.IGNORECASE, ), ) _rp = get_remote_path(path_name=_PATH_NAME) _fp = filter_prefix(_ls) _fpu = filter_prefix_unique(_fp) @router.on_event("startup") async def start_router() -> None: _logger.debug(f"{router.prefix} router starting.") remote_path = await _rp() if not webdav_ensure_path(remote_path): webdav_ensure_files( remote_path, "logo.svg", "thw.svg", ) @router.get( "/list", responses=_ls.responses, ) async def list_all_files( names: list[str] = Depends(_ls.func), ) -> list[str]: return names @router.get( "/find/{prefix}", responses=_fp.responses, ) async def find_files_by_prefix( names: list[str] = Depends(_fp.func), ) -> list[str]: return names @router.get( "/get/{prefix}", responses=_fpu.responses, response_class=StreamingResponse, ) async def get_file_by_prefix( prefix: str, remote_path: str = Depends(_rp.func), name: str = Depends(_fpu.func), ) -> StreamingResponse: buffer = BytesIO(await WebDAV.read_bytes(f"{remote_path}/{name}")) mime = _magic.from_buffer(buffer.read(2048)) buffer.seek(0) return StreamingResponse( content=buffer, media_type=mime, headers={"Content-Disposition": f"filename={prefix}"}, )