public ActionResult <BrewDto> CreateBrew([FromBody] BrewForCreationDto brew, [FromHeader(Name = ExtendedControllerBase.ACCEPT)] string mediaTypes) { var splitMediaTypes = mediaTypes.Split(','); if (!MediaTypeHeaderValue.TryParseList(splitMediaTypes, out IList <MediaTypeHeaderValue> parsedMediaTypes)) { return(BadRequest()); } if (!_homebrewRepository.RecipeExists(brew.RecipeId)) { ModelState.AddModelError( "Recipe ID", $"The associated recipe id [{brew.RecipeId}] for the {brew.Name} brew must be valid."); } if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var includeSteps = true; var includeAdditionalInfo = true; var finalBrew = _mapper.Map <Entities.Brew>(brew); _homebrewRepository.AddBrew(finalBrew); finalBrew.Recipe = _homebrewRepository.GetRecipe(brew.RecipeId, includeSteps); _homebrewRepository.Save(); var brewToReturn = _mapper.Map <Models.BrewDto>(finalBrew); if (parsedMediaTypes.Any(pmt => pmt.SubTypeWithoutSuffix.EndsWith(this.HATEOAS, StringComparison.InvariantCultureIgnoreCase))) { var links = CreateLinksForBrew(brewToReturn.Id, includeAdditionalInfo); var linkedResourceToReturn = brewToReturn.ShapeData(null) as IDictionary <string, object>; linkedResourceToReturn.Add(this.LINKS, links); return(CreatedAtRoute( "GetBrew", new { id = linkedResourceToReturn["Id"], includeAdditionalInfo }, linkedResourceToReturn)); } return(CreatedAtRoute( "GetBrew", new { id = brewToReturn.Id, includeAdditionalInfo }, brewToReturn)); }
public IActionResult GetRecipe(int id, [FromHeader(Name = ExtendedControllerBase.ACCEPT)] string mediaTypes, bool includeSteps = false) { var splitMediaTypes = mediaTypes.Split(','); if (!MediaTypeHeaderValue.TryParseList(splitMediaTypes, out IList <MediaTypeHeaderValue> parsedMediaTypes)) { return(BadRequest()); } var recipe = _homeBrewRepository.GetRecipe(id, includeSteps); if (recipe == null) { return(NotFound()); } if (parsedMediaTypes.Any(pmt => pmt.SubTypeWithoutSuffix.EndsWith(this.HATEOAS, StringComparison.InvariantCultureIgnoreCase))) { var links = CreateLinksForRecipe(id, includeSteps); // We aren't supporting shaping of data currently so pass in an empty string var linkedResourceToReturn = includeSteps ? _mapper.Map <RecipeDto>(recipe).ShapeData(null) as IDictionary <string, object> : _mapper.Map <RecipeWithoutStepsDto>(recipe).ShapeData(null) as IDictionary <string, object>; linkedResourceToReturn.Add(this.LINKS, links); return(Ok(linkedResourceToReturn)); } return(includeSteps ? Ok(_mapper.Map <RecipeDto>(recipe)) : Ok(_mapper.Map <RecipeWithoutStepsDto>(recipe).ShapeData(null))); }