summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2025-09-26 12:52:59 +0800
committer魏曹先生 <1992414357@qq.com>2025-09-26 12:52:59 +0800
commit6ce41600a46b542d1975af0bdf28f3454e65715f (patch)
treee8ecde63e9f924ef385fe0362b9c60edc7b32cd8
parent9c44621f13f27e7f2a82fa5ab2fc8e27381f3e39 (diff)
feat: Automatically create host member and ref sheet during vault setup
- Add VAULT_HOST_NAME constant for 'host' member - Modify setup_vault to automatically register host member and create ref sheet - Update test assertions to account for the additional ref sheet - Fix code formatting in sheets.rs
-rw-r--r--crates/vcs/src/constants.rs3
-rw-r--r--crates/vcs/src/data/vault.rs21
-rw-r--r--crates/vcs/src/data/vault/sheets.rs25
-rw-r--r--crates/vcs/vcs_test/src/test_sheet_creation_management_and_persistence.rs31
4 files changed, 60 insertions, 20 deletions
diff --git a/crates/vcs/src/constants.rs b/crates/vcs/src/constants.rs
index 05fcd1f..5e147c4 100644
--- a/crates/vcs/src/constants.rs
+++ b/crates/vcs/src/constants.rs
@@ -7,6 +7,9 @@ pub const PATH_TEMP: &str = "./.temp/";
// Default Port
pub const PORT: u16 = 25331;
+// Vault Host Name
+pub const VAULT_HOST_NAME: &str = "host";
+
// Server
// Server - Vault (Main)
pub const SERVER_FILE_VAULT: &str = "./vault.toml"; // crates::env::vault::vault_config
diff --git a/crates/vcs/src/data/vault.rs b/crates/vcs/src/data/vault.rs
index 152836e..2881c82 100644
--- a/crates/vcs/src/data/vault.rs
+++ b/crates/vcs/src/data/vault.rs
@@ -9,10 +9,10 @@ use cfg_file::config::ConfigFile;
use crate::{
constants::{
SERVER_FILE_README, SERVER_FILE_VAULT, SERVER_PATH_MEMBER_PUB, SERVER_PATH_MEMBERS,
- SERVER_PATH_SHEETS, SERVER_PATH_VF_ROOT,
+ SERVER_PATH_SHEETS, SERVER_PATH_VF_ROOT, VAULT_HOST_NAME,
},
current::{current_vault_path, find_vault_path},
- data::vault::config::VaultConfig,
+ data::{member::Member, vault::config::VaultConfig},
};
pub mod config;
@@ -71,6 +71,23 @@ impl Vault {
// 5. Setup storage directory
create_dir_all(vault_path.join(SERVER_PATH_VF_ROOT))?;
+ let Some(vault) = Vault::init(config, &vault_path) else {
+ return Err(std::io::Error::new(
+ std::io::ErrorKind::Other,
+ "Failed to initialize vault",
+ ));
+ };
+
+ // 6. Create host member
+ vault
+ .register_member_to_vault(Member::new(VAULT_HOST_NAME))
+ .await?;
+
+ // 7. Setup reference sheet
+ vault
+ .create_sheet(&"ref".to_string(), &VAULT_HOST_NAME.to_string())
+ .await?;
+
// Final, generate README.md
let readme_content = format!(
"\
diff --git a/crates/vcs/src/data/vault/sheets.rs b/crates/vcs/src/data/vault/sheets.rs
index dfad862..bcd5779 100644
--- a/crates/vcs/src/data/vault/sheets.rs
+++ b/crates/vcs/src/data/vault/sheets.rs
@@ -53,11 +53,13 @@ impl Vault {
let path = entry.path();
// Check if it's a YAML file
- if path.is_file() && path.extension().is_some_and(|ext| ext == "yaml")
- && let Some(file_stem) = path.file_stem().and_then(|s| s.to_str()) {
- // Create a new SheetName and add it to the result list
- sheet_names.push(file_stem.to_string());
- }
+ if path.is_file()
+ && path.extension().is_some_and(|ext| ext == "yaml")
+ && let Some(file_stem) = path.file_stem().and_then(|s| s.to_str())
+ {
+ // Create a new SheetName and add it to the result list
+ sheet_names.push(file_stem.to_string());
+ }
}
Ok(sheet_names)
@@ -229,13 +231,14 @@ impl Vault {
let path = entry.path();
if path.is_file()
- && let Some(file_name) = path.file_stem().and_then(|s| s.to_str()) {
- // Check if the filename starts with the sheet name
- if file_name.starts_with(&sheet_name) {
- found_path = Some(path);
- break;
- }
+ && let Some(file_name) = path.file_stem().and_then(|s| s.to_str())
+ {
+ // Check if the filename starts with the sheet name
+ if file_name.starts_with(&sheet_name) {
+ found_path = Some(path);
+ break;
}
+ }
}
let trash_path = found_path.ok_or_else(|| {
diff --git a/crates/vcs/vcs_test/src/test_sheet_creation_management_and_persistence.rs b/crates/vcs/vcs_test/src/test_sheet_creation_management_and_persistence.rs
index 7fe6955..1c7182b 100644
--- a/crates/vcs/vcs_test/src/test_sheet_creation_management_and_persistence.rs
+++ b/crates/vcs/vcs_test/src/test_sheet_creation_management_and_persistence.rs
@@ -111,19 +111,33 @@ async fn test_sheet_creation_management_and_persistence() -> Result<(), std::io:
// Test 7: List all sheets in vault
let sheet_names = vault.sheet_names()?;
- assert_eq!(sheet_names.len(), 1);
- assert_eq!(sheet_names[0], sheet_name);
+ assert_eq!(sheet_names.len(), 2);
+ assert!(sheet_names.contains(&sheet_name));
+ assert!(sheet_names.contains(&"ref".to_string()));
let all_sheets = vault.sheets().await?;
- assert_eq!(all_sheets.len(), 1);
- assert_eq!(all_sheets[0].holder(), &member_id);
+ assert_eq!(all_sheets.len(), 2);
+ // One sheet should be the test sheet, the other should be the ref sheet with host as holder
+ let test_sheet_holder = all_sheets
+ .iter()
+ .find(|s| s.holder() == &member_id)
+ .map(|s| s.holder())
+ .unwrap();
+ let ref_sheet_holder = all_sheets
+ .iter()
+ .find(|s| s.holder() == &"host".to_string())
+ .map(|s| s.holder())
+ .unwrap();
+ assert_eq!(test_sheet_holder, &member_id);
+ assert_eq!(ref_sheet_holder, &"host".to_string());
// Test 8: Safe deletion (move to trash)
vault.delete_sheet_safely(&sheet_name).await?;
// Verify sheet is not in normal listing but can be restored
let sheet_names_after_deletion = vault.sheet_names()?;
- assert_eq!(sheet_names_after_deletion.len(), 0);
+ assert_eq!(sheet_names_after_deletion.len(), 1);
+ assert_eq!(sheet_names_after_deletion[0], "ref");
// Test 9: Restore sheet from trash
let restored_sheet = vault.sheet(&sheet_name).await?;
@@ -132,14 +146,17 @@ async fn test_sheet_creation_management_and_persistence() -> Result<(), std::io:
// Verify sheet is back in normal listing
let sheet_names_after_restore = vault.sheet_names()?;
- assert_eq!(sheet_names_after_restore.len(), 1);
+ assert_eq!(sheet_names_after_restore.len(), 2);
+ assert!(sheet_names_after_restore.contains(&sheet_name));
+ assert!(sheet_names_after_restore.contains(&"ref".to_string()));
// Test 10: Permanent deletion
vault.delete_sheet(&sheet_name).await?;
// Verify sheet is permanently gone
let sheet_names_final = vault.sheet_names()?;
- assert_eq!(sheet_names_final.len(), 0);
+ assert_eq!(sheet_names_final.len(), 1);
+ assert_eq!(sheet_names_final[0], "ref");
// Attempt to access deleted sheet should fail
let result = vault.sheet(&sheet_name).await;