public KachingProduct ConvertProduct(Product subject) { var product = new KachingProduct(); AddBasicProperties(subject, product); AddAttributes(subject, product); AddVariants(subject, product); AddTags(subject, product); return(product); }
private void AddAttributes(Product subject, KachingProduct product) { if (subject.ProductProperties.Count > 0) { var attributes = new Dictionary <string, string>(); foreach (var prop in subject.ProductProperties) { var value = prop.Value; var name = prop.ProductDefinitionField.Name; attributes[name] = value; } product.Attributes = attributes; } }
private void AddBasicProperties(Product subject, KachingProduct product) { product.Name = Localizer.GetLocalizedName(new LocalizableProduct(subject)); product.Description = Localizer.GetLocalizedName(new LocalizableProductLongDescription(subject)); if (subject.ProductPrices.Count > 0) { product.RetailPrice = GetMarketPrice(subject.ProductPrices); } product.Id = subject.Guid.ToString(); if (!string.IsNullOrEmpty(subject.PrimaryImageMediaId)) { var imageUrl = ObjectFactory.Instance.Resolve <UCommerce.Content.IImageService>().GetImage(subject.PrimaryImageMediaId).Url; if (!string.IsNullOrEmpty(imageUrl)) { product.ImageUrl = DomainName() + imageUrl; } } }
private void AddVariants(Product subject, KachingProduct product) { var attributePropertyMap = new Dictionary <string, ProductDefinitionField>(); var list = new List <Variant>(); foreach (var v in subject.Variants) { var variant = new Variant(); AddBasicVariantProperties(v, variant); AddVariantAttributes(attributePropertyMap, v, variant); list.Add(variant); } if (list.Count > 0) { product.Variants = list.ToArray(); AddDimensions(product, attributePropertyMap, list); } }
private void AddTags(Product subject, KachingProduct product) { var tags = new HashSet <string>(); // Just as a convenience, always add a 'ucommerce' tag to allow for easy identification of // products from Ucommerce. tags.Add("ucommerce"); foreach (var category in subject.GetCategories()) { tags.Add(category.Name); var categoryIteration = category; while (categoryIteration.ParentCategory != null) { categoryIteration = categoryIteration.ParentCategory; tags.Add(categoryIteration.Name); } } product.Tags = tags; }
public PipelineExecutionResult Execute(Product subject) { var config = KachingConfiguration.Get(); var url = config.ProductsIntegrationURL; if (!url.StartsWith("https://", StringComparison.Ordinal)) { return(PipelineExecutionResult.Success); } // In case a product is initially being created, it will not yet have a // category configured. In this case delay the synchronization slightly // in order to let the database save the product<->category relationship. Func <PipelineExecutionResult> synchronize = () => { var converter = new ProductConverter(logging); var product = converter.ConvertProduct(subject); KachingProduct[] products = new KachingProduct[1]; products[0] = product; var metadata = converter.GetMetadata(); return(Synchronizer.Post(new ProductsRequest(products, metadata), url)); }; if (subject.GetCategories().Count == 0) { Task.Delay(2000).ContinueWith((task) => { synchronize(); }); return(PipelineExecutionResult.Success); } return(synchronize()); }
private void AddDimensions(KachingProduct product, Dictionary <string, ProductDefinitionField> attributePropertyMap, List <Variant> list) { foreach (var attribute in attributePropertyMap.Keys) { var flag = false; var alreadyUsed = new HashSet <string>(); foreach (var variant in list) { if (variant.Attributes == null || variant.Attributes[attribute] == null) { flag = true; break; } var value = variant.Attributes[attribute]; if (alreadyUsed.Contains(value)) { flag = true; break; } alreadyUsed.Add(value); } if (flag) { continue; } else { // attribute uniquely identifies each variant - use it for a dimension var propertyDefinition = attributePropertyMap[attribute]; var dimension = new Dimension(); dimension.Id = propertyDefinition.Name; dimension.Name = Localizer.GetLocalizedName(new LocalizableProductDefinitionField(propertyDefinition)); dimension.Values = new List <DimensionValue>(); foreach (var property in propertyDefinition.DataType.DataTypeEnums) { var value = new DimensionValue(); value.Id = property.Name; value.Name = Localizer.GetLocalizedName(new LocalizableDataTypeEnum(property)); dimension.Values.Add(value); } if (dimension.Values.Count == 0) { // No enums defined - show values directly instead var allValues = new HashSet <string>(); foreach (var variant in product.Variants) { allValues.Add(variant.Attributes[attribute]); } foreach (var valueString in allValues.OrderBy(a => a)) { var value = new DimensionValue(); value.Id = valueString; value.Name = new L10nString(valueString); dimension.Values.Add(value); } } product.Dimensions = new List <Dimension>(); product.Dimensions.Add(dimension); foreach (var variant in product.Variants) { variant.DimensionValues = new Dictionary <string, string>(); variant.DimensionValues[dimension.Id] = variant.Attributes[attribute]; } break; } } }