Exemplo n.º 1
0
        private IQueryable <Item> IncludeGroups(IQueryable <Item> query, ItemResponseGroups responseGroups)
        {
            if (responseGroups.HasFlag(ItemResponseGroups.ItemAssets))
            {
                query = query.Expand(p => p.ItemAssets);
            }

            if (responseGroups.HasFlag(ItemResponseGroups.ItemAssociations))
            {
                query = query.Expand(p => p.AssociationGroups.Select(a => a.Associations.Select(s => s.CatalogItem)));
            }

            if (responseGroups.HasFlag(ItemResponseGroups.ItemCategories))
            {
                query = query.Expand(p => p.CategoryItemRelations);
            }

            if (responseGroups.HasFlag(ItemResponseGroups.ItemEditorialReviews))
            {
                query = query.Expand(p => p.EditorialReviews);
            }

            if (responseGroups.HasFlag(ItemResponseGroups.ItemProperties))
            {
                query = query.Expand(p => p.ItemPropertyValues);
            }

            return(query);
        }
Exemplo n.º 2
0
 public ActionResult DisplayItemById(string itemId,
                                     string parentItemId               = null,
                                     string name                       = "MiniItem",
                                     string associationType            = null,
                                     bool forcedActive                 = false,
                                     ItemResponseGroups responseGroups = ItemResponseGroups.ItemSmall,
                                     ItemDisplayOptions displayOptions = ItemDisplayOptions.ItemSmall)
 {
     return(DisplayItemNoCache(itemId, parentItemId, name, associationType, forcedActive, responseGroups,
                               displayOptions));
 }
Exemplo n.º 3
0
        //Called from banner/ProductImageAndPrice to avoid nested caching
        /// <summary>
        /// Displays the item by identifier no cache.
        /// </summary>
        /// <param name="itemId">The item identifier.</param>
        /// <param name="parentItemId">The parent item identifier.</param>
        /// <param name="name">The name.</param>
        /// <param name="associationType">Type of the association.</param>
        /// <param name="forcedActive">if set to <c>true</c> [forced active].</param>
        /// <param name="responseGroups">The response groups.</param>
        /// <param name="displayOptions">The display options.</param>
        /// <param name="bycode"></param>
        /// <returns>ActionResult.</returns>
        public ActionResult DisplayItemNoCache(string itemId,
                                               string parentItemId               = null,
                                               string name                       = "MiniItem",
                                               string associationType            = null,
                                               bool forcedActive                 = false,
                                               ItemResponseGroups responseGroups = ItemResponseGroups.ItemSmall,
                                               ItemDisplayOptions displayOptions = ItemDisplayOptions.ItemSmall,
                                               bool bycode                       = false)
        {
            var itemModel = CatalogHelper.CreateCatalogModel(itemId, parentItemId, associationType, forcedActive, responseGroups, displayOptions, bycode);

            return(itemModel != null?PartialView(name, itemModel) : null);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Gets the item. Additionally filters by catalog
        /// </summary>
        /// <param name="id">The id of item.</param>
        /// <param name="responseGroup">The response group.</param>
        /// <param name="catalogId">The catalog id.</param>
        /// <param name="useCache">if set to <c>true</c> uses cache.</param>
        /// <param name="bycode">if set to <c>true</c> get item by code.</param>
        /// <returns></returns>
        public Item GetItem(string id, ItemResponseGroups responseGroup, string catalogId, bool useCache = true, bool bycode = false)
        {
            var items = bycode ? GetItemsByCode(new[] { id }, useCache, responseGroup) : GetItems(new[] { id }, useCache, responseGroup);

            if (items != null && items.Any())
            {
                if (string.IsNullOrWhiteSpace(catalogId))
                {
                    return(items[0]);
                }

                foreach (var item in items)
                {
                    if (item.CatalogId == catalogId)
                    {
                        return(item);
                    }

                    var relations = item.CategoryItemRelations.ToArray();

                    if (!responseGroup.HasFlag(ItemResponseGroups.ItemCategories))
                    {
                        relations = GetCategoryItemRelations(item.ItemId);
                    }

                    foreach (var rel in relations)
                    {
                        if (rel.CatalogId == catalogId)
                        {
                            return(item);
                        }

                        var category = GetCategoryById(rel.CategoryId, null);

                        if (category != null)
                        {
                            if (category.LinkedCategories.Any(link => link.CatalogId == catalogId))
                            {
                                return(item);
                            }
                        }
                    }
                }
            }

            return(null);
        }
Exemplo n.º 5
0
        public Item[] GetItemsByCode(string[] codes, bool useCache, ItemResponseGroups responseGroup)
        {
            if (codes == null || !codes.Any())
            {
                return(null);
            }

            var query = _catalogRepository.Items.Where(x => codes.Contains(x.Code));

            query = IncludeGroups(query, responseGroup);

            return(Helper.Get(
                       CacheHelper.CreateCacheKey(Constants.CatalogCachePrefix, string.Format(ItemsCodeCacheKey, CacheHelper.CreateCacheKey(codes), responseGroup)),
                       () => (query).ToArray(),
                       CatalogConfiguration.Instance.Cache.ItemTimeout,
                       _isEnabled && useCache));
        }
Exemplo n.º 6
0
        public virtual async Task <Product> GetProductAsync(
            string store,
            string language,
            string productId,
            ItemResponseGroups responseGroup)
        {
            var parameters =
                new
            {
                store,
                language,
                responseGroup = responseGroup.GetHashCode().ToString(CultureInfo.InvariantCulture)
            };

            return(await
                   GetAsync <Product>(
                       CreateRequestUri(String.Format(RelativePaths.Product, productId), parameters)).ConfigureAwait(false));
        }
Exemplo n.º 7
0
 /// <summary>
 ///     List items matching the given query
 /// </summary>
 public virtual async Task<ProductSearchResult> GetProductsAsync(
     string store,
     string language,
     BrowseQuery query,
     ItemResponseGroups? responseGroup = null)
 {
     var parameters = new
     {
         store,
         language,
         responseGroup = responseGroup.GetHashCode()
             .ToString(CultureInfo.InvariantCulture)
     };
     return
         await GetAsync<ProductSearchResult>(
             CreateRequestUri(RelativePaths.ProductsSearch, query.GetQueryString(parameters))).ConfigureAwait(false);
 }
Exemplo n.º 8
0
        public async Task <Product> GetProductByKeywordAsync(SiteContext context, string keyword, Collection parentCollection = null, ItemResponseGroups responseGroup = ItemResponseGroups.ItemLarge)
        {
            var product =
                await
                this._browseClient.GetProductByKeywordAsync(
                    context.StoreId,
                    context.Language,
                    keyword,
                    responseGroup);

            if (product == null)
            {
                return(null);
            }

            var variationIds = product.GetAllVariationIds();
            var prices       = await this.GetProductPricesAsync(context.PriceLists, variationIds);

            var price = prices.FirstOrDefault(p => p.ProductId == product.Id);

            var promoContext = new PromotionEvaluationContext
            {
                CustomerId   = context.CustomerId,
                CartTotal    = context.Cart.TotalPrice,
                Currency     = context.Shop.Currency,
                PromoEntries = new List <ProductPromoEntry>
                {
                    new ProductPromoEntry
                    {
                        CatalogId = product.CatalogId,
                        Price     = price != null ? (price.Sale.HasValue ? price.Sale.Value : price.List) : 0M,
                        ProductId = product.Id,
                        Quantity  = 1
                    }
                },
                IsRegisteredUser = context.Customer != null,
                StoreId          = context.StoreId
            };

            var rewards = await _marketingClient.GetPromotionRewardsAsync(promoContext);

            return(product.AsWebModel(prices, rewards, parentCollection));
        }
Exemplo n.º 9
0
		//Called from banner/ProductImageAndPrice to avoid nested caching
		/// <summary>
		/// Displays the item by identifier no cache.
		/// </summary>
		/// <param name="itemId">The item identifier.</param>
		/// <param name="parentItemId">The parent item identifier.</param>
		/// <param name="name">The name.</param>
		/// <param name="associationType">Type of the association.</param>
		/// <param name="forcedActive">if set to <c>true</c> [forced active].</param>
		/// <param name="responseGroups">The response groups.</param>
		/// <param name="displayOptions">The display options.</param>
		/// <returns>ActionResult.</returns>
		public ActionResult DisplayItemByIdNoCache(string itemId, string parentItemId = null, string name = "MiniItem", string associationType = null, bool forcedActive = false, ItemResponseGroups responseGroups = ItemResponseGroups.ItemSmall, ItemDisplayOptions displayOptions = ItemDisplayOptions.ItemSmall)
		{
			var itemModel = CatalogHelper.CreateCatalogModel(itemId, parentItemId, associationType, forcedActive, responseGroups, displayOptions);
			return itemModel != null ? PartialView(name, itemModel) : null;
		}
Exemplo n.º 10
0
		public ActionResult DisplayItemById(string itemId, string parentItemId = null, string name = "MiniItem", string associationType = null, bool forcedActive = false, ItemResponseGroups responseGroups = ItemResponseGroups.ItemSmall, ItemDisplayOptions displayOptions = ItemDisplayOptions.ItemSmall)
		{
			return DisplayItemByIdNoCache(itemId, parentItemId, name, associationType, forcedActive, responseGroups,
			                              displayOptions);
		}
Exemplo n.º 11
0
        /// <summary>
        /// Gets the item.
        /// </summary>
        /// <param name="id">The identifier.</param>
        /// <param name="responseGroup">The response group.</param>
        /// <param name="useCache">if set to <c>true</c> [use cache].</param>
        /// <param name="bycode">if set to <c>true</c> [bycode].</param>
        /// <returns></returns>
        public Item GetItem(string id, ItemResponseGroups responseGroup, bool useCache = true, bool bycode = false)
        {
            if (!string.IsNullOrEmpty(id))
            {
                var items = bycode ? GetItemsByCode(new[] { id }, useCache, responseGroup) : GetItems(new[] { id }, useCache, responseGroup);
                if (items != null && items.Any())
                    return items[0];
            }

            return null;
        }
Exemplo n.º 12
0
        /// <summary>
        /// Gets the item. Additionally filters by catalog
        /// </summary>
        /// <param name="id">The id of item.</param>
        /// <param name="responseGroup">The response group.</param>
        /// <param name="catalogId">The catalog id.</param>
        /// <param name="useCache">if set to <c>true</c> uses cache.</param>
        /// <param name="bycode">if set to <c>true</c> get item by code.</param>
        /// <returns></returns>
        public Item GetItem(string id, ItemResponseGroups responseGroup, string catalogId, bool useCache = true, bool bycode = false)
        {
            var items = bycode ? GetItemsByCode(new[] { id }, useCache, responseGroup) : GetItems(new[] { id }, useCache, responseGroup);

            if (items != null && items.Any())
            {
                if (string.IsNullOrWhiteSpace(catalogId))
                {
                    return items[0];
                }

                foreach (var item in items)
                {
                    if (item.CatalogId == catalogId)
                        return item;

                    var relations = item.CategoryItemRelations.ToArray();

                    if (!responseGroup.HasFlag(ItemResponseGroups.ItemCategories))
                    {
                        relations = GetCategoryItemRelations(item.ItemId);
                    }

                    foreach (var rel in relations)
                    {
                        if (rel.CatalogId == catalogId)
                            return item;

                        var category = GetCategoryById(rel.CategoryId, null);

                        if (category != null)
                        {
                            if (category.LinkedCategories.Any(link => link.CatalogId == catalogId))
                            {
                                return item;
                            }
                        }
                    }
                }
            }

            return null;
        }
Exemplo n.º 13
0
        /// <summary>
        /// Creates the catalog model.
        /// </summary>
        /// <param name="itemId">The item identifier.</param>
        /// <param name="parentItemId">The parent item identifier.</param>
        /// <param name="associationType">Type of the association.</param>
        /// <param name="forcedActive">if set to <c>true</c> [forced active].</param>
        /// <param name="responseGroups">The response groups.</param>
        /// <param name="display">The display.</param>
        /// <param name="byItemCode">if set to <c>true</c> gets item by code.</param>
        /// <returns>
        /// CatalogItemWithPriceModel.
        /// </returns>
        public static CatalogItemWithPriceModel CreateCatalogModel(string itemId,
            string parentItemId = null,
            string associationType = null,
            bool forcedActive = false,
            ItemResponseGroups responseGroups = ItemResponseGroups.ItemLarge,
            ItemDisplayOptions display = ItemDisplayOptions.ItemLarge,
            bool byItemCode = false)
        {

            var dbItem = CatalogClient.GetItem(itemId, responseGroups,
                                              UserHelper.CustomerSession.CatalogId, bycode: byItemCode);
            if (dbItem != null)
            {

                if (dbItem.IsActive || forcedActive)
                {
                    PriceModel priceModel = null;
                    PropertySet propertySet = null;
                    //ItemRelation[] variations = null;
                    ItemAvailabilityModel itemAvaiability = null;

                    if (display.HasFlag(ItemDisplayOptions.ItemPropertySets))
                    {
                        propertySet = CatalogClient.GetPropertySet(dbItem.PropertySetId);
                        //variations = CatalogClient.GetItemRelations(itemId);
                    }

                    var itemModel = CreateItemModel(dbItem, propertySet);

                    if (display.HasFlag(ItemDisplayOptions.ItemAvailability))
                    {
                        var fulfillmentCenter = UserHelper.StoreClient.GetCurrentStore().FulfillmentCenterId;
                        var availability = CatalogClient.GetItemAvailability(dbItem.ItemId, fulfillmentCenter);
                        itemAvaiability = new ItemAvailabilityModel(availability);
                    }

                    if (display.HasFlag(ItemDisplayOptions.ItemPrice))
                    {
                        var lowestPrice = PriceListClient.GetLowestPrice(dbItem.ItemId, itemAvaiability != null ? itemAvaiability.MinQuantity : 1);
                        var outlines = OutlineBuilder.BuildCategoryOutline(CatalogClient.CustomerSession.CatalogId, dbItem.ItemId);
                        var tags = new Hashtable
							{
								{
									"Outline",
                                    outlines.ToString()
                                }
							};
                        priceModel = MarketingHelper.GetItemPriceModel(dbItem, lowestPrice, tags);
                        itemModel.CatalogOutlines = outlines;

                        // get the category name
                        if (outlines.Count > 0)
                        {
                            var outline = outlines[0];
                            if (outline.Categories.Count > 0)
                            {
                                var category = outline.Categories.OfType<Category>().Reverse().FirstOrDefault();
                                if (category != null)
                                {
                                    itemModel.CategoryName = category.Name;
                                }
                            }
                        }
                    }

                    itemModel.ParentItemId = parentItemId;

                    return string.IsNullOrEmpty(associationType)
                               ? new CatalogItemWithPriceModel(itemModel, priceModel, itemAvaiability)
                               : new AssociatedCatalogItemWithPriceModel(itemModel, priceModel, itemAvaiability, associationType);
                }
            }

            return null;
        }
Exemplo n.º 14
0
        /// <summary>
        /// Gets the item. Additionally filters by catalog
        /// </summary>
        /// <param name="id">The id of item.</param>
        /// <param name="responseGroup">The response group.</param>
        /// <param name="catalogId">The catalog id.</param>
        /// <param name="useCache">if set to <c>true</c> uses cache.</param>
        /// <param name="bycode">if set to <c>true</c> get item by code.</param>
        /// <returns></returns>
        public Item GetItem(string id, ItemResponseGroups responseGroup, string catalogId, bool useCache = true, bool bycode = false)
        {
            var item = GetItem(id, responseGroup, useCache, bycode);

            if (item != null)
            {
                if (item.CatalogId == catalogId)
                    return item;

                var relations = item.CategoryItemRelations.ToArray();

                if (!responseGroup.HasFlag(ItemResponseGroups.ItemCategories))
                {
                    relations = GetCategoryItemRelations(item.ItemId);
                }

                foreach (var rel in relations)
                {
                    if (rel.CatalogId == catalogId)
                        return item;

                    var category = GetCategoryById(rel.CategoryId, null);

                    if (category != null)
                    {
                        if (category.LinkedCategories.Any(link => link.CatalogId == catalogId))
                        {
                            return item;
                        }
                    }
                }
            }

            return null;
        }
Exemplo n.º 15
0
        public virtual async Task<Product> GetProductAsync(
            string store,
            string language,
            string productId,
            ItemResponseGroups responseGroup)
        {
            var parameters =
                new
                {
                    store,
                    language,
                    responseGroup = responseGroup.GetHashCode().ToString(CultureInfo.InvariantCulture)
                };

            return await
                GetAsync<Product>(
                    CreateRequestUri(String.Format(RelativePaths.Product, productId), parameters)).ConfigureAwait(false);
        }
Exemplo n.º 16
0
        /// <summary>
        /// Creates the catalog model.
        /// </summary>
        /// <param name="itemId">The item identifier.</param>
        /// <param name="parentItemId">The parent item identifier.</param>
        /// <param name="associationType">Type of the association.</param>
        /// <param name="forcedActive">if set to <c>true</c> [forced active].</param>
        /// <param name="responseGroups">The response groups.</param>
        /// <param name="display">The display.</param>
        /// <param name="byItemCode">if set to <c>true</c> gets item by code.</param>
        /// <returns>
        /// CatalogItemWithPriceModel.
        /// </returns>
        public static CatalogItemWithPriceModel CreateCatalogModel(string itemId,
            string parentItemId = null,
            string associationType = null,
            bool forcedActive = false,
            ItemResponseGroups responseGroups = ItemResponseGroups.ItemLarge,
            ItemDisplayOptions display = ItemDisplayOptions.ItemLarge,
            bool byItemCode = false)
        {

            var dbItem = CatalogClient.GetItem(itemId, responseGroups,
                                              UserHelper.CustomerSession.CatalogId, bycode: byItemCode);
            if (dbItem != null)
            {

                if (dbItem.IsActive || forcedActive)
                {
                    PriceModel priceModel = null;
                    PropertySet propertySet = null;
                    //ItemRelation[] variations = null;
                    ItemAvailabilityModel itemAvaiability = null;

                    if (display.HasFlag(ItemDisplayOptions.ItemPropertySets))
                    {
                        propertySet = CatalogClient.GetPropertySet(dbItem.PropertySetId);
                        //variations = CatalogClient.GetItemRelations(itemId);
                    }

                    var itemModel = CreateItemModel(dbItem, propertySet);

                    if (display.HasFlag(ItemDisplayOptions.ItemAvailability))
                    {
                        var fulfillmentCenter = UserHelper.StoreClient.GetCurrentStore().FulfillmentCenterId;
                        var availability = CatalogClient.GetItemAvailability(dbItem.ItemId, fulfillmentCenter);
                        itemAvaiability = new ItemAvailabilityModel(availability);
                    }

                    if (display.HasFlag(ItemDisplayOptions.ItemPrice))
                    {
                        var lowestPrice = PriceListClient.GetLowestPrice(dbItem.ItemId, itemAvaiability != null ? itemAvaiability.MinQuantity : 1);
                        var outlines = OutlineBuilder.BuildCategoryOutline(CatalogClient.CustomerSession.CatalogId, dbItem.ItemId);
                        var tags = new Hashtable
							{
								{
									"Outline",
                                    outlines.ToString()
                                }
							};
                        priceModel = MarketingHelper.GetItemPriceModel(dbItem, lowestPrice, tags);
                        itemModel.CatalogOutlines = outlines;

                        // get the category name
                        if (outlines.Count > 0)
                        {
                            var outline = outlines[0];
                            if (outline.Categories.Count > 0)
                            {
                                var category = outline.Categories.OfType<Category>().Reverse().FirstOrDefault();
                                if (category != null)
                                {
                                    itemModel.CategoryName = category.Name;
                                }
                            }
                        }
                    }

                    itemModel.ParentItemId = parentItemId;

                    return string.IsNullOrEmpty(associationType)
                               ? new CatalogItemWithPriceModel(itemModel, priceModel, itemAvaiability)
                               : new AssociatedCatalogItemWithPriceModel(itemModel, priceModel, itemAvaiability, associationType);
                }
            }

            return null;
        }
Exemplo n.º 17
0
        public Item[] GetItemsByCode(string[] codes, bool useCache, ItemResponseGroups responseGroup)
        {
            if (codes == null || !codes.Any())
                return null;

            var query = _catalogRepository.Items.Where(x => codes.Contains(x.Code));
            query = IncludeGroups(query, responseGroup);

            return Helper.Get(
                CacheHelper.CreateCacheKey(Constants.CatalogCachePrefix, string.Format(ItemsCodeCacheKey, CacheHelper.CreateCacheKey(codes), responseGroup)),
                () => (query).ToArray(),
                CatalogConfiguration.Instance.Cache.ItemTimeout,
                _isEnabled && useCache);
        }
Exemplo n.º 18
0
        private IQueryable<Item> IncludeGroups(IQueryable<Item> query, ItemResponseGroups responseGroups)
        {
            if (responseGroups.HasFlag(ItemResponseGroups.ItemAssets))
            {
                query = query.Expand(p => p.ItemAssets);
            }

            if (responseGroups.HasFlag(ItemResponseGroups.ItemAssociations))
            {
                query = query.Expand(p => p.AssociationGroups.Select(a => a.Associations.Select(s => s.CatalogItem)));
            }

            if (responseGroups.HasFlag(ItemResponseGroups.ItemCategories))
            {
                query = query.Expand(p => p.CategoryItemRelations);
            }

            if (responseGroups.HasFlag(ItemResponseGroups.ItemEditorialReviews))
            {
                query = query.Expand(p => p.EditorialReviews);
            }

            if (responseGroups.HasFlag(ItemResponseGroups.ItemProperties))
            {
                query = query.Expand(p => p.ItemPropertyValues);
            }

            return query;
        }
Exemplo n.º 19
0
        public Item[] GetItems(string[] ids, bool useCache, ItemResponseGroups responseGroup)
        {
            if (ids == null || !ids.Any())
                return null;

            var query = _catalogRepository.Items.Where(x => ids.Contains(x.ItemId));
            query = IncludeGroups(query, responseGroup);

            return Helper.Get(
                string.Format(ItemsCacheKey, CacheHelper.CreateCacheKey("", ids), responseGroup),
                () => (query).ToArray(),
                CatalogConfiguration.Instance.Cache.ItemTimeout,
                _isEnabled && useCache);
        }