101 lines
2.9 KiB
PHP
101 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Exceptions\NotFoundException;
|
|
use App\Set\Set;
|
|
use App\Set\UseCases\GetSetLayout\ElementLayoutNode;
|
|
use App\Set\UseCases\GetSetLayout\GetSetLayout;
|
|
use App\Set\UseCases\GetSetLayout\GetSetLayoutRequest;
|
|
use App\Set\UseCases\GetSetLayout\SetLayoutLevel;
|
|
use App\Set\UseCases\ListSets\ListSets;
|
|
use Illuminate\Http\JsonResponse;
|
|
|
|
class SetController extends Controller
|
|
{
|
|
public function __construct(
|
|
private ListSets $listSets,
|
|
private GetSetLayout $getSetLayout,
|
|
) {}
|
|
|
|
public function index(): JsonResponse
|
|
{
|
|
$sets = array_map(function (Set $set): array {
|
|
return [
|
|
'id' => $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<mixed>
|
|
* }
|
|
*/
|
|
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(),
|
|
),
|
|
];
|
|
}
|
|
}
|