Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\EmailBundle\Validator; | |
use Mautic\EmailBundle\Entity\Email; | |
use Mautic\LeadBundle\Entity\LeadList; | |
use Mautic\LeadBundle\Form\Validator\Constraints\LeadListAccess; | |
use Symfony\Component\Validator\Constraint; | |
use Symfony\Component\Validator\Constraints\NotBlank; | |
use Symfony\Component\Validator\ConstraintValidator; | |
use Symfony\Component\Validator\ConstraintViolationInterface; | |
use Symfony\Component\Validator\Exception\UnexpectedTypeException; | |
final class EmailListsValidator extends ConstraintValidator | |
{ | |
public function validate($value, Constraint $constraint): void | |
{ | |
if (!$value instanceof Email) { | |
throw new UnexpectedTypeException($value, Email::class); | |
} | |
if ('list' !== $value->getEmailType() || $value->getTranslationParent()) { | |
return; | |
} | |
$this->validateLists($value); | |
$this->validateExcludedLists($value); | |
$this->validateConflictingLists($value); | |
} | |
private function validateLists(Email $email): void | |
{ | |
$violations = $this->context->getValidator()->validate( | |
$email->getLists(), | |
[ | |
new LeadListAccess(), | |
new NotBlank( | |
[ | |
'message' => 'mautic.lead.lists.required', | |
] | |
), | |
] | |
); | |
$this->addViolationsAtPath($violations, 'lists'); | |
} | |
private function validateExcludedLists(Email $email): void | |
{ | |
$violations = $this->context->getValidator()->validate( | |
$email->getExcludedLists(), | |
[ | |
new LeadListAccess(['allowEmpty' => true]), | |
] | |
); | |
$this->addViolationsAtPath($violations, 'excludedLists'); | |
} | |
private function validateConflictingLists(Email $email): void | |
{ | |
$listsIds = $this->getListsIds($email->getLists()); | |
$excludedListsIds = $this->getListsIds($email->getExcludedLists()); | |
$isConflicting = (bool) array_intersect($listsIds, $excludedListsIds); | |
if ($isConflicting) { | |
$this->context->buildViolation('mautic.lead.excluded_lists.conflicting') | |
->atPath('excludedLists') | |
->addViolation(); | |
} | |
} | |
/** | |
* @param LeadList[] $lists | |
* | |
* @return string[] | |
*/ | |
private function getListsIds(iterable $lists): array | |
{ | |
$ids = []; | |
foreach ($lists as $list) { | |
$ids[] = (string) $list->getId(); | |
} | |
return $ids; | |
} | |
/** | |
* @param ConstraintViolationInterface[] $violations | |
*/ | |
private function addViolationsAtPath(iterable $violations, string $path): void | |
{ | |
foreach ($violations as $violation) { | |
$this->context->buildViolation($violation->getMessage()) | |
->atPath($path) | |
->addViolation(); | |
} | |
} | |
} | |