ChatSessionRepository.php
- Pfad:
src/Infrastructure/Persistence/ChatSessionRepository.php - Namespace: Infrastructure\Persistence
- Zeilen: 180 | Größe: 6,121 Bytes
- Geändert: 2025-12-26 20:05:24 | Gescannt: 2025-12-31 10:22:15
Code Hygiene Score: 94
- Dependencies: 100 (25%)
- LOC: 100 (20%)
- Methods: 70 (20%)
- Secrets: 100 (15%)
- Classes: 100 (10%)
- Magic Numbers: 100 (10%)
Keine Issues gefunden.
Dependencies 5
- implements Domain\Repository\ChatSessionRepositoryInterface
- constructor PDO
- use Domain\Entity\ChatSession
- use Domain\Factory\ChatSessionFactory
- use Domain\Repository\ChatSessionRepositoryInterface
Klassen 1
-
ChatSessionRepositoryclass Zeile 13
Funktionen 13
-
__construct()public Zeile 17 -
findByUuid()public Zeile 22 -
findAll()public Zeile 31 -
findAllWithStats()public Zeile 45 -
save()public Zeile 62 -
create()public Zeile 105 -
updateTitle()public Zeile 115 -
updateSettings()public Zeile 121 -
updateSystemPrompt()public Zeile 145 -
delete()public Zeile 151 -
deleteAll()public Zeile 157 -
touch()public Zeile 165 -
generateUuid()public Zeile 171
Verwendet von 1
Versionen 8
-
v8
2025-12-26 20:05 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v7
2025-12-25 17:00 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v6
2025-12-25 17:00 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v5
2025-12-25 10:34 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v4
2025-12-25 10:32 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v3
2025-12-25 09:37 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v2
2025-12-23 08:04 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v1
2025-12-22 08:45 | 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-Sessions (CRUD, UUID-Lookup)
use Domain\Entity\ChatSession;
use Domain\Factory\ChatSessionFactory;
use Domain\Repository\ChatSessionRepositoryInterface;
class ChatSessionRepository implements ChatSessionRepositoryInterface
{
private \PDO $pdo;
public function __construct(\PDO $pdo)
{
$this->pdo = $pdo;
}
public function findByUuid(string $uuid): ?ChatSession
{
$stmt = $this->pdo->prepare('SELECT * FROM chat_sessions WHERE uuid = ?');
$stmt->execute([$uuid]);
$result = $stmt->fetch(\PDO::FETCH_ASSOC);
return $result !== false ? ChatSessionFactory::fromArray($result) : null;
}
public function findAll(int $limit = 50): array
{
$stmt = $this->pdo->query(
'SELECT * FROM chat_sessions ORDER BY last_activity DESC LIMIT ' . $limit
);
$sessions = [];
foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) {
$sessions[] = ChatSessionFactory::fromArray($row);
}
return $sessions;
}
public function findAllWithStats(int $limit = 50): array
{
$stmt = $this->pdo->query(
'SELECT s.*,
(SELECT COUNT(*) FROM chat_messages WHERE session_id = s.id) as message_count,
(SELECT COALESCE(SUM(tokens_input), 0) FROM chat_messages WHERE session_id = s.id) as total_input_tokens,
(SELECT COALESCE(SUM(tokens_output), 0) FROM chat_messages WHERE session_id = s.id) as total_output_tokens,
(SELECT COALESCE(SUM(end_microtime - start_microtime), 0) FROM chat_messages WHERE session_id = s.id AND start_microtime IS NOT NULL) as total_duration,
(SELECT model FROM chat_messages WHERE session_id = s.id AND role = "assistant" ORDER BY id DESC LIMIT 1) as last_model
FROM chat_sessions s
ORDER BY s.last_activity DESC
LIMIT ' . $limit
);
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
public function save(ChatSession $session): int
{
if ($session->getId() !== null) {
// Update
$stmt = $this->pdo->prepare(
'UPDATE chat_sessions SET
title = ?, model = ?, collections = ?, context_limit = ?,
temperature = ?, max_tokens = ?, author_profile_id = ?,
system_prompt_id = ?, updated_at = NOW()
WHERE id = ?'
);
$stmt->execute([
$session->getTitle(),
$session->getModel(),
json_encode($session->getCollections()),
$session->getContextLimit(),
$session->getTemperature(),
$session->getMaxTokens(),
$session->getAuthorProfileId(),
$session->getSystemPromptId(),
$session->getId(),
]);
return $session->getId();
}
// Insert
$stmt = $this->pdo->prepare(
'INSERT INTO chat_sessions (uuid, model, collections, context_limit, temperature, max_tokens)
VALUES (?, ?, ?, ?, ?, ?)'
);
$stmt->execute([
$session->getUuid(),
$session->getModel(),
json_encode($session->getCollections()),
$session->getContextLimit(),
$session->getTemperature(),
$session->getMaxTokens(),
]);
return (int) $this->pdo->lastInsertId();
}
public function create(string $uuid, string $model, string $collections, int $contextLimit): int
{
$stmt = $this->pdo->prepare(
'INSERT INTO chat_sessions (uuid, model, collections, context_limit) VALUES (?, ?, ?, ?)'
);
$stmt->execute([$uuid, $model, $collections, $contextLimit]);
return (int) $this->pdo->lastInsertId();
}
public function updateTitle(int $sessionId, string $title): void
{
$stmt = $this->pdo->prepare('UPDATE chat_sessions SET title = ? WHERE id = ?');
$stmt->execute([$title, $sessionId]);
}
public function updateSettings(
int $sessionId,
string $model,
array $collections,
int $contextLimit,
?int $authorProfileId,
float $temperature,
int $maxTokens
): void {
$collectionsJson = json_encode($collections);
$stmt = $this->pdo->prepare(
'UPDATE chat_sessions SET model = ?, collections = ?, context_limit = ?, author_profile_id = ?, temperature = ?, max_tokens = ? WHERE id = ?'
);
$stmt->execute([
$model,
$collectionsJson,
$contextLimit,
$authorProfileId > 0 ? $authorProfileId : null,
$temperature,
$maxTokens,
$sessionId,
]);
}
public function updateSystemPrompt(int $sessionId, ?string $systemPrompt): void
{
$stmt = $this->pdo->prepare('UPDATE chat_sessions SET system_prompt = ? WHERE id = ?');
$stmt->execute([$systemPrompt !== '' ? $systemPrompt : null, $sessionId]);
}
public function delete(int $sessionId): void
{
$stmt = $this->pdo->prepare('DELETE FROM chat_sessions WHERE id = ?');
$stmt->execute([$sessionId]);
}
public function deleteAll(): int
{
$count = (int) $this->pdo->query('SELECT COUNT(*) FROM chat_sessions')->fetchColumn();
$this->pdo->exec('DELETE FROM chat_sessions');
return $count;
}
public function touch(int $sessionId): void
{
$stmt = $this->pdo->prepare('UPDATE chat_sessions SET updated_at = NOW() WHERE id = ?');
$stmt->execute([$sessionId]);
}
public function generateUuid(): string
{
$data = random_bytes(16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
}