move controller service logics into a service
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
39
src/Service/TagRebuildStatusProvider.php
Normal file
39
src/Service/TagRebuildStatusProvider.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use App\Entity\TagRebuildJob;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
|
||||
final readonly class TagRebuildStatusProvider
|
||||
{
|
||||
public function __construct(
|
||||
private EntityManagerInterface $em
|
||||
) {}
|
||||
|
||||
public function getLatestStatus(): ?array
|
||||
{
|
||||
$this->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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user