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); }
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)); }
//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); }
/// <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); }
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)); }
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)); }
/// <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); }
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)); }
//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; }
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); }
/// <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; }
/// <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; }
/// <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; }
/// <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; }
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); }
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); }
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; }
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); }