ContactPointValidator.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Validator\Core;
  4. use App\Entity\Core\ContactPoint;
  5. use App\Enum\Core\ContactPointTypeEnum;
  6. use App\Repository\Core\ContactPointRepository;
  7. use Symfony\Component\Validator\Constraint;
  8. use Symfony\Component\Validator\ConstraintValidator;
  9. /**
  10. * Classe control qu'une seul et même type de point de contact est autorisé pour chaque owner (organization, person, place).
  11. */
  12. class ContactPointValidator extends ConstraintValidator
  13. {
  14. public function __construct(private readonly ContactPointRepository $contactPointRepository)
  15. {
  16. }
  17. public function validate(mixed $value, Constraint $constraint): bool
  18. {
  19. /** @var ContactPoint $contactPoint */
  20. $contactPoint = $value;
  21. // si le type est autre, on valide
  22. if ($contactPoint->getContactType() === ContactPointTypeEnum::OTHER) {
  23. return true;
  24. }
  25. $contactPointByType = [];
  26. if (!$contactPoint->getOrganization()->isEmpty()) {
  27. $contactPointByType = $this->contactPointRepository->getByTypeAndOrganization($contactPoint->getContactType(), $contactPoint->getOrganization()->first());
  28. } elseif (!$contactPoint->getPerson()->isEmpty()) {
  29. $contactPointByType = $this->contactPointRepository->getByTypeAndPerson($contactPoint->getContactType(), $contactPoint->getPerson()->first());
  30. }
  31. // Si le nombre de point de contact du type est supérieur à 1, OU si le nombre est égale a 1 ET que l'id du point de contact n'est pas celui en cours : invalide.
  32. if (count($contactPointByType) > 1 || (count($contactPointByType) === 1 && $contactPointByType[0]->getId() !== $contactPoint->getId())) {
  33. $this->context->buildViolation($constraint->payload)
  34. ->setParameter('{{ type }}', $contactPoint->getContactType()->value)
  35. ->atPath('contactType')
  36. ->addViolation();
  37. return false;
  38. }
  39. return true;
  40. }
  41. }