ChatMessageFactory.php

Code Hygiene Score: 98

Keine Issues gefunden.

Dependencies 6

Klassen 1

Funktionen 2

Verwendet von 1

Code

<?php

declare(strict_types=1);

namespace Domain\Factory;

// @responsibility: Factory for creating ChatMessage entities with complex construction logic

use Domain\Entity\ChatMessage;
use Domain\ValueObject\MessageContent;
use Domain\ValueObject\MessageMetadata;
use Domain\ValueObject\MessageRole;
use Domain\ValueObject\MessageTiming;
use Domain\ValueObject\TokenCount;

final class ChatMessageFactory
{
    /**
     * Create from database row.
     *
     * @param array<string, mixed> $data
     */
    public static function fromArray(array $data): ChatMessage
    {
        $content = MessageContent::fromStringOrEmpty($data['content']);
        $role = MessageRole::from($data['role']);

        $tokens = TokenCount::fromNullable(
            isset($data['tokens_input']) ? (int) $data['tokens_input'] : null,
            isset($data['tokens_output']) ? (int) $data['tokens_output'] : null
        );

        $timing = MessageTiming::create(
            isset($data['start_microtime']) ? (float) $data['start_microtime'] : null,
            isset($data['end_microtime']) ? (float) $data['end_microtime'] : null
        );

        $metadata = MessageMetadata::create(
            self::decodeJson($data['sources'] ?? null),
            self::decodeJson($data['collections'] ?? null),
            self::decodeJson($data['chunks_used'] ?? null),
            isset($data['context_limit']) ? (int) $data['context_limit'] : null
        );

        $createdAt = isset($data['created_at'])
            ? new \DateTimeImmutable($data['created_at'])
            : new \DateTimeImmutable();

        return ChatMessage::reconstituteFromPersistence(
            isset($data['id']) ? (int) $data['id'] : null,
            (int) $data['session_id'],
            $role,
            $content,
            $data['model'] ?? null,
            $tokens,
            $timing,
            $metadata,
            isset($data['author_profile_id']) ? (int) $data['author_profile_id'] : null,
            isset($data['system_prompt_id']) ? (int) $data['system_prompt_id'] : null,
            isset($data['llm_request_id']) ? (int) $data['llm_request_id'] : null,
            $createdAt
        );
    }

    /**
     * @return array<mixed>|null
     */
    private static function decodeJson(?string $json): ?array
    {
        if ($json === null) {
            return null;
        }

        $decoded = json_decode($json, true);

        return is_array($decoded) ? $decoded : null;
    }
}
← Übersicht Graph