From 890829ad2084f61ae07131965ac4c7412f6ecac8 Mon Sep 17 00:00:00 2001 From: doman Date: Fri, 27 Oct 2023 16:39:26 +0200 Subject: [PATCH] [preset] fix --- fooder/controller/meal.py | 13 +++++++++++++ fooder/domain/meal.py | 7 +++++++ fooder/test/test_diary.py | 16 ++++++++++++++++ fooder/view/meal.py | 11 ++++++++++- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/fooder/controller/meal.py b/fooder/controller/meal.py index 42b0529..c0e8132 100644 --- a/fooder/controller/meal.py +++ b/fooder/controller/meal.py @@ -47,6 +47,19 @@ class SaveMeal(AuthorizedController): raise HTTPException(status_code=400, detail=e.args[0]) +class DeleteMeal(AuthorizedController): + async def call(self, meal_id: id) -> None: + async with self.async_session.begin() as session: + meal = await DBMeal.get_by_id(session, self.user.id, meal_id) + if meal is None: + raise HTTPException(status_code=404, detail="meal not found") + + try: + await meal.delete(session) + except AssertionError as e: + raise HTTPException(status_code=400, detail=e.args[0]) + + class CreateMealFromPreset(AuthorizedController): async def call(self, content: CreateMealFromPresetPayload) -> Meal: async with self.async_session.begin() as session: diff --git a/fooder/domain/meal.py b/fooder/domain/meal.py index 712cb87..ab541ae 100644 --- a/fooder/domain/meal.py +++ b/fooder/domain/meal.py @@ -142,3 +142,10 @@ class Meal(Base, CommonMixin): .options(joinedload(cls.entries)) ) return await session.scalar(query.order_by(cls.id)) + + async def delete(self, session: AsyncSession) -> None: + """delete.""" + for entry in self.entries: + await session.delete(entry) + await session.delete(self) + await session.flush() diff --git a/fooder/test/test_diary.py b/fooder/test/test_diary.py index b00e405..5833468 100644 --- a/fooder/test/test_diary.py +++ b/fooder/test/test_diary.py @@ -25,6 +25,22 @@ def test_diary_add_meal(client, meal_payload_factory): assert response.status_code == 200, response.json() +@pytest.mark.dependency(depends=["test_diary_add_meal"]) +def test_diary_delete_meal(client): + today = datetime.date.today().isoformat() + response = client.get("diary", params={"date": today}) + + meals_amount = len(response.json()["meals"]) + meal_id = response.json()["meals"][0]["id"] + + response = client.delete(f"meal/{meal_id}") + assert response.status_code == 200, response.json() + + response = client.get("diary", params={"date": today}) + assert response.status_code == 200, response.json() + assert len(response.json()["meals"]) == meals_amount - 1 + + @pytest.mark.dependency(depends=["test_get_diary"]) def test_diary_add_entry(client, product_payload_factory, entry_payload_factory): today = datetime.date.today().isoformat() diff --git a/fooder/view/meal.py b/fooder/view/meal.py index 5fb62a4..18b7f82 100644 --- a/fooder/view/meal.py +++ b/fooder/view/meal.py @@ -6,7 +6,7 @@ from ..model.meal import ( SaveMealPayload, CreateMealFromPresetPayload, ) -from ..controller.meal import CreateMeal, SaveMeal, CreateMealFromPreset +from ..controller.meal import CreateMeal, SaveMeal, CreateMealFromPreset, DeleteMeal router = APIRouter(tags=["meal"]) @@ -31,6 +31,15 @@ async def save_meal( return await contoller.call(meal_id, data) +@router.delete("/{meal_id}") +async def delete_meal( + request: Request, + meal_id: int, + contoller: DeleteMeal = Depends(DeleteMeal), +): + return await contoller.call(meal_id) + + @router.post("/from_preset", response_model=Meal) async def create_meal_from_preset( request: Request,