From 72d413dc991b6e25c6e1ba790a8ed7392ea1f178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Wed, 26 Mar 2025 16:08:25 +0100 Subject: [PATCH] feat: refactor callback validators to dedicated class --- src/Form/Model/ParticipantData.php | 81 +++---------------- src/Validator/Constraints/Booking.php | 2 +- src/Validator/Constraints/Participant.php | 14 ++++ .../Constraints/ParticipantValidator.php | 67 +++++++++++++++ 4 files changed, 94 insertions(+), 70 deletions(-) create mode 100644 src/Validator/Constraints/Participant.php create mode 100644 src/Validator/Constraints/ParticipantValidator.php diff --git a/src/Form/Model/ParticipantData.php b/src/Form/Model/ParticipantData.php index be2eae6..2e3fb0e 100644 --- a/src/Form/Model/ParticipantData.php +++ b/src/Form/Model/ParticipantData.php @@ -5,9 +5,10 @@ namespace App\Form\Model; use App\BusProNet\Model\PersonalData; use App\BusProNet\Model\Pickup; use App\BusProNet\Model\Service; +use App\Validator\Constraints as AppAssert; use Symfony\Component\Validator\Constraints as Assert; -use Symfony\Component\Validator\Context\ExecutionContextInterface; +#[AppAssert\Participant] class ParticipantData { public ?int $index = null; @@ -44,74 +45,6 @@ class ParticipantData public ?Service $transportationServiceFro = null; public ?Pickup $pickup = null; - #[Assert\Callback] - public function assertBodyMeasurementsValid(ExecutionContextInterface $context): void - { - if (0 === count($this->rentals)) { - return; - } - - if (empty($this->height)) { - $context->buildViolation('Bitte angeben wegen Leihmaterial') - ->atPath('height') - ->addViolation() - ; - } - - if (empty($this->shoeSize)) { - $context->buildViolation('Bitte angeben wegen Leihmaterial') - ->atPath('shoeSize') - ->addViolation() - ; - } - - if (empty($this->weight)) { - $context->buildViolation('Bitte angeben wegen Leihmaterial') - ->atPath('weight') - ->addViolation() - ; - } - } - - #[Assert\Callback] - public function assertTransportationSelected(ExecutionContextInterface $context): void - { - if ('S' === $this->status) { - return; - } - - if (null === $this->transportationServiceTo) { - $context->buildViolation('Bitte angeben') - ->atPath('transportationServiceTo') - ->addViolation() - ; - } - - if (null === $this->transportationServiceFro) { - $context->buildViolation('Bitte angeben') - ->atPath('transportationServiceFro') - ->addViolation() - ; - } - } - - #[Assert\Callback] - public function assertPickupSelected(ExecutionContextInterface $context): void - { - $transportationServiceTo = $this->transportationServiceTo; - - if ( - null !== $transportationServiceTo - && 'BUS' === $transportationServiceTo->subType - && null === $this->pickup - ) { - $context->buildViolation('Bitte auswählen') - ->atPath('pickup') - ->addViolation() - ; - } - } - public static function fromPersonalData(PersonalData $personalData): static { $instance = new static(); @@ -133,4 +66,14 @@ class ParticipantData return $instance; } + + public function isCanceled(): bool + { + return 'S' === $this->status; + } + + public function isOption(): bool + { + return 'O' === $this->status; + } } diff --git a/src/Validator/Constraints/Booking.php b/src/Validator/Constraints/Booking.php index 51a2253..df034cf 100644 --- a/src/Validator/Constraints/Booking.php +++ b/src/Validator/Constraints/Booking.php @@ -7,7 +7,7 @@ use Symfony\Component\Validator\Constraint; #[\Attribute] class Booking extends Constraint { - public string $message = 'WTF?'; + public string $message = 'Bitte prüfe deine Angaben.'; public function getTargets(): array|string { diff --git a/src/Validator/Constraints/Participant.php b/src/Validator/Constraints/Participant.php new file mode 100644 index 0000000..660e618 --- /dev/null +++ b/src/Validator/Constraints/Participant.php @@ -0,0 +1,14 @@ +assertBodyMeasurementsValid($participant); + $this->assertTransportationSelected($participant); + $this->assertPickupSelected($participant); + } + + public function assertBodyMeasurementsValid(ParticipantData $participant): void + { + if (0 === count($participant->rentals)) { + return; + } + + foreach (['height', 'shoeSize', 'weight'] as $property) { + if (empty($participant->{$property})) { + $this->context->buildViolation('Bitte angeben wegen Leihmaterial') + ->atPath($property) + ->addViolation() + ; + } + } + } + + public function assertTransportationSelected(ParticipantData $participant): void + { + // no transportation services required for canceled participants + if (true === $participant->isCanceled()) { + return; + } + + foreach (['transportationServiceTo', 'transportationServiceFro'] as $property) { + if (null === $participant->{$property}) { + $this->context->buildViolation('Bitte angeben') + ->atPath($property) + ->addViolation() + ; + } + } + } + + public function assertPickupSelected(ParticipantData $participant): void + { + if ( + null !== $participant->transportationServiceTo + && 'BUS' === $participant->transportationServiceTo->subType + && null === $participant->pickup + ) { + $this->context->buildViolation('Bitte auswählen') + ->atPath('pickup') + ->addViolation() + ; + } + } +}