|
|
|
|
@@ -340,7 +340,11 @@ pub fn allowed_columns_for(table: &str) -> Option<&'static [&'static str]> {
|
|
|
|
|
// update_task/update_field 白名单均不含)。后人勿把 review_rounds 补进白名单,
|
|
|
|
|
// 否则破坏「review_rounds 唯一写入路径」收口、引入旁路写导致计数错乱。
|
|
|
|
|
"project_id", "title", "description", "priority", "branch_name",
|
|
|
|
|
"assignee", "workflow_def_id", "base_branch", "updated_at",
|
|
|
|
|
"assignee", "workflow_def_id", "base_branch",
|
|
|
|
|
// output_json:ai_execute 写产出 / ai_self_review 读产出自审 / human_review 展示对象
|
|
|
|
|
// (决策 a:task 中心,产出跟 task 走)。非状态机收口字段,合法可写。
|
|
|
|
|
"output_json",
|
|
|
|
|
"updated_at",
|
|
|
|
|
// TODO(B-260616-16): project_id 跨表存在性校验待 commands/task.rs 层补。
|
|
|
|
|
// 通用 CRUD 层(db repo)只懂表/列语义,不持有跨表业务约束(查 projects 表存在性)。
|
|
|
|
|
// project_id 当前可在白名单内改写,合法目标存在性由上层命令层校验。
|
|
|
|
|
@@ -485,6 +489,7 @@ fn task_from_row(row: &Row<'_>) -> std::result::Result<TaskRecord, rusqlite::Err
|
|
|
|
|
workflow_def_id: row.get("workflow_def_id")?,
|
|
|
|
|
base_branch: row.get("base_branch")?,
|
|
|
|
|
review_rounds: row.get("review_rounds")?,
|
|
|
|
|
output_json: row.get("output_json")?,
|
|
|
|
|
created_at: row.get("created_at")?,
|
|
|
|
|
updated_at: row.get("updated_at")?,
|
|
|
|
|
})
|
|
|
|
|
@@ -745,22 +750,22 @@ impl_repo!(
|
|
|
|
|
from_row => |row| task_from_row(row),
|
|
|
|
|
insert => |conn, rec| {
|
|
|
|
|
conn.execute(
|
|
|
|
|
"INSERT INTO tasks (id, project_id, title, description, status, priority, branch_name, assignee, workflow_def_id, base_branch, review_rounds, created_at, updated_at)
|
|
|
|
|
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13)",
|
|
|
|
|
"INSERT INTO tasks (id, project_id, title, description, status, priority, branch_name, assignee, workflow_def_id, base_branch, review_rounds, output_json, created_at, updated_at)
|
|
|
|
|
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14)",
|
|
|
|
|
params![
|
|
|
|
|
rec.id, rec.project_id, rec.title, rec.description, rec.status, rec.priority,
|
|
|
|
|
rec.branch_name, rec.assignee, rec.workflow_def_id, rec.base_branch,
|
|
|
|
|
rec.review_rounds, rec.created_at, rec.updated_at
|
|
|
|
|
rec.review_rounds, rec.output_json, rec.created_at, rec.updated_at
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
},
|
|
|
|
|
update => |conn, rec| {
|
|
|
|
|
conn.execute(
|
|
|
|
|
"UPDATE tasks SET project_id = ?1, title = ?2, description = ?3, status = ?4, priority = ?5, branch_name = ?6, assignee = ?7, workflow_def_id = ?8, base_branch = ?9, review_rounds = ?10, updated_at = ?11 WHERE id = ?12",
|
|
|
|
|
"UPDATE tasks SET project_id = ?1, title = ?2, description = ?3, status = ?4, priority = ?5, branch_name = ?6, assignee = ?7, workflow_def_id = ?8, base_branch = ?9, review_rounds = ?10, output_json = ?11, updated_at = ?12 WHERE id = ?13",
|
|
|
|
|
params![
|
|
|
|
|
rec.project_id, rec.title, rec.description, rec.status, rec.priority,
|
|
|
|
|
rec.branch_name, rec.assignee, rec.workflow_def_id, rec.base_branch,
|
|
|
|
|
rec.review_rounds, rec.updated_at, rec.id
|
|
|
|
|
rec.review_rounds, rec.output_json, rec.updated_at, rec.id
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
@@ -769,14 +774,14 @@ impl_repo!(
|
|
|
|
|
impl TaskRepo {
|
|
|
|
|
/// 列出未删除任务(deleted_at IS NULL)— 对标 ProjectRepo::list_active
|
|
|
|
|
///
|
|
|
|
|
/// 显式列出 13 个 TaskRecord 列名(同 ProjectRepo::list_active 写法),
|
|
|
|
|
/// 显式列出 14 个 TaskRecord 列名(同 ProjectRepo::list_active 写法),
|
|
|
|
|
/// 不 SELECT deleted_at:TaskRecord 不带该字段,取了 from_row 会因未知列报错。
|
|
|
|
|
pub async fn list_active(&self) -> Result<Vec<TaskRecord>> {
|
|
|
|
|
let conn = self.conn.clone();
|
|
|
|
|
tokio::task::spawn_blocking(move || {
|
|
|
|
|
let guard = conn.blocking_lock();
|
|
|
|
|
let mut stmt = guard
|
|
|
|
|
.prepare("SELECT id, project_id, title, description, status, priority, branch_name, assignee, workflow_def_id, base_branch, review_rounds, created_at, updated_at FROM tasks WHERE deleted_at IS NULL ORDER BY created_at DESC")
|
|
|
|
|
.prepare("SELECT id, project_id, title, description, status, priority, branch_name, assignee, workflow_def_id, base_branch, review_rounds, output_json, created_at, updated_at FROM tasks WHERE deleted_at IS NULL ORDER BY created_at DESC")
|
|
|
|
|
.map_err(storage_err)?;
|
|
|
|
|
let rows = stmt
|
|
|
|
|
.query_map([], |row| task_from_row(row))
|
|
|
|
|
@@ -877,7 +882,7 @@ impl TaskRepo {
|
|
|
|
|
}
|
|
|
|
|
// 回读更新后的记录(含新 status / 累加后的 review_rounds / 新 updated_at)。
|
|
|
|
|
let mut stmt = guard
|
|
|
|
|
.prepare("SELECT id, project_id, title, description, status, priority, branch_name, assignee, workflow_def_id, base_branch, review_rounds, created_at, updated_at FROM tasks WHERE id = ?1")
|
|
|
|
|
.prepare("SELECT id, project_id, title, description, status, priority, branch_name, assignee, workflow_def_id, base_branch, review_rounds, output_json, created_at, updated_at FROM tasks WHERE id = ?1")
|
|
|
|
|
.map_err(storage_err)?;
|
|
|
|
|
let row = stmt
|
|
|
|
|
.query_row(params![id], |row| task_from_row(row))
|
|
|
|
|
@@ -898,7 +903,7 @@ impl TaskRepo {
|
|
|
|
|
tokio::task::spawn_blocking(move || {
|
|
|
|
|
let guard = conn.blocking_lock();
|
|
|
|
|
let mut stmt = guard
|
|
|
|
|
.prepare("SELECT id, project_id, title, description, status, priority, branch_name, assignee, workflow_def_id, base_branch, review_rounds, created_at, updated_at FROM tasks WHERE deleted_at IS NOT NULL ORDER BY updated_at DESC")
|
|
|
|
|
.prepare("SELECT id, project_id, title, description, status, priority, branch_name, assignee, workflow_def_id, base_branch, review_rounds, output_json, created_at, updated_at FROM tasks WHERE deleted_at IS NOT NULL ORDER BY updated_at DESC")
|
|
|
|
|
.map_err(storage_err)?;
|
|
|
|
|
let rows = stmt
|
|
|
|
|
.query_map([], |row| task_from_row(row))
|
|
|
|
|
|