From e2326064ba72c7d4525bd031f25535db907c4168 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Thu, 12 Mar 2026 17:58:18 +0100 Subject: [PATCH] feat(skeleton) : expose skeleton relations via API and create SkeletonStructureService Co-Authored-By: Claude Opus 4.6 --- src/Entity/ModelType.php | 45 +++++++++++++++-- src/Service/SkeletonStructureService.php | 64 ++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 src/Service/SkeletonStructureService.php diff --git a/src/Entity/ModelType.php b/src/Entity/ModelType.php index 7cd92ab..606ea2c 100644 --- a/src/Entity/ModelType.php +++ b/src/Entity/ModelType.php @@ -271,9 +271,9 @@ class ModelType public function getStructure(): ?array { return match ($this->category) { - ModelCategory::COMPONENT => $this->componentSkeleton, - ModelCategory::PIECE => $this->pieceSkeleton, - ModelCategory::PRODUCT => $this->productSkeleton, + ModelCategory::COMPONENT => $this->getComponentStructureFromRelations(), + ModelCategory::PIECE => $this->getPieceStructureFromRelations(), + ModelCategory::PRODUCT => ['customFields' => []], }; } @@ -390,6 +390,45 @@ class ModelType return $this; } + private function getComponentStructureFromRelations(): array + { + $structure = ['customFields' => [], 'pieces' => [], 'products' => [], 'subcomponents' => []]; + + foreach ($this->skeletonPieceRequirements as $req) { + $structure['pieces'][] = [ + 'typePieceId' => $req->getTypePiece()->getId(), + ]; + } + + foreach ($this->skeletonProductRequirements as $req) { + $structure['products'][] = [ + 'typeProductId' => $req->getTypeProduct()->getId(), + 'familyCode' => $req->getFamilyCode(), + ]; + } + + foreach ($this->skeletonSubcomponentRequirements as $req) { + $structure['subcomponents'][] = [ + 'alias' => $req->getAlias(), + 'familyCode' => $req->getFamilyCode(), + 'typeComposantId' => $req->getTypeComposant()?->getId(), + ]; + } + + return $structure; + } + + private function getPieceStructureFromRelations(): array + { + return [ + 'customFields' => [], + 'products' => array_map(fn (SkeletonProductRequirement $req) => [ + 'typeProductId' => $req->getTypeProduct()->getId(), + 'familyCode' => $req->getFamilyCode(), + ], $this->skeletonProductRequirements->toArray()), + ]; + } + private function applyStructureForCategory(?array $structure, ModelCategory $category): void { if (ModelCategory::COMPONENT === $category) { diff --git a/src/Service/SkeletonStructureService.php b/src/Service/SkeletonStructureService.php new file mode 100644 index 0000000..8213abe --- /dev/null +++ b/src/Service/SkeletonStructureService.php @@ -0,0 +1,64 @@ +getSkeletonPieceRequirements() as $req) { + $modelType->removeSkeletonPieceRequirement($req); + } + + foreach ($modelType->getSkeletonProductRequirements() as $req) { + $modelType->removeSkeletonProductRequirement($req); + } + + foreach ($modelType->getSkeletonSubcomponentRequirements() as $req) { + $modelType->removeSkeletonSubcomponentRequirement($req); + } + + // Create piece requirements + foreach (($structure['pieces'] ?? []) as $i => $pieceData) { + $req = new SkeletonPieceRequirement(); + $req->setModelType($modelType); + $req->setTypePiece($this->em->getReference(ModelType::class, $pieceData['typePieceId'])); + $req->setPosition($i); + $modelType->addSkeletonPieceRequirement($req); + } + + // Create product requirements (shared by component + piece types) + foreach (($structure['products'] ?? []) as $i => $prodData) { + $req = new SkeletonProductRequirement(); + $req->setModelType($modelType); + $req->setTypeProduct($this->em->getReference(ModelType::class, $prodData['typeProductId'])); + $req->setFamilyCode($prodData['familyCode'] ?? null); + $req->setPosition($i); + $modelType->addSkeletonProductRequirement($req); + } + + // Create subcomponent requirements (component types only) + foreach (($structure['subcomponents'] ?? []) as $i => $subData) { + $req = new SkeletonSubcomponentRequirement(); + $req->setModelType($modelType); + $req->setAlias($subData['alias'] ?? ''); + $req->setFamilyCode($subData['familyCode'] ?? ''); + if (!empty($subData['typeComposantId'])) { + $req->setTypeComposant($this->em->getReference(ModelType::class, $subData['typeComposantId'])); + } + $req->setPosition($i); + $modelType->addSkeletonSubcomponentRequirement($req); + } + } +}