import datetime from fastapi import APIRouter, Depends from fooder.command.load_preset_as_meal import load_preset_as_meal from fooder.command.save_meal_as_preset import save_meal_as_preset from fooder.context import AuthContextDependency, Context from fooder.controller.meal import MealController from fooder.model.meal import MealCreateModel, MealModel, MealUpdateModel from fooder.model.preset import LoadPresetAsMealModel, PresetModel, SaveAsPresetModel 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.post("/from_preset", response_model=MealModel, status_code=201) async def load_preset_as_meal_view( date: datetime.date, data: LoadPresetAsMealModel, ctx: Context = Depends(_auth_ctx), ): async with ctx.repo.transaction(): diary = await ctx.repo.diary.get_by_user_and_date(ctx.user.id, date) preset = await ctx.repo.preset.get_by_id_and_user(data.preset_id, ctx.user.id) meal = await load_preset_as_meal(ctx, preset, diary_id=diary.id, name=data.name) return meal @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(): meal = await ctx.repo.meal.get_by_id_and_user(meal_id, ctx.user.id) await MealController(ctx, meal).update(data) return meal @router.post("/{meal_id}/preset", response_model=PresetModel, status_code=201) async def save_meal_as_preset_view( date: datetime.date, meal_id: int, data: SaveAsPresetModel, ctx: Context = Depends(_auth_ctx), ): async with ctx.repo.transaction(): meal = await ctx.repo.meal.get_by_id_and_user(meal_id, ctx.user.id) preset = await save_meal_as_preset(ctx, meal, name=data.name) return preset @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(): meal = await ctx.repo.meal.get_by_id_and_user(meal_id, ctx.user.id) await ctx.repo.meal.delete(meal)