Backup #1225

ID1225
Dateipfad/var/www/dev.campus.systemische-tools.de/src/Domain/DTO/ContentOrderDTO.php
Version4
Typ modified
Größe4.3 KB
Hashf7d52e0137baa8f7e95bae9601c9d7bc0c44a79a8c178497e206bce91a6816d6
Datum2025-12-25 10:50:32
Geändert vonclaude-code-hook
GrundClaude Code Pre-Hook Backup vor Edit-Operation
Datei existiert Ja

Dateiinhalt

<?php

declare(strict_types=1);

namespace Domain\DTO;

use Domain\ValueObject\GenerationStatus;
use Domain\ValueObject\CritiqueStatus;

// @responsibility: DTO für Content-Order-Daten aus Repository

final readonly class ContentOrderDTO
{
    /**
     * @param array<string> $collections
     */
    public function __construct(
        public int $id,
        public string $title,
        public string $briefing,
        public string $model,
        public array $collections,
        public int $contextLimit,
        public GenerationStatus $generationStatus,
        public CritiqueStatus $critiqueStatus,
        public ?int $authorProfileId,
        public ?int $contractId,
        public ?int $structureId,
        public \DateTimeImmutable $createdAt,
        public ?\DateTimeImmutable $updatedAt,
        public ?int $latestVersionId = null,
        public ?string $authorProfileName = null,
        public ?string $contractName = null,
        public ?string $structureName = null,
    ) {}

    /**
     * Create from database row.
     *
     * @param array<string, mixed> $row
     */
    public static function fromDatabaseRow(array $row): self
    {
        $id = isset($row['id']) ? (int) $row['id'] : 0;
        $title = isset($row['title']) ? (string) $row['title'] : '';
        $briefing = isset($row['briefing']) ? (string) $row['briefing'] : '';
        $model = isset($row['model']) ? (string) $row['model'] : '';
        $collections = self::parseCollections($row['collections'] ?? '');
        $contextLimit = isset($row['context_limit']) ? (int) $row['context_limit'] : 3;
        $generationStatusStr = isset($row['generation_status']) ? (string) $row['generation_status'] : 'idle';
        $critiqueStatusStr = isset($row['critique_status']) ? (string) $row['critique_status'] : 'idle';
        $createdAtStr = isset($row['created_at']) ? (string) $row['created_at'] : 'now';
        $updatedAtStr = isset($row['updated_at']) ? (string) $row['updated_at'] : null;

        return new self(
            id: $id,
            title: $title,
            briefing: $briefing,
            model: $model,
            collections: $collections,
            contextLimit: $contextLimit,
            generationStatus: GenerationStatus::from($generationStatusStr),
            critiqueStatus: CritiqueStatus::from($critiqueStatusStr),
            authorProfileId: isset($row['author_profile_id']) ? (int) $row['author_profile_id'] : null,
            contractId: isset($row['contract_id']) ? (int) $row['contract_id'] : null,
            structureId: isset($row['structure_id']) ? (int) $row['structure_id'] : null,
            createdAt: new \DateTimeImmutable($createdAtStr),
            updatedAt: $updatedAtStr !== null ? new \DateTimeImmutable($updatedAtStr) : null,
            latestVersionId: isset($row['latest_version_id']) ? (int) $row['latest_version_id'] : null,
            authorProfileName: isset($row['author_profile_name']) ? (string) $row['author_profile_name'] : null,
            contractName: isset($row['contract_name']) ? (string) $row['contract_name'] : null,
            structureName: isset($row['structure_name']) ? (string) $row['structure_name'] : null,
        );
    }

    /**
     * Parse comma-separated collections or JSON array.
     *
     * @return array<string>
     */
    private static function parseCollections(mixed $collections): array
    {
        if (is_array($collections)) {
            /** @var array<mixed> $collections */
            return array_values(array_map(fn(mixed $v): string => (string) $v, $collections));
        }

        if (!is_string($collections) || $collections === '') {
            return [];
        }

        // Try JSON first
        $decoded = json_decode($collections, true);
        if (is_array($decoded)) {
            return array_values(array_map(fn(mixed $v): string => (string) $v, $decoded));
        }

        // Fall back to comma-separated
        return array_values(array_filter(array_map('trim', explode(',', $collections))))
    }

    /**
     * Check if generation can be started.
     */
    public function canStartGeneration(): bool
    {
        return $this->generationStatus->canStart();
    }

    /**
     * Check if critique can be started.
     */
    public function canStartCritique(): bool
    {
        return $this->critiqueStatus->canStart() && $this->latestVersionId !== null;
    }
}

Vollständig herunterladen

Aktionen

Herunterladen

Andere Versionen dieser Datei

ID Version Typ Größe Datum
1225 4 modified 4.3 KB 2025-12-25 10:50
1224 3 modified 4.3 KB 2025-12-25 10:50
1223 2 modified 4.3 KB 2025-12-25 10:50
1217 1 modified 3.4 KB 2025-12-25 10:49

← Zurück zur Übersicht