diff --git a/src/Entity/ModelType.php b/src/Entity/ModelType.php index 8b1f966..6638a15 100644 --- a/src/Entity/ModelType.php +++ b/src/Entity/ModelType.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace App\Entity; +use ApiPlatform\Doctrine\Orm\Filter\SearchFilter; +use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Metadata\ApiResource; use App\Enum\ModelCategory; use App\Repository\ModelTypeRepository; @@ -17,49 +19,57 @@ use Symfony\Component\Serializer\Annotation\Groups; #[ORM\Table(name: 'model_types')] #[ORM\UniqueConstraint(name: 'unique_category_name', columns: ['category', 'name'])] #[ORM\HasLifecycleCallbacks] +#[ApiFilter(SearchFilter::class, properties: ['category' => 'exact'])] #[ApiResource] class ModelType { #[ORM\Id] #[ORM\Column(type: Types::STRING, length: 36)] - #[Groups(['type_machine:read'])] + #[Groups(['type_machine:read', 'model_type:read'])] private ?string $id = null; #[ORM\Column(type: Types::STRING, length: 120)] - #[Groups(['type_machine:read'])] + #[Groups(['type_machine:read', 'model_type:read', 'model_type:write'])] private string $name; #[ORM\Column(type: Types::STRING, length: 60, unique: true)] - #[Groups(['type_machine:read'])] + #[Groups(['type_machine:read', 'model_type:read', 'model_type:write'])] private string $code; #[ORM\Column(enumType: ModelCategory::class)] - #[Groups(['type_machine:read'])] + #[Groups(['type_machine:read', 'model_type:read', 'model_type:write'])] private ModelCategory $category; #[ORM\Column(type: Types::TEXT, nullable: true)] - #[Groups(['type_machine:read'])] + #[Groups(['type_machine:read', 'model_type:read', 'model_type:write'])] private ?string $notes = null; #[ORM\Column(type: Types::TEXT, nullable: true)] - #[Groups(['type_machine:read'])] + #[Groups(['type_machine:read', 'model_type:read', 'model_type:write'])] private ?string $description = null; #[ORM\Column(type: Types::JSON, nullable: true, name: 'componentSkeleton')] + #[Groups(['model_type:read'])] private ?array $componentSkeleton = null; #[ORM\Column(type: Types::JSON, nullable: true, name: 'pieceSkeleton')] + #[Groups(['model_type:read'])] private ?array $pieceSkeleton = null; #[ORM\Column(type: Types::JSON, nullable: true, name: 'productSkeleton')] + #[Groups(['model_type:read'])] private ?array $productSkeleton = null; #[ORM\Column(type: Types::DATETIME_IMMUTABLE, name: 'createdAt')] + #[Groups(['model_type:read'])] private \DateTimeImmutable $createdAt; #[ORM\Column(type: Types::DATETIME_IMMUTABLE, name: 'updatedAt')] + #[Groups(['model_type:read'])] private \DateTimeImmutable $updatedAt; + private ?array $pendingStructure = null; + /** * @var Collection */ @@ -195,6 +205,11 @@ class ModelType { $this->category = $category; + if ($this->pendingStructure !== null) { + $this->applyStructureForCategory($this->pendingStructure, $category); + $this->pendingStructure = null; + } + return $this; } @@ -258,6 +273,50 @@ class ModelType return $this; } + #[Groups(['model_type:read'])] + public function getStructure(): ?array + { + return match ($this->category) { + ModelCategory::COMPONENT => $this->componentSkeleton, + ModelCategory::PIECE => $this->pieceSkeleton, + ModelCategory::PRODUCT => $this->productSkeleton, + }; + } + + #[Groups(['model_type:write'])] + public function setStructure(?array $structure): static + { + if (!isset($this->category)) { + $this->pendingStructure = $structure; + return $this; + } + + $this->applyStructureForCategory($structure, $this->category); + + return $this; + } + + private function applyStructureForCategory(?array $structure, ModelCategory $category): void + { + if ($category === ModelCategory::COMPONENT) { + $this->componentSkeleton = $structure; + $this->pieceSkeleton = null; + $this->productSkeleton = null; + return; + } + + if ($category === ModelCategory::PIECE) { + $this->pieceSkeleton = $structure; + $this->componentSkeleton = null; + $this->productSkeleton = null; + return; + } + + $this->productSkeleton = $structure; + $this->componentSkeleton = null; + $this->pieceSkeleton = null; + } + public function getCreatedAt(): \DateTimeImmutable { return $this->createdAt;