private void ThrowIfMovieNull(Movie movie)
 {
     if (movie == null)
         throw new ArgumentNullException(nameof(movie));
     if (string.IsNullOrEmpty(movie.Title))
         throw new ArgumentNullException(nameof(movie.Title));
     if (string.IsNullOrEmpty(movie.Id))
         throw new ArgumentNullException(nameof(movie.Id));
 }
 public async Task AddWithRelationToPerson(Movie movie, Person existingPerson, string relationType)
 {
     await _db.PersonMatch()
         .Where((Person person) => person.Name == existingPerson.Name)
         .CreateUnique(
             $"person-[:{relationType}]->(movie:Movie {{newMovie}})")
         .WithParam("newMovie", movie)
         .ExecuteWithoutResultsAsync();
 }
 public async Task UpdateMovieAsync(Movie movie)
 {
     ThrowIfMovieNull(movie);
     if ((await GetMovieByTitleAndYearAsync(movie.Title, movie.Year)) == null)
     {
         await AddMovieAsync(movie);
         return;
     }
     await _movieRepo.Update(movie);
 }
 public async Task AddOrUpdateMovieWithRelationAsync(Movie movie, Person person, string relationType)
 {
     ThrowIfMovieNull(movie);
     ThrowIfPersonNull(person);
     if ((await GetMovieByTitleAndYearAsync(movie.Title, movie.Year)) == null)
     {
         await _movieRepo.AddWithRelationToPerson(movie, person, relationType);
         return;
     }
     //await UpdateMovieAsync(movie);
     await _movieRepo.AddRelationToPerson(movie, person, relationType);
 }
 public async Task Update(Movie updatedMovie)
 {
     var query = _db.MovieMerge()
         .Where((Movie movie) => movie.Id == updatedMovie.Id)
         .OnCreate()
         .Set("movie = {_updatedMovie}")
         .WithParams(new
         {
             _updatedMovie = updatedMovie
         });
     var q = query.Query;
     await query.ExecuteWithoutResultsAsync();
 }
        public async Task<IActionResult> AddMovie()
        {
            Movie movie = new Movie
            {
                Title = "Awesome Movie",
                Year = "2014",
                Id = "12345"
            };

            await
                _movieService.AddOrUpdateMovieWithRelationAsync(movie,
                   (await _personService.GetPersonByNameAsync("Will Czifro")), RelationTypes.ActedIn);
            var m = await _movieService.GetMovieByTitleAndYearAsync(movie.Title, movie.Year);

            return Ok(m);
        }
        public async Task <IActionResult> AddMovie()
        {
            Movie movie = new Movie
            {
                Title = "Awesome Movie",
                Year  = "2014",
                Id    = "12345"
            };

            await
            _movieService.AddOrUpdateMovieWithRelationAsync(movie,
                                                            (await _personService.GetPersonByNameAsync("Will Czifro")), RelationTypes.ActedIn);

            var m = await _movieService.GetMovieByTitleAndYearAsync(movie.Title, movie.Year);

            return(Ok(m));
        }
        private static void MovieCollector(IMovieService movieService, IPersonService personService,
                                           MyApiFilmsClient client, ConcurrentQueue queue)
        {
            while (queue.IncompleteMoviesWaiting() || queue.IncompletePersonsWaiting())
            {
                if (!queue.IncompleteMoviesWaiting())
                {
                    continue;
                }
                // ApiMovie is an alias for FilmIndustryNetwork.MyApiFilms.Entities.Movie
                // This is to distinguish between FilmIndustryNetwork.MyApiFilms.Entities.Movie
                // and FilmIndustryNetwork.Entities.Movie
                ApiMovie apiMovie;
                var      title = queue.PopIncompleteMovie();

                if (title == "---")
                {
                    continue;
                }

                try
                {
                    apiMovie =
                        client.GetDataAsObject <MovieResponse>(title, DataSetType.Movie)?.Data?.Movies?.FirstOrDefault();

                    if (apiMovie == null)
                    {
                        throw new Exception();
                    }

                    if (apiMovie.Type.Contains("TV"))
                    {
                        continue;
                    }
                }
                catch (MyApiFilmsTimeoutException e)
                {
                    // TODO: setup logging
                    FillQueueFromList(movieService, null, new [] { title }, queue, 0);
                    continue;
                }
                catch (NoMyApiFilmsResponseException e)
                {
                    // TODO: setup logging
                    continue;
                }
                catch (Exception)
                {
                    // TODO: setup logging
                    FillQueueFromList(movieService, null, new[] { title }, queue, 0);
                    continue;
                }

                var newMovie = new Movie
                {
                    Countries        = apiMovie.Countries,
                    FilmingLocations = apiMovie.FilmingLocations,
                    Genres           = apiMovie.Genres,
                    Id             = apiMovie.IdIMDB,
                    Languages      = apiMovie.Languages,
                    Plot           = apiMovie.Plot,
                    NeedsApiLookup = false,
                    Rated          = apiMovie.Rated,
                    Rating         = apiMovie.Rating,
                    Title          = apiMovie.Title,
                    Year           = apiMovie.Year
                };

                FillQueueFromList(null, personService, apiMovie.Actors.Select(x => x.ActorName).ToList(), queue, 1);
                FillQueueFromList(null, personService, apiMovie.Directors.Select(x => x.Name).ToList(), queue, 1);
                FillQueueFromList(null, personService, apiMovie.Writers.Select(x => x.Name).ToList(), queue, 1);

                AddRelationshipsToQueue(new[] { apiMovie.IdIMDB }, apiMovie.Actors.Select(x => x.ActorName).ToList(), queue,
                                        RelationTypes.ActedIn);
                AddRelationshipsToQueue(new[] { apiMovie.IdIMDB }, apiMovie.Directors.Select(x => x.Name).ToList(), queue,
                                        RelationTypes.DirectorFor);
                AddRelationshipsToQueue(new[] { apiMovie.IdIMDB }, apiMovie.Writers.Select(x => x.Name).ToList(), queue,
                                        RelationTypes.WriterOf);

                var existingMovie = movieService.GetMovieByIdAsync(newMovie.Id).Result;

                if (existingMovie != null)
                {
                    continue;
                }

                movieService.AddMovieAsync(newMovie).Wait();
            }
        }
        public async Task AddRelationToPerson(Movie existingMovie, Person existingPerson, string relationType)
        {
            var query = _db.Match($"(movie:Movie)",
                $"(person:Person)")
                .Where((Movie movie) => movie.Title == existingMovie.Title)
                .AndWhere((Person person) => person.Name == existingPerson.Name)
                .CreateUnique(
                    $"person-[:{relationType}]->movie");

            var q = query.Query;
            await query.ExecuteWithoutResultsAsync();

        }
 public async Task Add(Movie movie)
 {
     await _db.MovieCreate()
         .WithParam("newMovie", movie)
         .ExecuteWithoutResultsAsync();
 }
 public async Task AddMovieAsync(Movie movie)
 {
     ThrowIfMovieNull(movie);
     await _movieRepo.Add(movie);
 }
        private static void MovieCollector(IMovieService movieService, IPersonService personService, 
            MyApiFilmsClient client, ConcurrentQueue queue)
        {
            while (queue.IncompleteMoviesWaiting() || queue.IncompletePersonsWaiting())
            {
                if (!queue.IncompleteMoviesWaiting()) continue;
                // ApiMovie is an alias for FilmIndustryNetwork.MyApiFilms.Entities.Movie
                // This is to distinguish between FilmIndustryNetwork.MyApiFilms.Entities.Movie
                // and FilmIndustryNetwork.Entities.Movie
                ApiMovie apiMovie;
                var title = queue.PopIncompleteMovie();

                if (title == "---") continue;

                try
                {
                    apiMovie =
                        client.GetDataAsObject<MovieResponse>(title, DataSetType.Movie)?.Data?.Movies?.FirstOrDefault();

                    if (apiMovie == null) throw new Exception();

                    if (apiMovie.Type.Contains("TV")) continue;
                }
                catch (MyApiFilmsTimeoutException e)
                {
                    // TODO: setup logging
                    FillQueueFromList(movieService, null, new [] {title}, queue, 0);
                    continue;
                }
                catch (NoMyApiFilmsResponseException e)
                {
                    // TODO: setup logging
                    continue;
                }
                catch (Exception)
                {
                    // TODO: setup logging
                    FillQueueFromList(movieService, null, new[] { title }, queue, 0);
                    continue;
                }

                var newMovie = new Movie
                {
                    Countries = apiMovie.Countries,
                    FilmingLocations = apiMovie.FilmingLocations,
                    Genres = apiMovie.Genres,
                    Id = apiMovie.IdIMDB,
                    Languages = apiMovie.Languages,
                    Plot = apiMovie.Plot,
                    NeedsApiLookup = false,
                    Rated = apiMovie.Rated,
                    Rating = apiMovie.Rating,
                    Title = apiMovie.Title,
                    Year = apiMovie.Year
                };

                FillQueueFromList(null, personService, apiMovie.Actors.Select(x => x.ActorName).ToList(), queue, 1);
                FillQueueFromList(null, personService, apiMovie.Directors.Select(x => x.Name).ToList(), queue, 1);
                FillQueueFromList(null, personService, apiMovie.Writers.Select(x => x.Name).ToList(), queue, 1);

                AddRelationshipsToQueue(new[] {apiMovie.IdIMDB}, apiMovie.Actors.Select(x => x.ActorName).ToList(), queue,
                    RelationTypes.ActedIn);
                AddRelationshipsToQueue(new[] {apiMovie.IdIMDB}, apiMovie.Directors.Select(x => x.Name).ToList(), queue,
                    RelationTypes.DirectorFor);
                AddRelationshipsToQueue(new[] {apiMovie.IdIMDB}, apiMovie.Writers.Select(x => x.Name).ToList(), queue,
                    RelationTypes.WriterOf);

                var existingMovie = movieService.GetMovieByIdAsync(newMovie.Id).Result;

                if (existingMovie != null) continue;

                movieService.AddMovieAsync(newMovie).Wait();
            }
        }