Ejemplo n.º 1
0
        public ActionResult UpdateRecipe(int id,
                                         [FromBody] RecipeForUpdateDto recipe,
                                         [FromHeader(Name = ExtendedControllerBase.ACCEPT)] string mediaTypes)
        {
            var splitMediaTypes = mediaTypes.Split(',');

            if (!MediaTypeHeaderValue.TryParseList(splitMediaTypes,
                                                   out IList <MediaTypeHeaderValue> parsedMediaTypes))
            {
                return(BadRequest());
            }

            if (!_homeBrewRepository.WaterProfileExists(recipe.WaterProfileId))
            {
                ModelState.AddModelError(
                    "Description",
                    "The water profile ID for the recipe must exist.");
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var includeSteps = true;
            var recipeEntity = _homeBrewRepository.GetRecipe(id, includeSteps);

            if (recipeEntity == null)
            {
                return(NotFound());
            }

            _mapper.Map(recipe, recipeEntity);
            _homeBrewRepository.UpdateRecipe(recipeEntity);
            _homeBrewRepository.Save();

            if (parsedMediaTypes.Any(pmt => pmt.SubTypeWithoutSuffix.EndsWith(this.HATEOAS, StringComparison.InvariantCultureIgnoreCase)))
            {
                var links = CreateLinksForRecipe(recipeEntity.Id, includeSteps);

                var recipeToReturn         = _mapper.Map <RecipeDto>(recipeEntity);
                var linkedResourceToReturn = recipeToReturn.ShapeData(null)
                                             as IDictionary <string, object>;

                linkedResourceToReturn.Add(this.LINKS, links);

                return(Ok(linkedResourceToReturn));
            }

            return(NoContent());
        }