$set->getId(), 'name' => $set->getName(), ]; }, $this->listSets->execute()); return new JsonResponse(['sets' => $sets]); } public function show(int $setId): JsonResponse { try { $layout = $this->getSetLayout->execute( new GetSetLayoutRequest(setId: $setId), ); } catch (NotFoundException $exception) { return new JsonResponse( ['error' => $exception->getMessage()], 404, ); } $set = $layout->getSet(); return new JsonResponse([ 'set' => [ 'id' => $set->getId(), 'name' => $set->getName(), ], 'levels' => array_map( function (SetLayoutLevel $layoutLevel): array { $level = $layoutLevel->getLevel(); return [ 'id' => $level->getId(), 'kind' => $level->getKind(), 'depth' => $level->getDepth(), 'elementCount' => $layoutLevel->getElementCount(), ]; }, $layout->getLevels(), ), 'elements' => array_map( function (ElementLayoutNode $node): array { return $this->elementPayload($node); }, $layout->getElements(), ), ]); } /** * @return array{ * id: int, * name: string, * kind: string, * levelId: int, * children: list * } */ private function elementPayload(ElementLayoutNode $node): array { $element = $node->getElement(); return [ 'id' => $element->getId(), 'name' => $element->getName(), 'kind' => $element->getKind(), 'levelId' => $element->getLevel()->getId(), 'children' => array_map( function (ElementLayoutNode $childNode): array { return $this->elementPayload($childNode); }, $node->getChildren(), ), ]; } }