fix: 删除用户转移配方去重改为按成分内容比较,不只看名字
All checks were successful
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) Successful in 52s
All checks were successful
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) Successful in 52s
相同成分组合(不管名字是否相同)视为重复,不转移。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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()
|
diaries = conn.execute("SELECT id, name, ingredients FROM user_diary WHERE user_id = ?", (user_id,)).fetchall()
|
||||||
transferred = 0
|
transferred = 0
|
||||||
if diaries:
|
if diaries:
|
||||||
# Load admin's diary and public recipes for dedup
|
# Build set of ingredient fingerprints from admin diary + public recipes
|
||||||
admin_diaries = conn.execute("SELECT name, ingredients FROM user_diary WHERE user_id = ?", (user["id"],)).fetchall()
|
def _ings_key(ings_json):
|
||||||
public_recipes = conn.execute(
|
"""Normalize ingredients to a comparable key."""
|
||||||
"SELECT r.name, GROUP_CONCAT(ri.oil_name || ':' || ri.drops) as ings "
|
try:
|
||||||
"FROM recipes r LEFT JOIN recipe_ingredients ri ON r.id = ri.recipe_id GROUP BY r.id"
|
ings = json.loads(ings_json) if isinstance(ings_json, str) else []
|
||||||
).fetchall()
|
return tuple(sorted((i.get("oil") or i.get("oil_name", ""), i.get("drops", 0)) for i in ings))
|
||||||
existing = {}
|
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:
|
for row in admin_diaries:
|
||||||
existing[row["name"]] = row["ingredients"]
|
existing_keys.add(_ings_key(row["ingredients"]))
|
||||||
for row in public_recipes:
|
public_recipes = conn.execute("SELECT id FROM recipes").fetchall()
|
||||||
existing[row["name"]] = row["ings"] or ""
|
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:
|
for d in diaries:
|
||||||
# Check if same name+ingredients exists in admin diary or public
|
d_key = _ings_key(d["ingredients"])
|
||||||
is_dup = d["name"] in existing
|
is_dup = d_key in existing_keys and d_key != ()
|
||||||
if is_dup:
|
if is_dup:
|
||||||
conn.execute("DELETE FROM user_diary WHERE id = ?", (d["id"],))
|
conn.execute("DELETE FROM user_diary WHERE id = ?", (d["id"],))
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user