From 230faaebd3d852b2803c85a17e8f19aa9ce186e9 Mon Sep 17 00:00:00 2001 From: Manuel Aranda Date: Tue, 2 Jul 2024 08:43:02 +0200 Subject: [PATCH] refs #485. Organizational unit delete funcionality --- config/api_platform/OrganizationalUnit.yaml | 6 ++++ migrations/Version20240701123613.php | 33 +++++++++++++++++++ .../OrganizationalUnitChangeParentAction.php | 26 +++++++++++++++ src/Dto/Output/ClientOutput.php | 8 ++--- src/Dto/Output/OrganizationalUnitOutput.php | 6 +++- src/Entity/Client.php | 1 + .../OrganizationalUnitChangeParentHandler.php | 33 +++++++++++++++++++ src/State/Provider/UserProvider.php | 2 +- 8 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 migrations/Version20240701123613.php create mode 100644 src/Controller/OrganizationalUnitChangeParentAction.php create mode 100644 src/Handler/OrganizationalUnitChangeParentHandler.php diff --git a/config/api_platform/OrganizationalUnit.yaml b/config/api_platform/OrganizationalUnit.yaml index 76424c9..ac90e14 100644 --- a/config/api_platform/OrganizationalUnit.yaml +++ b/config/api_platform/OrganizationalUnit.yaml @@ -25,6 +25,12 @@ resources: groups: ['organizational-unit:patch' ] ApiPlatform\Metadata\Post: ~ ApiPlatform\Metadata\Delete: ~ + change_parent: + class: ApiPlatform\Metadata\Post + method: POST + input: false + uriTemplate: /organizational-units/{uuid}/change-parent + controller: App\Controller\OrganizationalUnitChangeParentAction properties: App\Entity\OrganizationalUnit: diff --git a/migrations/Version20240701123613.php b/migrations/Version20240701123613.php new file mode 100644 index 0000000..e83b75e --- /dev/null +++ b/migrations/Version20240701123613.php @@ -0,0 +1,33 @@ +addSql('ALTER TABLE client DROP FOREIGN KEY FK_C7440455FB84408A'); + $this->addSql('ALTER TABLE client ADD CONSTRAINT FK_C7440455FB84408A FOREIGN KEY (organizational_unit_id) REFERENCES organizational_unit (id) ON DELETE CASCADE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE client DROP FOREIGN KEY FK_C7440455FB84408A'); + $this->addSql('ALTER TABLE client ADD CONSTRAINT FK_C7440455FB84408A FOREIGN KEY (organizational_unit_id) REFERENCES organizational_unit (id)'); + } +} diff --git a/src/Controller/OrganizationalUnitChangeParentAction.php b/src/Controller/OrganizationalUnitChangeParentAction.php new file mode 100644 index 0000000..7061b22 --- /dev/null +++ b/src/Controller/OrganizationalUnitChangeParentAction.php @@ -0,0 +1,26 @@ +organizationalUnitChangeParentHandler->handle($organizationalUnit); + + return new OrganizationalUnitInput($organizationalUnit); + } +} \ No newline at end of file diff --git a/src/Dto/Output/ClientOutput.php b/src/Dto/Output/ClientOutput.php index de2a2b7..7622bf5 100644 --- a/src/Dto/Output/ClientOutput.php +++ b/src/Dto/Output/ClientOutput.php @@ -13,13 +13,13 @@ final class ClientOutput extends AbstractOutput { CONST string TYPE = 'client'; - #[Groups(['client:read'])] + #[Groups(['client:read', 'organizational-unit:read'])] public string $name; - #[Groups(['client:read'])] + #[Groups(['client:read', 'organizational-unit:read'])] public string $type = self::TYPE; - #[Groups(['client:read'])] + #[Groups(['client:read', 'organizational-unit:read'])] public ?string $serialNumber = ''; #[Groups(['client:read'])] @@ -53,7 +53,7 @@ final class ClientOutput extends AbstractOutput $this->serialNumber = $client->getSerialNumber(); $this->netiface = $client->getNetiface(); - if ($client->getOrganizationalUnit()) { + if ($this->organizationalUnit && $client->getOrganizationalUnit()) { $this->organizationalUnit = new OrganizationalUnitOutput($client->getOrganizationalUnit()); } diff --git a/src/Dto/Output/OrganizationalUnitOutput.php b/src/Dto/Output/OrganizationalUnitOutput.php index c372ac3..83a1941 100644 --- a/src/Dto/Output/OrganizationalUnitOutput.php +++ b/src/Dto/Output/OrganizationalUnitOutput.php @@ -4,6 +4,7 @@ namespace App\Dto\Output; use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Get; +use App\Entity\Client; use App\Entity\OrganizationalUnit; use Symfony\Component\Serializer\Annotation\Groups; @@ -62,7 +63,10 @@ final class OrganizationalUnitOutput extends AbstractOutput $this->capacity = $organizationalUnit->getCapacity(); $this->type = $organizationalUnit->getType(); $this->networkSettings = $organizationalUnit->getNetworkSettings() ? new NetworkSettingsOutput($organizationalUnit->getNetworkSettings()) : null; - $this->clients = $organizationalUnit->getClients()->toArray(); + + $this->clients = $organizationalUnit->getClients()->map( + fn(Client $client) => new ClientOutput($client) + )->toArray(); if ($organizationalUnit->getParent()) { $this->parent = new self($organizationalUnit->getParent()); diff --git a/src/Entity/Client.php b/src/Entity/Client.php index 16dfc1a..867fa3c 100644 --- a/src/Entity/Client.php +++ b/src/Entity/Client.php @@ -36,6 +36,7 @@ class Client extends AbstractEntity private ?string $status = null; #[ORM\ManyToOne(inversedBy: 'clients')] + #[ORM\JoinColumn( onDelete: 'CASCADE')] private ?OrganizationalUnit $organizationalUnit = null; /** diff --git a/src/Handler/OrganizationalUnitChangeParentHandler.php b/src/Handler/OrganizationalUnitChangeParentHandler.php new file mode 100644 index 0000000..b78e651 --- /dev/null +++ b/src/Handler/OrganizationalUnitChangeParentHandler.php @@ -0,0 +1,33 @@ +getParent(); + + if (!$parent) { + return throw new \InvalidArgumentException('The organizational unit has no parent.'); + } + + foreach ($organizationalUnit->getOrganizationalUnits() as $child) { + $child->setParent($parent); + $this->organizationalUnitRepository->save($child); + } + + $this->organizationalUnitRepository->delete($organizationalUnit); + + return $organizationalUnit; + } +} \ No newline at end of file diff --git a/src/State/Provider/UserProvider.php b/src/State/Provider/UserProvider.php index a850ef7..5ef6eda 100644 --- a/src/State/Provider/UserProvider.php +++ b/src/State/Provider/UserProvider.php @@ -30,7 +30,7 @@ class UserProvider implements ProviderInterface return $this->provideCollection($operation, $uriVariables, $context); case $operation instanceof Patch: case $operation instanceof Put: - return $this->provideInput($operation, $uriVariables, $context); + return $this->provideInput($operation, $uriVariables, $context); case $operation instanceof Get: return $this->provideItem($operation, $uriVariables, $context); }