diff options
| author | 魏曹先生 <1992414357@qq.com> | 2025-11-25 16:10:11 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2025-11-25 16:10:11 +0800 |
| commit | b1d38d63550dbc4cd1908f52caff089f52edd953 (patch) | |
| tree | 2ff52c374348bfb2189f2d50c0718ea69a5ffd31 /crates/vcs_actions/src | |
| parent | 292227c83753564cde90de7a4f43d9ef4660bd4c (diff) | |
Implement virtual file edit right management
Diffstat (limited to 'crates/vcs_actions/src')
| -rw-r--r-- | crates/vcs_actions/src/actions/user_actions.rs | 116 | ||||
| -rw-r--r-- | crates/vcs_actions/src/registry/client_registry.rs | 6 | ||||
| -rw-r--r-- | crates/vcs_actions/src/registry/server_registry.rs | 6 |
3 files changed, 117 insertions, 11 deletions
diff --git a/crates/vcs_actions/src/actions/user_actions.rs b/crates/vcs_actions/src/actions/user_actions.rs index 6ca1c24..b78d040 100644 --- a/crates/vcs_actions/src/actions/user_actions.rs +++ b/crates/vcs_actions/src/actions/user_actions.rs @@ -8,29 +8,127 @@ use std::path::PathBuf; use action_system::{action::ActionContext, macros::action_gen}; use serde::{Deserialize, Serialize}; use tcp_connection::error::TcpTargetError; +use vcs_data::data::local::vault_modified::sign_vault_modified; -use crate::actions::{auth_member, check_connection_instance}; +use crate::actions::{ + auth_member, check_connection_instance, get_current_sheet_name, try_get_vault, +}; #[derive(Serialize, Deserialize)] -pub enum HoldVirtualFileActionResult { +pub enum ChangeVirtualFileEditRightResult { // Success - Success, + Success { + success_hold: Vec<PathBuf>, + success_throw: Vec<PathBuf>, + }, // Fail AuthorizeFailed(String), + DoNothing, } +#[derive(Serialize, Deserialize, PartialEq)] +pub enum EditRightChangeBehaviour { + Hold, + Throw, +} + +/// The server part only checks: +/// 1. Whether the file exists +/// 2. Whether the file has no holder +/// If both conditions are met, send success information to the local client +/// +/// All version checks are handled locally #[action_gen] -pub async fn hold_virtual_file_action( +pub async fn change_virtual_file_edit_right_action( ctx: ActionContext, - relative_paths: Vec<PathBuf>, -) -> Result<HoldVirtualFileActionResult, TcpTargetError> { + relative_paths: Vec<(PathBuf, EditRightChangeBehaviour)>, +) -> Result<ChangeVirtualFileEditRightResult, TcpTargetError> { let instance = check_connection_instance(&ctx)?; // Auth Member - if let Err(e) = auth_member(&ctx, instance).await { - return Ok(HoldVirtualFileActionResult::AuthorizeFailed(e.to_string())); + let member_id = match auth_member(&ctx, instance).await { + Ok(id) => id, + Err(e) => { + return Ok(ChangeVirtualFileEditRightResult::AuthorizeFailed( + e.to_string(), + )); + } + }; + + // Check sheet + let sheet_name = get_current_sheet_name(&ctx, instance, &member_id).await?; + + if ctx.is_proc_on_remote() { + let mut mut_instance = instance.lock().await; + let mut success_hold: Vec<PathBuf> = Vec::new(); + let mut success_throw: Vec<PathBuf> = Vec::new(); + let vault = try_get_vault(&ctx)?; + for (path, behaviour) in relative_paths { + let Ok(sheet) = vault.sheet(&sheet_name).await else { + continue; + }; + let Some(mapping) = sheet.mapping().get(&path) else { + continue; + }; + let Ok(has_edit_right) = vault + .has_virtual_file_edit_right(&member_id, &mapping.id) + .await + else { + continue; + }; + + // Throw file + if has_edit_right && behaviour == EditRightChangeBehaviour::Throw { + match vault + .grant_virtual_file_edit_right(&member_id, &mapping.id) + .await + { + Ok(_) => { + success_throw.push(path.clone()); + } + Err(_) => continue, + } + } else + // Hold file + if !has_edit_right && behaviour == EditRightChangeBehaviour::Hold { + match vault.revoke_virtual_file_edit_right(&mapping.id).await { + Ok(_) => { + success_hold.push(path.clone()); + } + Err(_) => continue, + } + } + } + + // Write success list + mut_instance + .write_large_msgpack::<(Vec<PathBuf>, Vec<PathBuf>)>( + (success_hold.clone(), success_throw.clone()), + 4096u16, + ) + .await?; + return Ok(ChangeVirtualFileEditRightResult::Success { + success_hold, + success_throw, + }); + } + + if ctx.is_proc_on_local() { + let mut mut_instance = instance.lock().await; + let (success_hold, success_throw) = mut_instance + .read_large_msgpack::<(Vec<PathBuf>, Vec<PathBuf>)>(4096u16) + .await?; + + // If there are any successful items, mark as modified + if success_hold.len() + success_throw.len() > 0 { + sign_vault_modified(true).await; + } + return Ok(ChangeVirtualFileEditRightResult::Success { + success_hold, + success_throw, + }); } - Ok(HoldVirtualFileActionResult::Success) + Ok(ChangeVirtualFileEditRightResult::DoNothing) } diff --git a/crates/vcs_actions/src/registry/client_registry.rs b/crates/vcs_actions/src/registry/client_registry.rs index a0543f7..dc684a1 100644 --- a/crates/vcs_actions/src/registry/client_registry.rs +++ b/crates/vcs_actions/src/registry/client_registry.rs @@ -15,6 +15,7 @@ use crate::{ }, sheet_actions::{register_drop_sheet_action, register_make_sheet_action}, track_action::register_track_file_action, + user_actions::register_change_virtual_file_edit_right_action, }, connection::protocol::RemoteActionInvoke, }; @@ -30,8 +31,11 @@ fn register_actions(pool: &mut ActionPool) { register_make_sheet_action(pool); register_drop_sheet_action(pool); - // Virtual File Actions + // Track Action register_track_file_action(pool); + + // User Actions + register_change_virtual_file_edit_right_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 f02c3c9..9c12d24 100644 --- a/crates/vcs_actions/src/registry/server_registry.rs +++ b/crates/vcs_actions/src/registry/server_registry.rs @@ -4,6 +4,7 @@ use crate::actions::{ local_actions::{register_set_upstream_vault_action, register_update_to_latest_info_action}, sheet_actions::{register_drop_sheet_action, register_make_sheet_action}, track_action::register_track_file_action, + user_actions::register_change_virtual_file_edit_right_action, }; pub fn server_action_pool() -> ActionPool { @@ -17,8 +18,11 @@ pub fn server_action_pool() -> ActionPool { register_make_sheet_action(&mut pool); register_drop_sheet_action(&mut pool); - // Virtual File Actions + // Track Action register_track_file_action(&mut pool); + // User Actions + register_change_virtual_file_edit_right_action(&mut pool); + pool } |
