diff --git a/src/materia/models/__init__.py b/src/materia/models/__init__.py index 2132e48..66b0ad9 100644 --- a/src/materia/models/__init__.py +++ b/src/materia/models/__init__.py @@ -16,6 +16,7 @@ from materia.models.directory import ( Directory, DirectoryLink, DirectoryInfo, + DirectoryContent, DirectoryPath, DirectoryRename, DirectoryCopyMove, diff --git a/src/materia/models/directory.py b/src/materia/models/directory.py index 1e8d909..73ae4ac 100644 --- a/src/materia/models/directory.py +++ b/src/materia/models/directory.py @@ -59,11 +59,11 @@ class Directory(Base): if self.directories: for directory in self.directories: - directory.remove(session, config) + await directory.remove(session, config) if self.files: for file in self.files: - file.remove(session, config) + await file.remove(session, config) repository_path = await self.repository.real_path(session, config) directory_path = await self.real_path(session, config) @@ -284,6 +284,12 @@ class DirectoryInfo(BaseModel): used: Optional[int] = None +class DirectoryContent(BaseModel): + model_config = ConfigDict(arbitrary_types_allowed=True) + files: list["FileInfo"] + directories: list["DirectoryInfo"] + + class DirectoryPath(BaseModel): path: Path @@ -301,4 +307,4 @@ class DirectoryCopyMove(BaseModel): from materia.models.repository import Repository -from materia.models.file import File +from materia.models.file import File, FileInfo diff --git a/src/materia/models/file.py b/src/materia/models/file.py index ab9b838..fb8c331 100644 --- a/src/materia/models/file.py +++ b/src/materia/models/file.py @@ -216,10 +216,12 @@ class File(Base): await session.flush() return self - def info(self) -> Optional["FileInfo"]: - # if self.is_public: - return FileInfo.model_validate(self) - # return None + async def info(self, session: SessionContext) -> Optional["FileInfo"]: + info = FileInfo.model_validate(self) + relative_path = await self.relative_path(session) + info.path = Path("/").joinpath(relative_path) if relative_path else None + + return info def convert_bytes(size: int): @@ -252,6 +254,8 @@ class FileInfo(BaseModel): is_public: bool size: int + path: Optional[Path] = None + class FilePath(BaseModel): path: Path diff --git a/src/materia/models/user.py b/src/materia/models/user.py index 8902c09..934ea11 100644 --- a/src/materia/models/user.py +++ b/src/materia/models/user.py @@ -139,9 +139,6 @@ class User(Base): def info(self) -> "UserInfo": user_info = UserInfo.model_validate(self) - if user_info.is_email_private: - user_info.email = None - return user_info async def edit_avatar( diff --git a/src/materia/routers/api/directory.py b/src/materia/routers/api/directory.py index 9116a1e..4049f5c 100644 --- a/src/materia/routers/api/directory.py +++ b/src/materia/routers/api/directory.py @@ -4,6 +4,7 @@ from materia.models import ( User, Directory, DirectoryInfo, + DirectoryContent, DirectoryPath, DirectoryRename, DirectoryCopyMove, @@ -171,3 +172,27 @@ async def copy( await directory.copy(target_directory, session, ctx.config, force=data.force) await session.commit() + + +@router.get("/directory/content", response_model=DirectoryContent) +async def content( + path: Path, + repository: Repository = Depends(middleware.repository), + ctx: middleware.Context = Depends(), +): + async with ctx.database.session() as session: + directory = await validate_current_directory( + path, repository, session, ctx.config + ) + session.add(directory) + await session.refresh(directory, attribute_names=["directories"]) + await session.refresh(directory, attribute_names=["files"]) + + content = DirectoryContent( + files=[await _file.info(session) for _file in directory.files], + directories=[ + await _directory.info(session) for _directory in directory.directories + ], + ) + + return content diff --git a/src/materia/routers/api/repository.py b/src/materia/routers/api/repository.py index 46deebd..120c647 100644 --- a/src/materia/routers/api/repository.py +++ b/src/materia/routers/api/repository.py @@ -63,21 +63,11 @@ async def content( await session.refresh(repository, attribute_names=["directories"]) await session.refresh(repository, attribute_names=["files"]) - content = RepositoryContent( - files=list( - map( - lambda file: FileInfo.model_validate(file), - filter(lambda file: file.path is None, repository.files), - ) - ), - directories=list( - map( - lambda directory: DirectoryInfo.model_validate(directory), - filter( - lambda directory: directory.path is None, repository.directories - ), - ) - ), - ) + content = RepositoryContent( + files=[await _file.info(session) for _file in repository.files], + directories=[ + await _directory.info(session) for _directory in repository.directories + ], + ) return content