feat(phase8-task205): API 剪辑生成 — 渲染触发 + 进度查询 + Celery任务 #149
Reference in New Issue
Block a user
Delete Branch "feature/phase8-task205-edit-plan-generation"
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?
Phase 8 任务 2.05:API 剪辑生成
变更内容
1. API 端点(edit_plans.py)
POST /edit-plans/{id}/generate— 触发剪辑渲染生成worker.render_edit_planGET /edit-plans/{id}/generation-status— 查询生成进度2. Celery 任务(edit_plan_generation.py)
worker.render_edit_plan— 完整渲染流程3. 单元测试(16 个用例)
4. Celery 注册
worker_app/celery_app.py添加edit_plan_generation模块文件清单
apps/api/app/api/routes/edit_plans.py— 新增 2 个端点 + 3 个 Schemaapps/worker/worker_app/tasks/edit_plan_generation.py— 新建 Celery 任务apps/worker/worker_app/celery_app.py— 注册新任务模块tests/unit/test_edit_plan_generation_api.py— 16 个单元测试🔍 代码审查报告 — PR #149
结论:✅ 通过,建议合并
整体质量良好。后端 RESTful CRUD + 生成端点设计规范,Pydantic Schema 分离清晰,状态机流转校验完整。前端大重构为三栏架构(MediaPanel / TimelinePanel / ClipPropertiesPanel)职责明确,拖拽交互完整。Celery 任务有完善的错误处理和状态追踪。查重模块的文档增强也值得肯定。
共 44+ 个单元测试(25+ CRUD + 16 生成),覆盖正常/异常/边界路径。
P2(建议修复,不阻塞合并)
1.
list_plans按 template_id 筛选时全量查询算 total(N+1 问题)edit_plans.pylist_plans 函数template_id存在时,代码调用list_by_template(..., limit=10000)获取全量数据再用len()计算 total,而count()方法本身已支持template_id参数(见 Stub 实现)repo.count(template_id=template_id, status=status_enum)代替全量查询2.
generate_plan端点缺少用户隔离检查edit_plans.pygenerate_plan 函数plan.status == EDITING,但未验证plan是否属于当前用户。任何认证用户可通过 ID 触发任意计划的渲染created_by_user_id字段,或在 plan config 中记录用户信息,generate 端点做归属校验3.
delete_plan硬删除但无级联清理关联 EditPlanClipedit_plans.pydelete_plan 函数clip_repo.delete_by_plan(plan_id)清理关联片段(Stub 已有此方法)P3(微小建议,无需修改)
1.
_to_response中hasattr(p.status, "value")可用 isinstance 替代hasattr检查偏防御性,domain 模型保证p.status是EditPlanStatus枚举p.status.value if isinstance(p.status, EditPlanStatus) else p.status2.
handleAssetDragStart在 EditingPlanner.tsx 中是空回调onAssetDragStart只是() => {}dataTransfer正常工作,不影响功能3. Celery 任务 retry 时异常处理可改进
except Exception: pass内层的异常吞没是合理的(避免掩盖原始异常),但建议至少logger.debug记录一下恢复失败亮点
transition_map映射领域方法,非法流转自动抛 ValueError551e20a767tob41e0255ef