From bdf386e5106897d23bcb18a78a287bdb2b643647 Mon Sep 17 00:00:00 2001 From: Yisroel Baum Date: Sat, 18 Apr 2026 21:33:41 +0300 Subject: [PATCH] implement create node method in node controller --- app/Node/NodeController.php | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/Node/NodeController.php b/app/Node/NodeController.php index 254807b..57a1cf0 100644 --- a/app/Node/NodeController.php +++ b/app/Node/NodeController.php @@ -3,8 +3,12 @@ namespace App\Node; use App\Node\NodeRepository; +use App\Node\UseCases\CreateNode; +use App\Node\UseCases\CreateNodeRequest; use App\Text\TextRepository; +use DomainException; use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; class NodeController { @@ -34,4 +38,41 @@ class NodeController $response->getBody()->write(json_encode(array_values($data))); return $response->withHeader('Content-Type', 'application/json'); } + + public function createNode( + Request $request, + Response $response, + CreateNode $createNodeUseCase, + ): Response { + $data = $request->getParsedBody(); + $title = $data['title'] ?? ''; + + if (empty($title)) { + $response->getBody()->write(json_encode(['error' => 'Title is required'])); + return $response->withStatus(400)->withHeader('Content-Type', 'application/json'); + } + + $textId = (int) ($data['textId'] ?? 0); + $parentNodeId = isset($data['parentNodeId']) && $data['parentNodeId'] !== null + ? (int) $data['parentNodeId'] + : null; + + try { + $node = $createNodeUseCase->execute(new CreateNodeRequest( + textId: $textId, + title: $title, + parentNodeId: $parentNodeId, + )); + } catch (DomainException $e) { + $response->getBody()->write(json_encode(['error' => $e->getMessage()])); + return $response->withStatus(404)->withHeader('Content-Type', 'application/json'); + } + + $response->getBody()->write(json_encode([ + 'id' => $node->getId(), + 'title' => $node->getTitle(), + 'parentNodeId' => $node->getParentNode()?->getId(), + ])); + return $response->withStatus(201)->withHeader('Content-Type', 'application/json'); + } }