src/Controller/Api/MenusController.php line 219

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Controller\Response;
  4. use App\Data\Recipes\Recipes;
  5. use App\Data\SearchMenus;
  6. use App\Entity\CardiometabolicProfiles;
  7. use App\Entity\FavouriteMenus;
  8. use App\Entity\FavouriteMenusSessions;
  9. use App\Entity\Language;
  10. use App\Entity\MenuRecipes;
  11. use App\Entity\Menus;
  12. use App\Entity\RecipeIngredients;
  13. use App\Entity\Users;
  14. use App\Helper\ConvertUnitMeasures;
  15. use App\Services\Gamification\DailyMenuReward;
  16. use App\Services\Gamification\Gamification;
  17. use App\Services\Notifications\FcmNotifications;
  18. use App\Services\ShoppingList\QuantitiesCalculator;
  19. use App\Services\ShoppingList\IngredientsBag;
  20. use App\Services\ShoppingList\Response\CategoryGroup;
  21. use App\Services\ShoppingList\ShoppingList;
  22. use DateInterval;
  23. use DateTime;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use Psr\Log\LoggerInterface;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Contracts\Translation\TranslatorInterface;
  30. /**
  31.  * @Route("/api/menus", name="api_menus_")
  32.  */
  33. class MenusController extends AbstractController
  34. {
  35.     use Response;
  36.     use \App\Controller\Request;
  37.     private LoggerInterface $logger;
  38.     public function __construct(LoggerInterface $logger)
  39.     {
  40.         $this->logger $logger;
  41.     }
  42.     /**
  43.      * @Route("/search", name="search", methods={"POST"})
  44.      */
  45.     public function searchAction(Request $requestEntityManagerInterface $emRecipes $recipes)
  46.     {
  47.         try {
  48.             $user $this->getUser();
  49.             # get Request json
  50.             $content $request->getContent();
  51.             # parse JSON to Array
  52.             $data json_decode($contenttrue);
  53.             $lang $this->getLangFromData($data);
  54.             $profile $em->getRepository(CardiometabolicProfiles::class)->getLastByUser($user->getId());
  55.             $menuRecipesRepository $em->getRepository(MenuRecipes::class);
  56.             $searchService = new SearchMenus($data$profile$em$lang);
  57.             $data $recipes->getMenusRecipes($searchService->getData(), $menuRecipesRepository$lang);
  58.             return $this->jsonResponse(['data' => $data'categoryPath' => $request->getUriForPath('/assets/images/category/')]);
  59.         } catch (\Exception $e) {
  60.             return $this->errorJsonResponse(['message' => $e->getMessage()]);
  61.         }
  62.     }
  63.     /**
  64.      * @Route("/{id}", name="view", methods={"GET"})
  65.      */
  66.     public function viewMenuAction(
  67.         $id,
  68.         Recipes $recipes,
  69.         TranslatorInterface $translator,
  70.         EntityManagerInterface $em
  71.     )
  72.     {
  73.         try {
  74.             $user $this->getUser(); // TOKEN
  75.             $menu $em->getRepository(Menus::class)->findById($id$user->getLang());
  76.             if (!$menu) {
  77.                 throw new \Exception($translator->trans('Menu not found', [], 'messages'$user->getLang()));
  78.             }
  79.             $menuRecipesRepository $em->getRepository(MenuRecipes::class);
  80.             $profile $em->getRepository(CardiometabolicProfiles::class)->getLastByUser($user->getId());
  81.             if ($profile) {
  82.                 $profile->addFavouriteMenus(1);
  83.                 $em->flush();
  84.             }
  85.             return $this->jsonResponse(['data' => $recipes->getMenuRecipes($menu$menuRecipesRepository$user->getLang()), 'profile' => $profile?->getId() ?? null]);
  86.         } catch (\Exception $e) {
  87.             return $this->errorJsonResponse(['message' => $e->getMessage()]);
  88.         }
  89.     }
  90.     /**
  91.      * @Route("/shopping_list/{userid}", name="shopping_list", methods={"POST"})
  92.      */
  93.     public function shoppingListAction(
  94.         $userid,
  95.         Request $request,
  96.         EntityManagerInterface $em,
  97.         FcmNotifications $fcmNotification
  98.     )
  99.     {
  100.         try {
  101.             $user $this->getUser(); // TOKEN
  102.             $unitMeasure $user->getUnitMeasure();
  103.             # get Request json
  104.             $content $request->getContent();
  105.             # parse JSON to Array
  106.             $data \json_decode($contenttrue);
  107.             $lang $em->getRepository(Language::class)->findOneBy(['language_shortname' => $user->getLang()]);
  108.             $shoppingList = [];
  109.             if (isset($data['menus']) && is_array($data['menus'])) {
  110.                 $daySessions $em->getRepository(FavouriteMenusSessions::class)->getDaySessions($user->getId(), new DateTime());
  111.                 $favouriteSession = new FavouriteMenusSessions();
  112.                 $favouriteSession->setUserId($user->getId());
  113.                 $favouriteSession->setCreatedAt(new DateTime());
  114.                 $em->persist($favouriteSession);
  115.                 $em->flush();
  116.                 $day 1;
  117.                 $bag = new IngredientsBag();
  118.                 foreach ($data['menus'] as $menuData) {
  119.                     $date = new DateTime();
  120.                     $date->add(new DateInterval('P' $day 'D'));
  121.                     $menuPcs = (isset($menuData['quantity']) && $menuData['quantity'] > $menuData['quantity'] : 1);
  122.                     # favourites
  123.                     $favourite = new FavouriteMenus();
  124.                     $favourite->setUserId($user->getId());
  125.                     $favourite->setMenuId($menuData['menu']);
  126.                     $favourite->setSessionId($favouriteSession->getId());
  127.                     $favourite->setPlannedNotification($date);
  128.                     $favourite->setAddedAt($date);
  129.                     $em->persist($favourite);
  130.                     $menu $em->getRepository(Menus::class)->findOneBy([
  131.                         'id' => $menuData['menu'],
  132.                         'active' => 1,
  133.                         'removed' => 0,
  134.                     ]);
  135.                     if ($menu) {
  136.                         $menuRecipes $em->getRepository(MenuRecipes::class)->findByMenu($menu->getId());
  137.                         if ($menuRecipes) {
  138.                             foreach ($menuRecipes as $recipe) {
  139.                                 $recipeIngredients $em->getRepository(RecipeIngredients::class)->findByRecipe($recipe['id'], $lang->getLanguageShortname());
  140.                                 if (count($recipeIngredients)) {
  141.                                     foreach ($recipeIngredients as &$ingredient) {
  142.                                         if($unitMeasure == 2){
  143.                                             if($ingredient['abbreviation'] === 'g'){
  144.                                                 $ingredient['converted_unit_measure'] = ConvertUnitMeasures::convertGrams($ingredient['quantity'], $lang->getLanguageShortname());
  145.                                             } else if($ingredient['abbreviation'] === 'ml'){
  146.                                                 $ingredient['converted_unit_measure'] = ConvertUnitMeasures::convertMl($ingredient['quantity'], $lang->getLanguageShortname());
  147.                                             } else {
  148.                                                 $ingredient['converted_unit_measure'] = $ingredient['quantity'] . ' ' $ingredient['abbreviation'];
  149.                                             }
  150.                                         } else {
  151.                                             $ingredient['converted_unit_measure'] = $ingredient['quantity'] . ' ' $ingredient['abbreviation'];
  152.                                         }
  153.                                         $bag->addIngredientToBag($ingredient$menuPcs);
  154.                                     }
  155.                                 }
  156.                             }
  157.                         }
  158.                     }
  159.                     $day++;
  160.                 }
  161.                 $em->flush();
  162.                 $shoppingList = new ShoppingList($bag, new QuantitiesCalculator$unitMeasure$lang->getLanguageShortname());
  163.                 if (count($daySessions) === && $user->hasValidSubscription()) {
  164.                     $reward = new DailyMenuReward($lang$em);
  165.                     (new Gamification($user$em$this->logger$this->getParameter('fcm_api_key')))
  166.                         ->saveReward($reward)
  167.                         ->sendNotification($fcmNotification$reward->getNotification());
  168.                 }
  169.             }
  170.             return $this->jsonResponse([
  171.                 'data' => $shoppingList->getList(),
  172.                 'path' => $request->getUriForPath('/assets/images/ingredient_categories/'),
  173.             ]);
  174.         } catch (\Exception $e) {
  175.             return $this->errorJsonResponse(['message' => $e->getMessage()]);
  176.         }
  177.     }
  178.     /**
  179.      * @Route("/shopping_list/{userid}/categories", name="shopping_list_categories", methods={"POST"})
  180.      */
  181.     public function shoppingListCategoriesAction(
  182.         $userid,
  183.         Request $request,
  184.         EntityManagerInterface $em,
  185.         TranslatorInterface $translator,
  186.         FcmNotifications $fcmNotification
  187.     )
  188.     {
  189.         try {
  190.             $user $this->getUser(); // TOKEN
  191.             $unitMeasure $user->getUnitMeasure();
  192.             # get Request json
  193.             $content $request->getContent();
  194.             # parse JSON to Array
  195.             $data \json_decode($contenttrue);
  196.             $lang $em->getRepository(Language::class)->findOneBy(['language_shortname' => $user->getLang()]);
  197.             $shoppingList = [];
  198.             if (isset($data['menus']) && is_array($data['menus'])) {
  199.                 $daySessions $em->getRepository(FavouriteMenusSessions::class)->getDaySessions($user->getId(), new DateTime());
  200.                 $favouriteSession = new FavouriteMenusSessions();
  201.                 $favouriteSession->setUserId($user->getId());
  202.                 $favouriteSession->setCreatedAt(new DateTime());
  203.                 $em->persist($favouriteSession);
  204.                 $em->flush();
  205.                 $day 1;
  206.                 $bag = new IngredientsBag();
  207.                 foreach ($data['menus'] as $menuData) {
  208.                     $date = new DateTime();
  209.                     $date->add(new DateInterval('P' $day 'D'));
  210.                     $menuPcs = (isset($menuData['quantity']) && $menuData['quantity'] > $menuData['quantity'] : 1);
  211.                     # favourites
  212.                     $favourite = new FavouriteMenus();
  213.                     $favourite->setUserId($user->getId());
  214.                     $favourite->setMenuId($menuData['menu']);
  215.                     $favourite->setSessionId($favouriteSession->getId());
  216.                     $favourite->setPlannedNotification($date);
  217.                     $favourite->setAddedAt(new DateTime());
  218.                     $em->persist($favourite);
  219.                     $menu $em->getRepository(Menus::class)->findOneBy([
  220.                         'id' => $menuData['menu'],
  221.                         'active' => 1,
  222.                         'removed' => 0,
  223.                     ]);
  224.                     if ($menu) {
  225.                         $menuRecipes $em->getRepository(MenuRecipes::class)->findByMenu($menu->getId());
  226.                         if ($menuRecipes) {
  227.                             foreach ($menuRecipes as $recipe) {
  228.                                 $recipeIngredients $em->getRepository(RecipeIngredients::class)->findByRecipe($recipe['id'], $lang->getLanguageShortname());
  229.                                 if (count($recipeIngredients)) {
  230.                                     foreach ($recipeIngredients as $ingredient) {
  231.                                         $bag->addIngredientToBag($ingredient$menuPcs);
  232.                                     }
  233.                                 }
  234.                             }
  235.                         }
  236.                     }
  237.                     $day++;
  238.                 }
  239.                 $em->flush();
  240.                 $shoppingList = new ShoppingList($bag, new QuantitiesCalculator$unitMeasure$lang->getLanguageShortname());
  241.                 if (count($daySessions) === && $user->hasValidSubscription()) {
  242.                     $reward = new DailyMenuReward($lang$em);
  243.                     (new Gamification($user$em$this->logger$this->getParameter('fcm_api_key')))
  244.                         ->saveReward($reward)
  245.                         ->sendNotification($fcmNotification$reward->getNotification());
  246.                 }
  247.             }
  248.             return $this->jsonResponse([
  249.                 'data' => $shoppingList->getList(new CategoryGroup()),
  250.                 'path' => $request->getUriForPath('/assets/images/ingredient_categories/'),
  251.             ]);
  252.         } catch (\Exception $e) {
  253.             return $this->errorJsonResponse(['message' => $e->getMessage()]);
  254.         }
  255.     }
  256.     /**
  257.      * @Route("/{id}/healthy_minutes", name="count_healthy_minutes", methods={"POST"})
  258.      */
  259.     public function countMenuHealthyMinutes(
  260.         $id,
  261.         TranslatorInterface $translator,
  262.         EntityManagerInterface $em
  263.     )
  264.     {
  265.         try {
  266.             $user $this->getUser(); // TOKEN
  267.             $menu $em->getRepository(Menus::class)->findById($id$user->getLang());
  268.             if (!$menu) {
  269.                 throw new \Exception($translator->trans('Menu not found', [], 'messages'$user->getLang()));
  270.             }
  271.             $user->addHealthyMinutes($menu['healthy_minutes']);
  272.             $em->flush();
  273.             return $this->jsonResponse(['status' => 'ok']);
  274.         } catch (\Exception $e) {
  275.             return $this->errorJsonResponse(['message' => $e->getMessage()]);
  276.         }
  277.     }
  278. }