ExportChatSessionUseCase.php
- Pfad:
src/UseCases/Chat/ExportChatSessionUseCase.php - Namespace: UseCases\Chat
- Zeilen: 151 | Größe: 4,879 Bytes
- Geändert: 2025-12-27 23:21:46 | Gescannt: 2025-12-31 10:22:15
Code Hygiene Score: 100
- Dependencies: 100 (25%)
- LOC: 99 (20%)
- Methods: 100 (20%)
- Secrets: 100 (15%)
- Classes: 100 (10%)
- Magic Numbers: 100 (10%)
Keine Issues gefunden.
Dependencies 5
- constructor Domain\Repository\ChatSessionRepositoryInterface
- constructor Domain\Repository\ChatMessageRepositoryInterface
- use Domain\Constants
- use Domain\Repository\ChatMessageRepositoryInterface
- use Domain\Repository\ChatSessionRepositoryInterface
Klassen 1
-
ExportChatSessionUseCaseclass Zeile 13
Funktionen 4
-
__construct()public Zeile 15 -
exportAsMarkdown()public Zeile 24 -
exportAsJson()Zeile 80 -
generateFilename()Zeile 131
Verwendet von 2
- ChatController.php constructor
- ChatController.php use
Versionen 9
-
v9
2025-12-27 23:21 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v8
2025-12-27 23:21 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v7
2025-12-25 17:32 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v6
2025-12-25 17:32 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v5
2025-12-25 09:44 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v4
2025-12-25 09:43 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v3
2025-12-25 09:43 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v2
2025-12-23 08:17 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v1
2025-12-23 07:55 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
Code
<?php
declare(strict_types=1);
namespace UseCases\Chat;
// @responsibility: Exportiert Chat-Sessions als Markdown oder JSON
use Domain\Constants;
use Domain\Repository\ChatMessageRepositoryInterface;
use Domain\Repository\ChatSessionRepositoryInterface;
final class ExportChatSessionUseCase
{
public function __construct(
private ChatSessionRepositoryInterface $sessionRepo,
private ChatMessageRepositoryInterface $messageRepo
) {
}
/**
* Export session as Markdown.
*/
public function exportAsMarkdown(string $uuid): ?string
{
$session = $this->sessionRepo->findByUuid($uuid);
if ($session === null) {
return null;
}
$messages = $this->messageRepo->findBySessionId($session->getId() ?? 0);
$title = $session->getTitle() ?? 'Chat';
$date = date('d.m.Y H:i');
$model = $session->getModel();
$md = "# {$title}\n";
$md .= "*Exportiert am {$date}*\n";
$md .= "*Modell: {$model}*\n\n";
$md .= "---\n\n";
$questionNum = 0;
foreach ($messages as $msg) {
if ($msg->role()->isUser()) {
$questionNum++;
$md .= "## Frage {$questionNum}\n\n";
$md .= $msg->content()->value() . "\n\n";
} else {
$md .= "## Antwort {$questionNum}\n\n";
$md .= $msg->content()->value() . "\n\n";
$sources = $msg->metadata()->sources() ?? [];
if (!empty($sources)) {
$md .= "**Quellen:**\n";
foreach ($sources as $source) {
$sourceData = is_string($source) ? json_decode($source, true) : $source;
if (!is_array($sourceData)) {
continue;
}
$sourceTitle = $sourceData['title'] ?? 'Unbekannt';
$score = isset($sourceData['score']) ? round((float) $sourceData['score'] * Constants::PERCENT_FULL) . '%' : '';
$collection = isset($sourceData['collection']) ? "[{$sourceData['collection']}] " : '';
$md .= "- {$collection}{$sourceTitle} ({$score})\n";
}
$md .= "\n";
}
$md .= "---\n\n";
}
}
return $md;
}
/**
* Export session as JSON.
*
* @return array<string, mixed>|null
*/
public function exportAsJson(string $uuid): ?array
{
$session = $this->sessionRepo->findByUuid($uuid);
if ($session === null) {
return null;
}
$messages = $this->messageRepo->findBySessionId($session->getId() ?? 0);
$exportMessages = [];
foreach ($messages as $msg) {
$exportMsg = [
'role' => $msg->role()->value,
'content' => $msg->content()->value(),
'created_at' => $msg->createdAt()->format('Y-m-d H:i:s'),
];
if ($msg->role()->isAssistant()) {
$sources = $msg->metadata()->sources() ?? [];
$parsedSources = [];
foreach ($sources as $source) {
$parsedSources[] = is_string($source) ? json_decode($source, true) : $source;
}
$exportMsg['sources'] = $parsedSources;
$exportMsg['tokens'] = [
'input' => $msg->tokens()->input(),
'output' => $msg->tokens()->output(),
];
$exportMsg['model'] = $msg->model();
}
$exportMessages[] = $exportMsg;
}
return [
'session' => [
'uuid' => $session->getUuid(),
'title' => $session->getTitle() ?? 'Chat',
'created_at' => $session->getCreatedAt()->format('Y-m-d H:i:s'),
'model' => $session->getModel(),
'collections' => $session->getCollections(),
],
'messages' => $exportMessages,
'exported_at' => date('c'),
];
}
/**
* Generate filename for export.
*/
public function generateFilename(string $uuid, string $format): string
{
$session = $this->sessionRepo->findByUuid($uuid);
$title = $session?->getTitle() ?? 'chat';
// Sanitize title for filename
$title = preg_replace('/[^a-zA-Z0-9äöüÄÖÜß\-_\s]/u', '', $title) ?? '';
$title = preg_replace('/\s+/', '-', trim($title)) ?? '';
$title = mb_substr($title, 0, 50);
if ($title === '') {
$title = 'chat';
}
$date = date('Y-m-d');
$ext = $format === 'json' ? 'json' : 'md';
return "chat-{$title}-{$date}.{$ext}";
}
}