ChatMessageRepository.php
- Pfad:
src/Infrastructure/Persistence/ChatMessageRepository.php - Namespace: Infrastructure\Persistence
- Zeilen: 147 | Größe: 4,617 Bytes
- Geändert: 2025-12-29 08:44:43 | Gescannt: 2025-12-31 10:22:15
Code Hygiene Score: 100
- Dependencies: 100 (25%)
- LOC: 100 (20%)
- Methods: 100 (20%)
- Secrets: 100 (15%)
- Classes: 100 (10%)
- Magic Numbers: 100 (10%)
Keine Issues gefunden.
Dependencies 5
- implements Domain\Repository\ChatMessageRepositoryInterface
- constructor PDO
- use Domain\Entity\ChatMessage
- use Domain\Factory\ChatMessageFactory
- use Domain\Repository\ChatMessageRepositoryInterface
Klassen 1
-
ChatMessageRepositoryclass Zeile 13
Funktionen 7
-
__construct()public Zeile 17 -
findBySessionId()public Zeile 22 -
saveEntity()public Zeile 37 -
save()public Zeile 73 -
delete()public Zeile 119 -
deleteBySessionId()public Zeile 125 -
getSessionStats()public Zeile 131
Verwendet von 1
Versionen 8
-
v8
2025-12-29 08:44 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v7
2025-12-25 16:57 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v6
2025-12-25 16:57 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v5
2025-12-25 16:57 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v4
2025-12-25 10:34 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v3
2025-12-25 10:32 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v2
2025-12-25 09:37 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v1
2025-12-23 08:04 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
Code
<?php
declare(strict_types=1);
namespace Infrastructure\Persistence;
// @responsibility: Persistenz für Chat-Nachrichten (CRUD, Session-Filter)
use Domain\Entity\ChatMessage;
use Domain\Factory\ChatMessageFactory;
use Domain\Repository\ChatMessageRepositoryInterface;
class ChatMessageRepository implements ChatMessageRepositoryInterface
{
private \PDO $pdo;
public function __construct(\PDO $pdo)
{
$this->pdo = $pdo;
}
public function findBySessionId(int $sessionId): array
{
$stmt = $this->pdo->prepare(
'SELECT * FROM chat_messages WHERE session_id = ? ORDER BY created_at ASC'
);
$stmt->execute([$sessionId]);
$messages = [];
foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) {
$messages[] = ChatMessageFactory::fromArray($row);
}
return $messages;
}
public function saveEntity(ChatMessage $message): int
{
$data = $message->toArray();
unset($data['id']);
$stmt = $this->pdo->prepare(
'INSERT INTO chat_messages
(session_id, role, content, model, tokens_input, tokens_output, sources,
start_microtime, end_microtime, author_profile_id, system_prompt_id, collections, context_limit, chunks_used, llm_request_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
);
$stmt->execute([
$data['session_id'],
$data['role'],
$data['content'],
$data['model'],
$data['tokens_input'],
$data['tokens_output'],
$data['sources'],
$data['start_microtime'],
$data['end_microtime'],
$data['author_profile_id'],
$data['system_prompt_id'],
$data['collections'],
$data['context_limit'],
$data['chunks_used'],
$data['llm_request_id'],
]);
// Update session timestamp
$this->pdo->prepare('UPDATE chat_sessions SET updated_at = NOW() WHERE id = ?')
->execute([$message->sessionId()]);
return (int) $this->pdo->lastInsertId();
}
public function save(
int $sessionId,
string $role,
string $content,
string $model,
?int $tokensInput = null,
?int $tokensOutput = null,
?array $sources = null,
?float $startMicrotime = null,
?float $endMicrotime = null,
?int $authorProfileId = null,
?int $systemPromptId = null,
?string $collectionsJson = null,
?int $contextLimit = null,
?int $llmRequestId = null
): int {
$stmt = $this->pdo->prepare(
'INSERT INTO chat_messages
(session_id, role, content, model, tokens_input, tokens_output, sources,
start_microtime, end_microtime, author_profile_id, system_prompt_id, collections, context_limit, llm_request_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
);
$stmt->execute([
$sessionId,
$role,
$content,
$model,
$tokensInput,
$tokensOutput,
$sources !== null ? json_encode($sources) : null,
$startMicrotime,
$endMicrotime,
$authorProfileId,
$systemPromptId,
$collectionsJson,
$contextLimit,
$llmRequestId,
]);
// Update session timestamp
$this->pdo->prepare('UPDATE chat_sessions SET updated_at = NOW() WHERE id = ?')
->execute([$sessionId]);
return (int) $this->pdo->lastInsertId();
}
public function delete(int $id): void
{
$stmt = $this->pdo->prepare('DELETE FROM chat_messages WHERE id = ?');
$stmt->execute([$id]);
}
public function deleteBySessionId(int $sessionId): void
{
$stmt = $this->pdo->prepare('DELETE FROM chat_messages WHERE session_id = ?');
$stmt->execute([$sessionId]);
}
public function getSessionStats(int $sessionId): array
{
$stmt = $this->pdo->prepare(
'SELECT
COUNT(*) as message_count,
COALESCE(SUM(tokens_input), 0) as total_input_tokens,
COALESCE(SUM(tokens_output), 0) as total_output_tokens,
COALESCE(SUM(end_microtime - start_microtime), 0) as total_duration
FROM chat_messages
WHERE session_id = ?'
);
$stmt->execute([$sessionId]);
return $stmt->fetch(\PDO::FETCH_ASSOC);
}
}