declare(strict_types=1); namespace App\Controller; use App\Dto\CreateDto; use App\Dto\UpdateDto; use ; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Attribute\MapRequestPayload; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; /** * Auto-generated CRUD controller for the bridge resource (DTO-shaped). * Edit freely — re-running make:bridge:resource won't overwrite this file. * * Validated input via #[MapRequestPayload]: malformed JSON, missing * required fields, or constraint violations produce RFC 7807 * problem+json automatically (Symfony's RequestPayloadValueResolver). */ #[Route('')] final class Controller { public function __construct( private readonly EntityManagerInterface $em, private readonly NormalizerInterface $normalizer, ) { } #[Route('', name: '_list', methods: ['GET'])] public function list(): JsonResponse { $items = $this->em->getRepository(::class)->findAll(); return new JsonResponse($this->normalizer->normalize($items, 'json')); } #[Route('', name: '_create', methods: ['POST'])] public function create(#[MapRequestPayload] CreateDto $dto): JsonResponse { $entity = new (); $entity->setTitle($dto->title); $entity->setDone($dto->done); $this->em->persist($entity); $this->em->flush(); return new JsonResponse( $this->normalizer->normalize($entity, 'json'), Response::HTTP_CREATED, ); } #[Route('/{id}', name: '_update', methods: ['PATCH'])] public function update(string $id, #[MapRequestPayload] UpdateDto $dto): JsonResponse { $entity = $this->em->getRepository(::class)->find($id); if (null === $entity) { return new JsonResponse( ['title' => 'Not Found', 'status' => 404], Response::HTTP_NOT_FOUND, ['Content-Type' => 'application/problem+json'], ); } if (null !== $dto->title) { $entity->setTitle($dto->title); } if (null !== $dto->done) { $entity->setDone($dto->done); } $this->em->flush(); return new JsonResponse($this->normalizer->normalize($entity, 'json')); } #[Route('/{id}', name: '_delete', methods: ['DELETE'])] public function delete(string $id): JsonResponse { $entity = $this->em->getRepository(::class)->find($id); if (null === $entity) { return new JsonResponse(null, Response::HTTP_NO_CONTENT); } $this->em->remove($entity); $this->em->flush(); return new JsonResponse(null, Response::HTTP_NO_CONTENT); } }