from fooder.controller.base import ModelController from fooder.domain import Product from fooder.context import Context from fooder.model.product import ProductCreateModel, ProductUpdateModel from fooder.utils.calories import calculate_calories class ProductController(ModelController[Product]): @classmethod async def create( cls, ctx: Context, data: ProductCreateModel, ) -> "ProductController": obj = Product( name=data.name, protein=data.protein, carb=data.carb, fat=data.fat, fiber=data.fiber, calories=data.resolved_calories, barcode=data.barcode, ) await ctx.repo.product.create(obj) return cls(ctx, obj) async def update(self, data: ProductUpdateModel) -> None: if data.name is not None: self.obj.name = data.name if data.protein is not None: self.obj.protein = data.protein if data.carb is not None: self.obj.carb = data.carb if data.fat is not None: self.obj.fat = data.fat if data.fiber is not None: self.obj.fiber = data.fiber if data.barcode is not None: self.obj.barcode = data.barcode self.obj.calories = data.calories if data.calories is not None else calculate_calories( protein=self.obj.protein, carb=self.obj.carb, fat=self.obj.fat, fiber=self.obj.fiber, ) await self.ctx.repo.product.update(self.obj)