From 37c7cebf921b02c9b0e3b831660d047309b84cf3 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Tue, 30 Jun 2026 00:17:30 +0330 Subject: [PATCH] feat: update product service to support in-stock filtering and enhance top-selling product retrieval - Modified `GetTopSellingAsync` methods in `ProductService` and `DiscountProductService` to include an optional `inStock` parameter for filtering products based on availability. - Introduced a constant for the top product count in `Index.razor.cs` to improve maintainability and readability. - Updated the product retrieval logic in `Index.razor.cs` to utilize the new in-stock filtering feature. These changes enhance the product listing functionality by allowing users to view only in-stock top-selling products, improving the overall shopping experience. --- src/FrontOffice.Main/FrontOffice.Main.csproj | 2 +- src/FrontOffice.Main/Pages/Index.razor.cs | 8 +++--- .../Utilities/DiscountProductService.cs | 4 +-- .../Utilities/ProductService.cs | 25 +++++++++++-------- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/FrontOffice.Main/FrontOffice.Main.csproj b/src/FrontOffice.Main/FrontOffice.Main.csproj index ca06319..0fe8530 100644 --- a/src/FrontOffice.Main/FrontOffice.Main.csproj +++ b/src/FrontOffice.Main/FrontOffice.Main.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/FrontOffice.Main/Pages/Index.razor.cs b/src/FrontOffice.Main/Pages/Index.razor.cs index 500dfab..f688624 100644 --- a/src/FrontOffice.Main/Pages/Index.razor.cs +++ b/src/FrontOffice.Main/Pages/Index.razor.cs @@ -24,6 +24,8 @@ public partial class Index : IDisposable private LandingSettings? _settings; // ── Top-selling product sections ── + private const int LandingTopProductCount = 6; + private List _topRegularProducts = new(); private List _topDiscountProducts = new(); private bool _loadingTopProducts = true; @@ -65,9 +67,9 @@ public partial class Index : IDisposable PopulateFromSettings(); _dataLoaded = true; - // Load top-selling products and blog posts in parallel - var topRegTask = ProductService.GetTopSellingAsync(6); - var topDiscTask = DiscountProductService.GetTopSellingAsync(6); + // Load top-selling in-stock products and blog posts in parallel + var topRegTask = ProductService.GetTopSellingAsync(LandingTopProductCount, inStock: true); + var topDiscTask = DiscountProductService.GetTopSellingAsync(LandingTopProductCount, inStock: true); var featuredPostsTask = BlogPostService.GetFeaturedPostsAsync(2); try diff --git a/src/FrontOffice.Main/Utilities/DiscountProductService.cs b/src/FrontOffice.Main/Utilities/DiscountProductService.cs index 149fedc..4166315 100644 --- a/src/FrontOffice.Main/Utilities/DiscountProductService.cs +++ b/src/FrontOffice.Main/Utilities/DiscountProductService.cs @@ -127,8 +127,8 @@ public class DiscountProductService } } - public Task GetTopSellingAsync(int count = 6) - => GetProductsAsync(page: 1, pageSize: count, sortBy: "SaleCount desc"); + public Task GetTopSellingAsync(int count = 6, bool? inStock = null) + => GetProductsAsync(page: 1, pageSize: count, sortBy: "SaleCount desc", inStock: inStock); public async Task GetByIdAsync(long productId) { diff --git a/src/FrontOffice.Main/Utilities/ProductService.cs b/src/FrontOffice.Main/Utilities/ProductService.cs index ca09d3e..39b7f9c 100644 --- a/src/FrontOffice.Main/Utilities/ProductService.cs +++ b/src/FrontOffice.Main/Utilities/ProductService.cs @@ -71,12 +71,12 @@ public class ProductService return result.Products; } - public Task GetTopSellingAsync(int count = 6) - => GetProductsPagedAsync(sortBy: "SaleCount desc", page: 1, pageSize: count); + public Task GetTopSellingAsync(int count = 6, bool? inStock = null) + => GetProductsPagedAsync(sortBy: "SaleCount desc", page: 1, pageSize: count, inStock: inStock); public async Task GetProductsPagedAsync( string? query = null, long? categoryId = null, string? sortBy = null, - int page = 1, int pageSize = 12) + int page = 1, int pageSize = 12, bool? inStock = null) { try { @@ -87,20 +87,25 @@ public class ProductService PageNumber = page, PageSize = pageSize }, - Filter = new GetAllProductsByFilterFilter - { - Title = query ?? string.Empty, - Description = query ?? string.Empty, - ShortInfomation = query ?? string.Empty, - FullInformation = query ?? string.Empty - } + Filter = new GetAllProductsByFilterFilter() }; + // فقط Title — CMS فیلترها را AND می‌زند؛ ارسال query در همه فیلدها جستجو را می‌شکند + if (!string.IsNullOrWhiteSpace(query)) + { + request.Filter.Title = query.Trim(); + } + if (categoryId is { } value) { request.Filter.CategoryId = value; } + if (inStock.HasValue) + { + request.Filter.InStock = inStock.Value; + } + if (!string.IsNullOrEmpty(sortBy)) { request.SortBy = sortBy;