{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/plan-form-components-refactoring.md",
"offset": 380,
"limit": 120
}
}
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/plan-form-components-refactoring.md",
"content": " public function updateMetadata(string $collectionId, array $metadata): void;\n\n \/\/ Validierung\n public function isActive(string $collectionId): bool;\n public function isSearchable(string $collectionId): bool;\n\n \/\/ ══════════════════════════════════════════════════════════════════\n \/\/ KRITISCH: Sichere Löschung mit Referenz-Prüfung\n \/\/ ══════════════════════════════════════════════════════════════════\n\n \/**\n * Prüft ob Collection noch referenziert wird\n * @return array ['has_references' => bool, 'references' => [...]]\n *\/\n public function checkReferences(string $collectionId): array;\n\n \/**\n * Löscht Collection NUR wenn keine Referenzen existieren\n * @throws ConstraintViolationException wenn referenziert\n *\/\n public function safeDelete(string $collectionId): void;\n\n \/**\n * Deaktiviert Collection (statt Löschung) - sicherer Weg\n *\/\n public function deactivate(string $collectionId): void;\n}\n```\n\n```php\n\/\/ CollectionRepository Implementation\nclass CollectionRepository implements CollectionRepositoryInterface\n{\n public function checkReferences(string $collectionId): array\n {\n $references = [];\n\n \/\/ Chat-Sessions prüfen (JSON-Array durchsuchen)\n $chatCount = $this->db->fetchColumn(\"\n SELECT COUNT(*) FROM ki_content.chat_sessions\n WHERE JSON_CONTAINS(collections, ?, '$')\n \", [json_encode($collectionId)]);\n\n if ($chatCount > 0) {\n $references[] = ['type' => 'chat_sessions', 'count' => $chatCount];\n }\n\n \/\/ Content-Orders prüfen\n $orderCount = $this->db->fetchColumn(\"\n SELECT COUNT(*) FROM ki_content.content_orders\n WHERE JSON_CONTAINS(collections, ?, '$')\n \", [json_encode($collectionId)]);\n\n if ($orderCount > 0) {\n $references[] = ['type' => 'content_orders', 'count' => $orderCount];\n }\n\n \/\/ User-Preferences prüfen\n $prefCount = $this->db->fetchColumn(\"\n SELECT COUNT(*) FROM ki_dev.user_preferences\n WHERE JSON_CONTAINS(default_collections, ?, '$')\n \", [json_encode($collectionId)]);\n\n if ($prefCount > 0) {\n $references[] = ['type' => 'user_preferences', 'count' => $prefCount];\n }\n\n return [\n 'has_references' => count($references) > 0,\n 'references' => $references,\n ];\n }\n\n public function safeDelete(string $collectionId): void\n {\n $check = $this->checkReferences($collectionId);\n\n if ($check['has_references']) {\n $details = array_map(\n fn($r) => \"{$r['type']}: {$r['count']}\",\n $check['references']\n );\n throw new ConstraintViolationException(\n \"Collection '$collectionId' is still referenced: \" . implode(', ', $details)\n );\n }\n\n $this->db->delete('rag_collections', ['collection_id' => $collectionId]);\n }\n\n public function deactivate(string $collectionId): void\n {\n \/\/ Sicherer als Löschen - Collection bleibt für Historie\n $this->db->update('rag_collections', [\n 'is_active' => false,\n 'is_searchable' => false,\n ], ['collection_id' => $collectionId]);\n }\n}\n```\n\n**Admin-UI Empfehlung:**\n```\n┌─────────────────────────────────────────────────┐\n│ Collection \"documents\" löschen? │\n├─────────────────────────────────────────────────┤\n│ ⚠️ Diese Collection wird noch verwendet: │\n│ • 23 Chat-Sessions │\n│ • 5 Content-Orders │\n│ • 1 User-Preference │\n│ │\n│ [Deaktivieren (sicher)] [Abbrechen] │\n└─────────────────────────────────────────────────┘\n```\n\n### 0b.7 Dropdown-Query\n\n```php\n\/\/ CollectionRepository::getSearchable()\npublic function getSearchable(): array",
"numLines": 120,
"startLine": 380,
"totalLines": 3947
}
}
}