Attainly/backend/app/Http/Controllers/SetController.php

81 lines
2 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\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(),
],
'elements' => array_map(
$this->elementPayload(...),
$layout->getElements(),
),
]);
}
/**
* @return array{
* id: int,
* name: string,
* kind: string,
* children: list<mixed>
* }
*/
private function elementPayload(ElementLayoutNode $node): array
{
$element = $node->getElement();
return [
'id' => $element->getId(),
'name' => $element->getName(),
'kind' => $element->getKind(),
'children' => array_map(
$this->elementPayload(...),
$node->getChildren(),
),
];
}
}