diff --git a/src/Controller/Admin/TagRebuildStreamController.php b/src/Controller/Admin/TagRebuildStreamController.php index 7570aa2..2d686b7 100644 --- a/src/Controller/Admin/TagRebuildStreamController.php +++ b/src/Controller/Admin/TagRebuildStreamController.php @@ -4,19 +4,17 @@ declare(strict_types=1); namespace App\Controller\Admin; -use App\Entity\TagRebuildJob; -use Doctrine\ORM\EntityManagerInterface; +use App\Service\TagRebuildStatusProvider; use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\Routing\Attribute\Route; final class TagRebuildStreamController { #[Route('/admin/tags/rebuild/stream', name: 'admin_tags_rebuild_stream')] - public function stream(EntityManagerInterface $em): StreamedResponse + public function stream(TagRebuildStatusProvider $provider): StreamedResponse { - $response = new StreamedResponse(function () use ($em) { + $response = new StreamedResponse(function () use ($provider) { - // Sofort erstes Event senden (wichtig!) echo "event: ping\n"; echo "data: " . json_encode(['init' => true]) . "\n\n"; @@ -25,24 +23,11 @@ final class TagRebuildStreamController while (!connection_aborted()) { - $em->clear(); + $data = $provider->getLatestStatus(); - $job = $em->createQueryBuilder() - ->select('j') - ->from(TagRebuildJob::class, 'j') - ->orderBy('j.createdAt', 'DESC') - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - - if ($job) { + if ($data !== null) { echo "event: message\n"; - echo "data: " . json_encode([ - 'status' => $job->getStatus(), - 'startedAt' => $job->getStartedAt()?->format(DATE_ATOM), - 'finishedAt' => $job->getFinishedAt()?->format(DATE_ATOM), - 'error' => $job->getErrorMessage(), - ]) . "\n\n"; + echo "data: " . json_encode($data) . "\n\n"; @ob_flush(); @flush(); @@ -55,7 +40,7 @@ final class TagRebuildStreamController $response->headers->set('Content-Type', 'text/event-stream'); $response->headers->set('Cache-Control', 'no-cache'); $response->headers->set('Connection', 'keep-alive'); - $response->headers->set('X-Accel-Buffering', 'no'); // 🔥 wichtig bei nginx + $response->headers->set('X-Accel-Buffering', 'no'); return $response; } diff --git a/src/Service/TagRebuildStatusProvider.php b/src/Service/TagRebuildStatusProvider.php new file mode 100644 index 0000000..6154191 --- /dev/null +++ b/src/Service/TagRebuildStatusProvider.php @@ -0,0 +1,39 @@ +em->clear(); + + $job = $this->em->createQueryBuilder() + ->select('j') + ->from(TagRebuildJob::class, 'j') + ->orderBy('j.createdAt', 'DESC') + ->setMaxResults(1) + ->getQuery() + ->getOneOrNullResult(); + + if (!$job instanceof TagRebuildJob) { + return null; + } + + return [ + 'status' => $job->getStatus(), + 'startedAt' => $job->getStartedAt()?->format(DATE_ATOM), + 'finishedAt' => $job->getFinishedAt()?->format(DATE_ATOM), + 'error' => $job->getErrorMessage(), + ]; + } +} \ No newline at end of file