import datetime from fastapi import APIRouter, Depends from fooder.command.create_entry import create_entry from fooder.context import AuthContextDependency, Context from fooder.controller.entry import EntryController from fooder.model.entry import EntryCreateModel, EntryModel, EntryUpdateModel router = APIRouter(tags=["entry"]) _auth_ctx = AuthContextDependency() @router.post("", response_model=EntryModel, status_code=201) async def create_entry_route( date: datetime.date, meal_id: int, data: EntryCreateModel, ctx: Context = Depends(_auth_ctx), ): async with ctx.repo.transaction(): diary = await ctx.repo.diary.get_by_user_and_date(ctx.user.id, date) await ctx.repo.meal.get_by_id_and_diary(meal_id, diary.id) entry = await create_entry(ctx, meal_id=meal_id, data=data) return entry @router.patch("/{entry_id}", response_model=EntryModel) async def update_entry( date: datetime.date, meal_id: int, entry_id: int, data: EntryUpdateModel, ctx: Context = Depends(_auth_ctx), ): async with ctx.repo.transaction(): diary = await ctx.repo.diary.get_by_user_and_date(ctx.user.id, date) await ctx.repo.meal.get_by_id_and_diary(meal_id, diary.id) entry = await ctx.repo.entry.get_by_id_and_meal(entry_id, meal_id) await EntryController(ctx, entry).update(data) return entry @router.delete("/{entry_id}", status_code=204) async def delete_entry( date: datetime.date, meal_id: int, entry_id: int, ctx: Context = Depends(_auth_ctx), ): async with ctx.repo.transaction(): diary = await ctx.repo.diary.get_by_user_and_date(ctx.user.id, date) await ctx.repo.meal.get_by_id_and_diary(meal_id, diary.id) entry = await ctx.repo.entry.get_by_id_and_meal(entry_id, meal_id) await ctx.repo.entry.delete(entry)