fooder-api/fooder/view/meal.py

49 lines
1.5 KiB
Python

import datetime
from fastapi import APIRouter, Depends
from fooder.context import AuthContextDependency, Context
from fooder.controller.meal import MealController
from fooder.model.meal import MealCreateModel, MealModel, MealUpdateModel
router = APIRouter(tags=["meal"])
_auth_ctx = AuthContextDependency()
@router.post("", response_model=MealModel, status_code=201)
async def create_meal(
date: datetime.date,
data: MealCreateModel,
ctx: Context = Depends(_auth_ctx),
):
async with ctx.repo.transaction():
diary = await ctx.repo.diary.get_by_user_and_date(ctx.user.id, date)
ctrl = await MealController.create(ctx, diary_id=diary.id, data=data)
return ctrl.obj
@router.patch("/{meal_id}", response_model=MealModel)
async def update_meal(
date: datetime.date,
meal_id: int,
data: MealUpdateModel,
ctx: Context = Depends(_auth_ctx),
):
async with ctx.repo.transaction():
diary = await ctx.repo.diary.get_by_user_and_date(ctx.user.id, date)
meal = await ctx.repo.meal.get_by_id_and_diary(meal_id, diary.id)
await MealController(ctx, meal).update(data)
return meal
@router.delete("/{meal_id}", status_code=204)
async def delete_meal(
date: datetime.date,
meal_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)
await ctx.repo.meal.delete_by_id_and_diary(meal_id, diary.id)