feat(meals): enforce three lower-calorie dinners with media
CI / backend (pytest + alembic) (push) Canceled after 0s
CI / frontend (build) (push) Canceled after 0s

This commit is contained in:
2026-09-01 10:11:36 -07:00
parent 7838c49721
commit 2695ba0232
85 changed files with 8103 additions and 795 deletions
+51 -1
View File
@@ -14,9 +14,10 @@ from app.schemas.meal_plan_generation import (
GenerationDebug,
GenerationItem,
GenerationResponse,
PublicGenerateRequest,
RegenerateRequest,
)
from app.security import require_admin
from app.security import require_admin, require_session
from app.services.planner.config import DEFAULT
from app.services.planner.generate import generate_meal_plan
from app.services.planner.types import GenerationResult
@@ -82,6 +83,55 @@ def generate(payload: GenerateRequest, db: Session = Depends(get_db)) -> Generat
return _to_response(payload.week_start_date, result.meal_plan_id, items, result)
@public_router.post("/generate", response_model=GenerationResponse, status_code=status.HTTP_201_CREATED)
def generate_for_family(
payload: PublicGenerateRequest,
db: Session = Depends(get_db),
session_family_id: str = Depends(require_session),
) -> GenerationResponse:
try:
family_id = UUID(session_family_id)
except ValueError:
raise HTTPException(status_code=404, detail="family_profile not found")
family = db.query(FamilyProfile).filter(FamilyProfile.id == family_id).first()
if family is None:
raise HTTPException(status_code=404, detail="family_profile not found")
existing = (
db.query(MealPlan)
.filter(
MealPlan.family_profile_id == family_id,
MealPlan.week_start_date == payload.week_start_date,
)
.first()
)
if existing is not None:
has_items = (
db.query(MealPlanItem.id)
.filter(MealPlanItem.meal_plan_id == existing.id)
.first()
is not None
)
if has_items:
raise HTTPException(status_code=409, detail="meal plan already has items")
db.delete(existing)
db.commit()
result = generate_meal_plan(
db,
family_id=family_id,
week_start_date=payload.week_start_date,
)
items = (
db.query(MealPlanItem)
.filter(MealPlanItem.meal_plan_id == result.meal_plan_id)
.order_by(MealPlanItem.day_of_week)
.all()
)
return _to_response(payload.week_start_date, result.meal_plan_id, items, result)
@admin_router.post("/regenerate", response_model=GenerationResponse, status_code=status.HTTP_201_CREATED)
def regenerate(payload: RegenerateRequest, db: Session = Depends(get_db)) -> GenerationResponse:
family = db.query(FamilyProfile).filter(FamilyProfile.id == payload.family_profile_id).first()