Skip to content

Commit

Permalink
final refactoring changes
Browse files Browse the repository at this point in the history
  • Loading branch information
IrisOlfermann committed Sep 24, 2024
1 parent 6d6cec0 commit f2a2d3a
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 99 deletions.
75 changes: 8 additions & 67 deletions src/Mealz/MealBundle/Controller/MealAdminController.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public function __construct(
private readonly DishService $dishService,
private readonly EntityManagerInterface $em,
private readonly MealAdminHelper $mealAdminHelper
) {}
) {
}

public function getWeeks(): JsonResponse
{
Expand Down Expand Up @@ -224,7 +225,7 @@ private function handleDay(array $day): void

// parentMeal is an array of either one meal without variations or 1-2 variations
foreach ($mealCollection as $mealArr) {
$this->handleMealArray($mealArr, $dayEntity);
$this->mealAdminHelper->handleMealArray($mealArr, $dayEntity);
}
}

Expand Down Expand Up @@ -257,7 +258,7 @@ private function handleNewDay($dayData, Day $day): void

// parentMeal is an array of either one meal without variations or 1-2 variations
foreach ($mealCollection as $mealArr) {
$this->handleMealArray($mealArr, $day);
$this->mealAdminHelper->handleMealArray($mealArr, $day);
}
}

Expand All @@ -274,25 +275,6 @@ private function setLockParticipationForDay(Day $dayEntity, array $day): void
}
}

private function handleMealArray(array $mealArr, Day $dayEntity): void
{
foreach ($mealArr as $meal) {
if (false === isset($meal['dishSlug'])) {
continue;
}
$dishEntity = $this->dishRepository->findOneBy(['slug' => $meal['dishSlug']]);
if (null === $dishEntity) {
throw new Exception('107: dish not found for slug: ' . $meal['dishSlug']);
}
// if mealId is null create meal
if (false === isset($meal['mealId'])) {
$this->createMeal($dishEntity, $dayEntity, $meal);
} else {
$this->modifyMeal($meal, $dishEntity, $dayEntity);
}
}
}

private function handleEventArr(array $eventArr, Day $day): void
{
$this->addEvent($eventArr, $day);
Expand All @@ -303,54 +285,13 @@ private function addEvent(array $event, Day $dayEntity)
if (!isset($event['eventId'])) {
} else {
$eventEntity = $this->mealAdminHelper->findEvent($event['eventId']);
$eventExistsForDayAlready = $this->mealAdminHelper->checkIfEventExistsForDay($event['eventId'], $dayEntity);
if (!$eventExistsForDayAlready) {
$eventParticipationEntity = new EventParticipation($dayEntity, $eventEntity);
$dayEntity->addEvent($eventParticipationEntity);
$eventExistsAlready = $this->mealAdminHelper->checkIfEventExistsForDay($event['eventId'], $dayEntity);
if (!$eventExistsAlready) {
$eventParticipation = new EventParticipation($dayEntity, $eventEntity);
$dayEntity->addEvent($eventParticipation);
} else {
throw new Exception('Meal exists for day already');
}
}
}

private function createMeal(Dish $dishEntity, Day $dayEntity, array $meal): void
{
$mealEntity = new Meal($dishEntity, $dayEntity);
$mealEntity->setPrice($dishEntity->getPrice());
$this->mealAdminHelper->setParticipationLimit($mealEntity, $meal);
$dayEntity->addMeal($mealEntity);
}

/**
* @throws Exception
*/
private function modifyMeal(array $meal, Dish $dishEntity, Day $dayEntity): void
{
$mealEntity = $this->mealRepository->find($meal['mealId']);
if (null === $mealEntity) {
// this happens because meals without participations are deleted, even though they
// could be modified later on (this shouldn't happen but might)
$mealEntity = new Meal($dishEntity, $dayEntity);
$mealEntity->setPrice($dishEntity->getPrice());
$dayEntity->addMeal($mealEntity);

return;
}

$this->mealAdminHelper->setParticipationLimit($mealEntity, $meal);
// check if the requested dish is the same as before
if ($mealEntity->getDish()->getId() === $dishEntity->getId()) {
return;
}

// check if meal already exists and can be modified (aka has no participations)
if (!$mealEntity->hasParticipations()) {
$mealEntity->setDish($dishEntity);
$mealEntity->setPrice($dishEntity->getPrice());

return;
}

throw new Exception('108: meal has participations for id: ' . $meal['mealId']);
}
}
4 changes: 2 additions & 2 deletions src/Mealz/MealBundle/Entity/Day.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public function setWeek(Week $week): void
$this->week = $week;
}

public function getEvents(): EventCollection
public function getEvents(): ?EventCollection
{
if (false === ($this->events instanceof Collection)) {
$this->events = new EventCollection();
Expand Down Expand Up @@ -181,7 +181,7 @@ private function getDefaultWeek(DateTime $date): Week
/**
* @return (DateTime|array[][]|bool|int|null)[]
*
* @psalm-return array{dateTime: DateTime, lockParticipationDateTime: DateTime, week: int|null, meals: array<''|int, non-empty-list<array>>, event: int|null, enabled: bool}
* @psalm-return array{dateTime: DateTime, dayId: int|null, enabled: bool, events: array<int, array<array-key, mixed>>, lockParticipationDateTime: DateTime, meals: array<''|int, non-empty-list<array{dateTime: DateTime, day: int|null, dish: null|string, id: int|null, lockTime: DateTime, participationLimit: int}>>, week: int|null}
*/
public function jsonSerialize(): array
{
Expand Down
70 changes: 68 additions & 2 deletions src/Mealz/MealBundle/Helper/MealAdminHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,24 @@
namespace App\Mealz\MealBundle\Helper;

use App\Mealz\MealBundle\Entity\Day;
use App\Mealz\MealBundle\Entity\Dish;
use App\Mealz\MealBundle\Entity\Event;
use App\Mealz\MealBundle\Entity\Meal;
use App\Mealz\MealBundle\Repository\DishRepository;
use App\Mealz\MealBundle\Repository\EventPartRepo;
use App\Mealz\MealBundle\Repository\EventRepository;
use App\Mealz\MealBundle\Repository\MealRepository;
use App\Mealz\MealBundle\Service\EventParticipationService;
use Exception;

class MealAdminHelper
{
public function __construct(
private readonly EventParticipationService $eventService,
private readonly EventRepository $eventRepository,
private readonly EventPartRepo $eventPartRepo
private readonly EventPartRepo $eventPartRepo,
private readonly DishRepository $dishRepository,
private readonly MealRepository $mealRepository
) {
}

Expand All @@ -33,7 +39,7 @@ public function setParticipationLimit(Meal $mealEntity, array $meal): void
}
}

public function findEvent(int $eventId): Event
public function findEvent(int $eventId): ?Event
{
return $this->eventRepository->find($eventId);
}
Expand All @@ -46,4 +52,64 @@ public function checkIfEventExistsForDay(int $eventId, Day $day): bool

return false;
}

public function handleMealArray(array $mealArr, Day $dayEntity): void
{
foreach ($mealArr as $meal) {
if (false === isset($meal['dishSlug'])) {
continue;
}
$dishEntity = $this->dishRepository->findOneBy(['slug' => $meal['dishSlug']]);
if (null === $dishEntity) {
throw new Exception('107: dish not found for slug: ' . $meal['dishSlug']);
}
// if mealId is null create meal
if (false === isset($meal['mealId'])) {
$this->createMeal($dishEntity, $dayEntity, $meal);
} else {
$this->modifyMeal($meal, $dishEntity, $dayEntity);
}
}
}

private function createMeal(Dish $dishEntity, Day $dayEntity, array $meal): void
{
$mealEntity = new Meal($dishEntity, $dayEntity);
$mealEntity->setPrice($dishEntity->getPrice());
$this->setParticipationLimit($mealEntity, $meal);
$dayEntity->addMeal($mealEntity);
}

/**
* @throws Exception
*/
private function modifyMeal(array $meal, Dish $dishEntity, Day $dayEntity): void
{
$mealEntity = $this->mealRepository->find($meal['mealId']);
if (null === $mealEntity) {
// this happens because meals without participations are deleted, even though they
// could be modified later on (this shouldn't happen but might)
$mealEntity = new Meal($dishEntity, $dayEntity);
$mealEntity->setPrice($dishEntity->getPrice());
$dayEntity->addMeal($mealEntity);

return;
}

$this->setParticipationLimit($mealEntity, $meal);
// check if the requested dish is the same as before
if ($mealEntity->getDish()->getId() === $dishEntity->getId()) {
return;
}

// check if meal already exists and can be modified (aka has no participations)
if (!$mealEntity->hasParticipations()) {
$mealEntity->setDish($dishEntity);
$mealEntity->setPrice($dishEntity->getPrice());

return;
}

throw new Exception('108: meal has participations for id: ' . $meal['mealId']);
}
}
52 changes: 31 additions & 21 deletions src/Mealz/MealBundle/Message/WeeklyMenuMessage.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace App\Mealz\MealBundle\Message;

use App\Mealz\MealBundle\Entity\Day;
use App\Mealz\MealBundle\Entity\EventParticipation;
use App\Mealz\MealBundle\Entity\Meal;
use App\Mealz\MealBundle\Entity\Week;
use App\Mealz\MealBundle\Service\Notification\MessageInterface;
Expand Down Expand Up @@ -75,6 +76,33 @@ private function getDishesByDay(Day $day): string

$dishes = [];
$events = [];

$dishes = $this->handleDishes($day);
/** @var EventParticipation $event */
foreach ($day->getEvents() as $event) {
$events[$event->getEvent()->getTitle()] = $event->getEvent()->getTitle();
}

if (!$day->isEnabled() || (0 === count($day->getMeals()))) {
$body = $body . $this->translator->trans('week.notification.content.no_meals', [], 'messages') . ' | ';
if (0 === count($day->getEvents())) {
return $body . $this->translator->trans('week.notification.content.no_events', [], 'messages') . ' | ';
} else {
return $body . $this->eventsToString($events);
}
} elseif (!$day->isEnabled() || (0 === count($day->getEvents()))) {
$body = $body . $this->toString($dishes);

return $body . $this->translator->trans('week.notification.content.no_events', [], 'messages') . ' | ';
} else {
$body = $body . $this->toString($dishes);

return $body . $this->eventsToString($events);
}
}

private function handleDishes(Day $day)
{
/** @var Meal $meal */
foreach ($day->getMeals() as $meal) {
if ($meal->isCombinedMeal()) {
Expand All @@ -90,27 +118,8 @@ private function getDishesByDay(Day $day): string
$dishes[$dish->getTitleEn()] = [];
}
}
/** @var Event $event */
foreach($day->getEvents() as $event){
$events[$event->getEvent()->getTitle()] = $event->getEvent()->getTitle();
}

if (!$day->isEnabled() || (0 === count($day->getMeals()))) {
$body = $body . $this->translator->trans('week.notification.content.no_meals', [], 'messages') . ' | ';
if((0 === count($day->getEvents()))){
return $body . $this->translator->trans('week.notification.content.no_events', [], 'messages') . ' | ';
} else{
return $body . $this->eventsToString($events);
}
}
elseif(!$day->isEnabled() || (0 === count($day->getEvents()))) {
$body = $body . $this->toString($dishes);
return $body . $this->translator->trans('week.notification.content.no_events', [], 'messages') . ' | ';
}
else{
$body = $body . $this->toString($dishes);
return $body . $this->eventsToString($events);
}
return $dishes;
}

/**
Expand All @@ -130,8 +139,9 @@ private function toString(array $dishes): string

return implode(', ', $result) . ' |';
}

/**
* @param array<string, list<string>> $events
* @param array<string, string> $events
*/
private function eventsToString(array $events): string
{
Expand Down
11 changes: 5 additions & 6 deletions src/Mealz/MealBundle/Service/EventParticipationService.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace App\Mealz\MealBundle\Service;

use App\Mealz\MealBundle\Entity\Day;
use App\Mealz\MealBundle\Entity\Event;
use App\Mealz\MealBundle\Entity\EventParticipation;
use App\Mealz\MealBundle\Entity\Participant;
use App\Mealz\MealBundle\Repository\EventPartRepoInterface;
Expand Down Expand Up @@ -41,17 +40,17 @@ public function __construct(
*/
public function handleEventParticipation(Day $day, EventParticipation $event): void
{
if (null === $event) {
$this->removeEventFromDay($day, $event->getId());
if (null === $event->getId()) {
$this->removeEventFromDay($day, $event);
} else {
$this->addEventToDay($day, $event);
}
}

/**
* @return (bool|int|null)[]|null
* @return (Day|bool|int|null)[]|null
*
* @psalm-return array{eventId: int, participationId: int|null, participations: int, isPublic: bool, isParticipating?: bool}|null
* @psalm-return array{day: \App\Mealz\MealBundle\Entity\Day, eventId: int, isParticipating?: bool, isPublic: bool, participationId: int|null, participations: int<0, max>} | array{\App\Mealz\MealBundle\Entity\EventParticipation}
*/
public function getEventParticipationData(Day $day, ?int $eventId = null, ?Profile $profile = null): ?array
{
Expand Down Expand Up @@ -166,7 +165,7 @@ public function getParticipants(Day $day, int $eventId): array
private function addEventToDay(Day $day, ?EventParticipation $event): void
{
// new eventparticipation
if (null !== $event && null === $day->getEvents()) {
if (null !== $event) {
$eventParticipation = new EventParticipation($day, $event->getEvent());
$day->addEvent($eventParticipation);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,6 @@ private function createFutureEmptyWeek(DateTime $date): void

// Request
$this->client->request('POST', $routeStr, [], [], [], $weekJson);
https://meals.test/api/weeks/2024W40
// https://meals.test/api/weeks/2024W40
}
}

0 comments on commit f2a2d3a

Please sign in to comment.