76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
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)
|