public async Task CanPrepareProductOverviewModels()
        {
            var product = await _productService.GetProductByIdAsync(1);

            var model = (await _productModelFactory.PrepareProductOverviewModelsAsync(new[] { product })).FirstOrDefault();

            PropertiesShouldEqual(product, model);
        }
        /// <returns>A task that represents the asynchronous operation</returns>
        public virtual async Task <IActionResult> RecentlyViewedProducts()
        {
            if (!_catalogSettings.RecentlyViewedProductsEnabled)
            {
                return(Content(""));
            }

            var products = await _recentlyViewedProductsService.GetRecentlyViewedProductsAsync(_catalogSettings.RecentlyViewedProductsNumber);

            var model = new List <ProductOverviewModel>();

            model.AddRange(await _productModelFactory.PrepareProductOverviewModelsAsync(products));

            return(View(model));
        }
Example #3
0
        /// <returns>A task that represents the asynchronous operation</returns>
        public async Task <IViewComponentResult> InvokeAsync(int?productThumbPictureSize)
        {
            if (!_catalogSettings.ShowBestsellersOnHomepage || _catalogSettings.NumberOfBestsellersOnHomepage == 0)
            {
                return(Content(""));
            }

            //load and cache report
            var report = (await _staticCacheManager.GetAsync(_staticCacheManager.PrepareKeyForDefaultCache(NopModelCacheDefaults.HomepageBestsellersIdsKey, await _storeContext.GetCurrentStoreAsync()),
                                                             async() => await _orderReportService.BestSellersReportAsync(
                                                                 storeId: (await _storeContext.GetCurrentStoreAsync()).Id,
                                                                 pageSize: _catalogSettings.NumberOfBestsellersOnHomepage)))
                         .ToList();

            //load products
            var products = await(await _productService.GetProductsByIdsAsync(report.Select(x => x.ProductId).ToArray()))
                           //ACL and store mapping
                           .WhereAwait(async p => await _aclService.AuthorizeAsync(p) && await _storeMappingService.AuthorizeAsync(p))
                           //availability dates
                           .Where(p => _productService.ProductIsAvailable(p)).ToListAsync();

            if (!products.Any())
            {
                return(Content(""));
            }

            //prepare model
            var model = (await _productModelFactory.PrepareProductOverviewModelsAsync(products, true, true, productThumbPictureSize)).ToList();

            return(View(model));
        }
Example #4
0
        public virtual async Task <IActionResult> SearchTermAutoComplete(string term)
        {
            term = term.Trim();
            if (string.IsNullOrWhiteSpace(term) || term.Length < _catalogSettings.ProductSearchTermMinimumLength)
            {
                return(Content(""));
            }

            //products
            var productNumber = _catalogSettings.ProductSearchAutoCompleteNumberOfProducts > 0 ?
                                _catalogSettings.ProductSearchAutoCompleteNumberOfProducts : 10;

            var products = await _productService.SearchProductsAsync(0,
                                                                     storeId : (await _storeContext.GetCurrentStoreAsync()).Id,
                                                                     keywords : term,
                                                                     languageId : (await _workContext.GetWorkingLanguageAsync()).Id,
                                                                     visibleIndividuallyOnly : true,
                                                                     pageSize : productNumber);

            var showLinkToResultSearch = _catalogSettings.ShowLinkToAllResultInSearchAutoComplete && (products.TotalCount > productNumber);

            var models = (await _productModelFactory.PrepareProductOverviewModelsAsync(products, false, _catalogSettings.ShowProductImagesInSearchAutoComplete, _mediaSettings.AutoCompleteSearchThumbPictureSize)).ToList();
            var result = (from p in models
                          select new
            {
                label = p.Name,
                producturl = Url.RouteUrl("Product", new { SeName = p.SeName }),
                productpictureurl = p.DefaultPictureModel.ImageUrl,
                showlinktoresultsearch = showLinkToResultSearch
            })
                         .ToList();

            return(Json(result));
        }
        public async Task <IViewComponentResult> InvokeAsync(int?productThumbPictureSize, bool?preparePriceModel)
        {
            if (!_catalogSettings.RecentlyViewedProductsEnabled)
            {
                return(Content(""));
            }

            var preparePictureModel = productThumbPictureSize.HasValue;
            var products            = await(await _recentlyViewedProductsService.GetRecentlyViewedProductsAsync(_catalogSettings.RecentlyViewedProductsNumber))
                                      //ACL and store mapping
                                      .WhereAwait(async p => await _aclService.AuthorizeAsync(p) && await _storeMappingService.AuthorizeAsync(p))
                                      //availability dates
                                      .Where(p => _productService.ProductIsAvailable(p)).ToListAsync();

            if (!products.Any())
            {
                return(Content(""));
            }

            //prepare model
            var model = new List <ProductOverviewModel>();

            model.AddRange(await _productModelFactory.PrepareProductOverviewModelsAsync(products,
                                                                                        preparePriceModel.GetValueOrDefault(),
                                                                                        preparePictureModel,
                                                                                        productThumbPictureSize));

            return(View(model));
        }
        public async Task <IViewComponentResult> InvokeAsync(int?productThumbPictureSize)
        {
            var cart = await _shoppingCartService.GetShoppingCartAsync(await _workContext.GetCurrentCustomerAsync(), ShoppingCartType.ShoppingCart, (await _storeContext.GetCurrentStoreAsync()).Id);

            var products = await(await _productService.GetCrossSellProductsByShoppingCartAsync(cart, _shoppingCartSettings.CrossSellsNumber))
                           //ACL and store mapping
                           .WhereAwait(async p => await _aclService.AuthorizeAsync(p) && await _storeMappingService.AuthorizeAsync(p))
                           //availability dates
                           .Where(p => _productService.ProductIsAvailable(p))
                           //visible individually
                           .Where(p => p.VisibleIndividually).ToListAsync();

            if (!products.Any())
            {
                return(Content(""));
            }

            //Cross-sell products are displayed on the shopping cart page.
            //We know that the entire shopping cart page is not refresh
            //even if "ShoppingCartSettings.DisplayCartAfterAddingProduct" setting  is enabled.
            //That's why we force page refresh (redirect) in this case
            var model = (await _productModelFactory.PrepareProductOverviewModelsAsync(products,
                                                                                      productThumbPictureSize: productThumbPictureSize, forceRedirectionAfterAddingToCart: true))
                        .ToList();

            return(View(model));
        }
Example #7
0
        public async Task <IViewComponentResult> InvokeAsync(int productId, int?productThumbPictureSize)
        {
            if (!_catalogSettings.ProductsAlsoPurchasedEnabled)
            {
                return(Content(""));
            }

            //load and cache report
            var store = await _storeContext.GetCurrentStoreAsync();

            var productIds = await _staticCacheManager.GetAsync(_staticCacheManager.PrepareKeyForDefaultCache(NopModelCacheDefaults.ProductsAlsoPurchasedIdsKey, productId, store),
                                                                async() => await _orderReportService.GetAlsoPurchasedProductsIdsAsync(store.Id, productId, _catalogSettings.ProductsAlsoPurchasedNumber)
                                                                );

            //load products
            var products = await(await _productService.GetProductsByIdsAsync(productIds))
                           //ACL and store mapping
                           .WhereAwait(async p => await _aclService.AuthorizeAsync(p) && await _storeMappingService.AuthorizeAsync(p))
                           //availability dates
                           .Where(p => _productService.ProductIsAvailable(p)).ToListAsync();

            if (!products.Any())
            {
                return(Content(""));
            }

            var model = (await _productModelFactory.PrepareProductOverviewModelsAsync(products, true, true, productThumbPictureSize)).ToList();

            return(View(model));
        }
Example #8
0
        /// <returns>A task that represents the asynchronous operation</returns>
        public async Task <IViewComponentResult> InvokeAsync(int?productThumbPictureSize)
        {
            var products = await(await _productService.GetAllProductsDisplayedOnHomepageAsync())
                           //ACL and store mapping
                           .WhereAwait(async p => await _aclService.AuthorizeAsync(p) && await _storeMappingService.AuthorizeAsync(p))
                           //availability dates
                           .Where(p => _productService.ProductIsAvailable(p))
                           //visible individually
                           .Where(p => p.VisibleIndividually).ToListAsync();

            if (!products.Any())
            {
                return(Content(""));
            }

            var model = (await _productModelFactory.PrepareProductOverviewModelsAsync(products, true, true, productThumbPictureSize)).ToList();

            return(View(model));
        }
Example #9
0
        public async Task <IViewComponentResult> InvokeAsync(int productId, int?productThumbPictureSize)
        {
            //load and cache report
            var productIds = (await _productService.GetRelatedProductsByProductId1Async(productId)).Select(x => x.ProductId2).ToArray();

            //load products
            var products = await(await _productService.GetProductsByIdsAsync(productIds))
                           //ACL and store mapping
                           .WhereAwait(async p => await _aclService.AuthorizeAsync(p) && await _storeMappingService.AuthorizeAsync(p))
                           //availability dates
                           .Where(p => _productService.ProductIsAvailable(p))
                           //visible individually
                           .Where(p => p.VisibleIndividually).ToListAsync();

            if (!products.Any())
            {
                return(Content(string.Empty));
            }

            var model = (await _productModelFactory.PrepareProductOverviewModelsAsync(products, true, true, productThumbPictureSize)).ToList();

            return(View(model));
        }
Example #10
0
        public async Task <IActionResult> Promo(string promoSlug, CatalogProductsCommand command)
        {
            var urlRecord = await _urlRecordService.GetBySlugAsync(promoSlug);

            if (urlRecord == null)
            {
                return(InvokeHttp404());
            }

            var promo = await _abcPromoService.GetPromoByIdAsync(urlRecord.EntityId);

            if (promo == null)
            {
                return(InvokeHttp404());
            }

            var shouldDisplay = _settings.IncludeExpiredPromosOnRebatesPromosPage ?
                                promo.IsExpired() || promo.IsActive() :
                                promo.IsActive();

            if (!shouldDisplay)
            {
                return(InvokeHttp404());
            }

            var promoProducts = await _abcPromoService.GetPublishedProductsByPromoIdAsync(promo.Id);

            // if a category is provided, filter by it
            var filterCategory = await GetFilterCategoryAsync();

            if (filterCategory != null)
            {
                var filterCategoryIds = (await _categoryService.GetChildCategoryIdsAsync(filterCategory.Id)).ToList();
                filterCategoryIds.Add(filterCategory.Id);
                var categoryFilteredProducts = new List <Product>();
                foreach (var product in promoProducts)
                {
                    var pcs = await _categoryService.GetProductCategoriesByProductIdAsync(product.Id);

                    var pcsCategoryIds           = pcs.Select(pc => pc.CategoryId);
                    var pcCategoryIdsWithParents = new List <int>();

                    if (pcsCategoryIds.Intersect(filterCategoryIds).Any())
                    {
                        categoryFilteredProducts.Add(product);
                    }
                }

                promoProducts = categoryFilteredProducts;
            }

            promoProducts = SortPromoProducts(promoProducts, command);

            var filteredPromoProducts = promoProducts.Skip(command.PageIndex * 20).Take(20).ToList();

            var model = new PromoListingModel
            {
                Name = promo.ManufacturerId != null ?
                       $"{(await _manufacturerService.GetManufacturerByIdAsync(promo.ManufacturerId.Value)).Name} - {promo.Description}" :
                       promo.Description,
                Products       = (await _productModelFactory.PrepareProductOverviewModelsAsync(filteredPromoProducts)).ToList(),
                BannerImageUrl = await promo.GetPromoBannerUrlAsync(),
                PromoFormPopup = promo.GetPopupCommand()
            };

            var pagedList = new PagedList <Product>(
                filteredPromoProducts,
                command.PageIndex,
                20,
                promoProducts.Count
                );

            model.LoadPagedList(pagedList);

            // using duplicate sorting - it would be good to link this to NOP code but it's pretty complex
            await PrepareSortingOptionsAsync(model, command);

            return(View("~/Plugins/Widgets.AbcPromos/Views/PromoListing.cshtml", model));
        }