refactor(SearchService) , chore(BaseServices) , feat(SmsLookUpMethod)

- Refactor search service and add queries base service by mediatr
- Change core service files to base service
- Add sms look up method in sms service
release
Amir Hossein Khademi 2024-06-06 13:26:40 +03:30
parent f942bbb421
commit e54477f226
44 changed files with 138 additions and 317 deletions

View File

@ -66,7 +66,7 @@ public class OrderBagController : ICarterModule
=> TypedResults.Ok(await mediator.Send(new SubmitDiscountCommand(orderId, discountCode), cancellationToken)); => TypedResults.Ok(await mediator.Send(new SubmitDiscountCommand(orderId, discountCode), cancellationToken));
public async Task<IResult> AddShippingToOrderBagAsync(Guid orderId, [FromBody] SubmitOrderDeliveryCommand request, IMediator mediator, CancellationToken cancellationToken) public async Task<IResult> AddShippingToOrderBagAsync(Guid orderId, [FromBody] SubmitOrderDeliveryCommand request, IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(new SubmitOrderDeliveryCommand(request.AddressId, orderId, request.ShippingId), cancellationToken)); => TypedResults.Ok(await mediator.Send(request with { OrderId = orderId }, cancellationToken));
public async Task<IResult> SubmitOrderPaymentAsync(Guid orderId, [FromQuery] OrderPaymentMethod paymentMethod, IMediator mediator, CancellationToken cancellationToken) public async Task<IResult> SubmitOrderPaymentAsync(Guid orderId, [FromQuery] OrderPaymentMethod paymentMethod, IMediator mediator, CancellationToken cancellationToken)
{ {

View File

@ -1,4 +1,6 @@
namespace Netina.Api.Controllers; using Netina.Core.CoreServices.CommandQueries.Queries;
namespace Netina.Api.Controllers;
public class SearchController : ICarterModule public class SearchController : ICarterModule
{ {
@ -6,9 +8,6 @@ public class SearchController : ICarterModule
{ {
var group = app.NewVersionedApi("Search").MapGroup("api/search"); var group = app.NewVersionedApi("Search").MapGroup("api/search");
group.MapGet("", SearchAsync)
.WithDisplayName("Search Async")
.HasApiVersion(1.0);
group.MapGet("/thumb", SearchThumbAsync) group.MapGet("/thumb", SearchThumbAsync)
.WithDisplayName("Thumb Search Async") .WithDisplayName("Thumb Search Async")
@ -27,24 +26,12 @@ public class SearchController : ICarterModule
.HasApiVersion(1.0); .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] IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await searchService.ThumbSearchAsync(name, cancellationToken)); => TypedResults.Ok(await mediator.Send(new GetThumbSearchProductsQuery(name),cancellationToken));
private async Task<IResult> SearchAsync([FromQuery] string name, [FromServices] ISearchService searchService, CancellationToken cancellationToken)
=> TypedResults.Ok(await searchService.SearchAsync(name, cancellationToken));
private async Task<IResult> ZarehbinAsync([FromQuery] string? product_id, [FromQuery] int? page, [FromServices] ISearchService searchService, CancellationToken cancellationToken) private async Task<IResult> ZarehbinAsync([FromQuery] string? product_id, [FromQuery] int? page, [FromServices] IMediator mediator, CancellationToken cancellationToken)
{ => TypedResults.Ok(await mediator.Send(new GetZarehbinProductsQuery(Page: page ?? 0, ProductId: product_id), cancellationToken));
if (product_id == null)
{
if (page == null)
return TypedResults.Ok(await searchService.ZarehbinAsync(0, cancellationToken));
else
return TypedResults.Ok(await searchService.ZarehbinAsync(page.Value, cancellationToken));
}
else
return TypedResults.Ok(await searchService.ZarehbinAsync(Guid.Parse(product_id), cancellationToken));
}
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));

View File

@ -1,5 +1,4 @@
using Netina.Common.Models; using Netina.Domain.Dtos.ScraperDtos.Response;
using Netina.Domain.Dtos.ScraperDtos.Response;
namespace Netina.Core.Abstracts; namespace Netina.Core.Abstracts;

View File

@ -1,5 +1,4 @@
using Netina.Common.Models; using Netina.Domain.Models.Districts;
using Netina.Domain.Models.Districts;
namespace Netina.Core.Abstracts; namespace Netina.Core.Abstracts;

View File

@ -1,7 +1,4 @@
using Netina.Common.Models; namespace Netina.Core.Abstracts;
using Netina.Domain.Dtos.ResponseDtos;
namespace Netina.Core.Abstracts;
public interface IExternalFilesService : IScopedDependency public interface IExternalFilesService : IScopedDependency
{ {

View File

@ -1,6 +1,4 @@
using Netina.Common.Models; namespace Netina.Core.Abstracts;
namespace Netina.Core.Abstracts;
public interface IPaymentService : IScopedDependency public interface IPaymentService : IScopedDependency
{ {

View File

@ -1,9 +1,8 @@
using Netina.Common.Models; namespace Netina.Core.Abstracts;
namespace Netina.Core.Abstracts;
public interface ISmsService : IScopedDependency public interface ISmsService : IScopedDependency
{ {
Task SendVerifyCodeAsync(string phoneNumber, string verifyCode); Task SendVerifyCodeAsync(string phoneNumber, string verifyCode);
Task SendForgerPasswordAsync(string phoneNumber, string newPassword); Task SendForgerPasswordAsync(string phoneNumber, string newPassword);
Task SendLookUpAsync(string phoneNumber, string template, string token, string? token2 = null, string? token3 = null, string? token10 = null, string? token20 = null);
} }

View File

@ -1,7 +1,4 @@
using Netina.Common.Models; namespace Netina.Core.Abstracts;
using Netina.Common.Models.Api;
namespace Netina.Core.Abstracts;
public interface IUploadFileService : IScopedDependency public interface IUploadFileService : IScopedDependency
{ {

View File

@ -1,4 +1,4 @@
namespace Netina.Core.CoreServices.Abstracts; namespace Netina.Core.BaseServices.Abstracts;
public interface IAccountService : IScopedDependency public interface IAccountService : IScopedDependency
{ {

View File

@ -1,8 +1,4 @@
using Netina.Common.Models; namespace Netina.Core.BaseServices.Abstracts;
using Netina.Common.Models.Api;
using Netina.Domain.Entities.Users;
namespace Netina.Core.BaseServices.Abstracts;
public interface IJwtService : IScopedDependency public interface IJwtService : IScopedDependency
{ {

View File

@ -1,9 +1,9 @@
namespace Netina.Core.CoreServices.Abstracts; namespace Netina.Core.BaseServices.Abstracts;
public interface IPageService : IScopedDependency public interface IPageService : IScopedDependency
{ {
Task<BasePageSDto> GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null,string? type = null, CancellationToken cancellationToken=default); Task<BasePageSDto> GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null, string? type = null, CancellationToken cancellationToken = default);
Task<List<BasePageSDto>> GetPagesAsync(CancellationToken cancellationToken = default); Task<List<BasePageSDto>> GetPagesAsync(CancellationToken cancellationToken = default);
Task<bool> CreatePageAsync(PageActionRequestDto entity, CancellationToken cancellationToken = default); Task<bool> CreatePageAsync(PageActionRequestDto entity, CancellationToken cancellationToken = default);
Task<bool> DeletePageAsync(Guid id,CancellationToken cancellationToken = default); Task<bool> DeletePageAsync(Guid id, CancellationToken cancellationToken = default);
} }

View File

@ -1,6 +1,4 @@
using Netina.Common.Models; namespace Netina.Core.BaseServices.Abstracts;
namespace Netina.Core.CoreServices.Abstracts;
public interface ISettingService : IScopedDependency public interface ISettingService : IScopedDependency
{ {

View File

@ -1,6 +1,4 @@
using Netina.Common.Models; namespace Netina.Core.BaseServices.Abstracts;
namespace Netina.Core.BaseServices.Abstracts;
public interface ISiteMapService : IScopedDependency public interface ISiteMapService : IScopedDependency
{ {

View File

@ -1,19 +1,4 @@
using Netina.Common.Extensions; namespace Netina.Core.BaseServices;
using Netina.Common.Models.Api;
using Netina.Common.Models.Exception;
using Netina.Core.Abstracts;
using Netina.Core.BaseServices.Abstracts;
using Netina.Core.CoreServices.Abstracts;
using Netina.Core.EntityServices.Abstracts;
using Netina.Domain.Dtos.RequestDtos;
using Netina.Domain.Dtos.ResponseDtos;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Users;
using Netina.Domain.Enums;
using Netina.Repository.Abstracts;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.CoreServices;
public class AccountService : IAccountService public class AccountService : IAccountService

View File

@ -1,10 +1,4 @@
using Netina.Common.Extensions; namespace Netina.Core.BaseServices;
using Netina.Common.Models.Api;
using Netina.Core.BaseServices.Abstracts;
using Netina.Domain.Entities.Users;
using Netina.Domain.Models.Settings;
namespace Netina.Core.BaseServices;
public class JwtService : IJwtService public class JwtService : IJwtService

View File

@ -1,6 +1,6 @@
using Netina.Domain.MartenEntities.Pages; using Netina.Domain.MartenEntities.Pages;
namespace Netina.Core.CoreServices; namespace Netina.Core.BaseServices;
public class PageService : IPageService public class PageService : IPageService
{ {
@ -95,7 +95,7 @@ public class PageService : IPageService
var page = await _martenRepositoryWrapper.SetRepository<BasePage>().GetEntityAsync(p => p.Id == id, cancellationToken); var page = await _martenRepositoryWrapper.SetRepository<BasePage>().GetEntityAsync(p => p.Id == id, cancellationToken);
if (page == null) if (page == null)
throw new AppException("Page not found", ApiResultStatusCode.NotFound); throw new AppException("Page not found", ApiResultStatusCode.NotFound);
await _martenRepositoryWrapper.SetRepository<BasePage>().RemoveEntityAsync(page,cancellationToken); await _martenRepositoryWrapper.SetRepository<BasePage>().RemoveEntityAsync(page, cancellationToken);
return true; return true;
} }
} }

View File

@ -1,5 +1,4 @@
namespace Netina.Core.CoreServices; 
public class SettingService : ISettingService public class SettingService : ISettingService
{ {
@ -23,7 +22,6 @@ public class SettingService : ISettingService
setting = Activator.CreateInstance(type); setting = Activator.CreateInstance(type);
else else
setting = JsonConvert.DeserializeObject(baseSetting.JsonData, type) ?? Activator.CreateInstance(type); setting = JsonConvert.DeserializeObject(baseSetting.JsonData, type) ?? Activator.CreateInstance(type);
if (setting == null) if (setting == null)
throw new AppException("Setting type or base is wrong"); throw new AppException("Setting type or base is wrong");

View File

@ -1,7 +1,6 @@
using System.IO.Compression; using System.IO.Compression;
using System.Xml; using System.Xml;
using Netina.Core.Models; using Netina.Core.Models;
using Netina.Domain.Entities.Blogs;
using Netina.Domain.Entities.ProductCategories; using Netina.Domain.Entities.ProductCategories;
namespace Netina.Core.BaseServices; namespace Netina.Core.BaseServices;

View File

@ -1,12 +0,0 @@
using Netina.Domain.Dtos.ResponseDtos.Zarehbin;
namespace Netina.Core.CoreServices.Abstracts;
public interface ISearchService : IScopedDependency
{
public Task<SearchResponseDto> SearchAsync(string name,CancellationToken cancellationToken = default);
public Task<SearchResponseDto> ThumbSearchAsync(string name,CancellationToken cancellationToken = default);
public Task<ZarehbinPagedResponseDto> ZarehbinAsync(int page,CancellationToken cancellationToken = default);
public Task<ZarehbinProductResponseDto> ZarehbinAsync(Guid productId,CancellationToken cancellationToken = default);
}

View File

@ -0,0 +1,9 @@
namespace Netina.Core.CoreServices.CommandQueries.Queries;
public sealed record GetTorobProductsQuery(int Page = 0) : IRequest<List<TorobProductResponseDto>>;
public sealed record GetEmallsProductsQuery(int Page = 0 , int Count = 20) : IRequest<EmallsResponseDto>;
public sealed record GetThumbSearchProductsQuery(string Name) : IRequest<SearchResponseDto>;
public sealed record GetZarehbinProductsQuery(int Page=0, string? ProductId=null);

View File

@ -1,71 +0,0 @@
using Netina.Domain.Dtos.ResponseDtos.Zarehbin;
using Netina.Domain.Entities.ProductCategories;
namespace Netina.Core.CoreServices;
public class SearchService : ISearchService
{
private readonly IRepositoryWrapper _repositoryWrapper;
public SearchService(IRepositoryWrapper repositoryWrapper)
{
_repositoryWrapper = repositoryWrapper;
}
public async Task<SearchResponseDto> SearchAsync(string name, CancellationToken cancellationToken = default)
{
var searchQuery = name;
var products = await _repositoryWrapper.SetRepository<Product>()
.TableNoTracking
.OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, searchQuery))
.Select(ProductMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
var categories = await _repositoryWrapper.SetRepository<ProductCategory>()
.TableNoTracking
.OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.Name, searchQuery))
.Select(ProductCategoryMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
return new SearchResponseDto
{
Products = products.Select(p => p.Adapt<SearchedProductResponseDto>()).ToList(),
Categories = categories.Select(c => c.Adapt<SearchedProductCategoryResponseDto>()).ToList()
};
}
public async Task<SearchResponseDto> ThumbSearchAsync(string name, CancellationToken cancellationToken = default)
{
var searchQuery = name;
var products = await _repositoryWrapper.SetRepository<Product>()
.TableNoTracking
.OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, searchQuery))
.Take(8)
.Select(ProductMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
var categories = await _repositoryWrapper.SetRepository<ProductCategory>()
.TableNoTracking
.OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.Name.ToLower().Trim(), searchQuery))
.Take(8)
.Select(ProductCategoryMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
return new SearchResponseDto
{
Products = products.Select(p => p.Adapt<SearchedProductResponseDto>()).ToList(),
Categories = categories.Select(c => c.Adapt<SearchedProductCategoryResponseDto>()).ToList()
};
}
public Task<ZarehbinPagedResponseDto> ZarehbinAsync(int page, CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
public Task<ZarehbinProductResponseDto> ZarehbinAsync(Guid productId, CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
}

View File

@ -1,11 +1,11 @@
namespace Netina.Core.CoreServices.SearchServices; namespace Netina.Core.CoreServices.SearchServices;
public class GetEmallsProductQueryHandler : IRequestHandler<GetEmallsProductsQuery, EmallsResponseDto> public class GetEmallsProductsQueryHandler : IRequestHandler<GetEmallsProductsQuery, EmallsResponseDto>
{ {
private readonly IRepositoryWrapper _repositoryWrapper; private readonly IRepositoryWrapper _repositoryWrapper;
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly SiteSettings _siteSetting; private readonly SiteSettings _siteSetting;
public GetEmallsProductQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, IOptionsSnapshot<SiteSettings> optionsSnapshot) public GetEmallsProductsQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, IOptionsSnapshot<SiteSettings> optionsSnapshot)
{ {
_repositoryWrapper = repositoryWrapper; _repositoryWrapper = repositoryWrapper;
_mediator = mediator; _mediator = mediator;

View File

@ -0,0 +1,38 @@
using Netina.Domain.Entities.ProductCategories;
namespace Netina.Core.CoreServices.SearchServices;
public class GetThumbSearchProductsQueryHandler : IRequestHandler<GetThumbSearchProductsQuery, SearchResponseDto>
{
private readonly IRepositoryWrapper _repositoryWrapper;
public GetThumbSearchProductsQueryHandler(IRepositoryWrapper repositoryWrapper)
{
_repositoryWrapper = repositoryWrapper;
}
public async Task<SearchResponseDto> Handle(GetThumbSearchProductsQuery request, CancellationToken cancellationToken)
{
var searchQuery = request.Name;
var products = await _repositoryWrapper.SetRepository<Product>()
.TableNoTracking
.OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, searchQuery))
.Take(8)
.Select(ProductMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
var categories = await _repositoryWrapper.SetRepository<ProductCategory>()
.TableNoTracking
.OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.Name.ToLower().Trim(), searchQuery))
.Take(8)
.Select(ProductCategoryMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
return new SearchResponseDto
{
Products = products.Select(p => p.Adapt<SearchedProductResponseDto>()).ToList(),
Categories = categories.Select(c => c.Adapt<SearchedProductCategoryResponseDto>()).ToList()
};
}
}

View File

@ -1,6 +1,4 @@
using Netina.Domain.Dtos.ResponseDtos.Torob; namespace Netina.Core.CoreServices.SearchServices;
namespace Netina.Core.CoreServices.SearchServices;
public class GetTorobProductsQueryHandler : IRequestHandler<GetTorobProductsQuery, List<TorobProductResponseDto>> public class GetTorobProductsQueryHandler : IRequestHandler<GetTorobProductsQuery, List<TorobProductResponseDto>>
{ {

View File

@ -1,5 +1,4 @@
using Netina.Domain.Entities.Blogs; using Netina.Domain.Entities.ProductCategories;
using Netina.Domain.Entities.ProductCategories;
namespace Netina.Core.CoreServices.WebSiteServices; namespace Netina.Core.CoreServices.WebSiteServices;

View File

@ -1,11 +1,4 @@
using Netina.Common.Models; namespace Netina.Core.EntityServices.Abstracts;
using Netina.Domain.Dtos.RequestDtos;
using Netina.Domain.Dtos.ResponseDtos;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Users;
using Netina.Domain.Models.Claims;
namespace Netina.Core.EntityServices.Abstracts;
public interface IUserService : IScopedDependency public interface IUserService : IScopedDependency
{ {

View File

@ -1,13 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.DiscountHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.Entities.Discounts;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Enums;
using Netina.Repository.Abstracts;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.DiscountHandlers;
public class CalculateOrderDiscountCommandHandler : IRequestHandler<CalculateOrderDiscountCommand , double> public class CalculateOrderDiscountCommandHandler : IRequestHandler<CalculateOrderDiscountCommand , double>
{ {

View File

@ -1,14 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.OrderBagHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.CommandQueries.Queries;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Entities.Products;
using Netina.Repository.Abstracts;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class AddToOrderBagCommandHandler : IRequestHandler<AddToOrderBagCommand, OrderSDto> public class AddToOrderBagCommandHandler : IRequestHandler<AddToOrderBagCommand, OrderSDto>
{ {

View File

@ -1,9 +1,4 @@
using Netina.Domain.CommandQueries.Commands; namespace Netina.Core.EntityServices.OrderBagHandlers;
using Netina.Domain.Dtos.ResponseDtos;
using Netina.Domain.Entities.Products;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class CheckOrderBagCommandHandler : IRequestHandler<CheckOrderBagCommand , List<CheckOrderBagResponseItem>> public class CheckOrderBagCommandHandler : IRequestHandler<CheckOrderBagCommand , List<CheckOrderBagResponseItem>>
{ {

View File

@ -1,14 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.OrderBagHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.CommandQueries.Queries;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Entities.Users;
using Netina.Domain.Enums;
using Netina.Repository.Abstracts;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class GetUserOrderBagQueryHandler : IRequestHandler<GetUserOrderBagQuery,Order> public class GetUserOrderBagQueryHandler : IRequestHandler<GetUserOrderBagQuery,Order>
{ {

View File

@ -1,14 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.OrderBagHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.CommandQueries.Queries;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Entities.Products;
using Netina.Repository.Abstracts;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class RemoveFromOrderBagCommandHandler : IRequestHandler<RemoveFromOrderBagCommand, OrderSDto> public class RemoveFromOrderBagCommandHandler : IRequestHandler<RemoveFromOrderBagCommand, OrderSDto>
{ {

View File

@ -1,12 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.OrderBagHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Discounts;
using Netina.Domain.Entities.Orders;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class SubmitDiscountCommandHandler : IRequestHandler<SubmitDiscountCommand,OrderSDto> public class SubmitDiscountCommandHandler : IRequestHandler<SubmitDiscountCommand,OrderSDto>
{ {

View File

@ -1,14 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.OrderBagHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.CommandQueries.Queries;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Entities.Products;
using Netina.Repository.Abstracts;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class SubmitOrderBagCommandHandler : IRequestHandler<SubmitOrderBagCommand,OrderSDto> public class SubmitOrderBagCommandHandler : IRequestHandler<SubmitOrderBagCommand,OrderSDto>
{ {

View File

@ -1,10 +1,4 @@
using Netina.Common.Models.Api; using Netina.Domain.Entities.Warehouses;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Entities.Warehouses;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderBagHandlers; namespace Netina.Core.EntityServices.OrderBagHandlers;

View File

@ -1,25 +1,18 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.OrderBagHandlers;
using Netina.Common.Models.Exception;
using Netina.Core.Abstracts;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.Dtos.ResponseDtos;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Enums;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderBagHandlers;
public class SubmitOrderPaymentCommandHandler : IRequestHandler<SubmitOrderPaymentCommand , SubmitOrderPaymentResponseDto> public class SubmitOrderPaymentCommandHandler : IRequestHandler<SubmitOrderPaymentCommand , SubmitOrderPaymentResponseDto>
{ {
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly IRepositoryWrapper _repositoryWrapper; private readonly IRepositoryWrapper _repositoryWrapper;
private readonly IPaymentService _paymentService; private readonly IPaymentService _paymentService;
private readonly ISmsService _smsService;
public SubmitOrderPaymentCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper, IPaymentService paymentService) public SubmitOrderPaymentCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper, IPaymentService paymentService,ISmsService smsService)
{ {
_mediator = mediator; _mediator = mediator;
_repositoryWrapper = repositoryWrapper; _repositoryWrapper = repositoryWrapper;
_paymentService = paymentService; _paymentService = paymentService;
_smsService = smsService;
} }
public async Task<SubmitOrderPaymentResponseDto> Handle(SubmitOrderPaymentCommand request, CancellationToken cancellationToken) public async Task<SubmitOrderPaymentResponseDto> Handle(SubmitOrderPaymentCommand request, CancellationToken cancellationToken)
{ {
@ -43,6 +36,7 @@ public class SubmitOrderPaymentCommandHandler : IRequestHandler<SubmitOrderPayme
order.SetOrderPayment(request.PaymentMethod); order.SetOrderPayment(request.PaymentMethod);
_repositoryWrapper.SetRepository<Order>().Update(order); _repositoryWrapper.SetRepository<Order>().Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken); await _repositoryWrapper.SaveChangesAsync(cancellationToken);
} }
else else
{ {

View File

@ -1,12 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.OrderHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.CommandQueries.Queries;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Enums;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderHandlers;
public class CalculateOrderCommandHandler : IRequestHandler<CalculateOrderCommand,Order> public class CalculateOrderCommandHandler : IRequestHandler<CalculateOrderCommand,Order>
{ {

View File

@ -1,19 +1,14 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.OrderHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.Entities.Orders;
using Netina.Domain.Enums;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.OrderHandlers;
public class ConfirmOrderStepCommandHandler : IRequestHandler<ConfirmOrderStepCommand, bool> public class ConfirmOrderStepCommandHandler : IRequestHandler<ConfirmOrderStepCommand, bool>
{ {
private readonly IRepositoryWrapper _repositoryWrapper; private readonly IRepositoryWrapper _repositoryWrapper;
private readonly ISmsService _smsService;
public ConfirmOrderStepCommandHandler(IRepositoryWrapper repositoryWrapper) public ConfirmOrderStepCommandHandler(IRepositoryWrapper repositoryWrapper,ISmsService smsService)
{ {
_repositoryWrapper = repositoryWrapper; _repositoryWrapper = repositoryWrapper;
_smsService = smsService;
} }
public async Task<bool> Handle(ConfirmOrderStepCommand request, CancellationToken cancellationToken) public async Task<bool> Handle(ConfirmOrderStepCommand request, CancellationToken cancellationToken)
{ {
@ -41,6 +36,14 @@ public class ConfirmOrderStepCommandHandler : IRequestHandler<ConfirmOrderStepCo
} }
} }
switch (request.NextOrderStatus)
{
case :
break;
}
_repositoryWrapper.SetRepository<Order>() _repositoryWrapper.SetRepository<Order>()
.Update(order); .Update(order);
await _repositoryWrapper.SaveChangesAsync(cancellationToken); await _repositoryWrapper.SaveChangesAsync(cancellationToken);

View File

@ -1,5 +1,4 @@
using Netina.Domain.Dtos.LargDtos; using Syncfusion.Drawing;
using Syncfusion.Drawing;
using Syncfusion.Pdf; using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics; using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Grid; using Syncfusion.Pdf.Grid;

View File

@ -1,10 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Core.EntityServices.ReviewHandlers;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.Entities.Products;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices.ReviewHandlers;
public class ConfirmReviewCommandHandler : IRequestHandler<ConfirmReviewCommand , bool> public class ConfirmReviewCommandHandler : IRequestHandler<ConfirmReviewCommand , bool>
{ {

View File

@ -25,7 +25,6 @@
<ItemGroup> <ItemGroup>
<Folder Include="CoreServices\WebSiteServices\" /> <Folder Include="CoreServices\WebSiteServices\" />
<Folder Include="CoreServices\SearchServices\" />
<Folder Include="EntityServices\ProductHandlers\" /> <Folder Include="EntityServices\ProductHandlers\" />
<Folder Include="EntityServices\ReviewHandlers\" /> <Folder Include="EntityServices\ReviewHandlers\" />
<Folder Include="Models\Api\" /> <Folder Include="Models\Api\" />
@ -50,6 +49,7 @@
<Using Include="Netina.Core.BaseServices.Abstracts" /> <Using Include="Netina.Core.BaseServices.Abstracts" />
<Using Include="Netina.Core.CoreServices.Abstracts" /> <Using Include="Netina.Core.CoreServices.Abstracts" />
<Using Include="Netina.Core.CoreServices.CommandQueries.Commands" /> <Using Include="Netina.Core.CoreServices.CommandQueries.Commands" />
<Using Include="Netina.Core.CoreServices.CommandQueries.Queries" />
<Using Include="Netina.Core.EntityServices.Abstracts" /> <Using Include="Netina.Core.EntityServices.Abstracts" />
<Using Include="Netina.Domain" /> <Using Include="Netina.Domain" />
<Using Include="Netina.Domain.CommandQueries.Commands" /> <Using Include="Netina.Domain.CommandQueries.Commands" />
@ -59,6 +59,7 @@
<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.ResponseDtos.Emalls" />
<Using Include="Netina.Domain.Dtos.ResponseDtos.Torob" />
<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" />

View File

@ -1,8 +0,0 @@
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<List<TorobProductResponseDto>>;
public sealed record GetEmallsProductsQuery(int Page = 0 , int Count = 20) : IRequest<EmallsResponseDto>;

View File

@ -6,7 +6,9 @@ public interface IKaveNegarRestApi
{ {
[Post("/{apiKey}/verify/lookup.json")] [Post("/{apiKey}/verify/lookup.json")]
Task<KaveNegarResponse> SendLookUp(string apiKey, [Query] string receptor, [Query] string token, [Query] string token2, [Query] string token10, [Query] string token20, [Query] string template); Task<KaveNegarResponse> SendLookUp(string apiKey, [Query] string receptor, [Query] string template, [Query] string token, [Query] string? token2=null,
[Query]string? token3 = null, [Query] string? token10 = null, [Query] string? token20 = null);
[Post("/{apiKey}/sms/send.json")] [Post("/{apiKey}/sms/send.json")]
Task<KaveNegarResponse> SendSms(string apiKey, [Query] string receptor, [Query] string message, [Query] string sender); Task<KaveNegarResponse> SendSms(string apiKey, [Query] string receptor, [Query] string message, [Query] string sender);
} }

View File

@ -1,10 +1,4 @@
using Netina.Common.Models.Api; namespace Netina.Infrastructure.Services;
using Netina.Common.Models.Exception;
using Netina.Core.Abstracts;
using Netina.Domain.Models.Settings;
using Netina.Infrastructure.RestServices;
namespace Netina.Infrastructure.Services;
public class SmsService : ISmsService public class SmsService : ISmsService
{ {
@ -25,7 +19,9 @@ public class SmsService : ISmsService
} }
public async Task SendForgerPasswordAsync(string phoneNumber, string newPassword) public async Task SendForgerPasswordAsync(string phoneNumber, string newPassword)
{ {
var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, newPassword, null, null, null, "forgetPassword"); var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, newPassword,
null, null
, null, null, "forgetPassword");
if (rest.Return.status != 200) if (rest.Return.status != 200)
throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message); throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message);
@ -36,8 +32,7 @@ public class SmsService : ISmsService
try try
{ {
var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, _siteSettings.LoginOtpTemplate,verifyCode);
verifyCode, null, null, null, _siteSettings.LoginOtpTemplate);
if (rest.Return.status != 200 && _environment.IsProduction()) if (rest.Return.status != 200 && _environment.IsProduction())
throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message); throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message);
@ -45,7 +40,7 @@ public class SmsService : ISmsService
catch (ApiException apiException) catch (ApiException apiException)
{ {
if (_environment.IsProduction()) if (_environment.IsProduction())
throw ; throw;
else else
_logger.LogError(apiException.Message); _logger.LogError(apiException.Message);
} }
@ -58,4 +53,23 @@ public class SmsService : ISmsService
} }
} }
public async Task SendLookUpAsync(string phoneNumber, string template, string token, string? token2 = null, string? token3 = null, string? token10 = null, string? token20 = null)
{
try
{
var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber,template,token,token2,token3,token10,token20);
if (rest.Return.status != 200)
throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message);
}
catch (ApiException apiException)
{
_logger.LogError(apiException.Message);
}
catch (Exception apiException)
{
_logger.LogError(apiException.Message);
}
}
} }

View File

@ -2,7 +2,7 @@
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Netina.Common.Models.Exception; using Netina.Common.Models.Exception;
using Netina.Core.Abstracts; using Netina.Core.Abstracts;
using Netina.Core.CoreServices.Abstracts; using Netina.Core.BaseServices.Abstracts;
using Netina.Domain.CommandQueries.Commands; using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.CommandQueries.Queries; using Netina.Domain.CommandQueries.Queries;
using Netina.Domain.Enums; using Netina.Domain.Enums;