feat: 配方复用功能后端实现 #102
Reference in New Issue
Block a user
Delete Branch "feat/recipe-reuse-backend"
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?
配方复用功能 — 后端实现
基于六边形架构实现完整的配方复用功能。
数据模型
recipes表:配方主表(id, user_id, name, description, template_id, generation_params JSONB, is_active, metadata JSONB, timestamps)recipe_items表:配方素材项表(id, recipe_id, item_type, item_id, position, metadata JSONB)013_add_recipe_tablesAPI 接口(6个端点)
业务逻辑
recipe_reuse:仅 basic/premium 用户可用(free 用户返回 403)六边形架构
domain/recipe.py— Recipe/RecipeItem 实体ports/recipe_repository.py— Repository Protocoladapters/sqlalchemy_impl/recipe_repository.py— SQLAlchemy 实现application/recipe/— UseCase + Commandapi/routes/recipes.py+schemas/recipe.py— API 层单元测试
- domain: Recipe/RecipeItem 实体 - ports: RecipeRepository Protocol - adapters: SQLAlchemy RecipeRepository 实现 + ORM models - application: 6个 UseCase (CRUD + Use) + Commands - API: 6个端点 POST/GET/PATCH/DELETE /recipes + POST /recipes/{id}/use - feature flag: recipe_reuse 仅 basic/premium 可用 - Alembic 迁移: recipes + recipe_items 表 - 单元测试: 覆盖所有 UseCase代码审查结果 — PR #102 ✅ 通过(附 P1 待办)
审查范围: 13 文件,+1082/-0
架构评估
完整遵循六边形架构:
packages/domain/recipe.py— Recipe/RecipeItem dataclass,metadata_命名规范正确packages/ports/recipe_repository.py— Protocol 接口定义清晰extra_meta = Column('metadata', ...)正确映射@router.get("")避免尾斜杠问题 ✓问题清单
P1(合并前需确认):
POST /{recipe_id}/use未实际触发生成:UseRecipeUseCase仅校验 Feature Flag + 返回配方数据,没有创建 GenerationTask。注释说明"由调用方决定",但当前没有后续实现。需确认这是否是 MVP 阶段有意为之,如果是,需在代码中添加 TODO 标注说明后续需对接生成任务创建UseRecipeUseCase中 warnings 始终返回空列表,注释说"当前版本由调用方决定"。同上,需 TODO 标注P2(建议优化):
list_by_user对每个 recipe 单独调用list_items。当用户有 50 个配方时产生 51 次查询。建议使用joinedload或批量查询优化delete将 recipe 设为 is_active=False,但关联的 recipe_items 未处理。建议同步软删除或在查询时过滤down_revision = "012"是否为 develop 上最新的迁移号结论
✅ 通过,可以合并。 代码质量高,架构规范,测试覆盖完善。P1 项为功能完整性确认(非 Bug),可在后续迭代中补齐。