From 5168d44fd461f793727fa96cf0acd053c83c75b7 Mon Sep 17 00:00:00 2001 From: Manuel Aranda Date: Fri, 21 Jun 2024 11:02:04 +0200 Subject: [PATCH] refs #425. OrganizationalUnitParent validator --- migrations/Version20240621085144.php | 33 +++++++++++++++++++ src/Dto/Input/OrganizationalUnitInput.php | 2 ++ src/Entity/OrganizationalUnit.php | 2 +- .../Constraints/OrganizationalUnitParent.php | 24 ++++++++++++++ .../OrganizationalUnitParentValidator.php | 25 ++++++++++++++ 5 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 migrations/Version20240621085144.php create mode 100644 src/Validator/Constraints/OrganizationalUnitParent.php create mode 100644 src/Validator/Constraints/OrganizationalUnitParentValidator.php diff --git a/migrations/Version20240621085144.php b/migrations/Version20240621085144.php new file mode 100644 index 0000000..8286ec6 --- /dev/null +++ b/migrations/Version20240621085144.php @@ -0,0 +1,33 @@ +addSql('DROP INDEX UNIQ_IDENTIFIER_NAME ON organizational_unit'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NAME ON organizational_unit (name, parent_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP INDEX UNIQ_IDENTIFIER_NAME ON organizational_unit'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NAME ON organizational_unit (name)'); + } +} diff --git a/src/Dto/Input/OrganizationalUnitInput.php b/src/Dto/Input/OrganizationalUnitInput.php index 26bf8aa..7ce2c2b 100644 --- a/src/Dto/Input/OrganizationalUnitInput.php +++ b/src/Dto/Input/OrganizationalUnitInput.php @@ -8,10 +8,12 @@ use App\Entity\OrganizationalUnit; use App\Validator\Constraints\OrganizationalUnitMulticastMode; use App\Validator\Constraints\OrganizationalUnitMulticastPort; use App\Validator\Constraints\OrganizationalUnitP2PMode; +use App\Validator\Constraints\OrganizationalUnitParent; use App\Validator\Constraints\OrganizationalUnitType; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; +#[OrganizationalUnitParent] class OrganizationalUnitInput { #[Assert\NotBlank] diff --git a/src/Entity/OrganizationalUnit.php b/src/Entity/OrganizationalUnit.php index 583687a..136cf16 100644 --- a/src/Entity/OrganizationalUnit.php +++ b/src/Entity/OrganizationalUnit.php @@ -11,7 +11,7 @@ use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; #[Gedmo\Tree(type: 'materializedPath')] #[ORM\Entity(repositoryClass: MaterializedPathRepository::class)] -#[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_NAME', fields: ['name', 'parent_id'])] +#[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_NAME', columns: ['name', 'parent_id'])] #[UniqueEntity(fields: ['name', 'parent'], message: 'This organizational unit already exists.')] class OrganizationalUnit extends AbstractEntity { diff --git a/src/Validator/Constraints/OrganizationalUnitParent.php b/src/Validator/Constraints/OrganizationalUnitParent.php new file mode 100644 index 0000000..7950ac7 --- /dev/null +++ b/src/Validator/Constraints/OrganizationalUnitParent.php @@ -0,0 +1,24 @@ +message = 'Only the root organizational unit can not have a parent.'; + } + + public function getTargets(): array|string + { + return parent::CLASS_CONSTRAINT; + } +} \ No newline at end of file diff --git a/src/Validator/Constraints/OrganizationalUnitParentValidator.php b/src/Validator/Constraints/OrganizationalUnitParentValidator.php new file mode 100644 index 0000000..dccef59 --- /dev/null +++ b/src/Validator/Constraints/OrganizationalUnitParentValidator.php @@ -0,0 +1,25 @@ +parent && in_array($value->type, [OrganizationalUnitTypes::CLASSROOMS_GROUP, OrganizationalUnitTypes::CLASSROOM, OrganizationalUnitTypes::CLIENTS_GROUP])) { + $this->context->buildViolation($constraint->message)->addViolation(); + return; + } + } +} \ No newline at end of file