schedule explicit set levels

This commit is contained in:
Yisroel Baum 2026-08-11 22:57:15 +03:00
parent a64df64b76
commit 3cf1aff6a9
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
10 changed files with 156 additions and 38 deletions

View file

@ -6,11 +6,13 @@ use App\Element\Element;
use App\Element\ElementRepository;
use App\Exceptions\NotFoundException;
use App\Set\SetRepository;
use App\Set\SetLevelRepository;
class GetSetLayout
{
public function __construct(
private SetRepository $setRepository,
private SetLevelRepository $setLevelRepository,
private ElementRepository $elementRepository,
) {}
@ -24,10 +26,15 @@ class GetSetLayout
throw new NotFoundException('set not found');
}
$elements = $this->elementRepository->findBySet($set);
$elementsByParentId = [];
foreach ($this->elementRepository->findBySet($set) as $element) {
$elementCountsByLevelId = [];
foreach ($elements as $element) {
$parentId = $element->getParentElement()?->getId() ?? 0;
$elementsByParentId[$parentId][] = $element;
$levelId = $element->getLevel()->getId();
$elementCountsByLevelId[$levelId]
= ($elementCountsByLevelId[$levelId] ?? 0) + 1;
}
foreach ($elementsByParentId as &$siblings) {
@ -46,8 +53,17 @@ class GetSetLayout
}
unset($siblings);
$layoutLevels = [];
foreach ($this->setLevelRepository->findBySet($set) as $level) {
$layoutLevels[] = new SetLayoutLevel(
level: $level,
elementCount: $elementCountsByLevelId[$level->getId()] ?? 0,
);
}
return new SetLayout(
set: $set,
levels: $layoutLevels,
elements: $this->buildNodes(0, $elementsByParentId),
);
}

View file

@ -7,10 +7,12 @@ use App\Set\Set;
final readonly class SetLayout
{
/**
* @param list<SetLayoutLevel> $levels
* @param list<ElementLayoutNode> $elements
*/
public function __construct(
private Set $set,
private array $levels,
private array $elements,
) {}
@ -19,6 +21,14 @@ final readonly class SetLayout
return $this->set;
}
/**
* @return list<SetLayoutLevel>
*/
public function getLevels(): array
{
return $this->levels;
}
/**
* @return list<ElementLayoutNode>
*/

View file

@ -0,0 +1,23 @@
<?php
namespace App\Set\UseCases\GetSetLayout;
use App\Set\SetLevel;
final readonly class SetLayoutLevel
{
public function __construct(
private SetLevel $level,
private int $elementCount,
) {}
public function getLevel(): SetLevel
{
return $this->level;
}
public function getElementCount(): int
{
return $this->elementCount;
}
}