From cd08513985b8c38f1dcae04795bd7e74216fca81 Mon Sep 17 00:00:00 2001 From: Hera Zhao Date: Sun, 12 Apr 2026 09:56:34 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB=E9=85=8D=E6=96=B9=E6=97=B6=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E4=B8=8E=E5=85=AC=E5=85=B1=E5=BA=93/=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E4=B8=AA=E4=BA=BA=E5=BA=93=E9=87=8D=E5=90=8D=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/main.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/backend/main.py b/backend/main.py index 09abbd3..9833f5a 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1107,19 +1107,38 @@ def delete_user(user_id: int, user=Depends(require_role("admin"))): if not target: conn.close() raise HTTPException(404, "User not found") - # Transfer personal diary recipes to admin before deletion + # Transfer personal diary recipes to admin before deletion (skip duplicates) target_name = target["display_name"] or target["username"] - diaries = conn.execute("SELECT id, name FROM user_diary WHERE user_id = ?", (user_id,)).fetchall() + 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 = {} + for row in admin_diaries: + existing[row["name"]] = row["ingredients"] + for row in public_recipes: + existing[row["name"]] = row["ings"] or "" for d in diaries: - new_name = f"{d['name']}({target_name})" - conn.execute("UPDATE user_diary SET user_id = ?, name = ? WHERE id = ?", - (user["id"], new_name, d["id"])) + # Check if same name+ingredients exists in admin diary or public + is_dup = d["name"] in existing + if is_dup: + conn.execute("DELETE FROM user_diary WHERE id = ?", (d["id"],)) + else: + new_name = f"{d['name']}({target_name})" + conn.execute("UPDATE user_diary SET user_id = ?, name = ? WHERE id = ?", + (user["id"], new_name, d["id"])) + transferred += 1 snapshot = dict(target) conn.execute("DELETE FROM users WHERE id = ?", (user_id,)) detail = dict(snapshot) if diaries: - detail["transferred_diary_count"] = len(diaries) + detail["transferred_diary_count"] = transferred + detail["skipped_duplicate_count"] = len(diaries) - transferred log_audit(conn, user["id"], "delete_user", "user", user_id, target["username"], json.dumps(detail, ensure_ascii=False)) conn.commit()