repository = $repository; $this->apiFormatter = $apiFormatter; } /** * GET /semantic-explorer/taxonomie * Hierarchische Kategorisierung */ public function index(): void { $terms = $this->repository->findAll(); $hierarchy = $this->buildTaxonomyTree($terms); $stats = $this->repository->getStats(); $this->view('semantic-explorer.taxonomie', [ 'title' => 'Taxonomie', 'terms' => $terms, 'hierarchy' => $hierarchy, 'stats' => $stats, ]); } /** * GET /semantic-explorer/taxonomie/new */ public function create(): void { $this->view('semantic-explorer.taxonomie.new', [ 'title' => 'Neuer Taxonomie-Begriff', 'terms' => $this->repository->findForSelect(), ]); } /** * POST /semantic-explorer/taxonomie */ public function store(): void { $input = $this->getJsonInput(); $name = trim($input['name'] ?? ''); $parentId = isset($input['parent_id']) && $input['parent_id'] !== '' ? (int) $input['parent_id'] : null; if ($name === '') { $this->json($this->apiFormatter->validationError('Name ist erforderlich', ['name' => 'Pflichtfeld']), 400); return; } try { $id = $this->repository->create($name, $parentId); $this->json($this->apiFormatter->created($id, 'Taxonomie-Begriff erstellt')); } catch (\Exception $e) { $this->json($this->apiFormatter->error($e->getMessage(), 'SERVER_ERROR'), 500); } } /** * GET /semantic-explorer/taxonomie/{id}/edit */ public function edit(int $id): void { $term = $this->repository->find($id); if ($term === null) { $this->notFound('Begriff nicht gefunden'); } $this->view('semantic-explorer.taxonomie.edit', [ 'title' => 'Begriff bearbeiten', 'term' => $term, 'terms' => $this->repository->findForSelect(), ]); } /** * POST /semantic-explorer/taxonomie/{id} */ public function update(int $id): void { $input = $this->getJsonInput(); $name = trim($input['name'] ?? ''); $parentId = isset($input['parent_id']) && $input['parent_id'] !== '' ? (int) $input['parent_id'] : null; if ($name === '') { $this->json($this->apiFormatter->validationError('Name ist erforderlich', ['name' => 'Pflichtfeld']), 400); return; } try { $this->repository->updateTaxonomyTerm($id, $name, $parentId); $this->json($this->apiFormatter->ok('Taxonomie-Begriff aktualisiert')); } catch (\Exception $e) { $this->json($this->apiFormatter->error($e->getMessage(), 'SERVER_ERROR'), 500); } } /** * POST /semantic-explorer/taxonomie/{id}/delete */ public function delete(int $id): void { try { $success = $this->repository->deleteTaxonomyTerm($id); if ($success) { $this->json($this->apiFormatter->ok('Taxonomie-Begriff gelöscht')); } else { $this->json($this->apiFormatter->error('Begriff hat noch Unterbegriffe', 'HAS_CHILDREN'), 400); } } catch (\Exception $e) { $this->json($this->apiFormatter->error($e->getMessage(), 'SERVER_ERROR'), 500); } } /** * Baut Baum aus flacher Liste */ private function buildTaxonomyTree(array $items, ?int $parentId = null): array { $tree = []; foreach ($items as $item) { if ($item['parent_id'] == $parentId) { $item['children'] = $this->buildTaxonomyTree($items, $item['id']); $tree[] = $item; } } return $tree; } }