OrganizationAddressPostalValidator.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Validator\Organization;
  4. use App\Entity\Organization\OrganizationAddressPostal;
  5. use App\Enum\Organization\AddressPostalOrganizationTypeEnum;
  6. use App\Repository\Organization\OrganizationAddressPostalRepository;
  7. use Symfony\Component\Validator\Constraint;
  8. use Symfony\Component\Validator\ConstraintValidator;
  9. /**
  10. * Classe control qu'une seul et même type d'adresse est autorisé pour les adresses d'organization (à part les "adresses autres").
  11. */
  12. class OrganizationAddressPostalValidator extends ConstraintValidator
  13. {
  14. public function __construct(private readonly OrganizationAddressPostalRepository $organizationAddressPostalRepository)
  15. {
  16. }
  17. public function validate(mixed $value, Constraint $constraint): bool
  18. {
  19. /** @var OrganizationAddressPostal $organizationAddressPostal */
  20. $organizationAddressPostal = $value;
  21. // si le type est adresse autre, on valide
  22. if ($organizationAddressPostal->getType() === AddressPostalOrganizationTypeEnum::ADDRESS_OTHER) {
  23. return true;
  24. }
  25. $addressesByType = $this->organizationAddressPostalRepository->getByType($organizationAddressPostal->getType(), $organizationAddressPostal->getOrganization());
  26. // Si le nombre d'adress du type est supérieur à 1, OU si le nombre est égale a 1 ET que l'id de l'adresse n'est pas celui en cours : invalide.
  27. if (count($addressesByType) > 1 || (count($addressesByType) === 1 && $addressesByType[0]->getId() !== $organizationAddressPostal->getId())) {
  28. $this->context->buildViolation($constraint->payload)
  29. ->setParameter('{{ type }}', $organizationAddressPostal->getType()->value)
  30. ->atPath('type')
  31. ->addViolation();
  32. return false;
  33. }
  34. return true;
  35. }
  36. }