move controller service logics into a service
This commit is contained in:
@@ -4,19 +4,17 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace App\Controller\Admin;
|
namespace App\Controller\Admin;
|
||||||
|
|
||||||
use App\Entity\TagRebuildJob;
|
use App\Service\TagRebuildStatusProvider;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
|
||||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
|
|
||||||
final class TagRebuildStreamController
|
final class TagRebuildStreamController
|
||||||
{
|
{
|
||||||
#[Route('/admin/tags/rebuild/stream', name: 'admin_tags_rebuild_stream')]
|
#[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 "event: ping\n";
|
||||||
echo "data: " . json_encode(['init' => true]) . "\n\n";
|
echo "data: " . json_encode(['init' => true]) . "\n\n";
|
||||||
|
|
||||||
@@ -25,24 +23,11 @@ final class TagRebuildStreamController
|
|||||||
|
|
||||||
while (!connection_aborted()) {
|
while (!connection_aborted()) {
|
||||||
|
|
||||||
$em->clear();
|
$data = $provider->getLatestStatus();
|
||||||
|
|
||||||
$job = $em->createQueryBuilder()
|
if ($data !== null) {
|
||||||
->select('j')
|
|
||||||
->from(TagRebuildJob::class, 'j')
|
|
||||||
->orderBy('j.createdAt', 'DESC')
|
|
||||||
->setMaxResults(1)
|
|
||||||
->getQuery()
|
|
||||||
->getOneOrNullResult();
|
|
||||||
|
|
||||||
if ($job) {
|
|
||||||
echo "event: message\n";
|
echo "event: message\n";
|
||||||
echo "data: " . json_encode([
|
echo "data: " . json_encode($data) . "\n\n";
|
||||||
'status' => $job->getStatus(),
|
|
||||||
'startedAt' => $job->getStartedAt()?->format(DATE_ATOM),
|
|
||||||
'finishedAt' => $job->getFinishedAt()?->format(DATE_ATOM),
|
|
||||||
'error' => $job->getErrorMessage(),
|
|
||||||
]) . "\n\n";
|
|
||||||
|
|
||||||
@ob_flush();
|
@ob_flush();
|
||||||
@flush();
|
@flush();
|
||||||
@@ -55,7 +40,7 @@ final class TagRebuildStreamController
|
|||||||
$response->headers->set('Content-Type', 'text/event-stream');
|
$response->headers->set('Content-Type', 'text/event-stream');
|
||||||
$response->headers->set('Cache-Control', 'no-cache');
|
$response->headers->set('Cache-Control', 'no-cache');
|
||||||
$response->headers->set('Connection', 'keep-alive');
|
$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;
|
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