From 40ff4b5ca4bd9e2dfb8028afde72f7bc487368ab Mon Sep 17 00:00:00 2001 From: Daniel Subiabre Date: Wed, 26 Aug 2026 11:52:03 +0200 Subject: [PATCH] feat: add validation for charges targetting projects not in campaign --- .../Gateway/CheckoutApiResource.php | 2 + src/Dto/Gateway/CheckoutCreationDto.php | 2 + src/Validator/ChargeToProjectInCampaign.php | 11 +++++ .../ChargeToProjectInCampaignValidator.php | 46 +++++++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 src/Validator/ChargeToProjectInCampaign.php create mode 100644 src/Validator/ChargeToProjectInCampaignValidator.php diff --git a/src/ApiResource/Gateway/CheckoutApiResource.php b/src/ApiResource/Gateway/CheckoutApiResource.php index 6d48369..31f6f36 100644 --- a/src/ApiResource/Gateway/CheckoutApiResource.php +++ b/src/ApiResource/Gateway/CheckoutApiResource.php @@ -17,6 +17,7 @@ use App\Gateway\Tracking; use App\Mapping\Transformer\GatewayIdMapTransformer; use App\State\ApiResourceStateProvider; use App\State\Gateway\CheckoutStateProcessor; +use App\Validator\ChargeToProjectInCampaign; use AutoMapper\Attribute\MapFrom; use AutoMapper\Attribute\MapTo; use Symfony\Component\Validator\Constraints as Assert; @@ -70,6 +71,7 @@ class CheckoutApiResource #[API\ApiProperty(readableLink: true, writableLink: true)] #[Assert\NotBlank()] #[Assert\Count(min: 1)] + #[Assert\All([new ChargeToProjectInCampaign()])] public array $charges = []; /** diff --git a/src/Dto/Gateway/CheckoutCreationDto.php b/src/Dto/Gateway/CheckoutCreationDto.php index b13a963..7ab8980 100644 --- a/src/Dto/Gateway/CheckoutCreationDto.php +++ b/src/Dto/Gateway/CheckoutCreationDto.php @@ -8,6 +8,7 @@ use App\ApiResource\Gateway\GatewayApiResource; use App\Entity\Gateway\Checkout; use App\Gateway\RefundStrategy; use App\Mapping\Transformer\GatewayIdMapTransformer; +use App\Validator\ChargeToProjectInCampaign; use AutoMapper\Attribute\MapFrom; use AutoMapper\Attribute\MapTo; use Symfony\Component\Validator\Constraints as Assert; @@ -37,6 +38,7 @@ class CheckoutCreationDto #[API\ApiProperty(readableLink: true, writableLink: true)] #[Assert\NotBlank()] #[Assert\Count(min: 1)] + #[Assert\All([new ChargeToProjectInCampaign()])] public array $charges = []; /** diff --git a/src/Validator/ChargeToProjectInCampaign.php b/src/Validator/ChargeToProjectInCampaign.php new file mode 100644 index 0000000..b47b38f --- /dev/null +++ b/src/Validator/ChargeToProjectInCampaign.php @@ -0,0 +1,11 @@ +mapper->map($value->target, Accounting::class); + + if ($target->getProject() === null) { + return; + } + + if ($target->getProject()->getStatus() === ProjectStatus::InCampaign) { + return; + } + + $this->context->buildViolation($constraint->message) + ->setParameter('{{ target }}', $value->target->id) + ->setParameter('{{ project }}', $target->getProject()->getId()) + ->addViolation() + ; + } +}