private void ThrowIfPersonNull(Person person)
 {
     if (person == null)
         throw new ArgumentNullException(nameof(person));
     if (string.IsNullOrEmpty(person.Name))
         throw new ArgumentNullException(nameof(person.Name));
     if (string.IsNullOrEmpty(person.Id))
         throw new ArgumentNullException(nameof(person.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 AddPersonAsync(Person person)
 {
     ThrowIfPersonNull(person);
     if ((await GetPersonByNameAsync(person.Name)) != null)
     {
         await UpdatePersonAsync(person);
         return;
     }
     await _personRepo.Add(person);
 }
        public async Task<List<MixedResult>> GetDegreesOfSeparation(Person startingPerson, Person endingPerson)
        {
            if (startingPerson == null)
                throw new ArgumentNullException(nameof(startingPerson));
            if (endingPerson == null)
                throw new ArgumentNullException(nameof(endingPerson));

            var results = await _personRepo.GetPath(startingPerson, endingPerson);
            var r = results;
            return r;
        }
 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(Person updatedPerson)
 {
     await _db.PersonMerge()
         .Where((Person person) => person.Id == updatedPerson.Id)
         .OnCreate()
         .Set("person = {_updatedPerson}")
         .WithParams(new
         {
             _updatedPerson = updatedPerson
         })
         .ExecuteWithoutResultsAsync();
 }
        public async Task<IActionResult> AddActor()
        {
            Person p = new Person
            {
                Name = "Aiden Buckles",
                Id = "2345"
            };

            await _personService.AddPersonAsync(p);
            var r = await _personService.GetPersonByNameAsync("Will Czifro");

            return Ok(r);
        }
        public Task<List<MixedResult>> GetPath(Person startingPerson, Person endingPerson)
        {
            var query = _db
                .Match("x=shortestPath((start:Person)" +
                       "-[*]-(end:Person))")
                .Where((Person start) => start.Name == startingPerson.Name)
                .AndWhere((Person end) => end.Name == endingPerson.Name)
                .Return(x => new MixedResult
                {
                    Nodes = Return.As<IEnumerable<Node<MixedData>>>("nodes(x)"),
                    Relationships = Return.As<IEnumerable<RelationshipInstance<object>>>("rels(x)")
                });

            var str = query.Query.QueryText;

            return Task.FromResult(query
                .Results
                .ToList());
        }
        private static void PersonCollector(IPersonService personService, IMovieService movieService,
                                            MyApiFilmsClient client, ConcurrentQueue queue)
        {
            while (queue.IncompleteMoviesWaiting() || queue.IncompletePersonsWaiting())
            {
                if (!queue.IncompletePersonsWaiting())
                {
                    continue;
                }
                // ApiPerson is an alias for FilmIndustryNetwork.MyApiFilms.Entities.Person
                // This is to distinguish between FilmIndustryNetwork.MyApiFilms.Entities.Person
                // and FilmIndustryNetwork.Entities.Person
                ApiPerson apiPerson;
                var       name = queue.PopIncompletePerson();

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

                try
                {
                    apiPerson =
                        client.GetDataAsObject <PersonResponse>(name, DataSetType.Person)?.Data?.Names?.FirstOrDefault();

                    if (apiPerson == null)
                    {
                        throw new Exception();
                    }
                }
                catch (MyApiFilmsTimeoutException e)
                {
                    // TODO: setup logging
                    FillQueueFromList(null, personService, new [] { name }, queue, 1);
                    continue;
                }
                catch (NoMyApiFilmsResponseException e)
                {
                    // TODO: setup logging
                    continue;
                }
                catch (Exception)
                {
                    // TODO: setup logging
                    FillQueueFromList(null, personService, new[] { name }, queue, 1);
                    continue;
                }

                var person = new Person
                {
                    Bio            = apiPerson.Bio,
                    BirthName      = apiPerson.BirthName,
                    DateOfBirth    = apiPerson.DateOfBirth,
                    Id             = apiPerson.IdIMDB,
                    Name           = apiPerson.Name,
                    NeedsApiLookup = false,
                    PlaceOfBirth   = apiPerson.PlaceOfBirth,
                    UrlPhoto       = apiPerson.UrlPhoto
                };

                FillQueueFromList(movieService, null, apiPerson.Filmographies
                                  .Where(x => x.Section == "Actor" || x.Section == "Director" || x.Section == "Writer")
                                  .SelectMany(f => f.Filmography.Select(m => m.Title)).ToList(), queue, 0);

                AddRelationshipsToQueue(
                    apiPerson.Filmographies
                    .Where(x => x.Section == "Actor")
                    .SelectMany(f => f.Filmography
                                .Where(mm => mm.Remarks != null && !mm.Remarks.Contains("(TV Series)"))
                                .Select(m => m.IMDBId)), new[] { person.Name }, queue,
                    RelationTypes.ActedIn);
                AddRelationshipsToQueue(
                    apiPerson.Filmographies
                    .Where(x => x.Section == "Director")
                    .SelectMany(f => f.Filmography
                                .Where(mm => mm.Remarks != null && !mm.Remarks.Contains("(TV Series)"))
                                .Select(m => m.IMDBId)), new[] { person.Name }, queue,
                    RelationTypes.DirectorFor);
                AddRelationshipsToQueue(
                    apiPerson.Filmographies
                    .Where(x => x.Section == "Writer")
                    .SelectMany(f => f.Filmography
                                .Where(mm => mm.Remarks != null && !mm.Remarks.Contains("(TV Series)"))
                                .Select(m => m.IMDBId)), new[] { person.Name }, queue,
                    RelationTypes.WriterOf);

                if (personService.GetPersonByNameAsync(person.Name).Result != null)
                {
                    continue;
                }

                personService.AddPersonAsync(person).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(Person person)
 {
     await _db.PersonCreate()
         .WithParam("newPerson", person)
         .ExecuteWithoutResultsAsync();
 }
 public async Task UpdatePersonAsync(Person person)
 {
     ThrowIfPersonNull(person);
     await _personRepo.Update(person);
 }
        private static void PersonCollector(IPersonService personService, IMovieService movieService, 
            MyApiFilmsClient client, ConcurrentQueue queue)
        {
            while (queue.IncompleteMoviesWaiting() || queue.IncompletePersonsWaiting())
            {
                if (!queue.IncompletePersonsWaiting()) continue;
                // ApiPerson is an alias for FilmIndustryNetwork.MyApiFilms.Entities.Person
                // This is to distinguish between FilmIndustryNetwork.MyApiFilms.Entities.Person
                // and FilmIndustryNetwork.Entities.Person
                ApiPerson apiPerson;
                var name = queue.PopIncompletePerson();

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

                try
                {
                    apiPerson =
                        client.GetDataAsObject<PersonResponse>(name, DataSetType.Person)?.Data?.Names?.FirstOrDefault();

                    if (apiPerson == null) throw new Exception();
                }
                catch (MyApiFilmsTimeoutException e)
                {
                    // TODO: setup logging
                    FillQueueFromList(null, personService, new [] {name}, queue, 1);
                    continue;
                }
                catch (NoMyApiFilmsResponseException e)
                {
                    // TODO: setup logging
                    continue;
                }
                catch (Exception)
                {
                    // TODO: setup logging
                    FillQueueFromList(null, personService, new[] { name }, queue, 1);
                    continue;
                }

                var person = new Person
                {
                    Bio = apiPerson.Bio,
                    BirthName = apiPerson.BirthName,
                    DateOfBirth = apiPerson.DateOfBirth,
                    Id = apiPerson.IdIMDB,
                    Name = apiPerson.Name,
                    NeedsApiLookup = false,
                    PlaceOfBirth = apiPerson.PlaceOfBirth,
                    UrlPhoto = apiPerson.UrlPhoto
                };

                FillQueueFromList(movieService, null, apiPerson.Filmographies
                    .Where(x => x.Section == "Actor" || x.Section == "Director" || x.Section == "Writer")
                    .SelectMany(f => f.Filmography.Select(m => m.Title)).ToList(), queue, 0);

                AddRelationshipsToQueue(
                    apiPerson.Filmographies
                        .Where(x => x.Section == "Actor")
                        .SelectMany(f => f.Filmography
                                          .Where(mm => mm.Remarks != null && !mm.Remarks.Contains("(TV Series)"))
                                          .Select(m => m.IMDBId)), new[] {person.Name}, queue,
                    RelationTypes.ActedIn);
                AddRelationshipsToQueue(
                    apiPerson.Filmographies
                        .Where(x => x.Section == "Director")
                        .SelectMany(f => f.Filmography
                                          .Where(mm => mm.Remarks != null && !mm.Remarks.Contains("(TV Series)"))
                                          .Select(m => m.IMDBId)), new[] { person.Name }, queue,
                    RelationTypes.DirectorFor);
                AddRelationshipsToQueue(
                    apiPerson.Filmographies
                        .Where(x => x.Section == "Writer")
                        .SelectMany(f => f.Filmography
                                          .Where(mm => mm.Remarks != null && !mm.Remarks.Contains("(TV Series)"))
                                          .Select(m => m.IMDBId)), new[] { person.Name }, queue,
                    RelationTypes.WriterOf);

                if (personService.GetPersonByNameAsync(person.Name).Result != null) continue;

                personService.AddPersonAsync(person).Wait();
            }
        }