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()