diff --git a/backend/main.py b/backend/main.py index 9833f5a..9a96f91 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1112,20 +1112,25 @@ def delete_user(user_id: int, user=Depends(require_role("admin"))): diaries = conn.execute("SELECT id, name, ingredients FROM user_diary WHERE user_id = ?", (user_id,)).fetchall() transferred = 0 if diaries: - # Load admin's diary and public recipes for dedup - admin_diaries = conn.execute("SELECT name, ingredients FROM user_diary WHERE user_id = ?", (user["id"],)).fetchall() - public_recipes = conn.execute( - "SELECT r.name, GROUP_CONCAT(ri.oil_name || ':' || ri.drops) as ings " - "FROM recipes r LEFT JOIN recipe_ingredients ri ON r.id = ri.recipe_id GROUP BY r.id" - ).fetchall() - existing = {} + # Build set of ingredient fingerprints from admin diary + public recipes + def _ings_key(ings_json): + """Normalize ingredients to a comparable key.""" + try: + ings = json.loads(ings_json) if isinstance(ings_json, str) else [] + return tuple(sorted((i.get("oil") or i.get("oil_name", ""), i.get("drops", 0)) for i in ings)) + except Exception: + return () + existing_keys = set() + admin_diaries = conn.execute("SELECT ingredients FROM user_diary WHERE user_id = ?", (user["id"],)).fetchall() for row in admin_diaries: - existing[row["name"]] = row["ingredients"] - for row in public_recipes: - existing[row["name"]] = row["ings"] or "" + existing_keys.add(_ings_key(row["ingredients"])) + public_recipes = conn.execute("SELECT id FROM recipes").fetchall() + for pr in public_recipes: + pub_ings = conn.execute("SELECT oil_name, drops FROM recipe_ingredients WHERE recipe_id = ?", (pr["id"],)).fetchall() + existing_keys.add(tuple(sorted((r["oil_name"], r["drops"]) for r in pub_ings))) for d in diaries: - # Check if same name+ingredients exists in admin diary or public - is_dup = d["name"] in existing + d_key = _ings_key(d["ingredients"]) + is_dup = d_key in existing_keys and d_key != () if is_dup: conn.execute("DELETE FROM user_diary WHERE id = ?", (d["id"],)) else: