优化folder打开逻辑

This commit is contained in:
xintaofei
2026-03-25 18:24:32 +08:00
parent b330a4f936
commit 388f92637c
9 changed files with 119 additions and 13 deletions

View File

@@ -117,6 +117,45 @@ pub async fn reorder_folder_commands(
Ok(Json(()))
}
// TODO: bootstrap_folder_commands_from_package_json — requires access to
// `load_package_scripts_as_commands` which is private in commands/folder_commands.rs.
// Make it pub(crate) first, then add the web handler here.
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BootstrapFolderCommandsParams {
pub folder_id: i32,
pub folder_path: String,
}
pub async fn bootstrap_folder_commands_from_package_json(
Extension(app): Extension<tauri::AppHandle>,
Json(params): Json<BootstrapFolderCommandsParams>,
) -> Result<Json<Vec<FolderCommandInfo>>, AppCommandError> {
let db = app.state::<AppDatabase>();
let existing = folder_command_service::list_by_folder(&db.conn, params.folder_id)
.await
.map_err(AppCommandError::from)?;
if !existing.is_empty() {
return Ok(Json(existing));
}
let commands_to_create = tokio::task::spawn_blocking(move || {
crate::commands::folder_commands::load_package_scripts_as_commands(&params.folder_path)
})
.await
.map_err(|e| AppCommandError::new(
crate::app_error::AppErrorCode::TaskExecutionFailed,
format!("bootstrap task failed: {e}"),
))?;
if commands_to_create.is_empty() {
return Ok(Json(existing));
}
folder_command_service::create_many(&db.conn, params.folder_id, &commands_to_create)
.await
.map_err(AppCommandError::from)?;
let result = folder_command_service::list_by_folder(&db.conn, params.folder_id)
.await
.map_err(AppCommandError::from)?;
Ok(Json(result))
}

View File

@@ -24,6 +24,16 @@ pub async fn load_folder_history(
Ok(Json(result))
}
pub async fn list_open_folders(
Extension(app): Extension<tauri::AppHandle>,
) -> Result<Json<Vec<FolderHistoryEntry>>, AppCommandError> {
let db = app.state::<AppDatabase>();
let result = folder_service::list_open_folders(&db.conn)
.await
.map_err(AppCommandError::from)?;
Ok(Json(result))
}
pub async fn get_folder(
Extension(app): Extension<tauri::AppHandle>,
Json(params): Json<FolderIdParams>,
@@ -55,6 +65,17 @@ pub async fn open_folder_window(
Ok(Json(entry))
}
pub async fn close_folder_window(
Extension(app): Extension<tauri::AppHandle>,
Json(params): Json<FolderIdParams>,
) -> Result<Json<()>, AppCommandError> {
let db = app.state::<AppDatabase>();
folder_service::set_folder_open(&db.conn, params.folder_id, false)
.await
.map_err(AppCommandError::from)?;
Ok(Json(()))
}
// --- New handlers below ---
#[derive(Deserialize)]

View File

@@ -37,6 +37,8 @@ pub fn build_router(app: tauri::AppHandle, token: String, static_dir: std::path:
.route("/update_conversation_external_id", post(handlers::conversations::update_conversation_external_id))
// ─── Folders ───
.route("/load_folder_history", post(handlers::folders::load_folder_history))
.route("/list_open_folders", post(handlers::folders::list_open_folders))
.route("/close_folder_window", post(handlers::folders::close_folder_window))
.route("/get_folder", post(handlers::folders::get_folder))
.route("/open_folder_window", post(handlers::folders::open_folder_window))
.route("/add_folder_to_history", post(handlers::folders::add_folder_to_history))
@@ -115,6 +117,7 @@ pub fn build_router(app: tauri::AppHandle, token: String, static_dir: std::path:
.route("/update_folder_command", post(handlers::folder_commands::update_folder_command))
.route("/delete_folder_command", post(handlers::folder_commands::delete_folder_command))
.route("/reorder_folder_commands", post(handlers::folder_commands::reorder_folder_commands))
.route("/bootstrap_folder_commands_from_package_json", post(handlers::folder_commands::bootstrap_folder_commands_from_package_json))
// ─── MCP ───
.route("/mcp_scan_local", post(handlers::mcp::mcp_scan_local))
.route("/mcp_list_marketplaces", post(handlers::mcp::mcp_list_marketplaces))