From 8c0d80d7fbb50979deaac42ea8efaea1e151ece4 Mon Sep 17 00:00:00 2001 From: 409 <409dev@protonmail.com> Date: Sat, 6 Sep 2025 15:49:51 +0200 Subject: [PATCH] show file sizes (basic version) --- .../src/lib/domain/warren/models/file/mod.rs | 22 +++++++ .../lib/inbound/http/handlers/warrens/mod.rs | 2 + backend/src/lib/outbound/file_system.rs | 64 +++++++++++-------- frontend/components/DirectoryBackEntry.vue | 10 ++- frontend/components/DirectoryEntry.vue | 9 ++- frontend/shared/types/index.ts | 1 + 6 files changed, 71 insertions(+), 37 deletions(-) diff --git a/backend/src/lib/domain/warren/models/file/mod.rs b/backend/src/lib/domain/warren/models/file/mod.rs index 08f597f..8603e32 100644 --- a/backend/src/lib/domain/warren/models/file/mod.rs +++ b/backend/src/lib/domain/warren/models/file/mod.rs @@ -14,6 +14,7 @@ pub struct File { name: FileName, file_type: FileType, mime_type: Option, + size: FileSize, created_at: Option, } @@ -22,12 +23,14 @@ impl File { name: FileName, file_type: FileType, mime_type: Option, + size: FileSize, created_at: Option, ) -> Self { Self { name, file_type, mime_type, + size, created_at, } } @@ -44,6 +47,10 @@ impl File { self.mime_type.as_ref() } + pub fn size(&self) -> FileSize { + self.size + } + pub fn created_at(&self) -> Option { self.created_at } @@ -81,6 +88,21 @@ impl FileName { } } +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Display)] +pub struct FileSize(u64); + +impl FileSize { + pub fn new(value: u64) -> Self { + Self(value) + } +} + +impl From for u64 { + fn from(value: FileSize) -> Self { + value.0 + } +} + /// A valid file type #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Display)] #[serde(rename_all = "camelCase")] diff --git a/backend/src/lib/inbound/http/handlers/warrens/mod.rs b/backend/src/lib/inbound/http/handlers/warrens/mod.rs index a9d4461..b018177 100644 --- a/backend/src/lib/inbound/http/handlers/warrens/mod.rs +++ b/backend/src/lib/inbound/http/handlers/warrens/mod.rs @@ -55,6 +55,7 @@ pub struct WarrenFileElement { name: String, file_type: FileType, mime_type: Option, + size: u64, created_at: Option, } @@ -64,6 +65,7 @@ impl From<&File> for WarrenFileElement { name: value.name().to_string(), file_type: value.file_type().to_owned(), mime_type: value.mime_type().map(FileMimeType::to_string), + size: value.size().into(), created_at: value.created_at(), } } diff --git a/backend/src/lib/outbound/file_system.rs b/backend/src/lib/outbound/file_system.rs index 3458d5b..a97f641 100644 --- a/backend/src/lib/outbound/file_system.rs +++ b/backend/src/lib/outbound/file_system.rs @@ -20,10 +20,10 @@ use crate::{ models::{ file::{ AbsoluteFilePath, CatError, CatRequest, CpError, CpRequest, CpResponse, File, - FileMimeType, FileName, FilePath, FileStream, FileType, LsError, LsRequest, - LsResponse, MkdirError, MkdirRequest, MvError, MvRequest, RelativeFilePath, - RmError, RmRequest, SaveError, SaveRequest, SaveResponse, StatError, StatRequest, - StatResponse, TouchError, TouchRequest, + FileMimeType, FileName, FilePath, FileSize, FileStream, FileType, LsError, + LsRequest, LsResponse, MkdirError, MkdirRequest, MvError, MvRequest, + RelativeFilePath, RmError, RmRequest, SaveError, SaveRequest, SaveResponse, + StatError, StatRequest, StatResponse, TouchError, TouchRequest, }, warren::UploadFileStream, }, @@ -108,28 +108,8 @@ impl FileSystem { let mut files = Vec::new(); - let parent = if include_parent { - let dir_name = FileName::new( - &dir_path - .file_name() - .context("Failed to get directory name")? - .to_owned() - .into_string() - .ok() - .context("Failed to get directory name")?, - )?; - - Some(File::new( - dir_name, - FileType::Directory, - None, - get_btime(&dir_path), - )) - } else { - None - }; - let mut dir = fs::read_dir(&dir_path).await?; + let mut total_size = 0_u64; while let Ok(Some(entry)) = dir.next_entry().await { let name = entry @@ -149,6 +129,8 @@ impl FileSystem { } }; + let metadata = fs::metadata(entry.path()).await?; + let entry_size = metadata.size(); let created_at = get_btime(entry.path()); let mime_type = match file_type { @@ -156,14 +138,43 @@ impl FileSystem { _ => None, }; + total_size += entry_size; + files.push(File::new( FileName::new(&name)?, file_type, mime_type, + FileSize::new(entry_size), created_at, )); } + tracing::info!("Parent size: {total_size}"); + + let parent = if include_parent { + let dir_name = FileName::new( + &dir_path + .file_name() + .context("Failed to get directory name")? + .to_owned() + .into_string() + .ok() + .context("Failed to get directory name")?, + )?; + + let parent_size = FileSize::new(total_size); + + Some(File::new( + dir_name, + FileType::Directory, + None, + parent_size, + get_btime(&dir_path), + )) + } else { + None + }; + Ok(LsResponse::new(files, parent)) } @@ -408,9 +419,10 @@ impl FileSystem { _ => None, }; + let file_size = FileSize::new(metadata.size()); let created_at = get_btime(&fs_path); - Ok(File::new(name, file_type, mime_type, created_at)) + Ok(File::new(name, file_type, mime_type, file_size, created_at)) } } diff --git a/frontend/components/DirectoryBackEntry.vue b/frontend/components/DirectoryBackEntry.vue index d0c6351..07b302d 100644 --- a/frontend/components/DirectoryBackEntry.vue +++ b/frontend/components/DirectoryBackEntry.vue @@ -1,4 +1,5 @@