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