diff --git a/Netina.Api/Controllers/SearchController.cs b/Netina.Api/Controllers/SearchController.cs index 5cd2bb0..e9d6523 100644 --- a/Netina.Api/Controllers/SearchController.cs +++ b/Netina.Api/Controllers/SearchController.cs @@ -21,6 +21,10 @@ public class SearchController : ICarterModule group.MapGet("torob", TorobAsync) .WithDisplayName("Get Torob Product Async") .HasApiVersion(1.0); + + group.MapGet("emalls", EmallsAsync) + .WithDisplayName("Get Emalls Product Async") + .HasApiVersion(1.0); } private async Task SearchThumbAsync([FromQuery] string name, [FromServices] ISearchService searchService, CancellationToken cancellationToken) @@ -44,4 +48,7 @@ public class SearchController : ICarterModule private async Task TorobAsync([FromQuery] int page, [FromServices] IMediator mediator, CancellationToken cancellationToken) => TypedResults.Ok(await mediator.Send(new GetTorobProductsQuery(page),cancellationToken)); + + private async Task 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)); } \ No newline at end of file diff --git a/Netina.Core/CoreServices/SearchServices/GetEmallsProductQueryHandler.cs b/Netina.Core/CoreServices/SearchServices/GetEmallsProductQueryHandler.cs new file mode 100644 index 0000000..864e377 --- /dev/null +++ b/Netina.Core/CoreServices/SearchServices/GetEmallsProductQueryHandler.cs @@ -0,0 +1,71 @@ +namespace Netina.Core.CoreServices.SearchServices; + +public class GetEmallsProductQueryHandler : IRequestHandler +{ + private readonly IRepositoryWrapper _repositoryWrapper; + private readonly IMediator _mediator; + private readonly SiteSettings _siteSetting; + public GetEmallsProductQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, IOptionsSnapshot optionsSnapshot) + { + _repositoryWrapper = repositoryWrapper; + _mediator = mediator; + _siteSetting = optionsSnapshot.Value; + } + + public async Task Handle(GetEmallsProductsQuery request, CancellationToken cancellationToken) + { + var page = request.Page; + var productsSDto = await _repositoryWrapper.SetRepository() + .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(); + 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().TableNoTracking.CountAsync(cancellationToken)); + response.pages_count = response.total_items / request.Count; + response.products = products; + + return response; + } +} \ No newline at end of file diff --git a/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs b/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs index 1347092..2344258 100644 --- a/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs +++ b/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs @@ -46,7 +46,7 @@ public class GetTorobProductsQueryHandler : IRequestHandler product.CostWithDiscount) diff --git a/Netina.Core/Netina.Core.csproj b/Netina.Core/Netina.Core.csproj index 7ebd771..08dd96c 100644 --- a/Netina.Core/Netina.Core.csproj +++ b/Netina.Core/Netina.Core.csproj @@ -58,6 +58,7 @@ + diff --git a/Netina.Domain/CommandQueries/Queries/SearchQueries.cs b/Netina.Domain/CommandQueries/Queries/SearchQueries.cs index 2eacdfb..b473c30 100644 --- a/Netina.Domain/CommandQueries/Queries/SearchQueries.cs +++ b/Netina.Domain/CommandQueries/Queries/SearchQueries.cs @@ -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; -public sealed record GetTorobProductsQuery(int Page = 0) : IRequest>; \ No newline at end of file +public sealed record GetTorobProductsQuery(int Page = 0) : IRequest>; + +public sealed record GetEmallsProductsQuery(int Page = 0 , int Count = 20) : IRequest; \ No newline at end of file diff --git a/Netina.Domain/Dtos/ResponseDtos/Emalls/EmallsProductResponseDto.cs b/Netina.Domain/Dtos/ResponseDtos/Emalls/EmallsProductResponseDto.cs new file mode 100644 index 0000000..4820be3 --- /dev/null +++ b/Netina.Domain/Dtos/ResponseDtos/Emalls/EmallsProductResponseDto.cs @@ -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; } +} \ No newline at end of file diff --git a/Netina.Domain/Dtos/ResponseDtos/Emalls/EmallsResponseDto.cs b/Netina.Domain/Dtos/ResponseDtos/Emalls/EmallsResponseDto.cs new file mode 100644 index 0000000..28f24ed --- /dev/null +++ b/Netina.Domain/Dtos/ResponseDtos/Emalls/EmallsResponseDto.cs @@ -0,0 +1,10 @@ +namespace Netina.Domain.Dtos.ResponseDtos.Emalls; + +public class EmallsResponseDto +{ + public List 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; } +} \ No newline at end of file diff --git a/Netina.Domain/Netina.Domain.csproj b/Netina.Domain/Netina.Domain.csproj index fb82ead..247ce02 100644 --- a/Netina.Domain/Netina.Domain.csproj +++ b/Netina.Domain/Netina.Domain.csproj @@ -37,6 +37,7 @@ +