feat: 删除用户转移配方时跳过与公共库/管理员个人库重名的配方
Some checks failed
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Successful in 5s
Test / build-check (push) Successful in 4s
PR Preview / test (pull_request) Successful in 5s
PR Preview / deploy-preview (pull_request) Successful in 10s
Test / e2e-test (push) Has been cancelled
Some checks failed
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Successful in 5s
Test / build-check (push) Successful in 4s
PR Preview / test (pull_request) Successful in 5s
PR Preview / deploy-preview (pull_request) Successful in 10s
Test / e2e-test (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1107,19 +1107,38 @@ def delete_user(user_id: int, user=Depends(require_role("admin"))):
|
|||||||
if not target:
|
if not target:
|
||||||
conn.close()
|
conn.close()
|
||||||
raise HTTPException(404, "User not found")
|
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"]
|
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:
|
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:
|
for d in diaries:
|
||||||
|
# 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})"
|
new_name = f"{d['name']}({target_name})"
|
||||||
conn.execute("UPDATE user_diary SET user_id = ?, name = ? WHERE id = ?",
|
conn.execute("UPDATE user_diary SET user_id = ?, name = ? WHERE id = ?",
|
||||||
(user["id"], new_name, d["id"]))
|
(user["id"], new_name, d["id"]))
|
||||||
|
transferred += 1
|
||||||
snapshot = dict(target)
|
snapshot = dict(target)
|
||||||
conn.execute("DELETE FROM users WHERE id = ?", (user_id,))
|
conn.execute("DELETE FROM users WHERE id = ?", (user_id,))
|
||||||
detail = dict(snapshot)
|
detail = dict(snapshot)
|
||||||
if diaries:
|
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"],
|
log_audit(conn, user["id"], "delete_user", "user", user_id, target["username"],
|
||||||
json.dumps(detail, ensure_ascii=False))
|
json.dumps(detail, ensure_ascii=False))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|||||||
Reference in New Issue
Block a user