58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from backend.app.api.schemas import BrowseResponse, DirectoryEntry, FileEntry
|
|
from backend.app.fs.filesystem_adapter import FilesystemAdapter
|
|
from backend.app.security.path_guard import PathGuard
|
|
from backend.app.services.remote_browse_service import RemoteBrowseService
|
|
|
|
|
|
class BrowseService:
|
|
def __init__(
|
|
self,
|
|
path_guard: PathGuard,
|
|
filesystem: FilesystemAdapter,
|
|
remote_browse_service: RemoteBrowseService | None = None,
|
|
):
|
|
self._path_guard = path_guard
|
|
self._filesystem = filesystem
|
|
self._remote_browse_service = remote_browse_service
|
|
|
|
def browse(self, path: str, show_hidden: bool) -> BrowseResponse:
|
|
if self._remote_browse_service and self._remote_browse_service.handles_path(path):
|
|
return self._remote_browse_service.browse(path=path, show_hidden=show_hidden)
|
|
|
|
if self._path_guard.is_virtual_volumes_path(path):
|
|
directories = [
|
|
DirectoryEntry(name=item["name"], path=item["path"], modified="")
|
|
for item in self._path_guard.virtual_volumes_entries()
|
|
]
|
|
return BrowseResponse(path="/Volumes", directories=directories, files=[])
|
|
|
|
resolved = self._path_guard.resolve_directory_path(path)
|
|
directories_raw, files_raw = self._filesystem.list_directory(resolved.absolute, show_hidden=show_hidden)
|
|
|
|
directories = [
|
|
DirectoryEntry(
|
|
name=item["name"],
|
|
path=self._path_guard.entry_relative_path(
|
|
resolved.alias, item["absolute"], display_style=resolved.display_style
|
|
),
|
|
modified=item["modified"],
|
|
)
|
|
for item in directories_raw
|
|
]
|
|
|
|
files = [
|
|
FileEntry(
|
|
name=item["name"],
|
|
path=self._path_guard.entry_relative_path(
|
|
resolved.alias, item["absolute"], display_style=resolved.display_style
|
|
),
|
|
size=item["size"],
|
|
modified=item["modified"],
|
|
)
|
|
for item in files_raw
|
|
]
|
|
|
|
return BrowseResponse(path=resolved.relative, directories=directories, files=files)
|