public async Task <IActionResult> Edit(string id)
        {
            try
            {
                AuthorizeHelper.Authorize(this.HttpContext, "Editor", this.GetType().Name, "Edit", "movie");

                GetMovieModel getMovieModel = await _moviemindAPIService.GetModel <GetMovieModel>(id, "Movies");

                List <GetGenreModel> getGenreModels = await _moviemindAPIService.GetModels <GetGenreModel>("genres");

                List <GetDirectorModel> getDirectorModels = await _moviemindAPIService.GetModels <GetDirectorModel>("directors");

                PutMovieModel putMovieModel = new PutMovieModel
                {
                    Name          = getMovieModel.Name,
                    Year          = getMovieModel.Year,
                    Description   = getMovieModel.Description,
                    OverallRating = getMovieModel.OverallRating,
                    Duration      = getMovieModel.Duration,
                    DirectorId    = getMovieModel.DirectorId,
                    Director      = getMovieModel.Director,
                    GenreId       = getMovieModel.GenreId,
                    Genre         = getMovieModel.Genre
                };

                ViewBag.Genres    = getGenreModels;
                ViewBag.Directors = getDirectorModels;

                return(View(putMovieModel));
            }
            catch (MovieMindException e)
            {
                return(ErrorHelper.HandleError(e));
            }
        }
        public async Task <IActionResult> PutMovie(string id, PutMovieModel putMovieModel)
        {
            try
            {
                if (!Guid.TryParse(id, out Guid movieId))
                {
                    throw new GuidException("Invalid id", this.GetType().Name, "PutMovie", "400");
                }

                await _movieRepository.PutMovie(id, putMovieModel);

                return(NoContent());
            }
            catch (MovieMindException e)
            {
                if (e.MovieMindError.Status.Equals("404"))
                {
                    return(NotFound(e.MovieMindError));
                }
                else
                {
                    return(BadRequest(e.MovieMindError));
                }
            }
        }
        public async Task PutMovie(string id, PutMovieModel putMovieModel)
        {
            Movie movie = await _context.Movies.FirstOrDefaultAsync(x => x.Id == Guid.Parse(id));

            if (movie == null)
            {
                throw new EntityException("Movie not found", this.GetType().Name, "PutMovie", "404");
            }

            Director director = await _context.Directors.FirstOrDefaultAsync(x => x.Id == putMovieModel.DirectorId);

            if (director == null)
            {
                throw new EntityException("Director not found", this.GetType().Name, "PutMovie", "404");
            }

            Genre genre = await _context.Genres.FirstOrDefaultAsync(x => x.Id == putMovieModel.GenreId);

            if (genre == null)
            {
                throw new EntityException("Genre not found", this.GetType().Name, "PutMovie", "404");
            }

            try
            {
                movie.Name          = putMovieModel.Name;
                movie.Year          = putMovieModel.Year;
                movie.OverallRating = putMovieModel.OverallRating;
                movie.Duration      = putMovieModel.Duration;
                movie.Description   = putMovieModel.Description;
                movie.GenreId       = putMovieModel.GenreId;
                movie.Genre         = genre;
                movie.DirectorId    = putMovieModel.DirectorId;
                movie.Director      = director;

                await _context.SaveChangesAsync();
            }
            catch (MovieMindException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new DatabaseException(e.InnerException.Message, this.GetType().Name, "PutMovie", "400");
            }
        }
        [ValidateAntiForgeryToken] // Prevents XSRF/CSRF attacks
        public async Task <IActionResult> Edit(string id, PutMovieModel putMovieModel)
        {
            try
            {
                AuthorizeHelper.Authorize(this.HttpContext, "Editor", this.GetType().Name, "Edit", "movie");

                if (ModelState.IsValid)
                {
                    await _moviemindAPIService.PutModel <PutMovieModel>(id, putMovieModel, "Movies");

                    //delete (override) previous relationships
                    if (putMovieModel.ActorIds != null)
                    {
                        List <GetActorMovieModel> getActorMovieModels = await _moviemindAPIService.GetModels <GetActorMovieModel>("ActorMovies");

                        List <GetActorMovieModel> getActorMovieModelsToDelete = getActorMovieModels.Where(x => x.MovieId == Guid.Parse(id)).ToList();

                        foreach (GetActorMovieModel getActorMovieModel in getActorMovieModelsToDelete)
                        {
                            await _moviemindAPIService.DeleteModel(getActorMovieModel.Id.ToString(), "ActorMovies");
                        }

                        //put in new relationships
                        foreach (Guid actorId in putMovieModel.ActorIds)
                        {
                            await _moviemindAPIService.PostModel <PostActorMovieModel, GetActorMovieModel>(new PostActorMovieModel
                            {
                                ActorId = actorId,
                                MovieId = Guid.Parse(id)
                            }, "ActorMovies");
                        }
                    }

                    return(Redirect("/Movies/Details/" + id.ToString()));
                }

                return(View(putMovieModel));
            }
            catch (MovieMindException e)
            {
                return(ErrorHelper.HandleError(e, this.View(putMovieModel)));
            }
        }