From f34fd7e803f0e52f526b7a56c09fdb262ed9b8aa Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Wed, 5 Nov 2025 16:45:13 +0800 Subject: Update draft folder structure to include account name The draft folder path now includes the account name to prevent conflicts when multiple accounts work on the same sheet. This requires updating the draft_folder method signature and all call sites. Additionally, account switching is now restricted when a sheet is in use to maintain data integrity. --- crates/vcs_data/src/constants.rs | 2 +- crates/vcs_data/src/data/local/config.rs | 23 ++++++++++++++++++----- crates/vcs_data/src/data/sheet.rs | 10 ++++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/crates/vcs_data/src/constants.rs b/crates/vcs_data/src/constants.rs index 1d17927..55662e7 100644 --- a/crates/vcs_data/src/constants.rs +++ b/crates/vcs_data/src/constants.rs @@ -54,7 +54,7 @@ pub const CLIENT_FILE_LATEST_INFO: &str = "./.jv/latest.json"; pub const CLIENT_FILE_SHEET_COPY: &str = "./.jv/sheets/{sheet_name}.copy.json"; // Client - Local Draft -pub const CLIENT_PATH_LOCAL_DRAFT: &str = "./.jv/drafts/{sheet_name}/"; +pub const CLIENT_PATH_LOCAL_DRAFT: &str = "./.jv/drafts/{account}_{sheet_name}/"; // Client - Other pub const CLIENT_FILE_IGNOREFILES: &str = "IGNORE_RULES.toml"; diff --git a/crates/vcs_data/src/data/local/config.rs b/crates/vcs_data/src/data/local/config.rs index 3dc5248..fa3b607 100644 --- a/crates/vcs_data/src/data/local/config.rs +++ b/crates/vcs_data/src/data/local/config.rs @@ -1,6 +1,7 @@ use cfg_file::ConfigFile; use cfg_file::config::ConfigFile; use serde::{Deserialize, Serialize}; +use std::io::Error; use std::net::SocketAddr; use std::path::Path; use std::path::PathBuf; @@ -17,6 +18,7 @@ use crate::data::member::MemberId; use crate::data::sheet::SheetName; use crate::data::vault::config::VaultUuid; +const ACCOUNT: &str = "{account}"; const SHEET_NAME: &str = "{sheet_name}"; #[derive(Serialize, Deserialize, ConfigFile)] @@ -68,8 +70,15 @@ impl LocalConfig { } /// Set the currently used account - pub fn set_current_account(&mut self, account: MemberId) { + pub fn set_current_account(&mut self, account: MemberId) -> Result<(), std::io::Error> { + if self.sheet_in_use().is_some() { + return Err(Error::new( + std::io::ErrorKind::DirectoryNotEmpty, + "Please exit the current sheet before switching accounts", + )); + } self.using_account = account; + Ok(()) } /// Set the currently used sheet @@ -107,7 +116,7 @@ impl LocalConfig { self.check_local_path_empty(&local_path).await?; // Get the draft folder path - let draft_folder = self.draft_folder(&sheet, &local_path); + let draft_folder = self.draft_folder(&self.using_account, &sheet, &local_path); if draft_folder.exists() { // Exists @@ -135,7 +144,7 @@ impl LocalConfig { let sheet_name = self.sheet_in_use().as_ref().unwrap().clone(); // Get the draft folder path - let draft_folder = self.draft_folder(&sheet_name, &local_path); + let draft_folder = self.draft_folder(&self.using_account, &sheet_name, &local_path); // Create the draft folder if it doesn't exist if !draft_folder.exists() { @@ -312,11 +321,15 @@ impl LocalConfig { /// Get draft folder pub fn draft_folder( &self, + account: &MemberId, sheet_name: &SheetName, local_workspace_path: impl Into, ) -> PathBuf { + let account_str = snake_case!(account.as_str()); let sheet_name_str = snake_case!(sheet_name.as_str()); - let draft_path = CLIENT_PATH_LOCAL_DRAFT.replace(SHEET_NAME, &sheet_name_str); + let draft_path = CLIENT_PATH_LOCAL_DRAFT + .replace(ACCOUNT, &account_str) + .replace(SHEET_NAME, &sheet_name_str); local_workspace_path.into().join(draft_path) } @@ -330,7 +343,7 @@ impl LocalConfig { return None; }; - Some(self.draft_folder(sheet_name, current_dir)) + Some(self.draft_folder(&self.using_account, sheet_name, current_dir)) } } diff --git a/crates/vcs_data/src/data/sheet.rs b/crates/vcs_data/src/data/sheet.rs index ce450a6..69dc27d 100644 --- a/crates/vcs_data/src/data/sheet.rs +++ b/crates/vcs_data/src/data/sheet.rs @@ -89,6 +89,16 @@ impl<'a> Sheet<'a> { &self.data.mapping } + /// Forget the holder of this sheet + pub fn forget_holder(&mut self) { + self.data.holder = None; + } + + /// Set the holder of this sheet + pub fn set_holder(&mut self, holder: MemberId) { + self.data.holder = Some(holder); + } + /// Add an input package to the sheet pub fn add_input(&mut self, input_package: InputPackage) -> Result<(), std::io::Error> { if self.data.inputs.iter().any(|input| input == &input_package) { -- cgit