#42: allow updates to menuitems
All checks were successful
/ ls (pull_request) Successful in 37s
/ ls (push) Successful in 39s
/ ls (release) Successful in 25s

This commit is contained in:
lubiana 2024-07-29 13:04:57 +02:00
parent 0068654885
commit 674adcba60
No known key found for this signature in database
14 changed files with 258 additions and 7 deletions

View file

@ -0,0 +1,53 @@
<?php declare(strict_types=1);
namespace App\Controller;
use App\Entity\MenuItem;
use App\Form\MenuItemType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
#[Route('/menu/item')]
final class MenuItemController extends AbstractController
{
#[Route('/{id}', name: 'app_menu_item_show', methods: ['GET'])]
public function show(MenuItem $menuItem): Response
{
return $this->render('menu_item/show.html.twig', [
'menu_item' => $menuItem,
]);
}
#[Route('/{id}/edit', name: 'app_menu_item_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, MenuItem $menuItem, EntityManagerInterface $entityManager): Response
{
$form = $this->createForm(MenuItemType::class, $menuItem);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush();
return $this->redirectToRoute('app_menu_item_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('menu_item/edit.html.twig', [
'menu_item' => $menuItem,
'form' => $form,
]);
}
#[Route('/{id}', name: 'app_menu_item_delete', methods: ['POST'])]
public function delete(Request $request, MenuItem $menuItem, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete' . $menuItem->getId(), $request->getPayload()->getString('_token'))) {
$menuItem->delete();
$entityManager->persist($menuItem);
$entityManager->flush();
}
return $this->redirectToRoute('app_menu_item_index', [], Response::HTTP_SEE_OTHER);
}
}

View file

@ -88,9 +88,14 @@ class FoodVendor
/**
* @return Collection<int, MenuItem>
*/
public function getMenuItems(): Collection
public function getMenuItems(bool $withDeleted = false): Collection
{
return $this->menuItems;
if ($withDeleted) {
return $this->menuItems;
}
return $this->menuItems->filter(
static fn(MenuItem $item): bool => $item->isDeleted() === false
);
}
public function addMenuItem(MenuItem $menuItem): static

View file

@ -3,6 +3,7 @@
namespace App\Entity;
use App\Repository\MenuItemRepository;
use DateTimeImmutable;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator;
use Symfony\Bridge\Doctrine\Types\UlidType;
@ -24,6 +25,9 @@ class MenuItem
#[ORM\JoinColumn(nullable: false)]
private FoodVendor|null $foodVendor = null;
#[ORM\Column(nullable: true)]
private DateTimeImmutable|null $deletedAt = null;
public function getId(): Ulid|null
{
return $this->id;
@ -52,4 +56,27 @@ class MenuItem
return $this;
}
public function isDeleted(): bool
{
return $this->getDeletedAt() instanceof DateTimeImmutable;
}
public function delete(): static
{
$this->setDeletedAt();
return $this;
}
public function getDeletedAt(): DateTimeImmutable|null
{
return $this->deletedAt;
}
public function setDeletedAt(DateTimeImmutable|null $deletedAt = new DateTimeImmutable): static
{
$this->deletedAt = $deletedAt;
return $this;
}
}

28
src/Form/MenuItemType.php Normal file
View file

@ -0,0 +1,28 @@
<?php declare(strict_types=1);
namespace App\Form;
use App\Entity\MenuItem;
use Override;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class MenuItemType extends AbstractType
{
#[Override]
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name')
;
}
#[Override]
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => MenuItem::class,
]);
}
}