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),
);
}