From f27297517c3ec004ab9b75c11d63b8f101bf7f25 Mon Sep 17 00:00:00 2001 From: matthieu Date: Sun, 15 Mar 2026 19:27:00 +0100 Subject: [PATCH] feat : add ClientTicketNumberProcessor Co-Authored-By: Claude Sonnet 4.6 --- src/State/ClientTicketNumberProcessor.php | 61 +++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/State/ClientTicketNumberProcessor.php diff --git a/src/State/ClientTicketNumberProcessor.php b/src/State/ClientTicketNumberProcessor.php new file mode 100644 index 0000000..2f1cae1 --- /dev/null +++ b/src/State/ClientTicketNumberProcessor.php @@ -0,0 +1,61 @@ + + */ +final readonly class ClientTicketNumberProcessor implements ProcessorInterface +{ + public function __construct( + private EntityManagerInterface $entityManager, + private Security $security, + private ClientTicketRepository $clientTicketRepository, + ) {} + + public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): ClientTicket + { + assert($data instanceof ClientTicket); + + $user = $this->security->getUser(); + assert($user instanceof User); + + if (null === $user->getClient()) { + throw new AccessDeniedHttpException('Only client users can create tickets.'); + } + + $project = $data->getProject(); + if (null === $project) { + throw new BadRequestHttpException('Project is required.'); + } + + if (!$user->getAllowedProjects()->contains($project)) { + throw new AccessDeniedHttpException('You do not have access to this project.'); + } + + $nextNumber = $this->clientTicketRepository->findNextNumberForProject($project); + $data->setNumber($nextNumber); + $data->setSubmittedBy($user); + $data->setStatus('new'); + $data->setCreatedAt(new DateTimeImmutable()); + $data->setUpdatedAt(new DateTimeImmutable()); + + $this->entityManager->persist($data); + $this->entityManager->flush(); + + return $data; + } +}