优化folder打开逻辑
This commit is contained in:
@@ -7,7 +7,7 @@ use tokio::sync::Mutex;
|
||||
|
||||
static BOOTSTRAP_FOLDER_COMMANDS_LOCK: Mutex<()> = Mutex::const_new(());
|
||||
|
||||
fn load_package_scripts_as_commands(folder_path: &str) -> Vec<(String, String)> {
|
||||
pub(crate) fn load_package_scripts_as_commands(folder_path: &str) -> Vec<(String, String)> {
|
||||
let mut has_package_json = false;
|
||||
let mut has_pnpm_lock = false;
|
||||
let mut has_yarn_lock = false;
|
||||
|
||||
@@ -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(¶ms.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))
|
||||
}
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user