public Task <List <Movie> > SearchMovies(MovieSearchFilters filter) { try { var movies = (from M in _movieDBContext.Movies join MG in _movieDBContext.MovieGenres on M.Id equals MG.MovieId join G in _movieDBContext.Genres on MG.GenreId equals G.Id where (filter.yearOfRelease <= 0 || M.ReleaseYear == filter.yearOfRelease) && (string.IsNullOrEmpty(filter.title) || M.Title.Contains(filter.title)) && (filter == null || filter.generes == null || filter.generes.Count <= 0 || filter.generes.Any(x => x.ToLower().Trim() == G.Name.ToLower().Trim())) select new Movie { Id = M.Id, Title = M.Title, ReleaseYear = M.ReleaseYear, Runningtime = M.Runningtime, AverageRating = M.AverageRating })?.ToList(); var distinctMovies = movies .GroupBy(x => x.Id) .Select(x => x.First())?.ToList(); return(Task.FromResult(distinctMovies)); } catch (Exception ex) { throw ex; } }
public async Task <IActionResult> SearchMovies([FromBody] MovieSearchFilters filter) { try { _logger.LogInformation("Information is logged, In SearchMovies() API call with filter=" + JsonConvert.SerializeObject(filter)); if (filter == null || ((filter.generes == null || filter.generes.Count <= 0) && string.IsNullOrEmpty(filter.title) && filter.yearOfRelease <= 0)) { return(BadRequest("No search criteria given")); // Returns HttpStatusCode = 400 } var movies = await _movieApiRepository.SearchMovies(filter); var movieDtos = _mapper.Map <List <MoviesDto> >(movies); foreach (MoviesDto moviesDto in movieDtos) { moviesDto.Generes = string.Join(", ", _genreDataRepository.GetGenres(moviesDto.Id)?.Select(x => x.Name)); } if (movieDtos != null && movieDtos.Any()) { return(Ok(movieDtos)); // Returns HttpStatusCode = 200 } else { return(NotFound("No movie found based on the criteria")); // Returns HttpStatusCode = 404 } } catch (Exception ex) { _logger.LogError("Error occured in SearchMovies() API call." + "\n" + ex.Message + "\n" + ex.StackTrace + "\n" + ex.InnerException); throw ex; } }