public ActionResult PartiallyUpdateShoppingItemForShoppingList(Guid shoppingListId,
                                                                       Guid shoppingItemId,
                                                                       JsonPatchDocument <ShoppingItemForUpdateDto> patchDocument)
        {
            if (!_shopListingRepository.ShoppingListExists(shoppingListId))
            {
                return(NotFound());
            }

            var shoppingItemForShoppingListFromRepo = _shopListingRepository.GetShoppingItem(shoppingListId, shoppingItemId);

            if (shoppingItemForShoppingListFromRepo == null)
            {
                var shoppingItemDto = new ShoppingItemForUpdateDto();
                patchDocument.ApplyTo(shoppingItemDto, ModelState);

                if (!TryValidateModel(shoppingItemDto))
                {
                    return(ValidationProblem(ModelState));
                }

                var shoppingItemToAdd = _mapper.Map <Entities.ShoppingItem>(shoppingItemDto);
                shoppingItemToAdd.Id = shoppingItemId;

                _shopListingRepository.AddShoppingItem(shoppingListId, shoppingItemToAdd);
                _shopListingRepository.Save();

                var shoppingItemToReturn = _mapper.Map <ShoppingItemDto>(shoppingItemToAdd);

                return(CreatedAtRoute("GetShoppingItemForShoppingList",
                                      new { shoppingListId, shoppingItemId = shoppingItemToReturn.Id },
                                      shoppingItemToReturn));
            }

            var shoppingItemToPatch = _mapper.Map <ShoppingItemForUpdateDto>(shoppingItemForShoppingListFromRepo);

            // add validation
            patchDocument.ApplyTo(shoppingItemToPatch, ModelState);

            if (!TryValidateModel(shoppingItemToPatch))
            {
                return(ValidationProblem(ModelState));
            }

            _mapper.Map(shoppingItemToPatch, shoppingItemForShoppingListFromRepo);

            _shopListingRepository.UpdateShoppingItem(shoppingItemForShoppingListFromRepo);

            _shopListingRepository.Save();

            return(NoContent());
        }
        public IActionResult UpdateShoppingItemForShoppingList(
            Guid shoppingListId,
            Guid shoppingItemId,
            ShoppingItemForUpdateDto shoppingItem)
        {
            if (!_shopListingRepository.ShoppingListExists(shoppingListId))
            {
                return(NotFound());
            }

            var shoppingItemForShoppingListFromRepo = _shopListingRepository.GetShoppingItem(shoppingListId, shoppingItemId);

            if (shoppingItemForShoppingListFromRepo == null)
            {
                var shoppingItemToAdd = _mapper.Map <Entities.ShoppingItem>(shoppingItem);
                shoppingItemToAdd.Id = shoppingItemId;

                _shopListingRepository.AddShoppingItem(shoppingListId, shoppingItemToAdd);

                _shopListingRepository.Save();

                var shoppingItemToReturn = _mapper.Map <ShoppingItemDto>(shoppingItemToAdd);

                return(CreatedAtRoute("GetShoppingItemForShoppingList",
                                      new { shoppingListId, shoppingItemId = shoppingItemToReturn.Id },
                                      shoppingItemToReturn));
            }

            // map the entity to a ShoppingItemForUpdateDto
            // apply the updated field values to that dto
            // map the ShoppingItemForUpdateDto back to an entity
            _mapper.Map(shoppingItem, shoppingItemForShoppingListFromRepo);

            _shopListingRepository.UpdateShoppingItem(shoppingItemForShoppingListFromRepo);

            _shopListingRepository.Save();

            return(NoContent());
        }