PipelineRunStatusUseCase.php
- Pfad:
src/UseCases/Pipeline/PipelineRunStatusUseCase.php - Namespace: UseCases\Pipeline
- Zeilen: 99 | Größe: 3,351 Bytes
- Geändert: 2025-12-27 23:15:59 | Gescannt: 2025-12-31 10:22:15
Code Hygiene Score: 100
- Dependencies: 100 (25%)
- LOC: 100 (20%)
- Methods: 100 (20%)
- Secrets: 100 (15%)
- Classes: 100 (10%)
- Magic Numbers: 100 (10%)
Keine Issues gefunden.
Dependencies 3
- constructor Domain\Repository\PipelineRepositoryInterface
- use Domain\Constants
- use Domain\Repository\PipelineRepositoryInterface
Klassen 1
-
PipelineRunStatusUseCaseclass Zeile 12
Funktionen 4
-
__construct()public Zeile 14 -
execute()public Zeile 26 -
buildStatusData()private Zeile 43 -
calculateEta()private Zeile 87
Verwendet von 2
- ContentPipelineController.php constructor
- ContentPipelineController.php use
Versionen 7
-
v7
2025-12-27 23:15 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v6
2025-12-27 23:15 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v5
2025-12-27 23:15 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v4
2025-12-23 08:16 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v3
2025-12-23 07:56 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v2
2025-12-23 05:10 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v1
2025-12-23 05:10 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
Code
<?php
declare(strict_types=1);
namespace UseCases\Pipeline;
// @responsibility: Ermittelt Pipeline-Status mit Fortschritt und ETA
use Domain\Constants;
use Domain\Repository\PipelineRepositoryInterface;
class PipelineRunStatusUseCase
{
public function __construct(
private PipelineRepositoryInterface $repository
) {
}
/**
* Get detailed run status with progress calculations.
*
* @param int $pipelineId Pipeline ID
* @param int $runId Run ID
* @return array{success: bool, error?: string, data?: array}
*/
public function execute(int $pipelineId, int $runId): array
{
$run = $this->repository->findRunById($runId);
if ($run === null || (int) $run['pipeline_id'] !== $pipelineId) {
return ['success' => false, 'error' => 'Run nicht gefunden'];
}
return [
'success' => true,
'data' => $this->buildStatusData($run),
];
}
/**
* Build comprehensive status data from run record.
*/
private function buildStatusData(array $run): array
{
$startedAt = strtotime($run['started_at'] ?? 'now');
$elapsed = time() - $startedAt;
$total = (int) ($run['documents_total'] ?? 0);
$processed = (int) ($run['documents_processed'] ?? 0);
$progress = $total > 0 ? min(Constants::PERCENT_FULL, round(($processed / $total) * Constants::PERCENT_FULL)) : 0;
// Cap processed display to not exceed total
$processedDisplay = min($processed, $total);
$estimatedRemaining = $this->calculateEta($elapsed, $processed, $total);
$lastUpdate = strtotime($run['last_update_at'] ?? $run['started_at'] ?? 'now');
$isStalled = (time() - $lastUpdate) > Constants::SECONDS_PER_MINUTE && $run['status'] === 'running';
$isTerminal = in_array($run['status'], ['completed', 'failed', 'cancelled'], true);
return [
'status' => $run['status'],
'current_step' => $run['current_step'],
'current_document' => $run['current_document'],
'documents_total' => $total,
'documents_processed' => $processedDisplay,
'documents_failed' => (int) ($run['documents_failed'] ?? 0),
'chunks_created' => (int) ($run['chunks_created'] ?? 0),
'embeddings_created' => (int) ($run['embeddings_created'] ?? 0),
'progress' => $progress,
'elapsed' => $elapsed,
'elapsed_formatted' => gmdate('i:s', $elapsed),
'estimated_remaining' => $estimatedRemaining,
'estimated_formatted' => $estimatedRemaining !== null ? gmdate('i:s', $estimatedRemaining) : null,
'log_tail' => $run['log_tail'] ?? '',
'is_stalled' => $isStalled,
'is_terminal' => $isTerminal,
'completed_at' => $run['completed_at'],
'error_log' => $run['error_log'],
];
}
/**
* Calculate estimated time remaining.
*/
private function calculateEta(int $elapsed, int $processed, int $total): ?int
{
if ($processed <= 0 || $total <= $processed) {
return null;
}
$avgTimePerDoc = $elapsed / $processed;
$remaining = $total - $processed;
return (int) ($avgTimePerDoc * $remaining);
}
}