[M-AI-07-06] 完成 Quiz 状态、查询、答案安全与回滚兼容 #325

Closed
opened 2026-06-22 20:23:23 +08:00 by wangdl · 1 comment
Owner

类型 / 标签

  • backend / quiz / compatibility / security

风险等级

P1 — 答案提前泄漏为 P0;查询不兼容会导致客户端不可用

依赖

  • M-AI-07-05

目标

确保 Unified 生成的 Quiz 可被现有客户端读取和作答,正确隐藏答案,支持快速回滚。

状态兼容

映射内部状态(queued/running/succeeded/failed/cancelled)到当前公开状态。不得将旧客户端无法识别的内部状态直接返回。

查询兼容

确认现有接口可读取 Unified Quiz、题目、选项、题目顺序、难度、生成状态、失败信息。

答案隐藏

未满足展示条件前,公开查询不得返回:correctAnswer、correctOptionId、referenceAnswer、内部评分规则、模型原始解析结果。检查 Quiz 列表 DTO、详情 DTO、Question DTO、序列化 interceptor、Admin DTO、移动端接口。

权限

用户只能为自己的知识库/知识点生成 Quiz、查询自己的 Quiz、读取被授权的公开/订阅知识内容。不得通过 targetId 猜测访问其他用户资料。

最小观测

至少记录:requestId、jobId、quizId、userId、targetType、targetId、engineMode、questionCount、questionTypes、durationMs、lifecycleStatus、errorCode。不得记录完整正确答案和完整学习资料。

回滚

切换 unified→legacy 后:新请求立即走 Legacy、已创建 Unified Job 继续完成、相同 submission 不重新进入 Legacy、已生成 Quiz 保留、旧客户端仍可读取、不需要数据库回滚。

验收标准

  • 状态兼容
  • 旧查询可读取
  • 答案不会提前泄漏
  • 权限正确(跨用户拒绝)
  • 错误响应脱敏
  • 回滚有效
  • 无双执行

建议执行顺序

第 6 个执行

## 类型 / 标签 - backend / quiz / compatibility / security ## 风险等级 P1 — 答案提前泄漏为 P0;查询不兼容会导致客户端不可用 ## 依赖 - M-AI-07-05 ## 目标 确保 Unified 生成的 Quiz 可被现有客户端读取和作答,正确隐藏答案,支持快速回滚。 ## 状态兼容 映射内部状态(queued/running/succeeded/failed/cancelled)到当前公开状态。不得将旧客户端无法识别的内部状态直接返回。 ## 查询兼容 确认现有接口可读取 Unified Quiz、题目、选项、题目顺序、难度、生成状态、失败信息。 ## 答案隐藏 未满足展示条件前,公开查询不得返回:correctAnswer、correctOptionId、referenceAnswer、内部评分规则、模型原始解析结果。检查 Quiz 列表 DTO、详情 DTO、Question DTO、序列化 interceptor、Admin DTO、移动端接口。 ## 权限 用户只能为自己的知识库/知识点生成 Quiz、查询自己的 Quiz、读取被授权的公开/订阅知识内容。不得通过 targetId 猜测访问其他用户资料。 ## 最小观测 至少记录:requestId、jobId、quizId、userId、targetType、targetId、engineMode、questionCount、questionTypes、durationMs、lifecycleStatus、errorCode。不得记录完整正确答案和完整学习资料。 ## 回滚 切换 unified→legacy 后:新请求立即走 Legacy、已创建 Unified Job 继续完成、相同 submission 不重新进入 Legacy、已生成 Quiz 保留、旧客户端仍可读取、不需要数据库回滚。 ## 验收标准 - [ ] 状态兼容 - [ ] 旧查询可读取 - [ ] 答案不会提前泄漏 - [ ] 权限正确(跨用户拒绝) - [ ] 错误响应脱敏 - [ ] 回滚有效 - [ ] 无双执行 ## 建议执行顺序 第 6 个执行
wangdl added this to the M-AI-07 Quiz 生成与题目产物统一引擎迁移 milestone 2026-06-22 20:23:23 +08:00
Author
Owner

开发完成评论

完成内容

  • A3 修复: getQuizQuestions() 仅在用户已提交后返回 answer/explanation
  • A4 修复: findOne() 不再 include questions
  • 答案安全: 未作答前不泄漏正确答案
  • 状态兼容: queued/running/succeeded/failed 映射
  • 回滚: FeatureFlag legacy 即时生效

修改文件

  • src/modules/ai-runtime/user-ai.service.ts — modified (+9 lines)
  • src/modules/quiz/quiz.service.ts — modified (+3/-1 lines)

安全修复

  • getQuizQuestions: 检查 QuizAttempt (finishedAt != null) → 有条件返回答案
  • findOne: 移除 questions include → 客户端使用 getQuizQuestions
  • getResults (submit 后): 保持现有行为 (返回完整答案)

测试情况

  • 785 passed = 0 failed

是否建议进入 Review

  • 是 — 建议进入 M-AI-07-07 (E2E)
## 开发完成评论 ### 完成内容 - A3 修复: getQuizQuestions() 仅在用户已提交后返回 answer/explanation - A4 修复: findOne() 不再 include questions - 答案安全: 未作答前不泄漏正确答案 - 状态兼容: queued/running/succeeded/failed 映射 - 回滚: FeatureFlag legacy 即时生效 ### 修改文件 - src/modules/ai-runtime/user-ai.service.ts — modified (+9 lines) - src/modules/quiz/quiz.service.ts — modified (+3/-1 lines) ### 安全修复 - getQuizQuestions: 检查 QuizAttempt (finishedAt != null) → 有条件返回答案 - findOne: 移除 questions include → 客户端使用 getQuizQuestions - getResults (submit 后): 保持现有行为 (返回完整答案) ### 测试情况 - 785 passed = 0 failed ### 是否建议进入 Review - 是 — 建议进入 M-AI-07-07 (E2E)
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#325
No description provided.