Backup #1052

ID1052
Dateipfad/var/www/dev.campus.systemische-tools.de/src/Controller/OntologyController.php
Version11
Typ modified
Größe5.9 KB
Hash59f1e185d6e1a31ab8560290d859fdb8b7984f949a41310b75c01fc4b6cc9527
Datum2025-12-25 02:22:23
Geändert vonclaude-code-hook
GrundClaude Code Pre-Hook Backup vor Edit-Operation
Datei existiert Ja

Dateiinhalt

<?php

declare(strict_types=1);

namespace Controller;

// @responsibility: HTTP-Endpunkte für Semantic Explorer Ontologie (CRUD)

use Framework\Controller;
use Infrastructure\Audit\AuditService;
use Infrastructure\Formatter\ApiResponseFormatter;
use Infrastructure\SemanticExplorerRepository;

class OntologyController extends Controller
{
    private SemanticExplorerRepository $repository;
    private ApiResponseFormatter $apiFormatter;
    private AuditService $audit;

    public function __construct(
        SemanticExplorerRepository $repository,
        ApiResponseFormatter $apiFormatter,
        AuditService $audit
    ) {
        $this->repository = $repository;
        $this->apiFormatter = $apiFormatter;
        $this->audit = $audit;
    }

    /**
     * GET /semantic-explorer/ontologie
     * Konzept-Klassen
     */
    public function index(): void
    {
        $classes = $this->repository->getOntologyClasses();

        // Properties dekodieren
        foreach ($classes as &$class) {
            $class['properties_decoded'] = $this->decodeJson($class['properties'] ?? null);
        }

        $stats = $this->repository->getOntologyStats();

        $this->view('semantic-explorer.ontologie', [
            'title' => 'Ontologie',
            'classes' => $classes,
            'stats' => $stats,
        ]);
    }

    /**
     * GET /semantic-explorer/ontologie/new
     */
    public function create(): void
    {
        $this->view('semantic-explorer.ontologie.new', [
            'title' => 'Neue Ontologie-Klasse',
            'classes' => $this->repository->getOntologyClassesForSelect(),
        ]);
    }

    /**
     * POST /semantic-explorer/ontologie
     */
    public function store(): void
    {
        $input = $this->getJsonInput();

        $name = trim($input['name'] ?? '');
        $parentId = isset($input['parent_class_id']) && $input['parent_class_id'] !== '' ? (int) $input['parent_class_id'] : null;
        $description = trim($input['description'] ?? '') ?: null;
        $properties = $input['properties'] ?? [];

        if ($name === '') {
            $this->json($this->apiFormatter->validationError('Name ist erforderlich', ['name' => 'Pflichtfeld']), 400);

            return;
        }

        try {
            $id = $this->repository->createOntologyClass($name, $parentId, $description, $properties);

            // Audit log
            $this->audit->logCreate(
                table: 'ontology_classes',
                id: $id,
                data: ['name' => $name, 'parent_class_id' => $parentId, 'description' => $description],
                actor: 'user',
                actorType: 'user'
            );

            $this->json($this->apiFormatter->created($id, 'Ontologie-Klasse erstellt'));
        } catch (\Exception $e) {
            $this->json($this->apiFormatter->error($e->getMessage(), 'SERVER_ERROR'), 500);
        }
    }

    /**
     * GET /semantic-explorer/ontologie/{id}/edit
     */
    public function edit(int $id): void
    {
        $class = $this->repository->getOntologyClass($id);

        if ($class === null) {
            $this->notFound('Klasse nicht gefunden');
        }

        $this->view('semantic-explorer.ontologie.edit', [
            'title' => 'Klasse bearbeiten',
            'class' => $class,
            'classes' => $this->repository->getOntologyClassesForSelect(),
        ]);
    }

    /**
     * POST /semantic-explorer/ontologie/{id}
     */
    public function update(int $id): void
    {
        $input = $this->getJsonInput();

        $name = trim($input['name'] ?? '');
        $parentId = isset($input['parent_class_id']) && $input['parent_class_id'] !== '' ? (int) $input['parent_class_id'] : null;
        $description = trim($input['description'] ?? '') ?: null;
        $properties = $input['properties'] ?? [];

        if ($name === '') {
            $this->json($this->apiFormatter->validationError('Name ist erforderlich', ['name' => 'Pflichtfeld']), 400);

            return;
        }

        try {
            // Get old state for audit
            $oldClass = $this->repository->getOntologyClass($id);

            $this->repository->updateOntologyClass($id, $name, $parentId, $description, $properties);

            // Audit log
            $this->audit->logUpdate(
                table: 'ontology_classes',
                id: $id,
                oldData: $oldClass !== null ? ['name' => $oldClass['name'], 'description' => $oldClass['description'] ?? null] : [],
                newData: ['name' => $name, 'parent_class_id' => $parentId, 'description' => $description],
                actor: 'user',
                actorType: 'user'
            );

            $this->json($this->apiFormatter->ok('Ontologie-Klasse aktualisiert'));
        } catch (\Exception $e) {
            $this->json($this->apiFormatter->error($e->getMessage(), 'SERVER_ERROR'), 500);
        }
    }

    /**
     * POST /semantic-explorer/ontologie/{id}/delete
     */
    public function delete(int $id): void
    {
        try {
            // Get data before delete for audit
            $class = $this->repository->getOntologyClass($id);

            $success = $this->repository->deleteOntologyClass($id);
            if ($success) {
                // Audit log
                $this->audit->logDelete(
                    table: 'ontology_classes',
                    id: $id,
                    data: $class !== null ? ['name' => $class['name'], 'description' => $class['description'] ?? null] : [],
                    reason: 'User deleted via UI',
                    actor: 'user',
                    actorType: 'user'
                );

                $this->json($this->apiFormatter->ok('Ontologie-Klasse gelöscht'));
            } else {
                $this->json($this->apiFormatter->error('Klasse hat noch Unterklassen', 'HAS_CHILDREN'), 400);
            }
        } catch (\Exception $e) {
            $this->json($this->apiFormatter->error($e->getMessage(), 'SERVER_ERROR'), 500);
        }
    }
}

Vollständig herunterladen

Aktionen

Herunterladen

Andere Versionen dieser Datei

ID Version Typ Größe Datum
1724 22 modified 7.6 KB 2025-12-27 12:33
1723 21 modified 7.4 KB 2025-12-27 12:33
1722 20 modified 7.1 KB 2025-12-27 12:32
1721 19 modified 6.6 KB 2025-12-27 12:31
1528 18 modified 5.8 KB 2025-12-26 07:01
1058 17 modified 5.8 KB 2025-12-25 02:22
1057 16 modified 5.9 KB 2025-12-25 02:22
1056 15 modified 5.9 KB 2025-12-25 02:22
1055 14 modified 5.9 KB 2025-12-25 02:22
1054 13 modified 5.9 KB 2025-12-25 02:22
1053 12 modified 5.9 KB 2025-12-25 02:22
1052 11 modified 5.9 KB 2025-12-25 02:22
1025 10 modified 4.9 KB 2025-12-24 20:20
1024 9 modified 4.6 KB 2025-12-24 20:20
1023 8 modified 4.4 KB 2025-12-24 20:19
694 7 modified 4.5 KB 2025-12-23 07:52
616 6 modified 4.5 KB 2025-12-23 04:42
512 5 modified 4.4 KB 2025-12-22 15:47
511 4 modified 4.3 KB 2025-12-22 15:47
510 3 modified 4.0 KB 2025-12-22 15:47
298 2 modified 4.1 KB 2025-12-22 08:04
292 1 modified 4.1 KB 2025-12-22 08:03

← Zurück zur Übersicht