/// <summary> /// Get movies for the provider /// </summary> /// <returns><see cref="ProviderMovies"/></returns> public virtual ProviderMovies GetMovies() { return(_cacheProvider.GetCacheEntry($"{this.Name + "_Movies"}", () => { var movies = _moviesProviderClient.Get <MoviesCollection>(_url + "movies")?.Result; if (movies != null) { var providerMovies = new ProviderMovies(_movieProvider); movies.Movies.OrderBy(movie => movie.Title).ToList() .ForEach(movie => providerMovies.Movies.Add(movie)); return providerMovies; } return null; })); //var providerMovies = new ProviderMovies(this.Name); //providerMovies.Movies.AddRange(new List<Movie>() //{ // new Movie { ID = "1", Title = "The return of the Jedi" } //}); //return providerMovies; }
/// <summary> /// Get cheapest deal for a movie from all providers /// </summary> /// <param name="title">The title words of the movie</param> /// <returns><see cref="Task{IEnumerable{ProviderMovie}}"/></returns> public async Task <IEnumerable <ProviderMovie> > GetCheapestDeal(string title) { return(await Task.Run(() => { try { var moviesFromAllProviders = new ConcurrentBag <ProviderMovies>(); //Get all movies Parallel.ForEach(_movieProviders, provider => { try { var movies = provider.GetMovies(); if (movies != null) { moviesFromAllProviders.Add(movies); } Console.WriteLine($"Successfully got movies from Provider {provider.Name.ToString()}."); } catch (Exception ex) { Console.WriteLine($"Failed to get movies from Provider {provider.Name.ToString()}. {ex.Message}"); } }); //Get movies that match the title var foundMoviesFromProviders = moviesFromAllProviders.Select(providerMovies => { var p = new ProviderMovies(providerMovies.Name); p.Movies.AddRange(providerMovies.Movies.Where(m => m.Title.ToLower().Contains(title.ToLower()))); return p; }); var movieDetailsFromProviders = new ConcurrentBag <ProviderMovie>(); //Get all movie details for found movies Parallel.ForEach(foundMoviesFromProviders, providerMovies => { Parallel.ForEach(providerMovies.Movies, movie => { try { var m = _movieProviders.Single(x => x.Name == providerMovies.Name).GetMovie(movie.ID); if (m != null && m.Movie != null) { movieDetailsFromProviders.Add(m); } Console.WriteLine($"Successfully got movie details from Provider {providerMovies.Name.ToString()}."); } catch (Exception ex) { Console.WriteLine($"Failed to get movie details for { movie.ID } from Provider {providerMovies.Name.ToString()}. {ex.Message}"); } }); }); var distinctMovies = movieDetailsFromProviders.Distinct(new MovieEqualityComparer()); return distinctMovies.GroupBy(x => x.Movie.Title) .Select(g => g.MinBy(x => decimal.Parse(x.Movie.Price))) .OrderBy(x => x.Movie.Title) .ToList(); } catch (Exception ex) { Console.WriteLine($"Failed to get cheapest deal movies. {ex.Message}"); return new List <ProviderMovie>(); } })); }