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:
+17
-3
@@ -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 正是这里的期望值,断言会**对着一个不存在的表**全绿。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user