summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2025-11-25 16:10:11 +0800
committer魏曹先生 <1992414357@qq.com>2025-11-25 16:10:11 +0800
commitb1d38d63550dbc4cd1908f52caff089f52edd953 (patch)
tree2ff52c374348bfb2189f2d50c0718ea69a5ffd31 /crates
parent292227c83753564cde90de7a4f43d9ef4660bd4c (diff)
Implement virtual file edit right management
Diffstat (limited to 'crates')
-rw-r--r--crates/vcs_actions/src/actions/user_actions.rs116
-rw-r--r--crates/vcs_actions/src/registry/client_registry.rs6
-rw-r--r--crates/vcs_actions/src/registry/server_registry.rs6
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
}