refs #427. New endpoints created organizational-units

pull/7/head
Manuel Aranda Rosales 2024-06-05 15:32:46 +02:00
parent 30fa682a46
commit dc12acd29e
8 changed files with 271 additions and 8 deletions

View File

@ -1,8 +1,6 @@
resources:
App\Entity\OrganizationalUnit:
processor: App\State\Processor\OrganizationalUnitProcessor
input: App\Dto\Input\OrganizationalUnitInput
output: App\Dto\Output\OrganizationalUnitOutput
normalization_context:
groups: ['default', 'organizational-unit:read']
denormalization_context:
@ -16,8 +14,34 @@ resources:
provider: App\State\Provider\OrganizationalUnitProvider
ApiPlatform\Metadata\Patch:
provider: App\State\Provider\OrganizationalUnitProvider
ApiPlatform\Metadata\Post: ~
ApiPlatform\Metadata\Delete: ~
organizational_unit_root:
class: ApiPlatform\Metadata\Post
method: POST
uriTemplate: /organizational-units/root
input: App\Dto\Input\OrganizationalUnitRootInput
output: App\Dto\Output\OrganizationalUnitOutput
organizational_unit_classroom_group:
class: ApiPlatform\Metadata\Post
method: POST
uriTemplate: /organizational-units/classroom-group
input: App\Dto\Input\OrganizationalUnitClassroomGroupInput
output: App\Dto\Output\OrganizationalUnitOutput
organizational_unit_classroom:
class: ApiPlatform\Metadata\Post
method: POST
uriTemplate: /organizational-units/classroom
input: App\Dto\Input\OrganizationalUnitClassroomInput
output: App\Dto\Output\OrganizationalUnitOutput
organizational_unit_client_group:
class: ApiPlatform\Metadata\Post
method: POST
uriTemplate: /organizational-units/client-group
input: App\Dto\Input\OrganizationalUnitClientGroupInput
output: App\Dto\Output\OrganizationalUnitOutput
properties:
App\Entity\OrganizationalUnit:

View File

@ -0,0 +1,53 @@
<?php
namespace App\Dto\Input;
use App\Dto\Output\OrganizationalUnitOutput;
use App\Entity\OrganizationalUnit;
use App\Model\OrganizationalUnitTypes;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
final class OrganizationalUnitClassroomGroupInput
{
#[Assert\NotBlank]
#[Groups(['organizational-unit:write'])]
public ?string $name = null;
#[Assert\NotNull]
#[Groups(['organizational-unit:write'])]
public ?OrganizationalUnitOutput $parent = null;
#[Groups(['organizational-unit:write'])]
public ?string $description = null;
#[Groups(['organizational-unit:write'])]
public ?string $comments = null;
public function __construct(?OrganizationalUnit $organizationalUnit = null)
{
if (!$organizationalUnit) {
return;
}
$this->name = $organizationalUnit->getName();
$this->parent = $organizationalUnit->getParent();
$this->description = $organizationalUnit->getDescription();
$this->comments = $organizationalUnit->getComments();
}
public function createOrUpdateEntity(?OrganizationalUnit $organizationalUnit = null): OrganizationalUnit
{
if (!$organizationalUnit) {
$organizationalUnit = new OrganizationalUnit();
}
$organizationalUnit->setName($this->name);
$organizationalUnit->setParent($this->parent->getEntity());
$organizationalUnit->setType(OrganizationalUnitTypes::CLASSROOMS_GROUP);
$organizationalUnit->setDescription($this->description);
$organizationalUnit->setComments($this->comments);
return $organizationalUnit;
}
}

View File

@ -0,0 +1,73 @@
<?php
namespace App\Dto\Input;
use App\Dto\Output\OrganizationalUnitOutput;
use App\Entity\OrganizationalUnit;
use App\Model\OrganizationalUnitTypes;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
final class OrganizationalUnitClassroomInput
{
#[Assert\NotBlank]
#[Groups(['organizational-unit:write'])]
public ?string $name = null;
#[Assert\NotNull]
#[Groups(['organizational-unit:write'])]
public ?OrganizationalUnitOutput $parent = null;
#[Groups(['organizational-unit:write'])]
public ?string $description = null;
#[Groups(['organizational-unit:write'])]
public ?string $comments = null;
#[Groups(['organizational-unit:write'])]
public ?string $location = null;
#[Groups(['organizational-unit:write'])]
public ?bool $projector = null;
#[Groups(['organizational-unit:write'])]
public ?bool $board = null;
#[Groups(['organizational-unit:write'])]
public ?int $capacity = null;
public function __construct(?OrganizationalUnit $organizationalUnit = null)
{
if (!$organizationalUnit) {
return;
}
$this->name = $organizationalUnit->getName();
$this->parent = $organizationalUnit->getParent();
$this->description = $organizationalUnit->getDescription();
$this->comments = $organizationalUnit->getComments();
$this->location = $organizationalUnit->getLocation();
$this->projector = $organizationalUnit->isProjector();
$this->board = $organizationalUnit->isBoard();
$this->capacity = $organizationalUnit->getCapacity();
}
public function createOrUpdateEntity(?OrganizationalUnit $organizationalUnit = null): OrganizationalUnit
{
if (!$organizationalUnit) {
$organizationalUnit = new OrganizationalUnit();
}
$organizationalUnit->setName($this->name);
$organizationalUnit->setType(OrganizationalUnitTypes::CLASSROOM);
$organizationalUnit->setParent($this->parent->getEntity());
$organizationalUnit->setDescription($this->description);
$organizationalUnit->setComments($this->comments);
$organizationalUnit->setLocation($this->location);
$organizationalUnit->setProjector($this->projector);
$organizationalUnit->setBoard($this->board);
$organizationalUnit->setCapacity($this->capacity);
return $organizationalUnit;
}
}

View File

@ -0,0 +1,53 @@
<?php
namespace App\Dto\Input;
use App\Dto\Output\OrganizationalUnitOutput;
use App\Entity\OrganizationalUnit;
use App\Model\OrganizationalUnitTypes;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
final class OrganizationalUnitClientGroupInput
{
#[Assert\NotBlank]
#[Groups(['organizational-unit:write'])]
public ?string $name = null;
#[Assert\NotNull]
#[Groups(['organizational-unit:write'])]
public ?OrganizationalUnitOutput $parent = null;
#[Groups(['organizational-unit:write'])]
public ?string $description = null;
#[Groups(['organizational-unit:write'])]
public ?string $comments = null;
public function __construct(?OrganizationalUnit $organizationalUnit = null)
{
if (!$organizationalUnit) {
return;
}
$this->name = $organizationalUnit->getName();
$this->parent = $organizationalUnit->getParent();
$this->description = $organizationalUnit->getDescription();
$this->comments = $organizationalUnit->getComments();
}
public function createOrUpdateEntity(?OrganizationalUnit $organizationalUnit = null): OrganizationalUnit
{
if (!$organizationalUnit) {
$organizationalUnit = new OrganizationalUnit();
}
$organizationalUnit->setName($this->name);
$organizationalUnit->setParent($this->parent->getEntity());
$organizationalUnit->setType(OrganizationalUnitTypes::CLIENTS_GROUP);
$organizationalUnit->setDescription($this->description);
$organizationalUnit->setComments($this->comments);
return $organizationalUnit;
}
}

View File

@ -3,15 +3,22 @@
namespace App\Dto\Input;
use App\Entity\OrganizationalUnit;
use App\Model\OrganizationalUnitTypes;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
final class OrganizationalUnitInput
final class OrganizationalUnitRootInput
{
#[Assert\NotBlank]
#[Groups(['organizational-unit:write'])]
public ?string $name = null;
#[Groups(['organizational-unit:write'])]
public ?string $description = null;
#[Groups(['organizational-unit:write'])]
public ?string $comments = null;
public function __construct(?OrganizationalUnit $organizationalUnit = null)
{
if (!$organizationalUnit) {
@ -19,6 +26,8 @@ final class OrganizationalUnitInput
}
$this->name = $organizationalUnit->getName();
$this->description = $organizationalUnit->getDescription();
$this->comments = $organizationalUnit->getComments();
}
public function createOrUpdateEntity(?OrganizationalUnit $organizationalUnit = null): OrganizationalUnit
@ -28,6 +37,9 @@ final class OrganizationalUnitInput
}
$organizationalUnit->setName($this->name);
$organizationalUnit->setType(OrganizationalUnitTypes::ORGANIZATIONAL_UNIT);
$organizationalUnit->setDescription($this->description);
$organizationalUnit->setComments($this->comments);
return $organizationalUnit;
}

View File

@ -12,6 +12,15 @@ final class OrganizationalUnitOutput extends AbstractOutput
#[Groups(['organizational-unit:read'])]
public string $name;
#[Groups(['organizational-unit:read'])]
public string $type;
#[Groups(['organizational-unit:read'])]
public ?OrganizationalUnit $parent = null;
#[Groups(['organizational-unit:read'])]
public string $path;
#[Groups(['organizational-unit:read'])]
public \DateTime $createAt;
@ -23,6 +32,9 @@ final class OrganizationalUnitOutput extends AbstractOutput
parent::__construct($organizationalUnit);
$this->name = $organizationalUnit->getName();
$this->type = $organizationalUnit->getType();
$this->parent = $organizationalUnit->getParent();
$this->path = $organizationalUnit->getPath();
$this->createAt = $organizationalUnit->getCreatedAt();
$this->createBy = $organizationalUnit->getCreatedBy();
}

View File

@ -2,7 +2,32 @@
namespace App\Model;
class OrganizationalUnitTypes
final class OrganizationalUnitTypes
{
public const ORGANIZATIONAL_UNIT = 'ORGANIZATIONAL_UNIT';
public const CLASSROOMS_GROUP = 'CLASSROOMS_GROUP';
public const CLASSROOM = 'CLASSROOM';
public const CLIENTS_GROUP = 'CLIENTS_GROUP';
private const ORGANIZATIONAL_UNIT_TYPES = [
self::ORGANIZATIONAL_UNIT => 'Unidad Organizativa',
self::CLASSROOMS_GROUP => 'Grupo de aulas',
self::CLASSROOM => 'Aula',
self::CLIENTS_GROUP => 'Grupo de ordenadores',
];
public static function getOrganizationalUnitTypes(): array
{
return self::ORGANIZATIONAL_UNIT_TYPES;
}
public static function getOrganizationalUnitType(string $organizationalUnit): ?string
{
return self::ORGANIZATIONAL_UNIT_TYPES[$organizationalUnit] ?? null;
}
public static function getOrganizationalUnitTypeKeys(): array
{
return array_keys(self::ORGANIZATIONAL_UNIT_TYPES);
}
}

View File

@ -9,7 +9,10 @@ use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use ApiPlatform\State\ProcessorInterface;
use ApiPlatform\Validator\ValidatorInterface;
use App\Dto\Input\OrganizationalUnitInput;
use App\Dto\Input\OrganizationalUnitClassroomGroupInput;
use App\Dto\Input\OrganizationalUnitClassroomInput;
use App\Dto\Input\OrganizationalUnitClientGroupInput;
use App\Dto\Input\OrganizationalUnitRootInput;
use App\Dto\Output\OrganizationalUnitOutput;
use App\Repository\OrganizationalUnitRepository;
@ -42,8 +45,16 @@ class OrganizationalUnitProcessor implements ProcessorInterface
*/
private function processCreateOrUpdate($data, Operation $operation, array $uriVariables = [], array $context = []): OrganizationalUnitOutput
{
if (!($data instanceof OrganizationalUnitOutput)) {
throw new \Exception(sprintf('data is not instance of %s', OrganizationalUnitInput::class));
if (!($data instanceof OrganizationalUnitRootInput) &&
!($data instanceof OrganizationalUnitClassroomInput) &&
!($data instanceof OrganizationalUnitClientGroupInput) &&
!($data instanceof OrganizationalUnitClassroomGroupInput)) {
throw new \Exception(sprintf('data is not an instance of %s, %s, %s, or %s',
OrganizationalUnitRootInput::class,
OrganizationalUnitClassroomInput::class,
OrganizationalUnitClientGroupInput::class,
OrganizationalUnitClassroomGroupInput::class
));
}
$entity = null;