fooder-api/fooder/view/entry.py

56 lines
1.8 KiB
Python

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)