private SpecificationPropertyGroupList GetSpecificationPropertyGroups(Product product)
        {
            SpecificationPropertyGroupList specificationPropertyGroups = new SpecificationPropertyGroupList();

            foreach (Specification specification in product.Specifications)
            {
                foreach (SpecificationPropertyValue specificationPropertyValue in specification.PropertyValues)
                {
                    PropertyValueDto specificationPropertyValueDto = specificationPropertyValue.MapTo <PropertyValueDto>();

                    if (specificationPropertyGroups.HasSpecificationProperty(specificationPropertyValue.SpecificationProperty))
                    {
                        var specificationPropertyGroup = specificationPropertyGroups.GetFromSpecificationProperty(specificationPropertyValue.SpecificationProperty);

                        if (!HasPropertyValueDto(specificationPropertyGroup.SpecificationPropertyValues, specificationPropertyValueDto))
                        {
                            specificationPropertyGroup.SpecificationPropertyValues.Add(specificationPropertyValueDto);
                        }
                    }
                    else
                    {
                        var specificationPropertyGroup = new SpecificationPropertyGroup()
                        {
                            SpecificationProperty       = specificationPropertyValue.SpecificationProperty.MapTo <SpecificationPropertyDto>(),
                            SpecificationPropertyValues = new List <PropertyValueDto>()
                        };
                        specificationPropertyGroup.SpecificationPropertyValues.Add(specificationPropertyValueDto);
                        specificationPropertyGroups.Add(specificationPropertyGroup);
                    }
                }
            }
            return(specificationPropertyGroups);
        }
        public ProductDto GetProduct(ProductGetInput input)
        {
            Product product = _productRespository.Get(input.Id);

            if (product.Status == ProductStatus.Off)
            {
                throw new UserFriendlyException(L("TheProductIsOff"));
            }
            ProductDto productDto = product.MapTo <ProductDto>();

            SpecificationPropertyGroupList SpecificationPropertyGroupList = GetSpecificationPropertyGroups(product);

            productDto.SpecificationPropertyGroups = SpecificationPropertyGroupList;
            return(productDto);
        }