新增: 三实体列表查询维度补全(status/关键词/排序/分页下沉后端)

任务/项目/灵感三实体新增 list_by_query 动态 WHERE(累积式 where_clauses
+params_vec 收口)+ order_by 白名单防注入 + limit/offset 钳制。命令层
list_{tasks,projects,ideas} 吃 Option<XxxQuery> 双参向后兼容(旧无参/单参
路径等价全量)。前端 Tasks/Ideas status/keyword 筛选下沉后端 query。

F-260621-02
This commit is contained in:
lxy
2026-06-22 01:03:37 +08:00
parent 72e57c6232
commit c9b6e28433
18 changed files with 878 additions and 76 deletions
+21 -3
View File
@@ -17,6 +17,7 @@ use df_project::scan::{
collect_sample, detect_stack, discover_projects, extract_description,
normalize_path, DiscoveredProject,
};
use df_storage::crud::ProjectQuery;
use df_storage::models::ProjectRecord;
use crate::state::AppState;
@@ -38,10 +39,27 @@ pub struct CreateProjectInput {
pub stack: Option<String>,
}
/// 列出未删除项目(过滤回收站)
/// 列出未删除项目(过滤回收站)
///
/// F-260621-02:吃可选 query(关键词/排序/分页),向后兼容——不传(或 None)走 list_active
/// 全量(deleted_at IS NULL + created_at DESC),零破坏;传 query 走 list_by_query 动态 WHERE。
#[tauri::command]
pub async fn list_projects(state: State<'_, AppState>) -> Result<Vec<ProjectRecord>, String> {
state.projects.list_active().await.map_err(err_str)
pub async fn list_projects(
state: State<'_, AppState>,
query: Option<ProjectQuery>,
) -> Result<Vec<ProjectRecord>, String> {
match query {
// None 或全空 query(trim 后 keyword 空 + 无 order_by/limit/offset)→ 走 list_active,
// 与历史行为完全等价(列表上 list_by_query 空也等价,但保留 list_active 分支明示向后兼容契约)。
Some(q) if q.keyword.as_deref().map(str::trim).is_some_and(|k| !k.is_empty())
|| q.order_by.is_some()
|| q.limit.is_some()
|| q.offset.is_some() =>
{
state.projects.list_by_query(q).await.map_err(err_str)
}
_ => state.projects.list_active().await.map_err(err_str),
}
}
/// 创建项目,返回完整记录