textRepository->find($textId); if ($text === null) { return $response->withStatus(404); } $nodes = $this->nodeRepository->findByTextId($textId); $data = array_map(function ($node) { return [ 'id' => $node->getId(), 'title' => $node->getTitle(), 'parentNodeId' => $node->getParentNode()?->getId(), ]; }, $nodes); $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 = json_decode((string) $request->getBody(), true) ?? []; $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'); } public function bulkCreateNodes( Request $request, Response $response, BulkCreateNodes $bulkCreateNodesUseCase, ): Response { $data = json_decode((string) $request->getBody(), true) ?? []; $titlePrefix = trim($data['titlePrefix'] ?? ''); if ($titlePrefix === '') { $response->getBody()->write(json_encode(['error' => 'Title prefix is required'])); return $response->withStatus(400)->withHeader('Content-Type', 'application/json'); } $count = isset($data['count']) ? (int) $data['count'] : 0; if ($count < 1) { $response->getBody()->write(json_encode(['error' => 'Count must be at least 1'])); return $response->withStatus(400)->withHeader('Content-Type', 'application/json'); } if (!isset($data['parentNodeId']) || $data['parentNodeId'] === null) { $response->getBody()->write(json_encode(['error' => 'parentNodeId is required'])); return $response->withStatus(400)->withHeader('Content-Type', 'application/json'); } $textId = (int) ($data['textId'] ?? 0); $parentNodeId = (int) $data['parentNodeId']; try { $nodes = $bulkCreateNodesUseCase->execute(new BulkCreateNodesRequest( textId: $textId, parentNodeId: $parentNodeId, titlePrefix: $titlePrefix, count: $count, )); } catch (DomainException $e) { $response->getBody()->write(json_encode(['error' => $e->getMessage()])); return $response->withStatus(404)->withHeader('Content-Type', 'application/json'); } $result = array_map(function ($node) { return [ 'id' => $node->getId(), 'title' => $node->getTitle(), 'parentNodeId' => $node->getParentNode()?->getId(), ]; }, $nodes); $response->getBody()->write(json_encode(array_values($result))); return $response->withStatus(201)->withHeader('Content-Type', 'application/json'); } }