using Microsoft.AspNetCore.Mvc; using Nop.Core; using Nop.Core.Caching; using Nop.Core.Domain.Catalog; using Nop.Services.Catalog; using Nop.Services.Orders; using Nop.Services.Security; using Nop.Services.Stores; using Nop.Web.Factories; using Nop.Web.Framework.Components; using Nop.Web.Infrastructure.Cache; namespace Nop.Web.Components; public partial class HomepageBestSellersViewComponent : NopViewComponent { protected readonly CatalogSettings _catalogSettings; protected readonly IAclService _aclService; protected readonly IOrderReportService _orderReportService; protected readonly IProductModelFactory _productModelFactory; protected readonly IProductService _productService; protected readonly IStaticCacheManager _staticCacheManager; protected readonly IStoreContext _storeContext; protected readonly IStoreMappingService _storeMappingService; public HomepageBestSellersViewComponent(CatalogSettings catalogSettings, IAclService aclService, IOrderReportService orderReportService, IProductModelFactory productModelFactory, IProductService productService, IStaticCacheManager staticCacheManager, IStoreContext storeContext, IStoreMappingService storeMappingService) { _catalogSettings = catalogSettings; _aclService = aclService; _orderReportService = orderReportService; _productModelFactory = productModelFactory; _productService = productService; _staticCacheManager = staticCacheManager; _storeContext = storeContext; _storeMappingService = storeMappingService; } public async Task InvokeAsync(int? productThumbPictureSize) { if (!_catalogSettings.ShowBestsellersOnHomepage || _catalogSettings.NumberOfBestsellersOnHomepage == 0) return Content(""); //load and cache report var store = await _storeContext.GetCurrentStoreAsync(); var report = await _staticCacheManager.GetAsync( _staticCacheManager.PrepareKeyForDefaultCache(NopModelCacheDefaults.HomepageBestsellersIdsKey, store), async () => await (await _orderReportService.BestSellersReportAsync( storeId: store.Id, pageSize: _catalogSettings.NumberOfBestsellersOnHomepage)).ToListAsync()); //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); } }