From 9157d12f67046b71cbab70fb716a5586564b7df7 Mon Sep 17 00:00:00 2001 From: Carlos Narro Date: Fri, 3 Jul 2026 08:22:40 +0200 Subject: [PATCH] recetas B3: DELETE /cookbook/{author_id} (opt-out del respaldo, borra solo privadas) Co-Authored-By: Claude Opus 4.8 --- main.py | 13 +++++++++++++ test_recipes.py | 11 +++++++++++ 2 files changed, 24 insertions(+) diff --git a/main.py b/main.py index a763400..cc77dfe 100644 --- a/main.py +++ b/main.py @@ -243,6 +243,19 @@ def cookbook(author_id: str, db: Session = Depends(get_db)): return [r.to_app() for r in rows] +@app.delete("/cookbook/{author_id}") +def delete_cookbook(author_id: str, db: Session = Depends(get_db)): + """Opt-out del respaldo: borra las copias PRIVADAS de un autor. Lo que + publicó a propósito (pública / no listada) se mantiene.""" + n = ( + db.query(Recipe) + .filter(Recipe.author_id == author_id, Recipe.visibility == "private") + .delete() + ) + db.commit() + return {"deleted": n} + + @app.post("/recipes") def add_recipe(body: RecipeIn, db: Session = Depends(get_db)): items = [i.model_dump() for i in body.items] diff --git a/test_recipes.py b/test_recipes.py index 1c39d41..f88db4d 100644 --- a/test_recipes.py +++ b/test_recipes.py @@ -47,3 +47,14 @@ def test_receta_anonima_sin_nombre(): "items": [], "visibility": "public", "authorId": "a2"}) got = client.get("/recipes/anon").json() assert got["authorName"] is None + + +def test_delete_cookbook_borra_solo_privadas(): + client.post("/recipes", json={"id": "d_pub", "name": "P", "servings": 1, + "items": [], "visibility": "public", "authorId": "del"}) + client.post("/recipes", json={"id": "d_prv", "name": "Q", "servings": 1, + "items": [], "visibility": "private", "authorId": "del"}) + res = client.request("DELETE", "/cookbook/del").json() + assert res["deleted"] == 1 + ids = {x["id"] for x in client.get("/cookbook/del").json()} + assert ids == {"d_pub"} # la pública se mantiene