add child element ordering

This commit is contained in:
Yisroel Baum 2026-06-22 09:51:21 +03:00
parent 7323925319
commit 62dc119b11
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
12 changed files with 554 additions and 11 deletions

View file

@ -9,6 +9,8 @@ use App\Element\UseCases\DeleteChildElement\DeleteChildElement;
use App\Element\UseCases\DeleteChildElement\DeleteChildElementRequest;
use App\Element\UseCases\GetElement\GetElement;
use App\Element\UseCases\GetElement\GetElementRequest;
use App\Element\UseCases\ReorderChildElements\ReorderChildElements;
use App\Element\UseCases\ReorderChildElements\ReorderChildElementsRequest;
use App\Element\UseCases\UpdateElement\UpdateElement;
use App\Element\UseCases\UpdateElement\UpdateElementRequest;
use App\Exceptions\BadRequestException;
@ -24,6 +26,7 @@ class ElementController
private GetElement $getElement,
private CreateChildElement $createChildElement,
private DeleteChildElement $deleteChildElement,
private ReorderChildElements $reorderChildElements,
private UpdateElement $updateElement,
private FileUploader $fileUploader,
) {
@ -104,6 +107,37 @@ class ElementController
return new JsonResponse(null, 204);
}
public function reorderChildren(
Request $request,
?int $parentId,
): JsonResponse {
try {
$childElements = $this->reorderChildElements->execute(
new ReorderChildElementsRequest(
parentElementId: $parentId,
childElementIds: $this->intArrayInput(
$request,
'childElementIds',
),
)
);
} catch (BadRequestException $exception) {
return new JsonResponse([
'error' => $exception->getMessage(),
], 400);
} catch (NotFoundException $exception) {
return new JsonResponse([
'error' => $exception->getMessage(),
], 404);
}
return new JsonResponse([
'childElements' => $this->buildElementSummaryPayloads(
$childElements,
),
], 200);
}
public function update(Request $request): JsonResponse
{
$file = $this->uploadedFileInput($request, 'file');
@ -158,6 +192,38 @@ class ElementController
return null;
}
/**
* @return int[]|null
*/
private function intArrayInput(Request $request, string $key): ?array
{
if (! $request->exists($key)) {
return null;
}
$value = $request->input($key);
if (! is_array($value)) {
return null;
}
$integerValues = [];
foreach ($value as $item) {
if (is_int($item)) {
$integerValues[] = $item;
continue;
}
if (is_string($item) && ctype_digit($item)) {
$integerValues[] = (int) $item;
continue;
}
return null;
}
return $integerValues;
}
private function stringInput(Request $request, string $key): ?string
{
if (! $request->exists($key)) {