url = config('services.omdb.api_url') . config('services.omdb.api_key'); $this->user = auth()->user(); } public function search(string $query, array $options = []): array|Movie { $searchType = $options["type"] ?? "title"; $result = match ($searchType) { 'imdb' => $this->searchByImdbId($query), 'title' => $this->searchByTitle($query), default => $this->searchByTitle($query), }; return $result; } public function searchByImdbId(string $imdbId) { $movie = Http::get($this->url . "&i=" . $imdbId)->json(); if ($movie['Response'] !== 'True') { throw new NotFoundHttpException("Movie not found"); } try { $existing_movie = $this->movie->where('imdb_id', $movie['imdbID'])->firstOrFail(); return $existing_movie; } catch (Exception $e) { return Movie::fromOmdb(array_merge( $movie, ["added_by" => $this->user->id]) ); } } public function searchByTitle(string $title) { $search_results = Http::get($this->url . "&s=" . $title . "&type=movie")->json(); if ($search_results['Response'] !== 'True') { throw new NotFoundHttpException("Movie not found"); } $movies = []; foreach ($search_results['Search'] as $result) { $movies[] = [ 'title' => $result['Title'] ?? "", 'year' => $result['Year'] ?? "", 'imdb_id' => $result['imdbID'] ?? "", 'type' => $result['Type'] ?? "", 'poster' => $result['Poster'] ?? "" ]; } return $movies; } }