fix: 拖选文字时弹窗不再误关闭 #27

Merged
hera merged 16 commits from fix/next-batch into main 2026-04-12 14:11:46 +00:00
Showing only changes of commit cd08513985 - Show all commits

View File

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