From b70d74ae4b31d9a428c3d748836a20e9fdb97212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 28 Apr 2024 19:38:39 +0200 Subject: [PATCH] Perform the duplicate check of parameter names already on initial creation This fixes issue #568 --- src/Entity/Base/AbstractStructuralDBElement.php | 2 ++ src/Entity/Parameters/AbstractParameter.php | 8 +++++++- src/Entity/Parts/Part.php | 2 ++ src/Validator/Constraints/UniqueObjectCollection.php | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Entity/Base/AbstractStructuralDBElement.php b/src/Entity/Base/AbstractStructuralDBElement.php index e9437983..09ec94a6 100644 --- a/src/Entity/Base/AbstractStructuralDBElement.php +++ b/src/Entity/Base/AbstractStructuralDBElement.php @@ -26,6 +26,7 @@ use App\Entity\Attachments\Attachment; use App\Entity\Parameters\AbstractParameter; use App\Repository\StructuralDBElementRepository; use App\EntityListeners\TreeCacheInvalidationListener; +use App\Validator\Constraints\UniqueObjectCollection; use Doctrine\DBAL\Types\Types; use App\Entity\Attachments\AttachmentContainingDBElement; use App\Entity\Parameters\ParametersTrait; @@ -115,6 +116,7 @@ abstract class AbstractStructuralDBElement extends AttachmentContainingDBElement * @phpstan-var Collection */ #[Assert\Valid] + #[UniqueObjectCollection(fields: ['name', 'group', 'element'])] protected Collection $parameters; /** @var string[] all names of all parent elements as an array of strings, diff --git a/src/Entity/Parameters/AbstractParameter.php b/src/Entity/Parameters/AbstractParameter.php index c340b834..006ac302 100644 --- a/src/Entity/Parameters/AbstractParameter.php +++ b/src/Entity/Parameters/AbstractParameter.php @@ -53,6 +53,7 @@ use ApiPlatform\Metadata\Patch; use ApiPlatform\Metadata\Post; use App\ApiPlatform\Filter\LikeFilter; use App\Repository\ParameterRepository; +use App\Validator\UniqueValidatableInterface; use Doctrine\DBAL\Types\Types; use App\Entity\Base\AbstractDBElement; use App\Entity\Base\AbstractNamedDBElement; @@ -94,7 +95,7 @@ use function sprintf; #[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])] //This discriminator map is required for API platform to know which class to use for deserialization, when creating a new parameter. #[DiscriminatorMap(typeProperty: '_type', mapping: self::API_DISCRIMINATOR_MAP)] -abstract class AbstractParameter extends AbstractNamedDBElement +abstract class AbstractParameter extends AbstractNamedDBElement implements UniqueValidatableInterface { /* @@ -458,4 +459,9 @@ abstract class AbstractParameter extends AbstractNamedDBElement { return static::ALLOWED_ELEMENT_CLASS; } + + public function getComparableFields(): array + { + return ['name' => $this->name, 'group' => $this->group, 'element' => $this->element?->getId()]; + } } diff --git a/src/Entity/Parts/Part.php b/src/Entity/Parts/Part.php index a4dc50bf..325b143a 100644 --- a/src/Entity/Parts/Part.php +++ b/src/Entity/Parts/Part.php @@ -54,6 +54,7 @@ use App\Entity\Parts\PartTraits\OrderTrait; use App\Entity\Parts\PartTraits\ProjectTrait; use App\EntityListeners\TreeCacheInvalidationListener; use App\Repository\PartRepository; +use App\Validator\Constraints\UniqueObjectCollection; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; @@ -119,6 +120,7 @@ class Part extends AttachmentContainingDBElement #[Groups(['full', 'part:read', 'part:write'])] #[ORM\OneToMany(mappedBy: 'element', targetEntity: PartParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)] #[ORM\OrderBy(['group' => 'ASC', 'name' => 'ASC'])] + #[UniqueObjectCollection(fields: ['name', 'group', 'element'])] protected Collection $parameters; diff --git a/src/Validator/Constraints/UniqueObjectCollection.php b/src/Validator/Constraints/UniqueObjectCollection.php index 574959a8..d432892c 100644 --- a/src/Validator/Constraints/UniqueObjectCollection.php +++ b/src/Validator/Constraints/UniqueObjectCollection.php @@ -34,7 +34,7 @@ class UniqueObjectCollection extends Constraint self::IS_NOT_UNIQUE => 'IS_NOT_UNIQUE', ]; - public string $message = 'This collection should contain only unique elements.'; + public string $message = 'This value is already used.'; public $normalizer; /**