Attainly/backend/app/Http/Controllers/SetController.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(),
),
];
}
}