fix(task): 删任务级联清掉 run 与产物,不再留孤儿逐字稿

DELETE /api/my/tasks/:id 原先只删 task_record。实测:删前 1/7/6,
删后 0/7/6 —— 运行记录与产物原样留着。任务列表里再也看不到,
也没有任何接口能按 task_id 找回,等于永久留在库里。而产物正文常常是
完整逐字稿(一次 26 分钟会议的录音内容),于是「删掉任务」并不等于
「删掉录音内容」;交付前按 DELIVERY.md 手工清单 C 项清测试数据时,
会留下一批谁也删不掉的逐字稿。

补上 TaskRunDAO.DeleteByTask + TaskArtifactDAO.DeleteByTask —— 两个 DAO
早就有了,weixin_public_account 的工作流重置一直在配对使用,缺的只是
这里没调。先子后父:中途失败任务还在,重试一次就干净;反过来先删父
再失败,子记录就再没人能找到了。task_id 外键只有这两张表,即完整级联。

验证(internal/api/my_task_delete_test.go,真实路由 + 真实鉴权中间件):
先 stash 掉 my_task.go 跑,孤儿断言如期红;改回全绿。另有越权用例钉住
「404 且一条都不许少」,以及旁观任务证明不误伤。条数用 3/2 而非 1,
计数走模型而非表名字符串(拼错表名 Count 为 0,而 0 正是期望值)。
详见 bugs_and_errors.md E15。

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
eaiadmin
2026-09-27 00:16:39 +08:00
co-authored by Claude Code
parent 81366ca273
commit e9c0c4007c
3 changed files with 253 additions and 4 deletions
+17 -3
View File
@@ -693,9 +693,23 @@ torch / matplotlib 之类的 dotfile 也落在同一个可写位置。
`DELIVERY.md` 第 3 节手工清单 C 项「清空测试数据」若按这个删法走,
库里会留下一批**没有任何入口能看到、也没人能删**的孤儿逐字稿。
**状态**:**未修**。删除语义(硬删 / 软删留痕)是产品决定,不擅自改。
本次是我自己造的夹具,已手工清掉那 7 条 run 与 6 条产物(先备份
`/tmp/eai_backup_before_retry_test.db`,删后核对为 0 / 0)。
**修法**:`DeleteMyTask` 补上 `TaskRunDAO.DeleteByTask` + `TaskArtifactDAO.DeleteByTask`
(两个 DAO 早就有了,`weixin_public_account` 的工作流重置一直在配对使用 —— 缺的只是
这里没调)。**顺序先子后父**:中途失败时任务还在,重试一次就干净;反过来先删父再失败,
那些子记录就再也没人能按 task_id 找到了。响应里回带清掉的条数。
`task_id` 外键只有 `task_run` 与 `task_artifact` 两张表(grep `internal/model` 确认),
所以这两步就是完整的级联。
**验证**:新增 `internal/api/my_task_delete_test.go`,走**真实路由 + 真实鉴权中间件**。
- **先证明会红**:把 `my_task.go` stash 掉再跑,孤儿断言如期失败
(「task_run 还剩 3 条孤儿」「task_artifact 还剩 2 条孤儿」)。
- 改回后全绿;另有一条越权用例钉住「返回 404 且**一条都不许少**」——
若哪天有人在权限判断之前就把级联删了,状态码照样 404,孤儿却已经产生。
- 条数故意用 3 / 2 而不是 1,免得「删了一条就以为删干净了」蒙混过关;另铺一条
「旁观任务」证明级联不会误伤别的任务。
- 计数走模型而不是表名字符串:表名是各模型 `TableName()` 写死的单数,拼错字符串
`Count` 出来是 0 —— 而 0 正是这里的期望值,断言会**对着一个不存在的表**全绿。
---