From 02009132a4ab55e2372fb16d97dd243ad6a9b303 Mon Sep 17 00:00:00 2001 From: DoarMihai Date: Tue, 31 Dec 2024 00:51:40 +0200 Subject: [PATCH] [#7] upcoming --- .../FetchUpcomingMoviesCommand.php | 112 ++++++++++++++++++ app/Models/UpcomingMovie.php | 12 ++ ...30_222706_create_upcoming_movies_table.php | 28 +++++ 3 files changed, 152 insertions(+) create mode 100644 app/Console/Commands/ItemProcessing/FetchUpcomingMoviesCommand.php create mode 100644 app/Models/UpcomingMovie.php create mode 100644 database/migrations/2024_12_30_222706_create_upcoming_movies_table.php diff --git a/app/Console/Commands/ItemProcessing/FetchUpcomingMoviesCommand.php b/app/Console/Commands/ItemProcessing/FetchUpcomingMoviesCommand.php new file mode 100644 index 0000000..4c3cdc9 --- /dev/null +++ b/app/Console/Commands/ItemProcessing/FetchUpcomingMoviesCommand.php @@ -0,0 +1,112 @@ +moviesApi = $moviesApi; + $this->movieProcessingService = $movieProcessingService; + parent::__construct(); + } + + /** + * Execute the console command. + */ + public function handle() + { + $upcomingMovies = $this->moviesApi->getUpcoming(); + + if (empty($upcomingMovies) || empty($upcomingMovies['results'])) { + return; + } + + try { + DB::beginTransaction(); + $newUpcomingIds = []; + $oldUpcomingIds = UpcomingMovie::all()->pluck('movie_id'); + + foreach ($upcomingMovies['results'] as $upcomingMovie) { + $movie = $this->process($upcomingMovie); + + if ($movie) { + $newUpcomingIds[] = [ + 'movie_id' => $movie->id + ]; + } + } + + if (!empty($newUpcomingIds)) { + UpcomingMovie::whereIn('id', $oldUpcomingIds)->delete(); + UpcomingMovie::insert($newUpcomingIds); + } + + DB::commit(); + } catch (\Throwable $e) { + DB::rollBack(); + } + + } + + private function process(array $upcomingMovie) + { + $movie = Movie::where('tmdb_id', $upcomingMovie['id'])->first(); + + if ($movie) { + return $movie; + } + + $itemToFetch = ItemToFetch::where('tmdb_id', $upcomingMovie['id'])->where('type', $type)->first(); + + if ($itemToFetch) { + $this->movieProcessingService->process($itemToFetch, ItemToFetchJobs::JOB_DETAILS); + return Movie::where('tmdb_id', $upcomingMovie['id'])->first(); + } + + ItemToFetch::create([ + 'tmdb_id' => $upcomingMovie['id'], + 'type' => ItemToFetch::TYPE_MOVIE, + ]); + + $jobs = ItemToFetchJobs::JOBS; + $jobs[] = "Details"; + + ItemToFetchJobs::create([ + 'tmdb_id' => $upcomingMovie['id'], + 'type' => ItemToFetch::TYPE_MOVIE, + 'remaining_jobs' => json_encode($jobs), + ]); + + return null; + } +} diff --git a/app/Models/UpcomingMovie.php b/app/Models/UpcomingMovie.php new file mode 100644 index 0000000..8ab538c --- /dev/null +++ b/app/Models/UpcomingMovie.php @@ -0,0 +1,12 @@ +id(); + $table->unsignedBigInteger('movie_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('upcoming_movies'); + } +};