Skip to content

Commit

Permalink
fixes #1037
Browse files Browse the repository at this point in the history
  • Loading branch information
iammukeshm committed Oct 2, 2024
1 parent 39a02af commit 049d6ed
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 13 deletions.
6 changes: 6 additions & 0 deletions src/api/framework/Core/Paging/PaginationFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,9 @@ public class PaginationFilter : BaseFilter
public int PageSize { get; set; } = int.MaxValue;
public string[]? OrderBy { get; set; }
}

public static class PaginationFilterExtensions
{
public static bool HasOrderBy(this PaginationFilter filter) =>
filter.OrderBy?.Any() is true;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Ardalis.Specification;
using FSH.Framework.Core.Paging;
using FSH.Framework.Core.Specifications;
using FSH.Starter.WebApi.Catalog.Application.Products.Get.v1;
using FSH.Starter.WebApi.Catalog.Domain;

namespace FSH.Starter.WebApi.Catalog.Application.Products.Search.v1;
public class SearchProductSpecs : EntitiesByPaginationFilterSpec<Product, ProductResponse>
{
public SearchProductSpecs(SearchProductsCommand command)
: base(command) =>
Query
.OrderBy(c => c.Name, !command.HasOrderBy())
.Where(p => p.Price >= command.MinimumRate!.Value, command.MinimumRate.HasValue)
.Where(p => p.Price <= command.MaximumRate!.Value, command.MaximumRate.HasValue);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,9 @@

namespace FSH.Starter.WebApi.Catalog.Application.Products.Search.v1;

public record SearchProductsCommand(PaginationFilter filter) : IRequest<PagedList<ProductResponse>>;
public class SearchProductsCommand : PaginationFilter, IRequest<PagedList<ProductResponse>>
{
public Guid? BrandId { get; set; }
public decimal? MinimumRate { get; set; }
public decimal? MaximumRate { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using FSH.Framework.Core.Paging;
using FSH.Framework.Core.Persistence;
using FSH.Framework.Core.Specifications;
using FSH.Starter.WebApi.Catalog.Application.Products.Get.v1;
using FSH.Starter.WebApi.Catalog.Domain;
using MediatR;
Expand All @@ -16,12 +15,12 @@ public async Task<PagedList<ProductResponse>> Handle(SearchProductsCommand reque
{
ArgumentNullException.ThrowIfNull(request);

var spec = new EntitiesByPaginationFilterSpec<Product, ProductResponse>(request.filter);
var spec = new SearchProductSpecs(request);

var items = await repository.ListAsync(spec, cancellationToken).ConfigureAwait(false);
var totalCount = await repository.CountAsync(spec, cancellationToken).ConfigureAwait(false);

return new PagedList<ProductResponse>(items, request.filter.PageNumber, request.filter.PageSize, totalCount);
return new PagedList<ProductResponse>(items, request!.PageNumber, request!.PageSize, totalCount);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ public static class SearchProductsEndpoint
internal static RouteHandlerBuilder MapGetProductListEndpoint(this IEndpointRouteBuilder endpoints)
{
return endpoints
.MapPost("/search", async (ISender mediator, [FromBody] PaginationFilter filter) =>
.MapPost("/search", async (ISender mediator, [FromBody] SearchProductsCommand command) =>
{
var response = await mediator.Send(new SearchProductsCommand(filter));
var response = await mediator.Send(command);
return Results.Ok(response);
})
.WithName(nameof(SearchProductsEndpoint))
Expand Down
7 changes: 4 additions & 3 deletions src/apps/blazor/client/Pages/Catalog/Products.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ protected override void OnInitialized() =>
idFunc: prod => prod.Id!.Value,
searchFunc: async filter =>
{
var productFilter = filter.Adapt<PaginationFilter>();

var productFilter = filter.Adapt<SearchProductsCommand>();
productFilter.MinimumRate = Convert.ToDouble(SearchMinimumRate);
productFilter.MaximumRate = Convert.ToDouble(SearchMaximumRate);
var result = await _client.SearchProductsEndpointAsync("1", productFilter);
return result.Adapt<PaginationResponse<ProductResponse>>();
},
Expand Down Expand Up @@ -84,4 +85,4 @@ private decimal SearchMaximumRate

public class ProductViewModel : UpdateProductCommand
{
}
}
41 changes: 37 additions & 4 deletions src/apps/blazor/infrastructure/Api/ApiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public partial interface IApiClient
/// <param name="version">The requested API version</param>
/// <returns>OK</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
System.Threading.Tasks.Task<ProductResponsePagedList> SearchProductsEndpointAsync(string version, PaginationFilter body);
System.Threading.Tasks.Task<ProductResponsePagedList> SearchProductsEndpointAsync(string version, SearchProductsCommand body);

/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
/// <summary>
Expand All @@ -139,7 +139,7 @@ public partial interface IApiClient
/// <param name="version">The requested API version</param>
/// <returns>OK</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
System.Threading.Tasks.Task<ProductResponsePagedList> SearchProductsEndpointAsync(string version, PaginationFilter body, System.Threading.CancellationToken cancellationToken);
System.Threading.Tasks.Task<ProductResponsePagedList> SearchProductsEndpointAsync(string version, SearchProductsCommand body, System.Threading.CancellationToken cancellationToken);

/// <summary>
/// Get role details by ID
Expand Down Expand Up @@ -1312,7 +1312,7 @@ public virtual async System.Threading.Tasks.Task DeleteProductEndpointAsync(stri
/// <param name="version">The requested API version</param>
/// <returns>OK</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public virtual System.Threading.Tasks.Task<ProductResponsePagedList> SearchProductsEndpointAsync(string version, PaginationFilter body)
public virtual System.Threading.Tasks.Task<ProductResponsePagedList> SearchProductsEndpointAsync(string version, SearchProductsCommand body)
{
return SearchProductsEndpointAsync(version, body, System.Threading.CancellationToken.None);
}
Expand All @@ -1327,7 +1327,7 @@ public virtual System.Threading.Tasks.Task<ProductResponsePagedList> SearchProdu
/// <param name="version">The requested API version</param>
/// <returns>OK</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public virtual async System.Threading.Tasks.Task<ProductResponsePagedList> SearchProductsEndpointAsync(string version, PaginationFilter body, System.Threading.CancellationToken cancellationToken)
public virtual async System.Threading.Tasks.Task<ProductResponsePagedList> SearchProductsEndpointAsync(string version, SearchProductsCommand body, System.Threading.CancellationToken cancellationToken)
{
if (version == null)
throw new System.ArgumentNullException("version");
Expand Down Expand Up @@ -5151,6 +5151,39 @@ public partial class Search

}

[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.0.7.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class SearchProductsCommand
{

[System.Text.Json.Serialization.JsonPropertyName("advancedSearch")]
public Search AdvancedSearch { get; set; } = default!;

[System.Text.Json.Serialization.JsonPropertyName("keyword")]
public string? Keyword { get; set; } = default!;

[System.Text.Json.Serialization.JsonPropertyName("advancedFilter")]
public Filter AdvancedFilter { get; set; } = default!;

[System.Text.Json.Serialization.JsonPropertyName("pageNumber")]
public int PageNumber { get; set; } = default!;

[System.Text.Json.Serialization.JsonPropertyName("pageSize")]
public int PageSize { get; set; } = default!;

[System.Text.Json.Serialization.JsonPropertyName("orderBy")]
public System.Collections.Generic.ICollection<string>? OrderBy { get; set; } = default!;

[System.Text.Json.Serialization.JsonPropertyName("brandId")]
public System.Guid? BrandId { get; set; } = default!;

[System.Text.Json.Serialization.JsonPropertyName("minimumRate")]
public double? MinimumRate { get; set; } = default!;

[System.Text.Json.Serialization.JsonPropertyName("maximumRate")]
public double? MaximumRate { get; set; } = default!;

}

[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.0.7.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))")]
public partial class TenantDetail
{
Expand Down

0 comments on commit 049d6ed

Please sign in to comment.