fix: scopes alerts to user session

This commit is contained in:
2025-05-12 22:04:10 -05:00
parent 4653feb123
commit 217a667df2
6 changed files with 20 additions and 11 deletions

View File

@@ -5,6 +5,7 @@ namespace App\Controller;
use App\Download\Action\Input\DownloadMediaInput; use App\Download\Action\Input\DownloadMediaInput;
use App\Download\Framework\Repository\DownloadRepository; use App\Download\Framework\Repository\DownloadRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mercure\HubInterface; use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update; use Symfony\Component\Mercure\Update;
@@ -21,6 +22,7 @@ class DownloadController extends AbstractController
#[Route('/download', name: 'app_download', methods: ['POST'])] #[Route('/download', name: 'app_download', methods: ['POST'])]
public function download( public function download(
Request $request,
DownloadMediaInput $input, DownloadMediaInput $input,
): Response { ): Response {
$download = $this->downloadRepository->insert( $download = $this->downloadRepository->insert(
@@ -44,11 +46,11 @@ class DownloadController extends AbstractController
} }
$this->hub->publish(new Update( $this->hub->publish(new Update(
'alerts', $request->getSession()->get('mercure_alert_topic'),
$this->renderView('broadcast/Alert.stream.html.twig', [ $this->renderView('broadcast/Alert.stream.html.twig', [
'alert_id' => uniqid(), 'alert_id' => uniqid(),
'title' => 'Success', 'title' => 'Success',
'message' => 'Added to Queue', 'message' => '"' . $input->title . '" added to Queue',
]) ])
)); ));

View File

@@ -5,6 +5,7 @@ namespace App\Controller;
use App\Download\Framework\Repository\DownloadRepository; use App\Download\Framework\Repository\DownloadRepository;
use App\Tmdb\Tmdb; use App\Tmdb\Tmdb;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Attribute\Route;
@@ -16,9 +17,10 @@ final class IndexController extends AbstractController
) {} ) {}
#[Route('/', name: 'app_index')] #[Route('/', name: 'app_index')]
public function index(): Response public function index(Request $request): Response
{ {
// dd($this->getUser()->getActiveDownloads()); $request->getSession()->set('mercure_alert_topic', 'alerts_' . uniqid());
return $this->render('index/index.html.twig', [ return $this->render('index/index.html.twig', [
'active_downloads' => $this->getUser()->getActiveDownloads(), 'active_downloads' => $this->getUser()->getActiveDownloads(),
'recent_downloads' => $this->getUser()->getDownloads(), 'recent_downloads' => $this->getUser()->getDownloads(),

View File

@@ -8,6 +8,7 @@ use App\Torrentio\Action\Input\GetMovieOptionsInput;
use App\Torrentio\Action\Input\GetTvShowOptionsInput; use App\Torrentio\Action\Input\GetTvShowOptionsInput;
use Carbon\Carbon; use Carbon\Carbon;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mercure\HubInterface; use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update; use Symfony\Component\Mercure\Update;
@@ -63,7 +64,7 @@ final class TorrentioController extends AbstractController
} }
#[Route('/torrentio/tvshows/clear/{tmdbId}/{imdbId}/{season?}/{episode?}', name: 'app_clear_torrentio_tvshows')] #[Route('/torrentio/tvshows/clear/{tmdbId}/{imdbId}/{season?}/{episode?}', name: 'app_clear_torrentio_tvshows')]
public function clearTvShowOptions(GetTvShowOptionsInput $input, CacheInterface $cache): Response public function clearTvShowOptions(GetTvShowOptionsInput $input, CacheInterface $cache, Request $request): Response
{ {
$cacheId = sprintf( $cacheId = sprintf(
"page.torrentio.tvshows.%s.%s.%s.%s", "page.torrentio.tvshows.%s.%s.%s.%s",
@@ -75,7 +76,7 @@ final class TorrentioController extends AbstractController
$cache->delete($cacheId); $cache->delete($cacheId);
$this->hub->publish(new Update( $this->hub->publish(new Update(
'alerts', $request->getSession()->get('mercure_alert_topic'),
$this->renderer->render('Alert.stream.html.twig', [ $this->renderer->render('Alert.stream.html.twig', [
'alert_id' => uniqid(), 'alert_id' => uniqid(),
'title' => 'Success', 'title' => 'Success',

View File

@@ -25,23 +25,27 @@ class DownloadRepository extends ServiceEntityRepository
$this->paginator = $paginator; $this->paginator = $paginator;
} }
public function getCompletePaginated(int $pageNumber = 1, int $perPage = 10) public function getCompletePaginated(UserInterface $user, int $pageNumber = 1, int $perPage = 10)
{ {
$query = $this->createQueryBuilder('d') $query = $this->createQueryBuilder('d')
->andWhere('d.status IN (:statuses)') ->andWhere('d.status IN (:statuses)')
->andWhere('d.user = :user')
->orderBy('d.id', 'DESC') ->orderBy('d.id', 'DESC')
->setParameter('statuses', ['Complete']) ->setParameter('statuses', ['Complete'])
->setParameter('user', $user)
->getQuery(); ->getQuery();
return $this->paginator->paginate($query, $pageNumber, $perPage); return $this->paginator->paginate($query, $pageNumber, $perPage);
} }
public function getActivePaginated(int $pageNumber = 1, int $perPage = 5) public function getActivePaginated(UserInterface $user, int $pageNumber = 1, int $perPage = 5)
{ {
$query = $this->createQueryBuilder('d') $query = $this->createQueryBuilder('d')
->andWhere('d.status IN (:statuses)') ->andWhere('d.status IN (:statuses)')
->andWhere('d.user = :user')
->orderBy('d.id', 'ASC') ->orderBy('d.id', 'ASC')
->setParameter('statuses', ['New', 'In Progress']) ->setParameter('statuses', ['New', 'In Progress'])
->setParameter('user', $user)
->getQuery(); ->getQuery();
return $this->paginator->paginate($query, $pageNumber, $perPage); return $this->paginator->paginate($query, $pageNumber, $perPage);

View File

@@ -22,9 +22,9 @@ final class DownloadList extends AbstractController
public function getDownloads() public function getDownloads()
{ {
if ($this->type === "active") { if ($this->type === "active") {
return $this->downloadRepository->getActivePaginated(); return $this->downloadRepository->getActivePaginated($this->getUser());
} elseif ($this->type === "complete") { } elseif ($this->type === "complete") {
return $this->downloadRepository->getCompletePaginated(); return $this->downloadRepository->getCompletePaginated($this->getUser());
} }
return []; return [];

View File

@@ -16,7 +16,7 @@
</div> </div>
</div> </div>
</div> </div>
<div {{ turbo_stream_listen('alerts') }} class="absolute top-10 right-10"> <div {{ turbo_stream_listen(app.session.get('mercure_alert_topic')) }} class="absolute top-10 right-10">
<div > <div >
<ul id="alert_list"> <ul id="alert_list">
</ul> </ul>