From 5416c501e61e591cea85c1f30daa53818baa5f23 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 3 Nov 2025 18:48:52 +0800 Subject: feat: Add sheet creation action - Implement make_sheet_action for creating sheets - Add sheet-related constants - Update sheet data structures --- crates/vcs_actions/src/actions/sheet_actions.rs | 79 +++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'crates/vcs_actions/src') diff --git a/crates/vcs_actions/src/actions/sheet_actions.rs b/crates/vcs_actions/src/actions/sheet_actions.rs index e69de29..b6ea51d 100644 --- a/crates/vcs_actions/src/actions/sheet_actions.rs +++ b/crates/vcs_actions/src/actions/sheet_actions.rs @@ -0,0 +1,79 @@ +use action_system::{action::ActionContext, macros::action_gen}; +use serde::{Deserialize, Serialize}; +use tcp_connection::error::TcpTargetError; +use vcs_data::data::sheet::SheetName; + +use crate::actions::{auth_member, check_connection_instance, try_get_vault}; + +#[derive(Default, Serialize, Deserialize)] +pub enum MakeSheetActionResult { + Success, + + // Fail + AuthorizeFailed(String), + SheetAlreadyExists, + SheetCreationFailed(String), + + #[default] + Unknown, +} + +/// Build a sheet with context +#[action_gen] +pub async fn make_sheet_action( + ctx: ActionContext, + sheet_name: SheetName, +) -> Result { + let instance = check_connection_instance(&ctx)?; + + // Auth Member + let member_id = match auth_member(&ctx, instance).await { + Ok(id) => id, + Err(e) => return Ok(MakeSheetActionResult::AuthorizeFailed(e.to_string())), + }; + + if ctx.is_proc_on_remote() { + let vault = try_get_vault(&ctx)?; + + // Check if the sheet already exists + if vault.sheet(&sheet_name).await.is_ok() { + instance + .lock() + .await + .write(MakeSheetActionResult::SheetAlreadyExists) + .await?; + return Ok(MakeSheetActionResult::SheetAlreadyExists); + } else { + // Create the sheet + match vault.create_sheet(&sheet_name, &member_id).await { + Ok(_) => { + instance + .lock() + .await + .write(MakeSheetActionResult::Success) + .await?; + return Ok(MakeSheetActionResult::Success); + } + Err(e) => { + instance + .lock() + .await + .write(MakeSheetActionResult::SheetCreationFailed(e.to_string())) + .await?; + return Ok(MakeSheetActionResult::SheetCreationFailed(e.to_string())); + } + } + } + } + + if ctx.is_proc_on_local() { + let result = instance + .lock() + .await + .read::() + .await?; + return Ok(result); + } + + Err(TcpTargetError::NoResult("No result.".to_string())) +} -- cgit From 40df512c3fb11a769ae57692550c23899c28fe75 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 3 Nov 2025 18:49:06 +0800 Subject: update: Registry and connection improvements - Update client and server registry logic - Improve TCP connection instance handling --- crates/vcs_actions/src/registry/client_registry.rs | 12 ++++++++++-- crates/vcs_actions/src/registry/server_registry.rs | 11 +++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) (limited to 'crates/vcs_actions/src') diff --git a/crates/vcs_actions/src/registry/client_registry.rs b/crates/vcs_actions/src/registry/client_registry.rs index c7d6eb9..a0b87a6 100644 --- a/crates/vcs_actions/src/registry/client_registry.rs +++ b/crates/vcs_actions/src/registry/client_registry.rs @@ -9,16 +9,24 @@ use vcs_data::data::{ }; use crate::{ - actions::local_actions::{ - register_set_upstream_vault_action, register_update_to_latest_info_action, + actions::{ + local_actions::{ + register_set_upstream_vault_action, register_update_to_latest_info_action, + }, + sheet_actions::register_make_sheet_action, }, connection::protocol::RemoteActionInvoke, }; fn register_actions(pool: &mut ActionPool) { // Pool register here + + // Local Actions register_set_upstream_vault_action(pool); register_update_to_latest_info_action(pool); + + // Sheet Actions + register_make_sheet_action(pool); } pub fn client_action_pool() -> ActionPool { diff --git a/crates/vcs_actions/src/registry/server_registry.rs b/crates/vcs_actions/src/registry/server_registry.rs index 3b6ab17..eade391 100644 --- a/crates/vcs_actions/src/registry/server_registry.rs +++ b/crates/vcs_actions/src/registry/server_registry.rs @@ -1,12 +1,19 @@ use action_system::action_pool::ActionPool; -use crate::actions::local_actions::{ - register_set_upstream_vault_action, register_update_to_latest_info_action, +use crate::actions::{ + local_actions::{register_set_upstream_vault_action, register_update_to_latest_info_action}, + sheet_actions::register_make_sheet_action, }; pub fn server_action_pool() -> ActionPool { let mut pool = ActionPool::new(); + + // Local Actions register_set_upstream_vault_action(&mut pool); register_update_to_latest_info_action(&mut pool); + + // Sheet Actions + register_make_sheet_action(&mut pool); + pool } -- cgit From dea59dad70681d3eb86f5212932a2e242e225cbb Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 3 Nov 2025 18:49:13 +0800 Subject: update: Local actions and data structures - Update local actions implementation - Improve latest info handling - Enhance vault sheets management --- crates/vcs_actions/src/actions/local_actions.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'crates/vcs_actions/src') diff --git a/crates/vcs_actions/src/actions/local_actions.rs b/crates/vcs_actions/src/actions/local_actions.rs index 87eafb8..da9fc62 100644 --- a/crates/vcs_actions/src/actions/local_actions.rs +++ b/crates/vcs_actions/src/actions/local_actions.rs @@ -6,7 +6,10 @@ use log::{info, warn}; use serde::{Deserialize, Serialize}; use tcp_connection::error::TcpTargetError; use vcs_data::data::{ - local::{config::LocalConfig, latest_info::LatestInfo}, + local::{ + config::LocalConfig, + latest_info::{LatestInfo, SheetInfo}, + }, vault::config::VaultUuid, }; @@ -108,10 +111,16 @@ pub async fn update_to_latest_info_action( let mut member_visible = Vec::new(); for sheet in vault.sheets().await? { - if sheet.holder() == &member_id { + if sheet.holder().is_some() && sheet.holder().unwrap() == &member_id { member_owned.push(sheet.name().clone()); } else { - member_visible.push(sheet.name().clone()); + member_visible.push(SheetInfo { + sheet_name: sheet.name().clone(), + holder_name: match sheet.holder() { + Some(holder) => Some(holder.clone()), + None => None, + }, + }); } } -- cgit From cf2402fff1632fd673a1865d83cefc80b75ed85f Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 3 Nov 2025 19:58:03 +0800 Subject: feat: Enhance upstream vault action - Add redirect functionality for already stained workspaces - Implement SameUpstream and Redirected result types - Improve vault address update logic --- crates/vcs_actions/src/actions/local_actions.rs | 30 +++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'crates/vcs_actions/src') diff --git a/crates/vcs_actions/src/actions/local_actions.rs b/crates/vcs_actions/src/actions/local_actions.rs index da9fc62..59dd972 100644 --- a/crates/vcs_actions/src/actions/local_actions.rs +++ b/crates/vcs_actions/src/actions/local_actions.rs @@ -2,7 +2,7 @@ use std::net::SocketAddr; use action_system::{action::ActionContext, macros::action_gen}; use cfg_file::config::ConfigFile; -use log::{info, warn}; +use log::info; use serde::{Deserialize, Serialize}; use tcp_connection::error::TcpTargetError; use vcs_data::data::{ @@ -21,10 +21,15 @@ use crate::actions::{ pub enum SetUpstreamVaultActionResult { // Success DirectedAndStained, + Redirected, // Fail AlreadyStained, AuthorizeFailed(String), + RedirectFailed(String), + SameUpstream, + + Done, } #[action_gen] @@ -47,6 +52,7 @@ pub async fn set_upstream_vault_action( .await .write(*vault.config().vault_uuid()) .await?; + return Ok(SetUpstreamVaultActionResult::Done); } if ctx.is_proc_on_local() { @@ -72,7 +78,27 @@ pub async fn set_upstream_vault_action( info!("Workspace stained!"); return Ok(SetUpstreamVaultActionResult::DirectedAndStained); } else { - warn!("Workspace already stained!"); + // Local workspace is already stained, redirecting + let Some(stained_uuid) = mut_local_config.stained_uuid() else { + return Ok(SetUpstreamVaultActionResult::RedirectFailed( + "Stained uuid not found".to_string(), + )); + }; + let local_upstream = mut_local_config.upstream_addr(); + + // Address changed, but same UUID. + if vault_uuid == stained_uuid { + if local_upstream != upstream { + // Set the upstream address + mut_local_config.set_vault_addr(upstream); + + // Store the updated config + LocalConfig::write(&mut_local_config).await?; + return Ok(SetUpstreamVaultActionResult::Redirected); + } else { + return Ok(SetUpstreamVaultActionResult::SameUpstream); + } + } return Ok(SetUpstreamVaultActionResult::AlreadyStained); } } -- cgit