diff options
Diffstat (limited to 'crates/vcs_actions/src')
| -rw-r--r-- | crates/vcs_actions/src/actions/local_actions.rs | 83 | ||||
| -rw-r--r-- | crates/vcs_actions/src/registry/client_registry.rs | 5 | ||||
| -rw-r--r-- | crates/vcs_actions/src/registry/server_registry.rs | 5 |
3 files changed, 87 insertions, 6 deletions
diff --git a/crates/vcs_actions/src/actions/local_actions.rs b/crates/vcs_actions/src/actions/local_actions.rs index 3027218..87eafb8 100644 --- a/crates/vcs_actions/src/actions/local_actions.rs +++ b/crates/vcs_actions/src/actions/local_actions.rs @@ -5,7 +5,10 @@ use cfg_file::config::ConfigFile; use log::{info, warn}; use serde::{Deserialize, Serialize}; use tcp_connection::error::TcpTargetError; -use vcs_data::data::{local::config::LocalConfig, vault::config::VaultUuid}; +use vcs_data::data::{ + local::{config::LocalConfig, latest_info::LatestInfo}, + vault::config::VaultUuid, +}; use crate::actions::{ auth_member, check_connection_instance, try_get_local_workspace, try_get_vault, @@ -26,15 +29,14 @@ pub async fn set_upstream_vault_action( ctx: ActionContext, upstream: SocketAddr, ) -> Result<SetUpstreamVaultActionResult, TcpTargetError> { - // Ensure the instance is available let instance = check_connection_instance(&ctx)?; - // Step1: Auth Member + // Auth Member if let Err(e) = auth_member(&ctx, instance).await { return Ok(SetUpstreamVaultActionResult::AuthorizeFailed(e.to_string())); } - // Step2: Direct + // Direct if ctx.is_proc_on_remote() { let vault = try_get_vault(&ctx)?; instance @@ -74,3 +76,76 @@ pub async fn set_upstream_vault_action( Err(TcpTargetError::NoResult("No result.".to_string())) } + +#[derive(Serialize, Deserialize)] +pub enum UpdateToLatestInfoResult { + Success, + + // Fail + AuthorizeFailed(String), +} + +#[action_gen] +pub async fn update_to_latest_info_action( + ctx: ActionContext, + _unused: (), +) -> Result<UpdateToLatestInfoResult, TcpTargetError> { + let instance = check_connection_instance(&ctx)?; + + let member_id = match auth_member(&ctx, instance).await { + Ok(id) => id, + Err(e) => return Ok(UpdateToLatestInfoResult::AuthorizeFailed(e.to_string())), + }; + + if ctx.is_proc_on_remote() { + let vault = try_get_vault(&ctx)?; + + // Build latest info + let mut latest_info = LatestInfo::default(); + + // Sheet + let mut member_owned = Vec::new(); + let mut member_visible = Vec::new(); + + for sheet in vault.sheets().await? { + if sheet.holder() == &member_id { + member_owned.push(sheet.name().clone()); + } else { + member_visible.push(sheet.name().clone()); + } + } + + latest_info.my_sheets = member_owned; + latest_info.other_sheets = member_visible; + + // RefSheet + let ref_sheet_data = vault.sheet(&"ref".to_string()).await?.to_data(); + latest_info.ref_sheet_content = ref_sheet_data; + + // Members + let members = vault.members().await?; + latest_info.vault_members = members; + + // Send + instance + .lock() + .await + .write_large_msgpack(latest_info, 512 as u16) + .await?; + + return Ok(UpdateToLatestInfoResult::Success); + } + + if ctx.is_proc_on_local() { + let latest_info = instance + .lock() + .await + .read_large_msgpack::<LatestInfo>(512 as u16) + .await?; + LatestInfo::write(&latest_info).await?; + + return Ok(UpdateToLatestInfoResult::Success); + } + + Err(TcpTargetError::NoResult("No result.".to_string())) +} diff --git a/crates/vcs_actions/src/registry/client_registry.rs b/crates/vcs_actions/src/registry/client_registry.rs index dcad657..c7d6eb9 100644 --- a/crates/vcs_actions/src/registry/client_registry.rs +++ b/crates/vcs_actions/src/registry/client_registry.rs @@ -9,13 +9,16 @@ use vcs_data::data::{ }; use crate::{ - actions::local_actions::register_set_upstream_vault_action, + actions::local_actions::{ + register_set_upstream_vault_action, register_update_to_latest_info_action, + }, connection::protocol::RemoteActionInvoke, }; fn register_actions(pool: &mut ActionPool) { // Pool register here register_set_upstream_vault_action(pool); + register_update_to_latest_info_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 3ecc103..3b6ab17 100644 --- a/crates/vcs_actions/src/registry/server_registry.rs +++ b/crates/vcs_actions/src/registry/server_registry.rs @@ -1,9 +1,12 @@ use action_system::action_pool::ActionPool; -use crate::actions::local_actions::register_set_upstream_vault_action; +use crate::actions::local_actions::{ + register_set_upstream_vault_action, register_update_to_latest_info_action, +}; pub fn server_action_pool() -> ActionPool { let mut pool = ActionPool::new(); register_set_upstream_vault_action(&mut pool); + register_update_to_latest_info_action(&mut pool); pool } |
