public async Task <IActionResult> CreateMovieAsync( [FromBody, SwaggerParameter(Description = "Movie to create", Required = true)] MovieToCreateDto movieToCreate, [FromHeader(Name = "Accept"), SwaggerParameter(Description = "media type to request betwen json or json+hateoas")] string mediaType) { var movieToAdd = Mapper.Map <Movie>(movieToCreate); movieToAdd.Id = Guid.NewGuid(); _movieRepository.AddMovie(movieToAdd); if (!await _movieRepository.SaveChangesAsync()) { _logger.LogError("Saving changes to database while creating a movie failed"); } // if any genre is added to movie, create many-to-many relationship for each genre if (movieToCreate.GenreIds != null && movieToCreate.GenreIds.Count > 0) { for (int i = 0; i < movieToCreate.GenreIds.Count; i++) { // create moviegenre object with genre id and movie id from movieToCreate object MovieGenre movieGenreToAdd = new MovieGenre { MovieId = movieToAdd.Id, GenreId = movieToCreate.GenreIds[i] }; movieGenreToAdd.Id = Guid.NewGuid(); _movieGenreRepository.AddMovieGenre(movieGenreToAdd); } // save changes to database after all many-to-many relationships has been created if (!await _movieGenreRepository.SaveChangesAsync()) { _logger.LogError("Saving changes to database while creating a moviegenre failed"); } } var foundMovie = await _movieRepository.GetMovieAsync(movieToAdd.Id); var movieDto = Mapper.Map <MovieDto>(foundMovie); if (mediaType == "application/vnd.biob.json+hateoas") { var links = CreateLinksForMovies(movieDto.Id, null); var linkedMovie = movieDto.ShapeData(null) as IDictionary <string, object>; linkedMovie.Add("links", links); return(CreatedAtRoute("GetMovie", new { movieId = movieDto.Id }, linkedMovie)); } else { return(CreatedAtRoute("GetMovie", new { movieId = movieDto.Id }, movieDto)); } }