예제 #1
0
        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 ActionResult <RecipeDto> CreateRecipe([FromBody] RecipeForCreationDto 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 finalRecipe  = _mapper.Map <Entities.Recipe>(recipe);

            _homeBrewRepository.AddRecipe(finalRecipe);
            finalRecipe.WaterProfile = _homeBrewRepository.GetWaterProfile(recipe.WaterProfileId, true);
            _homeBrewRepository.Save();

            var recipeToReturn = _mapper.Map <Models.RecipeDto>(finalRecipe);

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

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

                linkedResourceToReturn.Add(this.LINKS, links);

                return(CreatedAtRoute(
                           "GetRecipe",
                           new { id = linkedResourceToReturn["Id"], includeSteps },
                           linkedResourceToReturn));
            }

            return(CreatedAtRoute(
                       "GetRecipe",
                       new { id = recipeToReturn.Id, includeSteps },
                       recipeToReturn));
        }
        public ActionResult <TastingNoteDto> CreateTastingNote(int brewId,
                                                               [FromBody] TastingNoteForCreationDto tastingNote,
                                                               [FromHeader(Name = ExtendedControllerBase.ACCEPT)] string mediaTypes)
        {
            var splitMediaTypes = mediaTypes.Split(',');

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

            if (!_homebrewRepository.BrewExists(brewId))
            {
                return(NotFound());
            }

            var includeAdditionalInfo = true;
            var finalTastingNote      = _mapper.Map <Entities.TastingNote>(tastingNote);

            _homebrewRepository.AddTastingNote(finalTastingNote);
            finalTastingNote.Brew = _homebrewRepository.GetBrew(brewId, includeAdditionalInfo);
            _homebrewRepository.Save();

            var tastingNoteToReturn = _mapper.Map <Models.TastingNoteDto>(finalTastingNote);

            if (parsedMediaTypes.Any(pmt => pmt.SubTypeWithoutSuffix.EndsWith(this.HATEOAS, StringComparison.InvariantCultureIgnoreCase)))
            {
                var links = CreateLinksForTastingNote(brewId, tastingNoteToReturn.Id);

                var linkedResourcesToReturn = tastingNote.ShapeData(null) as IDictionary <string, object>;

                linkedResourcesToReturn.Add(this.LINKS, links);

                return(CreatedAtRoute(
                           "GetTastingNote",
                           new { brewId, id = linkedResourcesToReturn["Id"] },
                           linkedResourcesToReturn));
            }

            return(CreatedAtRoute(
                       "GetTastingNote",
                       new { brewId, id = tastingNoteToReturn.Id },
                       tastingNoteToReturn));
        }
        public ActionResult <IngredientDto> CreateIngredient(int recipeStepId,
                                                             [FromBody] IngredientForCreationDto ingredient)
        {
            if (!_homeBrewRepository.RecipeStepExists(recipeStepId))
            {
                return(NotFound());
            }

            var finalIngredient = _mapper.Map <Entities.Ingredient>(ingredient);

            _homeBrewRepository.AddIngredientForRecipeStep(recipeStepId, finalIngredient);

            _homeBrewRepository.Save();

            var createdIngredientToReturn = _mapper.Map <Models.IngredientDto>(finalIngredient);

            return(CreatedAtRoute(
                       "GetIngredient",
                       new { recipeStepId, id = finalIngredient.Id },
                       createdIngredientToReturn));
        }
        public ActionResult <WaterProfileDto> CreateWaterProfile([FromBody] WaterProfileForCreationDto waterProfile,
                                                                 [FromHeader(Name = ExtendedControllerBase.ACCEPT)] string mediaTypes)
        {
            var splitMediaTypes = mediaTypes.Split(',');

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

            var includeAdditions  = true;
            var finalWaterProfile = _mapper.Map <Entities.WaterProfile>(waterProfile);

            _homeBrewRepository.AddWaterProfile(finalWaterProfile);
            _homeBrewRepository.Save();

            var waterProfileToReturn = _mapper.Map <Models.WaterProfileDto>(finalWaterProfile);

            if (parsedMediaTypes.Any(pmt => pmt.SubTypeWithoutSuffix.EndsWith(this.HATEOAS, StringComparison.InvariantCultureIgnoreCase)))
            {
                var links = CreateLinksForWaterProfile(waterProfileToReturn.Id, includeAdditions);

                var linkedResourceToReturn = waterProfileToReturn.ShapeData(null)
                                             as IDictionary <string, object>;

                linkedResourceToReturn.Add(this.LINKS, links);

                return(CreatedAtRoute(
                           "GetWaterProfile",
                           new { id = linkedResourceToReturn["Id"], includeAdditions },
                           linkedResourceToReturn));
            }

            return(CreatedAtRoute(
                       "GetWaterProfile",
                       new { id = finalWaterProfile.Id, includeAdditions },
                       waterProfileToReturn));
        }
        public ActionResult <RecipeStepDto> CreateRecipeStep(int recipeId,
                                                             [FromBody] RecipeStepForCreationDto recipeStep)
        {
            if (!_homeBrewRepository.RecipeExists(recipeId))
            {
                return(NotFound());
            }

            var finalRecipeStep = _mapper.Map <Entities.RecipeStep>(recipeStep);

            _homeBrewRepository.AddStepForRecipe(recipeId, finalRecipeStep);

            _homeBrewRepository.Save();

            var createdRecipeStepToReturn = _mapper.Map <Models.RecipeStepDto>(finalRecipeStep);

            return(CreatedAtRoute(
                       "GetRecipeStep",
                       new { recipeId, id = finalRecipeStep.Id },
                       createdRecipeStepToReturn));
        }