ChatMessage.php
- Pfad:
src/Domain/Entity/ChatMessage.php
- Namespace: Domain\Entity
- Zeilen: 302 | Größe: 7,745 Bytes
- Geändert: 2025-12-30 03:15:34 | Gescannt: 2025-12-31 10:22:15
Code Hygiene Score: 64
- Dependencies: 100 (25%)
- LOC: 0 (20%)
- Methods: 20 (20%)
- Secrets: 100 (15%)
- Classes: 100 (10%)
- Magic Numbers: 100 (10%)
Issues 1
| Zeile |
Typ |
Beschreibung |
| - |
complexity |
Datei hat 302 Zeilen (max: 300) |
Dependencies 11
- constructor Domain\ValueObject\MessageRole
- constructor Domain\ValueObject\MessageContent
- constructor Domain\ValueObject\TokenCount
- constructor Domain\ValueObject\MessageTiming
- constructor Domain\ValueObject\MessageMetadata
- constructor DateTimeImmutable
- use Domain\ValueObject\MessageContent
- use Domain\ValueObject\MessageMetadata
- use Domain\ValueObject\MessageRole
- use Domain\ValueObject\MessageTiming
- use Domain\ValueObject\TokenCount
Klassen 1
-
ChatMessage
class
Zeile 15
Funktionen 28
-
__construct()
private
Zeile 30
-
createUserMessage()
public
Zeile 59
-
createAssistantMessage()
public
Zeile 77
-
createSystemMessage()
public
Zeile 100
-
reconstituteFromPersistence()
public
Zeile 119
-
id()
public
Zeile 150
-
sessionId()
public
Zeile 155
-
role()
public
Zeile 160
-
content()
public
Zeile 165
-
model()
public
Zeile 170
-
tokens()
public
Zeile 175
-
timing()
public
Zeile 180
-
metadata()
public
Zeile 185
-
authorProfileId()
public
Zeile 190
-
systemPromptId()
public
Zeile 195
-
llmRequestId()
public
Zeile 200
-
createdAt()
public
Zeile 205
-
isUser()
public
Zeile 211
-
isAssistant()
public
Zeile 216
-
isSystem()
public
Zeile 221
-
hasTokens()
public
Zeile 226
-
estimatedCostUsd()
public
Zeile 231
-
durationMs()
public
Zeile 236
-
withId()
public
Zeile 242
-
withMetadata()
public
Zeile 250
-
withLlmRequestId()
public
Zeile 258
-
withTiming()
public
Zeile 266
-
toArray()
public
Zeile 279
Verwendet von 7
Versionen 9
-
v9
2025-12-28 01:28 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
-
v8
2025-12-28 01:28 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
-
v7
2025-12-28 01:27 | 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 Write-Operation
-
v5
2025-12-25 09:54 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
-
v4
2025-12-25 09:54 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
-
v3
2025-12-25 09:54 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
-
v2
2025-12-25 09:54 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
-
v1
2025-12-25 09:54 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
Code
<?php
declare(strict_types=1);
namespace Domain\Entity;
// @responsibility: Rich domain model for chat messages with business logic
use Domain\ValueObject\MessageContent;
use Domain\ValueObject\MessageMetadata;
use Domain\ValueObject\MessageRole;
use Domain\ValueObject\MessageTiming;
use Domain\ValueObject\TokenCount;
class ChatMessage
{
private ?int $id;
private int $sessionId;
private MessageRole $role;
private MessageContent $content;
private ?string $model;
private TokenCount $tokens;
private MessageTiming $timing;
private MessageMetadata $metadata;
private ?int $authorProfileId;
private ?int $systemPromptId;
private ?int $llmRequestId;
private \DateTimeImmutable $createdAt;
private function __construct(
?int $id,
int $sessionId,
MessageRole $role,
MessageContent $content,
?string $model,
TokenCount $tokens,
MessageTiming $timing,
MessageMetadata $metadata,
?int $authorProfileId,
?int $systemPromptId,
?int $llmRequestId,
\DateTimeImmutable $createdAt
) {
$this->id = $id;
$this->sessionId = $sessionId;
$this->role = $role;
$this->content = $content;
$this->model = $model;
$this->tokens = $tokens;
$this->timing = $timing;
$this->metadata = $metadata;
$this->authorProfileId = $authorProfileId;
$this->systemPromptId = $systemPromptId;
$this->llmRequestId = $llmRequestId;
$this->createdAt = $createdAt;
}
// Factory methods for domain logic
public static function createUserMessage(int $sessionId, string $content, ?int $authorProfileId = null): self
{
return new self(
null,
$sessionId,
MessageRole::USER,
MessageContent::fromString($content),
null,
TokenCount::zero(),
MessageTiming::none(),
MessageMetadata::empty(),
$authorProfileId,
null,
null,
new \DateTimeImmutable()
);
}
public static function createAssistantMessage(
int $sessionId,
string $content,
string $model,
TokenCount $tokens,
MessageTiming $timing
): self {
return new self(
null,
$sessionId,
MessageRole::ASSISTANT,
MessageContent::fromStringOrEmpty($content),
$model,
$tokens,
$timing,
MessageMetadata::empty(),
null,
null,
null,
new \DateTimeImmutable()
);
}
public static function createSystemMessage(int $sessionId, string $content, ?int $systemPromptId = null): self
{
return new self(
null,
$sessionId,
MessageRole::SYSTEM,
MessageContent::fromStringOrEmpty($content),
null,
TokenCount::zero(),
MessageTiming::none(),
MessageMetadata::empty(),
null,
$systemPromptId,
null,
new \DateTimeImmutable()
);
}
// Reconstitution from persistence (used by Factory)
public static function reconstituteFromPersistence(
?int $id,
int $sessionId,
MessageRole $role,
MessageContent $content,
?string $model,
TokenCount $tokens,
MessageTiming $timing,
MessageMetadata $metadata,
?int $authorProfileId,
?int $systemPromptId,
?int $llmRequestId,
\DateTimeImmutable $createdAt
): self {
return new self(
$id,
$sessionId,
$role,
$content,
$model,
$tokens,
$timing,
$metadata,
$authorProfileId,
$systemPromptId,
$llmRequestId,
$createdAt
);
}
// Essential getters
public function id(): ?int
{
return $this->id;
}
public function sessionId(): int
{
return $this->sessionId;
}
public function role(): MessageRole
{
return $this->role;
}
public function content(): MessageContent
{
return $this->content;
}
public function model(): ?string
{
return $this->model;
}
public function tokens(): TokenCount
{
return $this->tokens;
}
public function timing(): MessageTiming
{
return $this->timing;
}
public function metadata(): MessageMetadata
{
return $this->metadata;
}
public function authorProfileId(): ?int
{
return $this->authorProfileId;
}
public function systemPromptId(): ?int
{
return $this->systemPromptId;
}
public function llmRequestId(): ?int
{
return $this->llmRequestId;
}
public function createdAt(): \DateTimeImmutable
{
return $this->createdAt;
}
// Business logic methods
public function isUser(): bool
{
return $this->role->isUser();
}
public function isAssistant(): bool
{
return $this->role->isAssistant();
}
public function isSystem(): bool
{
return $this->role->isSystem();
}
public function hasTokens(): bool
{
return $this->tokens->hasTokens();
}
public function estimatedCostUsd(): float
{
return $this->tokens->estimatedCostUsd();
}
public function durationMs(): ?float
{
return $this->timing->durationMs();
}
// Mutation methods (return new instance for immutability)
public function withId(int $id): self
{
$clone = clone $this;
$clone->id = $id;
return $clone;
}
public function withMetadata(MessageMetadata $metadata): self
{
$clone = clone $this;
$clone->metadata = $metadata;
return $clone;
}
public function withLlmRequestId(int $llmRequestId): self
{
$clone = clone $this;
$clone->llmRequestId = $llmRequestId;
return $clone;
}
public function withTiming(MessageTiming $timing): self
{
$clone = clone $this;
$clone->timing = $timing;
return $clone;
}
/**
* Convert to array for persistence.
*
* @return array<string, mixed>
*/
public function toArray(): array
{
return [
'id' => $this->id,
'session_id' => $this->sessionId,
'role' => $this->role->value,
'content' => $this->content->value(),
'model' => $this->model,
'tokens_input' => $this->tokens->input() > 0 ? $this->tokens->input() : null,
'tokens_output' => $this->tokens->output() > 0 ? $this->tokens->output() : null,
'sources' => $this->metadata->sources() !== null ? json_encode($this->metadata->sources()) : null,
'start_microtime' => $this->timing->startMicrotime(),
'end_microtime' => $this->timing->endMicrotime(),
'author_profile_id' => $this->authorProfileId,
'system_prompt_id' => $this->systemPromptId,
'collections' => $this->metadata->collections() !== null ? json_encode($this->metadata->collections()) : null,
'context_limit' => $this->metadata->contextLimit(),
'chunks_used' => $this->metadata->chunksUsed() !== null ? json_encode($this->metadata->chunksUsed()) : null,
'llm_request_id' => $this->llmRequestId,
'created_at' => $this->createdAt->format('Y-m-d H:i:s'),
];
}
}