fix(api): 模板编辑器兼容旧模板系统,修复E2E 500错误 #675
Reference in New Issue
Block a user
Delete Branch "fix/template-editor-compat-old-templates"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
两套模板系统未打通:
用户自建模板走旧系统,但生成页/模板编辑器走新系统,导致 GET /templates/{id}/editor 返回 500(模板不存在抛 ValueError),E2E 测试等不到 generate 接口超时报错。
修复
修改
get_draft_plan_id依赖函数,增加兼容逻辑:影响范围
🚀 预览环境已部署
1722ab5eb0toeac5b26173d627736051to1630c022fd代码审查结果 - PR #675
⚠️ 问题(3个需要修改)
templates_editor.py 第703行:数据一致性与原子性风险
generator.generate_from_template与plan_svc.update_plan_config之间缺乏事务保护。如果生成成功但更新配置失败(如数据库连接断开、权限错误),会产生一个未标记is_template_draft=True的“僵尸”计划。由于第 649 行的检查依赖于该标记,后续请求将无法找到此草稿,导致重复创建无限多个草稿计划。templates_editor.py 第649-699行:并发竞态条件(Race Condition)
get_draft_plan_id实现了“检查后执行”模式,但步骤 1(检查草稿是否存在)与步骤 4(创建草稿)之间不是原子操作。在高并发场景下,两个请求可能同时通过步骤 1 的检查,导致在步骤 4 中为同一个template_id创建两个草稿计划。templates_editor.py 第694行:潜在的 KeyError 异常
result["plan"]访问字典键。如果generate_from_template方法在异常情况下返回None或结构不匹配的字典,将导致运行时崩溃(HTTP 500)。💡 建议(2个可选)
templates_editor.py 第656-659行:避免在函数内部导入
from app.services...和from packages.domain...等导入语句移至文件顶部。虽然函数内导入可以解决循环依赖,但通常意味着架构设计需要优化(如通过依赖注入),且会增加微小的调用开销。templates_editor.py 第664-683行:封装复杂逻辑到 Service 层
pseudo_template和转换clip_configs的逻辑较为繁琐,属于业务逻辑而非路由层职责。建议封装为tpl_svc.migrate_legacy_template_to_draft(template_id, user_id)方法,保持路由代码简洁。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-21 12:59:01 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #675 已关闭或合并,对应的预览环境已被清理。