diff --git a/src/CMSMicroservice.Application/DiscountShopCQ/Queries/GetDiscountProducts/GetDiscountProductsQuery.cs b/src/CMSMicroservice.Application/DiscountShopCQ/Queries/GetDiscountProducts/GetDiscountProductsQuery.cs index e094519..9064e73 100644 --- a/src/CMSMicroservice.Application/DiscountShopCQ/Queries/GetDiscountProducts/GetDiscountProductsQuery.cs +++ b/src/CMSMicroservice.Application/DiscountShopCQ/Queries/GetDiscountProducts/GetDiscountProductsQuery.cs @@ -11,6 +11,7 @@ public class GetDiscountProductsQuery : IRequest public bool? IsActive { get; set; } public int? MinPrice { get; set; } public int? MaxPrice { get; set; } + public string? SortBy { get; set; } } public class GetDiscountProductsResponseDto diff --git a/src/CMSMicroservice.Application/DiscountShopCQ/Queries/GetDiscountProducts/GetDiscountProductsQueryHandler.cs b/src/CMSMicroservice.Application/DiscountShopCQ/Queries/GetDiscountProducts/GetDiscountProductsQueryHandler.cs index 6b3f7c7..c48bf54 100644 --- a/src/CMSMicroservice.Application/DiscountShopCQ/Queries/GetDiscountProducts/GetDiscountProductsQueryHandler.cs +++ b/src/CMSMicroservice.Application/DiscountShopCQ/Queries/GetDiscountProducts/GetDiscountProductsQueryHandler.cs @@ -1,3 +1,4 @@ +using CMSMicroservice.Application.Common.Extensions; using CMSMicroservice.Application.Common.Interfaces; using CMSMicroservice.Application.Common.Models; using MediatR; @@ -51,13 +52,16 @@ public class GetDiscountProductsQueryHandler : IRequestHandler p.Price <= request.MaxPrice.Value); } + if (!string.IsNullOrEmpty(request.SortBy)) + query = query.ApplyOrder(request.SortBy); + else + query = query.OrderByDescending(p => p.Created); + var totalCount = await query.CountAsync(cancellationToken); - // Apply pagination var pagination = request.PaginationQuery ?? new PaginationState { PageNumber = 1, PageSize = 10 }; - + var products = await query - .OrderByDescending(p => p.Created) .Skip((pagination.PageNumber - 1) * pagination.PageSize) .Take(pagination.PageSize) .Select(p => new DiscountProductDto diff --git a/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj b/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj index f857e88..d6e0aa8 100644 --- a/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj +++ b/src/CMSMicroservice.Protobuf/CMSMicroservice.Protobuf.csproj @@ -3,7 +3,7 @@ net9.0 enable enable - 0.0.195 + 0.0.196 None False False diff --git a/src/CMSMicroservice.Protobuf/Protos/discountproduct.proto b/src/CMSMicroservice.Protobuf/Protos/discountproduct.proto index c549fba..4eaaa19 100644 --- a/src/CMSMicroservice.Protobuf/Protos/discountproduct.proto +++ b/src/CMSMicroservice.Protobuf/Protos/discountproduct.proto @@ -163,6 +163,7 @@ message GetDiscountProductsRequest google.protobuf.BoolValue in_stock = 6; int32 page_number = 7; int32 page_size = 8; + google.protobuf.StringValue sort_by = 9; } message GetDiscountProductsResponse @@ -184,6 +185,7 @@ message DiscountProductDto int32 view_count = 9; bool is_active = 10; google.protobuf.Timestamp created = 11; + int32 sale_count = 12; } // ===== Product Image Gallery Messages ===== diff --git a/src/CMSMicroservice.WebApi/Common/Mappings/DiscountProductProfile.cs b/src/CMSMicroservice.WebApi/Common/Mappings/DiscountProductProfile.cs index d80be07..b695d95 100644 --- a/src/CMSMicroservice.WebApi/Common/Mappings/DiscountProductProfile.cs +++ b/src/CMSMicroservice.WebApi/Common/Mappings/DiscountProductProfile.cs @@ -23,6 +23,8 @@ public class DiscountProductProfile : IRegister src => src.MinPrice != null ? (int?)src.MinPrice.Value : null) .Map(dest => dest.MaxPrice, src => src.MaxPrice != null ? (int?)src.MaxPrice.Value : null) + .Map(dest => dest.SortBy, + src => string.IsNullOrEmpty(src.SortBy) ? null : src.SortBy) .Map(dest => dest.PaginationQuery, src => new PaginationState { PageNumber = src.PageNumber > 0 ? src.PageNumber : 1, @@ -64,6 +66,7 @@ public class DiscountProductProfile : IRegister ThumbnailPath = p.ThumbnailPath ?? string.Empty, RemainingCount = p.RemainingCount, ViewCount = p.ViewCount, + SaleCount = p.SaleCount, IsActive = p.IsActive, Created = Timestamp.FromDateTime(DateTime.UtcNow) });