diff --git a/desktop-client/src-tauri/src/lib.rs b/desktop-client/src-tauri/src/lib.rs index bf3eb33..70fac0f 100644 --- a/desktop-client/src-tauri/src/lib.rs +++ b/desktop-client/src-tauri/src/lib.rs @@ -325,6 +325,94 @@ async fn api_get_download_url( request_json(&state.client, Method::GET, api_url, None, None).await } +#[tauri::command] +async fn api_get_my_shares( + state: tauri::State<'_, ApiState>, + base_url: String, +) -> Result { + request_with_optional_csrf( + &state.client, + Method::GET, + &base_url, + "/api/share/my", + None, + false, + ) + .await +} + +#[tauri::command] +async fn api_create_share( + state: tauri::State<'_, ApiState>, + base_url: String, + share_type: String, + file_path: String, + file_name: Option, + password: Option, + expiry_days: Option, +) -> Result { + let mut body = Map::new(); + body.insert("share_type".to_string(), Value::String(share_type)); + body.insert("file_path".to_string(), Value::String(file_path)); + + if let Some(name) = file_name { + if !name.trim().is_empty() { + body.insert("file_name".to_string(), Value::String(name.trim().to_string())); + } + } + + if let Some(raw_password) = password { + let value = raw_password.trim(); + if value.is_empty() { + body.insert("password".to_string(), Value::Null); + } else { + body.insert("password".to_string(), Value::String(value.to_string())); + } + } + + if let Some(days) = expiry_days { + if days > 0 { + body.insert("expiry_days".to_string(), Value::Number(days.into())); + } else { + body.insert("expiry_days".to_string(), Value::Null); + } + } else { + body.insert("expiry_days".to_string(), Value::Null); + } + + request_with_optional_csrf( + &state.client, + Method::POST, + &base_url, + "/api/share/create", + Some(Value::Object(body)), + true, + ) + .await +} + +#[tauri::command] +async fn api_delete_share( + state: tauri::State<'_, ApiState>, + base_url: String, + share_id: u64, +) -> Result { + if share_id == 0 { + return Err("无效的分享ID".to_string()); + } + + let csrf_token = fetch_csrf_token(&state.client, &base_url).await?; + let path = format!("/api/share/{}", share_id); + request_json( + &state.client, + Method::DELETE, + join_api_url(&base_url, &path), + None, + csrf_token, + ) + .await +} + #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { let client = reqwest::Client::builder() @@ -345,7 +433,10 @@ pub fn run() { api_mkdir, api_rename_file, api_delete_file, - api_get_download_url + api_get_download_url, + api_get_my_shares, + api_create_share, + api_delete_share ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/desktop-client/src/App.vue b/desktop-client/src/App.vue index c86321f..cadffad 100644 --- a/desktop-client/src/App.vue +++ b/desktop-client/src/App.vue @@ -1,9 +1,9 @@