feat(EmallsProductResponse) , feat(EmallsProductsEndpoint)
- Add Emalls product response dtos - Add Emalls queries and add mediatr - Add Emalls enpoint to get productsrelease
parent
092d335f77
commit
f942bbb421
|
@ -21,6 +21,10 @@ public class SearchController : ICarterModule
|
||||||
group.MapGet("torob", TorobAsync)
|
group.MapGet("torob", TorobAsync)
|
||||||
.WithDisplayName("Get Torob Product Async")
|
.WithDisplayName("Get Torob Product Async")
|
||||||
.HasApiVersion(1.0);
|
.HasApiVersion(1.0);
|
||||||
|
|
||||||
|
group.MapGet("emalls", EmallsAsync)
|
||||||
|
.WithDisplayName("Get Emalls Product Async")
|
||||||
|
.HasApiVersion(1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IResult> SearchThumbAsync([FromQuery] string name, [FromServices] ISearchService searchService, CancellationToken cancellationToken)
|
private async Task<IResult> SearchThumbAsync([FromQuery] string name, [FromServices] ISearchService searchService, CancellationToken cancellationToken)
|
||||||
|
@ -44,4 +48,7 @@ public class SearchController : ICarterModule
|
||||||
|
|
||||||
private async Task<IResult> TorobAsync([FromQuery] int page, [FromServices] IMediator mediator, CancellationToken cancellationToken)
|
private async Task<IResult> TorobAsync([FromQuery] int page, [FromServices] IMediator mediator, CancellationToken cancellationToken)
|
||||||
=> TypedResults.Ok(await mediator.Send(new GetTorobProductsQuery(page),cancellationToken));
|
=> TypedResults.Ok(await mediator.Send(new GetTorobProductsQuery(page),cancellationToken));
|
||||||
|
|
||||||
|
private async Task<IResult> EmallsAsync([FromQuery] int page, [FromQuery]int? item_per_page, [FromServices] IMediator mediator, CancellationToken cancellationToken)
|
||||||
|
=> TypedResults.Ok(await mediator.Send(new GetEmallsProductsQuery(page,item_per_page??20), cancellationToken));
|
||||||
}
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
namespace Netina.Core.CoreServices.SearchServices;
|
||||||
|
|
||||||
|
public class GetEmallsProductQueryHandler : IRequestHandler<GetEmallsProductsQuery, EmallsResponseDto>
|
||||||
|
{
|
||||||
|
private readonly IRepositoryWrapper _repositoryWrapper;
|
||||||
|
private readonly IMediator _mediator;
|
||||||
|
private readonly SiteSettings _siteSetting;
|
||||||
|
public GetEmallsProductQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, IOptionsSnapshot<SiteSettings> optionsSnapshot)
|
||||||
|
{
|
||||||
|
_repositoryWrapper = repositoryWrapper;
|
||||||
|
_mediator = mediator;
|
||||||
|
_siteSetting = optionsSnapshot.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<EmallsResponseDto> Handle(GetEmallsProductsQuery request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var page = request.Page;
|
||||||
|
var productsSDto = await _repositoryWrapper.SetRepository<Product>()
|
||||||
|
.TableNoTracking
|
||||||
|
.OrderByDescending(p => p.ModifiedAt == DateTime.MinValue ? p.CreatedAt : p.ModifiedAt)
|
||||||
|
.Select(p => new ProductSDto
|
||||||
|
{
|
||||||
|
Id = p.Id,
|
||||||
|
BeDisplayed = p.BeDisplayed,
|
||||||
|
IsEnable = p.IsEnable,
|
||||||
|
Cost = p.Cost,
|
||||||
|
CategoryId = p.CategoryId,
|
||||||
|
BrandId = p.BrandId,
|
||||||
|
EnglishName = p.EnglishName,
|
||||||
|
PersianName = p.PersianName,
|
||||||
|
Slug = p.Slug,
|
||||||
|
|
||||||
|
})
|
||||||
|
.Skip(page * request.Count)
|
||||||
|
.Take(request.Count)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var productSDto in productsSDto)
|
||||||
|
await _mediator.Send(new CalculateProductDiscountCommand(productSDto), cancellationToken);
|
||||||
|
var products = new List<EmallsProductResponseDto>();
|
||||||
|
foreach (var product in productsSDto)
|
||||||
|
{
|
||||||
|
var torobProduct = new EmallsProductResponseDto
|
||||||
|
{
|
||||||
|
is_available = product.IsEnable,
|
||||||
|
url = $"{_siteSetting.WebSiteUrl}/products/{product.Id}/{product.Slug}",
|
||||||
|
id = product.Id.ToString(),
|
||||||
|
title = product.PersianName,
|
||||||
|
category = product.CategoryName
|
||||||
|
};
|
||||||
|
if (product.Cost > product.CostWithDiscount)
|
||||||
|
{
|
||||||
|
torobProduct.old_price = (int)product.Cost;
|
||||||
|
torobProduct.price = (int)product.CostWithDiscount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
torobProduct.price = (int)product.Cost;
|
||||||
|
products.Add(torobProduct);
|
||||||
|
}
|
||||||
|
|
||||||
|
var response = new EmallsResponseDto();
|
||||||
|
response.item_per_page = request.Count;
|
||||||
|
response.page_num = request.Page;
|
||||||
|
response.total_items = (await _repositoryWrapper.SetRepository<Product>().TableNoTracking.CountAsync(cancellationToken));
|
||||||
|
response.pages_count = response.total_items / request.Count;
|
||||||
|
response.products = products;
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
|
@ -46,7 +46,7 @@ public class GetTorobProductsQueryHandler : IRequestHandler<GetTorobProductsQuer
|
||||||
var torobProduct = new TorobProductResponseDto
|
var torobProduct = new TorobProductResponseDto
|
||||||
{
|
{
|
||||||
availibility = product.IsEnable,
|
availibility = product.IsEnable,
|
||||||
page_url = $"{_siteSetting.WebSiteUrl}/products/{product.Id}",
|
page_url = $"{_siteSetting.WebSiteUrl}/products/{product.Id}/{product.Slug}",
|
||||||
product_id = product.Id.ToString()
|
product_id = product.Id.ToString()
|
||||||
};
|
};
|
||||||
if (product.Cost > product.CostWithDiscount)
|
if (product.Cost > product.CostWithDiscount)
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
<Using Include="Netina.Domain.Dtos.LargDtos" />
|
<Using Include="Netina.Domain.Dtos.LargDtos" />
|
||||||
<Using Include="Netina.Domain.Dtos.RequestDtos" />
|
<Using Include="Netina.Domain.Dtos.RequestDtos" />
|
||||||
<Using Include="Netina.Domain.Dtos.ResponseDtos" />
|
<Using Include="Netina.Domain.Dtos.ResponseDtos" />
|
||||||
|
<Using Include="Netina.Domain.Dtos.ResponseDtos.Emalls" />
|
||||||
<Using Include="Netina.Domain.Dtos.SmallDtos" />
|
<Using Include="Netina.Domain.Dtos.SmallDtos" />
|
||||||
<Using Include="Netina.Domain.Entities.Blogs" />
|
<Using Include="Netina.Domain.Entities.Blogs" />
|
||||||
<Using Include="Netina.Domain.Entities.Brands" />
|
<Using Include="Netina.Domain.Entities.Brands" />
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
using Netina.Domain.Dtos.ResponseDtos.Torob;
|
using Netina.Domain.Dtos.ResponseDtos.Emalls;
|
||||||
|
using Netina.Domain.Dtos.ResponseDtos.Torob;
|
||||||
|
|
||||||
namespace Netina.Domain.CommandQueries.Queries;
|
namespace Netina.Domain.CommandQueries.Queries;
|
||||||
|
|
||||||
public sealed record GetTorobProductsQuery(int Page = 0) : IRequest<List<TorobProductResponseDto>>;
|
public sealed record GetTorobProductsQuery(int Page = 0) : IRequest<List<TorobProductResponseDto>>;
|
||||||
|
|
||||||
|
public sealed record GetEmallsProductsQuery(int Page = 0 , int Count = 20) : IRequest<EmallsResponseDto>;
|
|
@ -0,0 +1,14 @@
|
||||||
|
namespace Netina.Domain.Dtos.ResponseDtos.Emalls;
|
||||||
|
|
||||||
|
public class EmallsProductResponseDto
|
||||||
|
{
|
||||||
|
public string title { get; set; } = string.Empty;
|
||||||
|
public string id { get; set; } = string.Empty;
|
||||||
|
public int price { get; set; }
|
||||||
|
public int? old_price { get; set; }
|
||||||
|
public string category { get; set; }
|
||||||
|
public string color { get; set; }
|
||||||
|
public string guarantee { get; set; }
|
||||||
|
public bool is_available { get; set; }
|
||||||
|
public string url { get; set; }
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
namespace Netina.Domain.Dtos.ResponseDtos.Emalls;
|
||||||
|
|
||||||
|
public class EmallsResponseDto
|
||||||
|
{
|
||||||
|
public List<EmallsProductResponseDto> products { get; set; } = new();
|
||||||
|
public int total_items { get; set; }
|
||||||
|
public int pages_count { get; set; }
|
||||||
|
public int item_per_page { get; set; }
|
||||||
|
public int page_num { get; set; }
|
||||||
|
}
|
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Dtos\FilterDtos\" />
|
<Folder Include="Dtos\FilterDtos\" />
|
||||||
|
<Folder Include="Dtos\ResponseDtos\Emalls\" />
|
||||||
<Folder Include="Entities\StorageFiles\" />
|
<Folder Include="Entities\StorageFiles\" />
|
||||||
<Folder Include="Models\Districts\" />
|
<Folder Include="Models\Districts\" />
|
||||||
<Folder Include="Models\Settings\" />
|
<Folder Include="Models\Settings\" />
|
||||||
|
|
Loading…
Reference in New Issue