import datetime from fooder.context import Context from fooder.controller.base import ModelController from fooder.domain import Diary from fooder.domain.user_settings import UserSettings from fooder.model.diary import DiaryUpdateModel from fooder.utils.calories import calculate_calories class DiaryController(ModelController[Diary]): @classmethod async def create( cls, ctx: Context, date: datetime.date, settings: UserSettings ) -> "DiaryController": obj = Diary( user_id=ctx.user.id, date=date, protein_goal=settings.protein_goal, carb_goal=settings.carb_goal, fat_goal=settings.fat_goal, fiber_goal=settings.fiber_goal, calories_goal=settings.calories_goal, ) await ctx.repo.diary.create(obj) return cls(ctx, obj) async def update(self, data: DiaryUpdateModel) -> None: if data.protein_goal is not None: self.obj.protein_goal = data.protein_goal if data.carb_goal is not None: self.obj.carb_goal = data.carb_goal if data.fat_goal is not None: self.obj.fat_goal = data.fat_goal if data.fiber_goal is not None: self.obj.fiber_goal = data.fiber_goal if data.calories_goal is not None: self.obj.calories_goal = data.calories_goal else: self.obj.calories_goal = calculate_calories( protein=self.obj.protein_goal, carb=self.obj.carb_goal, fat=self.obj.fat_goal, fiber=self.obj.fiber_goal, ) await self.ctx.repo.diary.update(self.obj)