ChatSessionFactory.php

Code Hygiene Score: 100

Keine Issues gefunden.

Dependencies 3

Klassen 1

Funktionen 4

Verwendet von 2

Versionen 1

Code

<?php

declare(strict_types=1);

namespace Domain\Factory;

// @responsibility: Erstellt ChatSession-Instanzen aus verschiedenen Quellen

use Domain\Entity\ChatSession;
use Domain\ValueObject\SessionMetadata;
use Domain\ValueObject\SessionUuid;

final class ChatSessionFactory
{
    /**
     * Erstelle neue Session mit Defaults.
     */
    public static function createNew(
        ?SessionUuid $uuid = null,
        ?SessionMetadata $metadata = null
    ): ChatSession {
        return new ChatSession(
            uuid: $uuid ?? SessionUuid::generate(),
            metadata: $metadata ?? SessionMetadata::create()
        );
    }

    /**
     * Erstelle Session aus Datenbank-Row.
     *
     * @param array<string, mixed> $data
     */
    public static function fromArray(array $data): ChatSession
    {
        $collections = self::parseCollections($data['collections'] ?? '["documents"]');

        $metadata = SessionMetadata::create(
            model: $data['model'] ?? 'claude-opus-4-5-20251101',
            collections: $collections,
            contextLimit: (int) ($data['context_limit'] ?? 5),
            temperature: (float) ($data['temperature'] ?? 0.7),
            maxTokens: (int) ($data['max_tokens'] ?? 4096)
        );

        $session = new ChatSession(
            uuid: SessionUuid::fromString($data['uuid']),
            metadata: $metadata,
            id: isset($data['id']) ? (int) $data['id'] : null,
            sessionToken: $data['session_token'] ?? null,
            userId: isset($data['user_id']) ? (int) $data['user_id'] : null,
            personaId: isset($data['persona_id']) ? (int) $data['persona_id'] : null,
            title: $data['title'] ?? null,
            authorProfileId: isset($data['author_profile_id']) ? (int) $data['author_profile_id'] : null,
            systemPromptId: isset($data['system_prompt_id']) ? (int) $data['system_prompt_id'] : null,
            createdAt: isset($data['created_at']) ? new \DateTimeImmutable($data['created_at']) : new \DateTimeImmutable(),
            updatedAt: isset($data['updated_at']) ? new \DateTimeImmutable($data['updated_at']) : new \DateTimeImmutable(),
            lastActivity: isset($data['last_activity']) ? new \DateTimeImmutable($data['last_activity']) : new \DateTimeImmutable()
        );

        return $session;
    }

    /**
     * Parse collections from JSON string or array.
     *
     * @return array<string>
     */
    private static function parseCollections(mixed $collections): array
    {
        if (is_string($collections)) {
            $decoded = json_decode($collections, true);

            return is_array($decoded) ? $decoded : ['documents'];
        }

        if (is_array($collections)) {
            return $collections;
        }

        return ['documents'];
    }

    /**
     * Convert entity to array for persistence.
     *
     * @return array<string, mixed>
     */
    public static function toArray(ChatSession $session): array
    {
        return [
            'id' => $session->getId(),
            'uuid' => $session->getUuid(),
            'session_token' => $session->getSessionToken(),
            'user_id' => $session->getUserId(),
            'persona_id' => $session->getPersonaId(),
            'title' => $session->getTitle(),
            'model' => $session->getModel(),
            'collections' => json_encode($session->getCollections()),
            'context_limit' => $session->getContextLimit(),
            'temperature' => $session->getTemperature(),
            'max_tokens' => $session->getMaxTokens(),
            'author_profile_id' => $session->getAuthorProfileId(),
            'system_prompt_id' => $session->getSystemPromptId(),
            'created_at' => $session->getCreatedAt()->format('Y-m-d H:i:s'),
            'updated_at' => $session->getUpdatedAt()->format('Y-m-d H:i:s'),
            'last_activity' => $session->getLastActivity()->format('Y-m-d H:i:s'),
        ];
    }
}
← Übersicht Graph