From 5688b3a0df7c358af646dbc726d1efe285cf7afb Mon Sep 17 00:00:00 2001 From: Brock H Caldwell Date: Sat, 3 May 2025 11:53:23 -0500 Subject: [PATCH] feat: button to add movie monitor --- assets/controllers/monitor_controller.js | 24 ++++++++++ src/Controller/DownloadController.php | 15 +++++++ src/Controller/SearchController.php | 6 +-- .../Action/Command/AddMovieMonitorCommand.php | 16 +++++++ .../Action/Handler/AddMovieMonitorHandler.php | 45 +++++++++++++++++++ .../Action/Input/AddMovieMonitorInput.php | 31 +++++++++++++ .../Action/Result/AddMovieMonitorResult.php | 13 ++++++ templates/components/Header.html.twig | 2 +- templates/search/result.html.twig | 21 +++++++-- 9 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 assets/controllers/monitor_controller.js create mode 100644 src/Download/Action/Command/AddMovieMonitorCommand.php create mode 100644 src/Download/Action/Handler/AddMovieMonitorHandler.php create mode 100644 src/Download/Action/Input/AddMovieMonitorInput.php create mode 100644 src/Download/Action/Result/AddMovieMonitorResult.php diff --git a/assets/controllers/monitor_controller.js b/assets/controllers/monitor_controller.js new file mode 100644 index 0000000..ee6bb8c --- /dev/null +++ b/assets/controllers/monitor_controller.js @@ -0,0 +1,24 @@ +import { Controller } from '@hotwired/stimulus'; + +/* +* The following line makes this controller "lazy": it won't be downloaded until needed +* See https://github.com/symfony/stimulus-bridge#lazy-controllers +*/ +/* stimulusFetch: 'lazy' */ +export default class extends Controller { + static values = { + title: String, + tmdbId: String, + imdbId: String, + mediaType: String, + } + + addMovieMonitor() { + console.log(`/monitor/movies/${this.tmdbIdValue}/${this.imdbIdValue}/${encodeURI(this.titleValue)}`) + fetch(`/monitor/movies/${this.tmdbIdValue}/${this.imdbIdValue}/${encodeURI(this.titleValue)}`) + .then(res => res.json()) + .then(json => { + console.log(json) + }) + } +} diff --git a/src/Controller/DownloadController.php b/src/Controller/DownloadController.php index 18579e4..f0d0862 100644 --- a/src/Controller/DownloadController.php +++ b/src/Controller/DownloadController.php @@ -2,6 +2,9 @@ namespace App\Controller; +use App\Download\Action\Command\AddMovieMonitorCommand; +use App\Download\Action\Handler\AddMovieMonitorHandler; +use App\Download\Action\Input\AddMovieMonitorInput; use App\Download\Action\Input\DownloadMediaInput; use App\Download\Framework\Repository\DownloadRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -37,4 +40,16 @@ class DownloadController extends AbstractController return $this->json(['status' => 200, 'message' => 'Added to Queue']); } + + #[Route('/monitor/movies/{tmdbId}/{imdbId}/{title}', name: 'app_add_movie_monitor', methods: ['GET', 'POST'])] + public function addMonitor( + AddMovieMonitorInput $input, + AddMovieMonitorHandler $handler, + ) { + $handler->handle($input->toCommand()); + return $this->json([ + 'status' => 200, + 'message' => $input + ]); + } } diff --git a/src/Controller/SearchController.php b/src/Controller/SearchController.php index 1b7ed03..3d5f55c 100644 --- a/src/Controller/SearchController.php +++ b/src/Controller/SearchController.php @@ -37,8 +37,8 @@ final class SearchController extends AbstractController ): Response { $cacheId = sprintf("page.%s.%s", $input->mediaType, $input->tmdbId); - return $cache->get($cacheId, function (ItemInterface $item) use ($input) { - $item->expiresAt(new \DateTimeImmutable("today 11:59 pm")); +// return $cache->get($cacheId, function (ItemInterface $item) use ($input) { +// $item->expiresAt(new \DateTimeImmutable("today 11:59 pm")); $result = $this->getMediaInfoHandler->handle($input->toCommand()); return $this->render('search/result.html.twig', [ 'results' => $result, @@ -51,6 +51,6 @@ final class SearchController extends AbstractController 'episode' => '' ] ]); - }); +// }); } } diff --git a/src/Download/Action/Command/AddMovieMonitorCommand.php b/src/Download/Action/Command/AddMovieMonitorCommand.php new file mode 100644 index 0000000..55837eb --- /dev/null +++ b/src/Download/Action/Command/AddMovieMonitorCommand.php @@ -0,0 +1,16 @@ + */ +readonly class AddMovieMonitorHandler implements HandlerInterface +{ + public function __construct( + private MovieMonitorRepository $movieMonitorRepository, + private UserRepository $userRepository, + ) {} + + public function handle(CommandInterface $command): ResultInterface + { + $user = $this->userRepository->findOneBy(['email' => $command->userEmail]); + $monitor = new MovieMonitor(); + $monitor->setTmdbId($command->tmdbId); + $monitor->setImdbId($command->imdbId); + $monitor->setTitle($command->title); + $monitor->setUser($user); + $monitor->setCreatedAt(new DateTimeImmutable()); + $monitor->setSearchCount(0); + $monitor->setStatus('New'); + + $this->movieMonitorRepository->getEntityManager()->persist($monitor); + $this->movieMonitorRepository->getEntityManager()->flush(); + + return new MonitorMovieResult( + status: 'OK', + result: [ + 'monitor' => $monitor, + ] + ); + } +} diff --git a/src/Download/Action/Input/AddMovieMonitorInput.php b/src/Download/Action/Input/AddMovieMonitorInput.php new file mode 100644 index 0000000..16773eb --- /dev/null +++ b/src/Download/Action/Input/AddMovieMonitorInput.php @@ -0,0 +1,31 @@ +userEmail, $this->title, $this->tmdbId, $this->imdbId); + } +} diff --git a/src/Download/Action/Result/AddMovieMonitorResult.php b/src/Download/Action/Result/AddMovieMonitorResult.php new file mode 100644 index 0000000..5f510a8 --- /dev/null +++ b/src/Download/Action/Result/AddMovieMonitorResult.php @@ -0,0 +1,13 @@ + -
+
diff --git a/templates/search/result.html.twig b/templates/search/result.html.twig index 3b790da..70a3ff4 100644 --- a/templates/search/result.html.twig +++ b/templates/search/result.html.twig @@ -10,9 +10,24 @@
-

- {{ results.media.title }} - {{ results.media.year }} -

+
+

+ {{ results.media.title }} - {{ results.media.year }} +

+ +

{{ results.media.description }}