From e54477f2268b410068e15d7d2dc9b63e96dfd3fb Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Thu, 6 Jun 2024 13:26:40 +0330 Subject: [PATCH] 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 --- Netina.Api/Controllers/OrderBagController.cs | 2 +- Netina.Api/Controllers/SearchController.cs | 27 ++----- Netina.Core/Abstracts/IDigikalaScraper.cs | 3 +- Netina.Core/Abstracts/IDistrictService.cs | 3 +- .../Abstracts/IExternalFilesService.cs | 5 +- Netina.Core/Abstracts/IPaymentService.cs | 4 +- Netina.Core/Abstracts/ISmsService.cs | 5 +- Netina.Core/Abstracts/IUploadFileService.cs | 5 +- .../Abstracts/IAccountService.cs | 2 +- .../BaseServices/Abstracts/IJwtService.cs | 6 +- .../Abstracts/IPageService.cs | 6 +- .../Abstracts/ISettingService.cs | 4 +- .../BaseServices/Abstracts/ISiteMapService.cs | 4 +- .../AccountService.cs | 17 +---- Netina.Core/BaseServices/JwtService.cs | 8 +-- .../PageService.cs | 4 +- .../SettingService.cs | 4 +- Netina.Core/BaseServices/SiteMapService.cs | 1 - .../CoreServices/Abstracts/ISearchService.cs | 12 ---- .../CommandQueries/Queries/SearchQueries.cs | 9 +++ Netina.Core/CoreServices/SearchService.cs | 71 ------------------- ...er.cs => GetEmallsProductsQueryHandler.cs} | 4 +- .../GetThumbSearchProductsQueryHandler.cs | 38 ++++++++++ .../GetTorobProductsQueryHandler.cs | 4 +- .../GetWebSiteNavBarCommandHandler.cs | 3 +- .../EntityServices/Abstracts/IUserService.cs | 9 +-- .../CalculateOrderDiscountCommandHandler.cs | 11 +-- .../AddToOrderBagCommandHandler.cs | 12 +--- .../CheckOrderBagCommandHandler.cs | 7 +- .../GetUserOrderBagQueryHandler.cs | 12 +--- .../RemoveFromOrderBagCommandHandler.cs | 12 +--- .../SubmitDiscountCommandHandler.cs | 10 +-- .../SubmitOrderBagCommandHandler.cs | 12 +--- .../SubmitOrderDeliveryCommandHandler.cs | 8 +-- .../SubmitOrderPaymentCommandHandler.cs | 16 ++--- .../CalculateOrderCommandHandler.cs | 10 +-- .../ConfirmOrderStepCommandHandler.cs | 21 +++--- .../GetOrderInvoiceCommandHandler.cs | 3 +- .../ConfirmReviewCommandHandler.cs | 8 +-- Netina.Core/Netina.Core.csproj | 3 +- .../CommandQueries/Queries/SearchQueries.cs | 8 --- .../RestServices/IKaveNegarRestApi.cs | 4 +- Netina.Infrastructure/Services/SmsService.cs | 36 +++++++--- .../Services/ZarinpalService.cs | 2 +- 44 files changed, 138 insertions(+), 317 deletions(-) rename Netina.Core/{CoreServices => BaseServices}/Abstracts/IAccountService.cs (93%) rename Netina.Core/{CoreServices => BaseServices}/Abstracts/IPageService.cs (56%) rename Netina.Core/{CoreServices => BaseServices}/Abstracts/ISettingService.cs (79%) rename Netina.Core/{CoreServices => BaseServices}/AccountService.cs (92%) rename Netina.Core/{CoreServices => BaseServices}/PageService.cs (98%) rename Netina.Core/{CoreServices => BaseServices}/SettingService.cs (98%) delete mode 100644 Netina.Core/CoreServices/Abstracts/ISearchService.cs create mode 100644 Netina.Core/CoreServices/CommandQueries/Queries/SearchQueries.cs delete mode 100644 Netina.Core/CoreServices/SearchService.cs rename Netina.Core/CoreServices/SearchServices/{GetEmallsProductQueryHandler.cs => GetEmallsProductsQueryHandler.cs} (91%) create mode 100644 Netina.Core/CoreServices/SearchServices/GetThumbSearchProductsQueryHandler.cs delete mode 100644 Netina.Domain/CommandQueries/Queries/SearchQueries.cs diff --git a/Netina.Api/Controllers/OrderBagController.cs b/Netina.Api/Controllers/OrderBagController.cs index 154bc6e..636ea42 100644 --- a/Netina.Api/Controllers/OrderBagController.cs +++ b/Netina.Api/Controllers/OrderBagController.cs @@ -66,7 +66,7 @@ public class OrderBagController : ICarterModule => TypedResults.Ok(await mediator.Send(new SubmitDiscountCommand(orderId, discountCode), cancellationToken)); public async Task 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 SubmitOrderPaymentAsync(Guid orderId, [FromQuery] OrderPaymentMethod paymentMethod, IMediator mediator, CancellationToken cancellationToken) { diff --git a/Netina.Api/Controllers/SearchController.cs b/Netina.Api/Controllers/SearchController.cs index e9d6523..adf1244 100644 --- a/Netina.Api/Controllers/SearchController.cs +++ b/Netina.Api/Controllers/SearchController.cs @@ -1,4 +1,6 @@ -namespace Netina.Api.Controllers; +using Netina.Core.CoreServices.CommandQueries.Queries; + +namespace Netina.Api.Controllers; public class SearchController : ICarterModule { @@ -6,9 +8,6 @@ public class SearchController : ICarterModule { var group = app.NewVersionedApi("Search").MapGroup("api/search"); - group.MapGet("", SearchAsync) - .WithDisplayName("Search Async") - .HasApiVersion(1.0); group.MapGet("/thumb", SearchThumbAsync) .WithDisplayName("Thumb Search Async") @@ -27,24 +26,12 @@ public class SearchController : ICarterModule .HasApiVersion(1.0); } - private async Task SearchThumbAsync([FromQuery] string name, [FromServices] ISearchService searchService, CancellationToken cancellationToken) - => TypedResults.Ok(await searchService.ThumbSearchAsync(name, cancellationToken)); + private async Task SearchThumbAsync([FromQuery] string name, [FromServices] IMediator mediator, CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(new GetThumbSearchProductsQuery(name),cancellationToken)); - private async Task SearchAsync([FromQuery] string name, [FromServices] ISearchService searchService, CancellationToken cancellationToken) - => TypedResults.Ok(await searchService.SearchAsync(name, cancellationToken)); - private async Task ZarehbinAsync([FromQuery] string? product_id, [FromQuery] int? page, [FromServices] ISearchService searchService, CancellationToken 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 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)); private async Task TorobAsync([FromQuery] int page, [FromServices] IMediator mediator, CancellationToken cancellationToken) => TypedResults.Ok(await mediator.Send(new GetTorobProductsQuery(page),cancellationToken)); diff --git a/Netina.Core/Abstracts/IDigikalaScraper.cs b/Netina.Core/Abstracts/IDigikalaScraper.cs index 39ae8f9..8bb26cc 100644 --- a/Netina.Core/Abstracts/IDigikalaScraper.cs +++ b/Netina.Core/Abstracts/IDigikalaScraper.cs @@ -1,5 +1,4 @@ -using Netina.Common.Models; -using Netina.Domain.Dtos.ScraperDtos.Response; +using Netina.Domain.Dtos.ScraperDtos.Response; namespace Netina.Core.Abstracts; diff --git a/Netina.Core/Abstracts/IDistrictService.cs b/Netina.Core/Abstracts/IDistrictService.cs index 50a2f9e..b0a67b9 100644 --- a/Netina.Core/Abstracts/IDistrictService.cs +++ b/Netina.Core/Abstracts/IDistrictService.cs @@ -1,5 +1,4 @@ -using Netina.Common.Models; -using Netina.Domain.Models.Districts; +using Netina.Domain.Models.Districts; namespace Netina.Core.Abstracts; diff --git a/Netina.Core/Abstracts/IExternalFilesService.cs b/Netina.Core/Abstracts/IExternalFilesService.cs index 62b5058..0d35038 100644 --- a/Netina.Core/Abstracts/IExternalFilesService.cs +++ b/Netina.Core/Abstracts/IExternalFilesService.cs @@ -1,7 +1,4 @@ -using Netina.Common.Models; -using Netina.Domain.Dtos.ResponseDtos; - -namespace Netina.Core.Abstracts; +namespace Netina.Core.Abstracts; public interface IExternalFilesService : IScopedDependency { diff --git a/Netina.Core/Abstracts/IPaymentService.cs b/Netina.Core/Abstracts/IPaymentService.cs index 0abc15b..51a44b3 100644 --- a/Netina.Core/Abstracts/IPaymentService.cs +++ b/Netina.Core/Abstracts/IPaymentService.cs @@ -1,6 +1,4 @@ -using Netina.Common.Models; - -namespace Netina.Core.Abstracts; +namespace Netina.Core.Abstracts; public interface IPaymentService : IScopedDependency { diff --git a/Netina.Core/Abstracts/ISmsService.cs b/Netina.Core/Abstracts/ISmsService.cs index c309ce5..ab2b8f1 100644 --- a/Netina.Core/Abstracts/ISmsService.cs +++ b/Netina.Core/Abstracts/ISmsService.cs @@ -1,9 +1,8 @@ -using Netina.Common.Models; - -namespace Netina.Core.Abstracts; +namespace Netina.Core.Abstracts; public interface ISmsService : IScopedDependency { Task SendVerifyCodeAsync(string phoneNumber, string verifyCode); 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); } \ No newline at end of file diff --git a/Netina.Core/Abstracts/IUploadFileService.cs b/Netina.Core/Abstracts/IUploadFileService.cs index 18c07d6..20d36fc 100644 --- a/Netina.Core/Abstracts/IUploadFileService.cs +++ b/Netina.Core/Abstracts/IUploadFileService.cs @@ -1,7 +1,4 @@ -using Netina.Common.Models; -using Netina.Common.Models.Api; - -namespace Netina.Core.Abstracts; +namespace Netina.Core.Abstracts; public interface IUploadFileService : IScopedDependency { diff --git a/Netina.Core/CoreServices/Abstracts/IAccountService.cs b/Netina.Core/BaseServices/Abstracts/IAccountService.cs similarity index 93% rename from Netina.Core/CoreServices/Abstracts/IAccountService.cs rename to Netina.Core/BaseServices/Abstracts/IAccountService.cs index de3ed04..11a24c5 100644 --- a/Netina.Core/CoreServices/Abstracts/IAccountService.cs +++ b/Netina.Core/BaseServices/Abstracts/IAccountService.cs @@ -1,4 +1,4 @@ -namespace Netina.Core.CoreServices.Abstracts; +namespace Netina.Core.BaseServices.Abstracts; public interface IAccountService : IScopedDependency { diff --git a/Netina.Core/BaseServices/Abstracts/IJwtService.cs b/Netina.Core/BaseServices/Abstracts/IJwtService.cs index a6e6cde..3c4f845 100644 --- a/Netina.Core/BaseServices/Abstracts/IJwtService.cs +++ b/Netina.Core/BaseServices/Abstracts/IJwtService.cs @@ -1,8 +1,4 @@ -using Netina.Common.Models; -using Netina.Common.Models.Api; -using Netina.Domain.Entities.Users; - -namespace Netina.Core.BaseServices.Abstracts; +namespace Netina.Core.BaseServices.Abstracts; public interface IJwtService : IScopedDependency { diff --git a/Netina.Core/CoreServices/Abstracts/IPageService.cs b/Netina.Core/BaseServices/Abstracts/IPageService.cs similarity index 56% rename from Netina.Core/CoreServices/Abstracts/IPageService.cs rename to Netina.Core/BaseServices/Abstracts/IPageService.cs index 55c8e43..d960ace 100644 --- a/Netina.Core/CoreServices/Abstracts/IPageService.cs +++ b/Netina.Core/BaseServices/Abstracts/IPageService.cs @@ -1,9 +1,9 @@ -namespace Netina.Core.CoreServices.Abstracts; +namespace Netina.Core.BaseServices.Abstracts; public interface IPageService : IScopedDependency { - Task GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null,string? type = null, CancellationToken cancellationToken=default); + Task GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null, string? type = null, CancellationToken cancellationToken = default); Task> GetPagesAsync(CancellationToken cancellationToken = default); Task CreatePageAsync(PageActionRequestDto entity, CancellationToken cancellationToken = default); - Task DeletePageAsync(Guid id,CancellationToken cancellationToken = default); + Task DeletePageAsync(Guid id, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/Netina.Core/CoreServices/Abstracts/ISettingService.cs b/Netina.Core/BaseServices/Abstracts/ISettingService.cs similarity index 79% rename from Netina.Core/CoreServices/Abstracts/ISettingService.cs rename to Netina.Core/BaseServices/Abstracts/ISettingService.cs index e8d3226..4290378 100644 --- a/Netina.Core/CoreServices/Abstracts/ISettingService.cs +++ b/Netina.Core/BaseServices/Abstracts/ISettingService.cs @@ -1,6 +1,4 @@ -using Netina.Common.Models; - -namespace Netina.Core.CoreServices.Abstracts; +namespace Netina.Core.BaseServices.Abstracts; public interface ISettingService : IScopedDependency { diff --git a/Netina.Core/BaseServices/Abstracts/ISiteMapService.cs b/Netina.Core/BaseServices/Abstracts/ISiteMapService.cs index d3ca1b8..9f12e56 100644 --- a/Netina.Core/BaseServices/Abstracts/ISiteMapService.cs +++ b/Netina.Core/BaseServices/Abstracts/ISiteMapService.cs @@ -1,6 +1,4 @@ -using Netina.Common.Models; - -namespace Netina.Core.BaseServices.Abstracts; +namespace Netina.Core.BaseServices.Abstracts; public interface ISiteMapService : IScopedDependency { diff --git a/Netina.Core/CoreServices/AccountService.cs b/Netina.Core/BaseServices/AccountService.cs similarity index 92% rename from Netina.Core/CoreServices/AccountService.cs rename to Netina.Core/BaseServices/AccountService.cs index e7f5d9b..3ac0f22 100644 --- a/Netina.Core/CoreServices/AccountService.cs +++ b/Netina.Core/BaseServices/AccountService.cs @@ -1,19 +1,4 @@ -using Netina.Common.Extensions; -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; +namespace Netina.Core.BaseServices; public class AccountService : IAccountService diff --git a/Netina.Core/BaseServices/JwtService.cs b/Netina.Core/BaseServices/JwtService.cs index 2e80764..0ec4497 100644 --- a/Netina.Core/BaseServices/JwtService.cs +++ b/Netina.Core/BaseServices/JwtService.cs @@ -1,10 +1,4 @@ -using Netina.Common.Extensions; -using Netina.Common.Models.Api; -using Netina.Core.BaseServices.Abstracts; -using Netina.Domain.Entities.Users; -using Netina.Domain.Models.Settings; - -namespace Netina.Core.BaseServices; +namespace Netina.Core.BaseServices; public class JwtService : IJwtService diff --git a/Netina.Core/CoreServices/PageService.cs b/Netina.Core/BaseServices/PageService.cs similarity index 98% rename from Netina.Core/CoreServices/PageService.cs rename to Netina.Core/BaseServices/PageService.cs index 715437f..e221faf 100644 --- a/Netina.Core/CoreServices/PageService.cs +++ b/Netina.Core/BaseServices/PageService.cs @@ -1,6 +1,6 @@ using Netina.Domain.MartenEntities.Pages; -namespace Netina.Core.CoreServices; +namespace Netina.Core.BaseServices; public class PageService : IPageService { @@ -95,7 +95,7 @@ public class PageService : IPageService var page = await _martenRepositoryWrapper.SetRepository().GetEntityAsync(p => p.Id == id, cancellationToken); if (page == null) throw new AppException("Page not found", ApiResultStatusCode.NotFound); - await _martenRepositoryWrapper.SetRepository().RemoveEntityAsync(page,cancellationToken); + await _martenRepositoryWrapper.SetRepository().RemoveEntityAsync(page, cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Core/CoreServices/SettingService.cs b/Netina.Core/BaseServices/SettingService.cs similarity index 98% rename from Netina.Core/CoreServices/SettingService.cs rename to Netina.Core/BaseServices/SettingService.cs index 4a750c5..4d11304 100644 --- a/Netina.Core/CoreServices/SettingService.cs +++ b/Netina.Core/BaseServices/SettingService.cs @@ -1,5 +1,4 @@ -namespace Netina.Core.CoreServices; - + public class SettingService : ISettingService { @@ -23,7 +22,6 @@ public class SettingService : ISettingService setting = Activator.CreateInstance(type); else setting = JsonConvert.DeserializeObject(baseSetting.JsonData, type) ?? Activator.CreateInstance(type); - if (setting == null) throw new AppException("Setting type or base is wrong"); diff --git a/Netina.Core/BaseServices/SiteMapService.cs b/Netina.Core/BaseServices/SiteMapService.cs index 1c03399..ed1afa1 100644 --- a/Netina.Core/BaseServices/SiteMapService.cs +++ b/Netina.Core/BaseServices/SiteMapService.cs @@ -1,7 +1,6 @@ using System.IO.Compression; using System.Xml; using Netina.Core.Models; -using Netina.Domain.Entities.Blogs; using Netina.Domain.Entities.ProductCategories; namespace Netina.Core.BaseServices; diff --git a/Netina.Core/CoreServices/Abstracts/ISearchService.cs b/Netina.Core/CoreServices/Abstracts/ISearchService.cs deleted file mode 100644 index fa5a9e0..0000000 --- a/Netina.Core/CoreServices/Abstracts/ISearchService.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Netina.Domain.Dtos.ResponseDtos.Zarehbin; - -namespace Netina.Core.CoreServices.Abstracts; - -public interface ISearchService : IScopedDependency -{ - public Task SearchAsync(string name,CancellationToken cancellationToken = default); - public Task ThumbSearchAsync(string name,CancellationToken cancellationToken = default); - public Task ZarehbinAsync(int page,CancellationToken cancellationToken = default); - public Task ZarehbinAsync(Guid productId,CancellationToken cancellationToken = default); - -} \ No newline at end of file diff --git a/Netina.Core/CoreServices/CommandQueries/Queries/SearchQueries.cs b/Netina.Core/CoreServices/CommandQueries/Queries/SearchQueries.cs new file mode 100644 index 0000000..2782e19 --- /dev/null +++ b/Netina.Core/CoreServices/CommandQueries/Queries/SearchQueries.cs @@ -0,0 +1,9 @@ +namespace Netina.Core.CoreServices.CommandQueries.Queries; + +public sealed record GetTorobProductsQuery(int Page = 0) : IRequest>; + +public sealed record GetEmallsProductsQuery(int Page = 0 , int Count = 20) : IRequest; + +public sealed record GetThumbSearchProductsQuery(string Name) : IRequest; + +public sealed record GetZarehbinProductsQuery(int Page=0, string? ProductId=null); \ No newline at end of file diff --git a/Netina.Core/CoreServices/SearchService.cs b/Netina.Core/CoreServices/SearchService.cs deleted file mode 100644 index 3c12659..0000000 --- a/Netina.Core/CoreServices/SearchService.cs +++ /dev/null @@ -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 SearchAsync(string name, CancellationToken cancellationToken = default) - { - var searchQuery = name; - var products = await _repositoryWrapper.SetRepository() - .TableNoTracking - .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, searchQuery)) - .Select(ProductMapper.ProjectToSDto) - .ToListAsync(cancellationToken); - - var categories = await _repositoryWrapper.SetRepository() - .TableNoTracking - .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.Name, searchQuery)) - .Select(ProductCategoryMapper.ProjectToSDto) - .ToListAsync(cancellationToken); - - return new SearchResponseDto - { - Products = products.Select(p => p.Adapt()).ToList(), - Categories = categories.Select(c => c.Adapt()).ToList() - }; - } - - public async Task ThumbSearchAsync(string name, CancellationToken cancellationToken = default) - { - var searchQuery = name; - - var products = await _repositoryWrapper.SetRepository() - .TableNoTracking - .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, searchQuery)) - .Take(8) - .Select(ProductMapper.ProjectToSDto) - .ToListAsync(cancellationToken); - - var categories = await _repositoryWrapper.SetRepository() - .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()).ToList(), - Categories = categories.Select(c => c.Adapt()).ToList() - }; - } - - public Task ZarehbinAsync(int page, CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } - - public Task ZarehbinAsync(Guid productId, CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } - -} \ No newline at end of file diff --git a/Netina.Core/CoreServices/SearchServices/GetEmallsProductQueryHandler.cs b/Netina.Core/CoreServices/SearchServices/GetEmallsProductsQueryHandler.cs similarity index 91% rename from Netina.Core/CoreServices/SearchServices/GetEmallsProductQueryHandler.cs rename to Netina.Core/CoreServices/SearchServices/GetEmallsProductsQueryHandler.cs index 864e377..6a1a9ae 100644 --- a/Netina.Core/CoreServices/SearchServices/GetEmallsProductQueryHandler.cs +++ b/Netina.Core/CoreServices/SearchServices/GetEmallsProductsQueryHandler.cs @@ -1,11 +1,11 @@ namespace Netina.Core.CoreServices.SearchServices; -public class GetEmallsProductQueryHandler : IRequestHandler +public class GetEmallsProductsQueryHandler : IRequestHandler { private readonly IRepositoryWrapper _repositoryWrapper; private readonly IMediator _mediator; private readonly SiteSettings _siteSetting; - public GetEmallsProductQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, IOptionsSnapshot optionsSnapshot) + public GetEmallsProductsQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, IOptionsSnapshot optionsSnapshot) { _repositoryWrapper = repositoryWrapper; _mediator = mediator; diff --git a/Netina.Core/CoreServices/SearchServices/GetThumbSearchProductsQueryHandler.cs b/Netina.Core/CoreServices/SearchServices/GetThumbSearchProductsQueryHandler.cs new file mode 100644 index 0000000..ca12fde --- /dev/null +++ b/Netina.Core/CoreServices/SearchServices/GetThumbSearchProductsQueryHandler.cs @@ -0,0 +1,38 @@ +using Netina.Domain.Entities.ProductCategories; + +namespace Netina.Core.CoreServices.SearchServices; + +public class GetThumbSearchProductsQueryHandler : IRequestHandler +{ + private readonly IRepositoryWrapper _repositoryWrapper; + + public GetThumbSearchProductsQueryHandler(IRepositoryWrapper repositoryWrapper) + { + _repositoryWrapper = repositoryWrapper; + } + public async Task Handle(GetThumbSearchProductsQuery request, CancellationToken cancellationToken) + { + + var searchQuery = request.Name; + + var products = await _repositoryWrapper.SetRepository() + .TableNoTracking + .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, searchQuery)) + .Take(8) + .Select(ProductMapper.ProjectToSDto) + .ToListAsync(cancellationToken); + + var categories = await _repositoryWrapper.SetRepository() + .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()).ToList(), + Categories = categories.Select(c => c.Adapt()).ToList() + }; + } +} \ No newline at end of file diff --git a/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs b/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs index 2344258..473b1cd 100644 --- a/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs +++ b/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs @@ -1,6 +1,4 @@ -using Netina.Domain.Dtos.ResponseDtos.Torob; - -namespace Netina.Core.CoreServices.SearchServices; +namespace Netina.Core.CoreServices.SearchServices; public class GetTorobProductsQueryHandler : IRequestHandler> { diff --git a/Netina.Core/CoreServices/WebSiteServices/GetWebSiteNavBarCommandHandler.cs b/Netina.Core/CoreServices/WebSiteServices/GetWebSiteNavBarCommandHandler.cs index 1e2d799..3ebae44 100644 --- a/Netina.Core/CoreServices/WebSiteServices/GetWebSiteNavBarCommandHandler.cs +++ b/Netina.Core/CoreServices/WebSiteServices/GetWebSiteNavBarCommandHandler.cs @@ -1,5 +1,4 @@ -using Netina.Domain.Entities.Blogs; -using Netina.Domain.Entities.ProductCategories; +using Netina.Domain.Entities.ProductCategories; namespace Netina.Core.CoreServices.WebSiteServices; diff --git a/Netina.Core/EntityServices/Abstracts/IUserService.cs b/Netina.Core/EntityServices/Abstracts/IUserService.cs index 32e45b2..5d7842c 100644 --- a/Netina.Core/EntityServices/Abstracts/IUserService.cs +++ b/Netina.Core/EntityServices/Abstracts/IUserService.cs @@ -1,11 +1,4 @@ -using Netina.Common.Models; -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; +namespace Netina.Core.EntityServices.Abstracts; public interface IUserService : IScopedDependency { diff --git a/Netina.Core/EntityServices/DiscountHandlers/CalculateOrderDiscountCommandHandler.cs b/Netina.Core/EntityServices/DiscountHandlers/CalculateOrderDiscountCommandHandler.cs index d2b6939..51b87ce 100644 --- a/Netina.Core/EntityServices/DiscountHandlers/CalculateOrderDiscountCommandHandler.cs +++ b/Netina.Core/EntityServices/DiscountHandlers/CalculateOrderDiscountCommandHandler.cs @@ -1,13 +1,4 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.DiscountHandlers; public class CalculateOrderDiscountCommandHandler : IRequestHandler { diff --git a/Netina.Core/EntityServices/OrderBagHandlers/AddToOrderBagCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/AddToOrderBagCommandHandler.cs index cf6ae1c..4d9585b 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/AddToOrderBagCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/AddToOrderBagCommandHandler.cs @@ -1,14 +1,4 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.OrderBagHandlers; public class AddToOrderBagCommandHandler : IRequestHandler { diff --git a/Netina.Core/EntityServices/OrderBagHandlers/CheckOrderBagCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/CheckOrderBagCommandHandler.cs index a57b9a3..60d3509 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/CheckOrderBagCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/CheckOrderBagCommandHandler.cs @@ -1,9 +1,4 @@ -using Netina.Domain.CommandQueries.Commands; -using Netina.Domain.Dtos.ResponseDtos; -using Netina.Domain.Entities.Products; -using Netina.Repository.Repositories.Base.Contracts; - -namespace Netina.Core.EntityServices.OrderBagHandlers; +namespace Netina.Core.EntityServices.OrderBagHandlers; public class CheckOrderBagCommandHandler : IRequestHandler> { diff --git a/Netina.Core/EntityServices/OrderBagHandlers/GetUserOrderBagQueryHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/GetUserOrderBagQueryHandler.cs index 08be54c..eab411d 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/GetUserOrderBagQueryHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/GetUserOrderBagQueryHandler.cs @@ -1,14 +1,4 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.OrderBagHandlers; public class GetUserOrderBagQueryHandler : IRequestHandler { diff --git a/Netina.Core/EntityServices/OrderBagHandlers/RemoveFromOrderBagCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/RemoveFromOrderBagCommandHandler.cs index a369fbb..882b9ea 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/RemoveFromOrderBagCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/RemoveFromOrderBagCommandHandler.cs @@ -1,14 +1,4 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.OrderBagHandlers; public class RemoveFromOrderBagCommandHandler : IRequestHandler { diff --git a/Netina.Core/EntityServices/OrderBagHandlers/SubmitDiscountCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/SubmitDiscountCommandHandler.cs index 540d735..791452c 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/SubmitDiscountCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/SubmitDiscountCommandHandler.cs @@ -1,12 +1,4 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.OrderBagHandlers; public class SubmitDiscountCommandHandler : IRequestHandler { diff --git a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderBagCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderBagCommandHandler.cs index a217fe2..7622a62 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderBagCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderBagCommandHandler.cs @@ -1,14 +1,4 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.OrderBagHandlers; public class SubmitOrderBagCommandHandler : IRequestHandler { diff --git a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderDeliveryCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderDeliveryCommandHandler.cs index dc56aa9..15b3616 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderDeliveryCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderDeliveryCommandHandler.cs @@ -1,10 +1,4 @@ -using Netina.Common.Models.Api; -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; +using Netina.Domain.Entities.Warehouses; namespace Netina.Core.EntityServices.OrderBagHandlers; diff --git a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs index 2ca677f..d61cd5d 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs @@ -1,25 +1,18 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.OrderBagHandlers; public class SubmitOrderPaymentCommandHandler : IRequestHandler { private readonly IMediator _mediator; private readonly IRepositoryWrapper _repositoryWrapper; 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; _repositoryWrapper = repositoryWrapper; _paymentService = paymentService; + _smsService = smsService; } public async Task Handle(SubmitOrderPaymentCommand request, CancellationToken cancellationToken) { @@ -43,6 +36,7 @@ public class SubmitOrderPaymentCommandHandler : IRequestHandler().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); + } else { diff --git a/Netina.Core/EntityServices/OrderHandlers/CalculateOrderCommandHandler.cs b/Netina.Core/EntityServices/OrderHandlers/CalculateOrderCommandHandler.cs index fa4b103..35c97bc 100644 --- a/Netina.Core/EntityServices/OrderHandlers/CalculateOrderCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderHandlers/CalculateOrderCommandHandler.cs @@ -1,12 +1,4 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.OrderHandlers; public class CalculateOrderCommandHandler : IRequestHandler { diff --git a/Netina.Core/EntityServices/OrderHandlers/ConfirmOrderStepCommandHandler.cs b/Netina.Core/EntityServices/OrderHandlers/ConfirmOrderStepCommandHandler.cs index 94c79b6..6e4fcb7 100644 --- a/Netina.Core/EntityServices/OrderHandlers/ConfirmOrderStepCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderHandlers/ConfirmOrderStepCommandHandler.cs @@ -1,19 +1,14 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.OrderHandlers; public class ConfirmOrderStepCommandHandler : IRequestHandler { private readonly IRepositoryWrapper _repositoryWrapper; + private readonly ISmsService _smsService; - public ConfirmOrderStepCommandHandler(IRepositoryWrapper repositoryWrapper) + public ConfirmOrderStepCommandHandler(IRepositoryWrapper repositoryWrapper,ISmsService smsService) { _repositoryWrapper = repositoryWrapper; + _smsService = smsService; } public async Task Handle(ConfirmOrderStepCommand request, CancellationToken cancellationToken) { @@ -41,6 +36,14 @@ public class ConfirmOrderStepCommandHandler : IRequestHandler() .Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); diff --git a/Netina.Core/EntityServices/OrderHandlers/GetOrderInvoiceCommandHandler.cs b/Netina.Core/EntityServices/OrderHandlers/GetOrderInvoiceCommandHandler.cs index 2bb3b8b..63a42df 100644 --- a/Netina.Core/EntityServices/OrderHandlers/GetOrderInvoiceCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderHandlers/GetOrderInvoiceCommandHandler.cs @@ -1,5 +1,4 @@ -using Netina.Domain.Dtos.LargDtos; -using Syncfusion.Drawing; +using Syncfusion.Drawing; using Syncfusion.Pdf; using Syncfusion.Pdf.Graphics; using Syncfusion.Pdf.Grid; diff --git a/Netina.Core/EntityServices/ReviewHandlers/ConfirmReviewCommandHandler.cs b/Netina.Core/EntityServices/ReviewHandlers/ConfirmReviewCommandHandler.cs index 1434ece..7b47f4f 100644 --- a/Netina.Core/EntityServices/ReviewHandlers/ConfirmReviewCommandHandler.cs +++ b/Netina.Core/EntityServices/ReviewHandlers/ConfirmReviewCommandHandler.cs @@ -1,10 +1,4 @@ -using Netina.Common.Models.Api; -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; +namespace Netina.Core.EntityServices.ReviewHandlers; public class ConfirmReviewCommandHandler : IRequestHandler { diff --git a/Netina.Core/Netina.Core.csproj b/Netina.Core/Netina.Core.csproj index 08dd96c..612cf73 100644 --- a/Netina.Core/Netina.Core.csproj +++ b/Netina.Core/Netina.Core.csproj @@ -25,7 +25,6 @@ - @@ -50,6 +49,7 @@ + @@ -59,6 +59,7 @@ + diff --git a/Netina.Domain/CommandQueries/Queries/SearchQueries.cs b/Netina.Domain/CommandQueries/Queries/SearchQueries.cs deleted file mode 100644 index b473c30..0000000 --- a/Netina.Domain/CommandQueries/Queries/SearchQueries.cs +++ /dev/null @@ -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>; - -public sealed record GetEmallsProductsQuery(int Page = 0 , int Count = 20) : IRequest; \ No newline at end of file diff --git a/Netina.Infrastructure/RestServices/IKaveNegarRestApi.cs b/Netina.Infrastructure/RestServices/IKaveNegarRestApi.cs index 6f84068..2d8a115 100644 --- a/Netina.Infrastructure/RestServices/IKaveNegarRestApi.cs +++ b/Netina.Infrastructure/RestServices/IKaveNegarRestApi.cs @@ -6,7 +6,9 @@ public interface IKaveNegarRestApi { [Post("/{apiKey}/verify/lookup.json")] - Task SendLookUp(string apiKey, [Query] string receptor, [Query] string token, [Query] string token2, [Query] string token10, [Query] string token20, [Query] string template); + Task 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")] Task SendSms(string apiKey, [Query] string receptor, [Query] string message, [Query] string sender); } \ No newline at end of file diff --git a/Netina.Infrastructure/Services/SmsService.cs b/Netina.Infrastructure/Services/SmsService.cs index be8b1bd..78caf85 100644 --- a/Netina.Infrastructure/Services/SmsService.cs +++ b/Netina.Infrastructure/Services/SmsService.cs @@ -1,10 +1,4 @@ -using Netina.Common.Models.Api; -using Netina.Common.Models.Exception; -using Netina.Core.Abstracts; -using Netina.Domain.Models.Settings; -using Netina.Infrastructure.RestServices; - -namespace Netina.Infrastructure.Services; +namespace Netina.Infrastructure.Services; public class SmsService : ISmsService { @@ -25,7 +19,9 @@ public class SmsService : ISmsService } 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) throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message); @@ -36,8 +32,7 @@ public class SmsService : ISmsService try { - var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, - verifyCode, null, null, null, _siteSettings.LoginOtpTemplate); + var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, _siteSettings.LoginOtpTemplate,verifyCode); if (rest.Return.status != 200 && _environment.IsProduction()) throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message); @@ -45,7 +40,7 @@ public class SmsService : ISmsService catch (ApiException apiException) { if (_environment.IsProduction()) - throw ; + throw; else _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); + } + } + } \ No newline at end of file diff --git a/Netina.Infrastructure/Services/ZarinpalService.cs b/Netina.Infrastructure/Services/ZarinpalService.cs index eed25ed..d55f45b 100644 --- a/Netina.Infrastructure/Services/ZarinpalService.cs +++ b/Netina.Infrastructure/Services/ZarinpalService.cs @@ -2,7 +2,7 @@ using Microsoft.IdentityModel.Tokens; using Netina.Common.Models.Exception; using Netina.Core.Abstracts; -using Netina.Core.CoreServices.Abstracts; +using Netina.Core.BaseServices.Abstracts; using Netina.Domain.CommandQueries.Commands; using Netina.Domain.CommandQueries.Queries; using Netina.Domain.Enums;