public async Task <ProductOption> CreateProductOptionAsync(Guid productId, CreateProductOptionDto createProductOptionDto)
        {
            if (await _productRepository.GetByIdAsync(productId) == null)
            {
                throw new NotFoundException(Constants.Constants.ProductNotFound, HttpStatusCode.NotFound.ToString());
            }

            var validationResults = createProductOptionDto.Validate();
            var validations       = validationResults.ToList();

            if (validations.Any())
            {
                throw new ValidationException(validations);
            }

            var productOption = new ProductOption
            {
                Id          = Guid.NewGuid(),
                Description = createProductOptionDto.Description,
                Name        = createProductOptionDto.Name,
                ProductId   = productId
            };

            return(await _repository.CreateAsync(productOption));
        }
        public async Task <HttpResponseMessage> CreateOption(Guid productId, ProductOptionModel option)
        {
            // validate
            if (!ModelState.IsValid)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }

            await productOptionRepository.CreateAsync(productId, option);

            return(new HttpResponseMessage(HttpStatusCode.Created));
        }
        /// <inheritdoc />
        public async Task <Result <ProductOption> > CreateAsync(ProductOption productOption)
        {
            _logger.Debug("Creating a product option. ProductOption: {productOption}", JsonConvert.SerializeObject(productOption));

            var duplicateOptionResult = await GetByProductAsync(productOption.ProductId);

            if (!duplicateOptionResult.IsSuccess())
            {
                return(Result <ProductOption> .Failed(duplicateOptionResult.Error));
            }

            var duplicateOption = duplicateOptionResult.Data.Items
                                  .FirstOrDefault(x => x.Name.Equals(productOption.Name, StringComparison.InvariantCultureIgnoreCase));

            if (duplicateOption != null)
            {
                return(Result <ProductOption> .Failed(ErrorCode.DuplicateProductOptionFound,
                                                      AppConstants.DuplicateProductOptionFoundErrorMessage.Replace("[name]", productOption.Name)));
            }

            var createdProductOption = await _productOptionRepository.CreateAsync(productOption);

            return(Result <ProductOption> .Success(createdProductOption));
        }