ovdashboard/api/ovdashboard_api/routers/v1/file.py

94 lines
2 KiB
Python

"""
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.func)
_fpu = filter_prefix_unique(_fp.func)
@router.on_event("startup")
async def start_router() -> None:
_logger.debug(f"{router.prefix} router starting.")
remote_path = await _rp.func()
if not webdav_ensure_path(remote_path):
webdav_ensure_files(
remote_path,
"logo.svg",
"thw.svg",
)
@router.get(
"/list",
response_model=list[str],
responses=_ls.responses,
)
async def list_all_files(
names: list[str] = Depends(_ls.func),
) -> list[str]:
return names
@router.get(
"/find/{prefix}",
response_model=list[str],
responses=_fp.responses,
)
async def find_files_by_prefix(
names: list[str] = Depends(_fp.func),
) -> list[str]:
return names
@router.get(
"/get/{prefix}",
response_class=StreamingResponse,
responses=_fpu.responses,
)
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}"},
)