f2e123a017
- 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
37 lines
893 B
Python
37 lines
893 B
Python
"""Recipe commands."""
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import List, Optional
|
|
|
|
|
|
@dataclass
|
|
class RecipeItemCommand:
|
|
item_type: str
|
|
item_id: str
|
|
position: int = 0
|
|
metadata_: dict = field(default_factory=dict)
|
|
|
|
|
|
@dataclass
|
|
class CreateRecipeCommand:
|
|
user_id: str
|
|
name: str
|
|
description: str = ""
|
|
template_id: str = ""
|
|
generation_params: dict = field(default_factory=dict)
|
|
items: List[RecipeItemCommand] = field(default_factory=list)
|
|
metadata_: dict = field(default_factory=dict)
|
|
|
|
|
|
@dataclass
|
|
class UpdateRecipeCommand:
|
|
recipe_id: str
|
|
user_id: str
|
|
name: Optional[str] = None
|
|
description: Optional[str] = None
|
|
template_id: Optional[str] = None
|
|
generation_params: Optional[dict] = None
|
|
items: Optional[List[RecipeItemCommand]] = None
|
|
metadata_: Optional[dict] = None
|