add child creation

This commit is contained in:
Yisroel Baum 2026-06-21 22:02:36 +03:00
parent 7c84eefe78
commit 34b0fd0b44
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
7 changed files with 332 additions and 2 deletions

View file

@ -3,6 +3,8 @@
namespace App\Controllers;
use App\Element\Element;
use App\Element\UseCases\CreateChildElement\CreateChildElement;
use App\Element\UseCases\CreateChildElement\CreateChildElementRequest;
use App\Element\UseCases\GetElement\GetElement;
use App\Element\UseCases\GetElement\GetElementRequest;
use App\Element\UseCases\UpdateElement\UpdateElement;
@ -18,6 +20,7 @@ class ElementController
{
public function __construct(
private GetElement $getElement,
private CreateChildElement $createChildElement,
private UpdateElement $updateElement,
private FileUploader $fileUploader,
) {
@ -55,6 +58,30 @@ class ElementController
], 200);
}
public function createChild(Request $request, ?int $parentId): JsonResponse
{
try {
$element = $this->createChildElement->execute(
new CreateChildElementRequest(
parentElementId: $parentId,
title: $this->stringInput($request, 'title'),
)
);
} catch (BadRequestException $exception) {
return new JsonResponse([
'error' => $exception->getMessage(),
], 400);
} catch (NotFoundException $exception) {
return new JsonResponse([
'error' => $exception->getMessage(),
], 404);
}
return new JsonResponse([
'element' => $this->buildElementPayload($element),
], 201);
}
public function update(Request $request): JsonResponse
{
$file = $this->uploadedFileInput($request, 'file');

View file

@ -0,0 +1,50 @@
<?php
namespace App\Element\UseCases\CreateChildElement;
use App\Element\CreateElementDto;
use App\Element\Element;
use App\Element\ElementRepository;
use App\Exceptions\BadRequestException;
use App\Exceptions\NotFoundException;
class CreateChildElement
{
public function __construct(private ElementRepository $elementRepository)
{
}
/**
* @throws BadRequestException
* @throws NotFoundException
*/
public function execute(CreateChildElementRequest $request): Element
{
if ($request->parentElementId === null) {
throw new BadRequestException('parentElementId is required');
}
if ($request->title === null || $request->title === '') {
throw new BadRequestException('title is required');
}
$parentElement = $this->elementRepository->find(
$request->parentElementId
);
if ($parentElement === null) {
throw new NotFoundException('Parent element not found');
}
return $this->elementRepository->create(new CreateElementDto(
set: $parentElement->getSet(),
title: $request->title,
description: '',
iconImageUrl: null,
richText: '',
shortPdfPath: null,
longPdfPath: null,
youtubeUrl: null,
parentElement: $parentElement,
));
}
}

View file

@ -0,0 +1,12 @@
<?php
namespace App\Element\UseCases\CreateChildElement;
class CreateChildElementRequest
{
public function __construct(
public ?int $parentElementId,
public ?string $title,
) {
}
}

View file

@ -12,5 +12,10 @@ Route::get('/me', [AuthController::class, 'me'])
->middleware(AuthMiddleware::class);
Route::get('/sets', [SetController::class, 'index']);
Route::get('/elements/{id}', [ElementController::class, 'show']);
Route::post('/elements/{parentId}/children', [
ElementController::class,
'createChild',
])
->middleware(AuthMiddleware::class);
Route::post('/element/update', [ElementController::class, 'update'])
->middleware(AuthMiddleware::class);

View file

@ -5,6 +5,7 @@ namespace Tests\Unit\Controllers;
use App\Controllers\ElementController;
use App\Element\CreateElementDto;
use App\Element\Element;
use App\Element\UseCases\CreateChildElement\CreateChildElement;
use App\Element\UseCases\GetElement\GetElement;
use App\Element\UseCases\UpdateElement\UpdateDescription;
use App\Element\UseCases\UpdateElement\UpdateElement;
@ -61,6 +62,7 @@ class ElementControllerTest extends TestCase
);
$this->controller = new ElementController(
$getElement,
new CreateChildElement($this->elementRepo),
$updateElement,
$this->fileUploader,
);