From 8c7e09e5e6b1c889f5b5148cdcbd7ae1ce53f776 Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Mon, 5 Aug 2024 23:23:32 +0330 Subject: [PATCH 01/10] fix(AmountSpecialOffer) --- .../appsettings.DevelopmentVesmeh.json | 4 +-- Netina.Api/Netina.Api.csproj | 26 +++++++++---------- .../.installation | 1 + Netina.Common/Extensions/StringExtensions.cs | 3 +++ Netina.Common/Netina.Common.csproj | 10 +++---- Netina.Core/Netina.Core.csproj | 4 +-- Netina.Domain/Netina.Domain.csproj | 12 ++++----- .../Netina.Infrastructure.csproj | 4 +-- .../Products/GetProductQueryHandler.cs | 15 +++-------- Netina.Repository/Netina.Repository.csproj | 10 +++---- .../Netina.WordPressDBConverter.csproj | 2 +- 11 files changed, 44 insertions(+), 47 deletions(-) create mode 100644 Netina.Api/Sentry/9DC334EC83D3BBA80249F4426A4CB422C68089AE/.installation diff --git a/Netina.Api/AppSettings/appsettings.DevelopmentVesmeh.json b/Netina.Api/AppSettings/appsettings.DevelopmentVesmeh.json index 3ac4912..8610861 100644 --- a/Netina.Api/AppSettings/appsettings.DevelopmentVesmeh.json +++ b/Netina.Api/AppSettings/appsettings.DevelopmentVesmeh.json @@ -1,8 +1,8 @@ { "ConnectionStrings": { "PostgresServer": "Host=185.220.227.246;Username=vesmmehAgent;Password=g05CTjK358Vx3Eoc9satsWyVwo+15UmsA2dnCrZRUYh1pLTe;Database=NetinaShopDB;Application Name=NetinaShopApi", - "Postgres": "Host=pg-0,pg-1;Username=igarsonAgent;Password=xHTpBf4wC+bBeNg2pL6Ga7VEWKFJx7VPEUpqxwPFfOc2YYTVwFQuHfsiqoVeT9+6;Database=NetinaShopDB;Load Balance Hosts=true;Target Session Attributes=primary;Application Name=iGLS", - "MartenDB": "Host=pg-0,pg-1;Username=igarsonAgent;Password=xHTpBf4wC+bBeNg2pL6Ga7VEWKFJx7VPEUpqxwPFfOc2YYTVwFQuHfsiqoVeT9+6;Database=NetinaShopMartenDB;" + "Postgres": "Host=pg-0;Username=postgres;Password=xHTpBf4wC+bBeNg2pL6Ga7VEWKFJx7VPEUpqxwPFfOc2YYTVwFQuHfsiqoVeT9+6;Database=NetinaShopDB", + "MartenDB": "Host=pg-0;Username=postgres;Password=xHTpBf4wC+bBeNg2pL6Ga7VEWKFJx7VPEUpqxwPFfOc2YYTVwFQuHfsiqoVeT9+6;Database=NetinaShopMartenDB" }, "Logging": { "LogLevel": { diff --git a/Netina.Api/Netina.Api.csproj b/Netina.Api/Netina.Api.csproj index d84a3e8..fcdf1e1 100644 --- a/Netina.Api/Netina.Api.csproj +++ b/Netina.Api/Netina.Api.csproj @@ -11,35 +11,35 @@ - + - + - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - + + + @@ -48,11 +48,11 @@ - - + + - + diff --git a/Netina.Api/Sentry/9DC334EC83D3BBA80249F4426A4CB422C68089AE/.installation b/Netina.Api/Sentry/9DC334EC83D3BBA80249F4426A4CB422C68089AE/.installation new file mode 100644 index 0000000..52b8fd7 --- /dev/null +++ b/Netina.Api/Sentry/9DC334EC83D3BBA80249F4426A4CB422C68089AE/.installation @@ -0,0 +1 @@ +9167d171-2373-44c9-9fa5-a91858e9854d \ No newline at end of file diff --git a/Netina.Common/Extensions/StringExtensions.cs b/Netina.Common/Extensions/StringExtensions.cs index 88f2fa1..95d59a7 100644 --- a/Netina.Common/Extensions/StringExtensions.cs +++ b/Netina.Common/Extensions/StringExtensions.cs @@ -5,6 +5,9 @@ namespace Netina.Common.Extensions { public static class StringExtensions { + public static bool IsNullOrEmpty(this string value) + => string.IsNullOrEmpty(value); + public static string GetSlug(string title) { return HttpUtility.UrlEncode(title.Replace(' ', '-')); diff --git a/Netina.Common/Netina.Common.csproj b/Netina.Common/Netina.Common.csproj index a752020..86c51c9 100644 --- a/Netina.Common/Netina.Common.csproj +++ b/Netina.Common/Netina.Common.csproj @@ -1,6 +1,6 @@  - + + - + diff --git a/Netina.Core/Netina.Core.csproj b/Netina.Core/Netina.Core.csproj index 4a9947b..338e582 100644 --- a/Netina.Core/Netina.Core.csproj +++ b/Netina.Core/Netina.Core.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/Netina.Domain/Netina.Domain.csproj b/Netina.Domain/Netina.Domain.csproj index 742bd87..892e6e1 100644 --- a/Netina.Domain/Netina.Domain.csproj +++ b/Netina.Domain/Netina.Domain.csproj @@ -1,6 +1,6 @@  - + - + diff --git a/Netina.Infrastructure/Netina.Infrastructure.csproj b/Netina.Infrastructure/Netina.Infrastructure.csproj index 99a2ca1..80db44a 100644 --- a/Netina.Infrastructure/Netina.Infrastructure.csproj +++ b/Netina.Infrastructure/Netina.Infrastructure.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/Netina.Repository/Handlers/Products/GetProductQueryHandler.cs b/Netina.Repository/Handlers/Products/GetProductQueryHandler.cs index ac71894..c9c74e6 100644 --- a/Netina.Repository/Handlers/Products/GetProductQueryHandler.cs +++ b/Netina.Repository/Handlers/Products/GetProductQueryHandler.cs @@ -2,19 +2,12 @@ namespace Netina.Repository.Handlers.Products; -public class GetProductQueryHandler : IRequestHandler +public class GetProductQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - - public GetProductQueryHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - } public async Task Handle(GetProductQuery request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .Where(b => b.Id == request.Id) .Select(ProductMapper.ProjectToLDto) .FirstOrDefaultAsync(cancellationToken); @@ -22,7 +15,7 @@ public class GetProductQueryHandler : IRequestHandler - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Tools/NetinaShop.WordPressDBConverter/Netina.WordPressDBConverter.csproj b/Tools/NetinaShop.WordPressDBConverter/Netina.WordPressDBConverter.csproj index 1708a01..4ba533a 100644 --- a/Tools/NetinaShop.WordPressDBConverter/Netina.WordPressDBConverter.csproj +++ b/Tools/NetinaShop.WordPressDBConverter/Netina.WordPressDBConverter.csproj @@ -8,7 +8,7 @@ - + From 1137fde70bdd8e98b1eafd61ae6138a293ddf138 Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Tue, 6 Aug 2024 10:30:01 +0330 Subject: [PATCH 02/10] fix(CancelOrder) --- Netina.Api/Controllers/OrderController.cs | 8 +++++ .../CancelOrderStepCommandHandler.cs | 21 ++++++++++++ .../CommandQueries/Commands/OrderCommands.cs | 1 + .../Products/UpdateProductCommandHandler.cs | 33 ++++++++----------- 4 files changed, 43 insertions(+), 20 deletions(-) create mode 100644 Netina.Core/EntityServices/OrderHandlers/CancelOrderStepCommandHandler.cs diff --git a/Netina.Api/Controllers/OrderController.cs b/Netina.Api/Controllers/OrderController.cs index 4a06093..9044a42 100644 --- a/Netina.Api/Controllers/OrderController.cs +++ b/Netina.Api/Controllers/OrderController.cs @@ -24,6 +24,11 @@ public class OrderController : ICarterModule .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); + group.MapPost("{id}/cancel", CancelOrderStepAsync) + .WithDisplayName("ConfirmOrderStep") + .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) + .HasApiVersion(1.0); + group.MapDelete("{id}", DeleteAsync) .WithDisplayName("DeleteOneOrder") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) @@ -40,6 +45,9 @@ public class OrderController : ICarterModule private async Task ConfirmOrderStepAsync(Guid id, [FromQuery] OrderStatus nextOrderStatus, [FromQuery]string? trackingCode, [FromServices] IMediator mediator, CancellationToken cancellationToken) => TypedResults.Ok(await mediator.Send(new ConfirmOrderStepCommand(id, nextOrderStatus,TrackingCode:trackingCode), cancellationToken)); + private async Task CancelOrderStepAsync(Guid id, [FromServices] IMediator mediator, CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(new CancelOrderStepCommand(id), cancellationToken)); + public async Task GetAllAsync(IMediator mediator, [FromQuery]string? factorCode, [FromQuery]long? selectedDate, diff --git a/Netina.Core/EntityServices/OrderHandlers/CancelOrderStepCommandHandler.cs b/Netina.Core/EntityServices/OrderHandlers/CancelOrderStepCommandHandler.cs new file mode 100644 index 0000000..6ee96bb --- /dev/null +++ b/Netina.Core/EntityServices/OrderHandlers/CancelOrderStepCommandHandler.cs @@ -0,0 +1,21 @@ +namespace Netina.Core.EntityServices.OrderHandlers; + +public class CancelOrderStepCommandHandler (IRepositoryWrapper repositoryWrapper) : IRequestHandler +{ + public async Task Handle(CancelOrderStepCommand request, CancellationToken cancellationToken) + { + var order = await repositoryWrapper.SetRepository() + .TableNoTracking + .FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken); + if (order == null) + throw new AppException("Order not found", ApiResultStatusCode.NotFound); + + order.SetOrderStatus(OrderStatus.Canceled); + + repositoryWrapper.SetRepository().Update(order); + await repositoryWrapper.SaveChangesAsync(cancellationToken); + + return true; + + } +} \ No newline at end of file diff --git a/Netina.Domain/CommandQueries/Commands/OrderCommands.cs b/Netina.Domain/CommandQueries/Commands/OrderCommands.cs index 573dc37..5fc1bc4 100644 --- a/Netina.Domain/CommandQueries/Commands/OrderCommands.cs +++ b/Netina.Domain/CommandQueries/Commands/OrderCommands.cs @@ -4,6 +4,7 @@ public sealed record CreateBaseOrderCommand(Guid UserId) : IRequest; public sealed record CalculateOrderCommand(Guid OrderId , bool NamoosiCalculate = false) : IRequest; public sealed record ConfirmOrderStepCommand(Guid OrderId , OrderStatus NextOrderStatus,string? TrackingCode) : IRequest; +public sealed record CancelOrderStepCommand(Guid OrderId) : IRequest; public sealed record GetOrderInvoiceCommand(Guid OrderId) : IRequest; public sealed record DeleteOrderCommand(Guid OrderId) : IRequest; \ No newline at end of file diff --git a/Netina.Repository/Handlers/Products/UpdateProductCommandHandler.cs b/Netina.Repository/Handlers/Products/UpdateProductCommandHandler.cs index 1f62aad..09396ed 100644 --- a/Netina.Repository/Handlers/Products/UpdateProductCommandHandler.cs +++ b/Netina.Repository/Handlers/Products/UpdateProductCommandHandler.cs @@ -2,19 +2,12 @@ namespace Netina.Repository.Handlers.Products; -public class UpdateProductCommandHandler : IRequestHandler +public class UpdateProductCommandHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - - public UpdateProductCommandHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - } public async Task Handle(UpdateProductCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(e => e.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("Product not found", ApiResultStatusCode.NotFound); @@ -34,14 +27,14 @@ public class UpdateProductCommandHandler : IRequestHandler().TableNoTracking + var dbSpecifications = await repositoryWrapper.SetRepository().TableNoTracking .Where(s => s.ProductId == ent.Id).ToListAsync(cancellationToken); foreach (var dbSpecification in dbSpecifications) { if (request.Specifications.FirstOrDefault(s => s.Id != dbSpecification.Id) == null) { - _repositoryWrapper.SetRepository().Delete(dbSpecification); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(dbSpecification); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } } foreach (var specification in request.Specifications.Where(s => s.Id == default)) @@ -51,14 +44,14 @@ public class UpdateProductCommandHandler : IRequestHandler().TableNoTracking + var dbFiles = await repositoryWrapper.SetRepository().TableNoTracking .Where(s => s.ProductId == ent.Id).ToListAsync(cancellationToken); foreach (var dbFile in dbFiles) { if (request.Files.FirstOrDefault(s => s.Id == dbFile.Id)==null) { - _repositoryWrapper.SetRepository().Delete(dbFile); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(dbFile); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } } foreach (var file in request.Files.Where(f=>f.Id==default)) @@ -67,8 +60,8 @@ public class UpdateProductCommandHandler : IRequestHandler().Update(newEnt); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(newEnt); + await repositoryWrapper.SaveChangesAsync(cancellationToken); if (request.IsSpecialOffer) { @@ -81,12 +74,12 @@ public class UpdateProductCommandHandler : IRequestHandler(); - await _mediator.Send(discountRequest, cancellationToken); + await mediator.Send(discountRequest, cancellationToken); } else { var discountRequest = discount.Adapt(); - await _mediator.Send(discountRequest, cancellationToken); + await mediator.Send(discountRequest, cancellationToken); } } From 8f28afbf50adbb93c7237f0ad99ffb688ee016e4 Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Tue, 6 Aug 2024 11:39:21 +0330 Subject: [PATCH 03/10] fix(CKEditor) , fix(DiscountDuplicateCode) --- Netina.Api/Controllers/FileController.cs | 46 ++++++++++++++++++- .../CkEditorFileUploadResponseDto.cs | 6 +++ .../Discounts/CreateDiscountCommandHandler.cs | 33 +++++++------ .../Discounts/UpdateDiscountCommandHandler.cs | 23 ++++------ 4 files changed, 80 insertions(+), 28 deletions(-) create mode 100644 Netina.Domain/Dtos/ResponseDtos/CkEditorFileUploadResponseDto.cs diff --git a/Netina.Api/Controllers/FileController.cs b/Netina.Api/Controllers/FileController.cs index 7747d37..2f27c83 100644 --- a/Netina.Api/Controllers/FileController.cs +++ b/Netina.Api/Controllers/FileController.cs @@ -1,4 +1,5 @@ -using Netina.Domain.Enums; +using Netina.Domain.Dtos.ResponseDtos; +using Netina.Domain.Enums; namespace Netina.Api.Controllers; @@ -18,6 +19,49 @@ public class FileController : ICarterModule .WithDisplayName("UploadFileAsync") .HasApiVersion(1.0); + group.MapPost("/ckeditor", UploadCkEditorFileAsync) + .WithDisplayName("Upload CkEditor File") + .AllowAnonymous() + .DisableAntiforgery() + .HasApiVersion(1.0); + + } + + public async Task UploadCkEditorFileAsync(IFormFile upload, [FromServices] IHttpContextAccessor httpContextAccessor, [FromServices] IStorageService storageService, IUploadFileService uploadFileService, CancellationToken cancellationToken) + { + try + { + if (httpContextAccessor.HttpContext?.Request?.Headers is { } dictionary && dictionary.TryGetValue("Authorization", out StringValues value)) + { + if (value.ToString() != "xuwp4KzU1/YBoevpzgH0cz8+zLKQ+EOaYXeo4JtRxmVIuN7Hqxz97oQ398tNX68+") + throw new Exception("ارسال فایل از طرف شما معتبر نمی باشد"); + + using var stream = new MemoryStream(); + await upload.CopyToAsync(stream, cancellationToken); + var uploadRequest = new FileUploadRequest + { + FileName = upload.FileName, + ContentType = upload.ContentType, + FileUploadType = FileUploadType.Image, + StringBaseFile = Convert.ToBase64String(stream.ToArray()) + }; + var fileUrl = await uploadFileService.UploadImageAsync(uploadRequest); + return TypedResults.Ok(new CkEditorFileUploadResponseDto { url = fileUrl.FileUrl }); + } + throw new Exception("ارسال فایل از طرف شما معتبر نمی باشد"); + } + catch (Exception e) + { + var errorMessage = new + { + message = e.Message + }; + var errorResponse = new + { + error = errorMessage + }; + return TypedResults.BadRequest(errorResponse); + } } public async Task GetFilesAsync([FromQuery]StorageFileType? fileType,[FromServices] IStorageService storageService, CancellationToken cancellationToken) diff --git a/Netina.Domain/Dtos/ResponseDtos/CkEditorFileUploadResponseDto.cs b/Netina.Domain/Dtos/ResponseDtos/CkEditorFileUploadResponseDto.cs new file mode 100644 index 0000000..696f8e5 --- /dev/null +++ b/Netina.Domain/Dtos/ResponseDtos/CkEditorFileUploadResponseDto.cs @@ -0,0 +1,6 @@ +namespace Netina.Domain.Dtos.ResponseDtos; + +public class CkEditorFileUploadResponseDto +{ + public string url { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/Netina.Repository/Handlers/Discounts/CreateDiscountCommandHandler.cs b/Netina.Repository/Handlers/Discounts/CreateDiscountCommandHandler.cs index d290ab7..689943d 100644 --- a/Netina.Repository/Handlers/Discounts/CreateDiscountCommandHandler.cs +++ b/Netina.Repository/Handlers/Discounts/CreateDiscountCommandHandler.cs @@ -1,15 +1,22 @@ -namespace Netina.Repository.Handlers.Discounts; +using Microsoft.EntityFrameworkCore; -public class CreateDiscountCommandHandler : IRequestHandler +namespace Netina.Repository.Handlers.Discounts; + +public class CreateDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CreateDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(CreateDiscountCommand request, CancellationToken cancellationToken) { + if (request.HasCode) + { + var foundDiscount = await repositoryWrapper.SetRepository() + .TableNoTracking + .Where(d => d.Code == request.Code) + .FirstOrDefaultAsync(cancellationToken); + + if (foundDiscount != null) + throw new BaseApiException(ApiResultStatusCode.BadRequest, "کد تخفیف مورد نظر تکراری می باشد"); + } switch (request.Type) { case DiscountType.All: @@ -17,14 +24,14 @@ public class CreateDiscountCommandHandler : IRequestHandler().Add(ent); + repositoryWrapper.SetRepository().Add(ent); break; case DiscountType.Category: var catDis = CategoryDiscount.Create(request.Code,request.Description, request.DiscountPercent, request.DiscountAmount, request.HasCode, request.AmountType, request.Type, request.Count,request.IsImmortal, request.StartDate, request.ExpireDate, request.PriceFloor, request.HasPriceFloor, request.PriceCeiling, request.HasPriceCeiling, request.IsInfinity, request.UseCount, request.IsForInvitation,request.IsForFirstPurchase,request.IsSpecialOffer, request.CategoryId); - _repositoryWrapper.SetRepository().Add(catDis); + repositoryWrapper.SetRepository().Add(catDis); break; case DiscountType.Product: @@ -32,17 +39,17 @@ public class CreateDiscountCommandHandler : IRequestHandler().Add(productDis); + repositoryWrapper.SetRepository().Add(productDis); break; default: var def = Discount.Create(request.Code,request.Description, request.DiscountPercent, request.DiscountAmount, request.HasCode, request.AmountType, request.Type, request.Count, request.IsImmortal, request.StartDate, request.ExpireDate, request.PriceFloor, request.HasPriceFloor, request.PriceCeiling, request.HasPriceCeiling, request.IsInfinity, request.UseCount, request.IsForInvitation, request.IsForFirstPurchase,request.IsSpecialOffer); - _repositoryWrapper.SetRepository().Add(def); + repositoryWrapper.SetRepository().Add(def); break; } - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return request.Adapt(); } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Discounts/UpdateDiscountCommandHandler.cs b/Netina.Repository/Handlers/Discounts/UpdateDiscountCommandHandler.cs index c022c55..e3f035e 100644 --- a/Netina.Repository/Handlers/Discounts/UpdateDiscountCommandHandler.cs +++ b/Netina.Repository/Handlers/Discounts/UpdateDiscountCommandHandler.cs @@ -2,20 +2,15 @@ namespace Netina.Repository.Handlers.Discounts; -public class UpdateDiscountCommandHandler : IRequestHandler +public class UpdateDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public UpdateDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(UpdateDiscountCommand request, CancellationToken cancellationToken) { switch (request.Type) { case DiscountType.All: - var ent = await _repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d=>d.Id==request.Id,cancellationToken); + var ent = await repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d=>d.Id==request.Id,cancellationToken); if (ent == null) throw new AppException("Discount not found", ApiResultStatusCode.NotFound); var newEnt = Discount.Create(request.Code,request.Description, @@ -27,10 +22,10 @@ public class UpdateDiscountCommandHandler : IRequestHandler().Update(newEnt); + repositoryWrapper.SetRepository().Update(newEnt); break; case DiscountType.Category: - var catEnt = await _repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d => d.Id == request.Id, cancellationToken); + var catEnt = await repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d => d.Id == request.Id, cancellationToken); if (catEnt == null) throw new AppException("Discount not found", ApiResultStatusCode.NotFound); @@ -43,11 +38,11 @@ public class UpdateDiscountCommandHandler : IRequestHandler().Update(catDis); + repositoryWrapper.SetRepository().Update(catDis); break; case DiscountType.Product: - var productEnt = await _repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d => d.Id == request.Id, cancellationToken); + var productEnt = await repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d => d.Id == request.Id, cancellationToken); if (productEnt == null) throw new AppException("Discount not found", ApiResultStatusCode.NotFound); @@ -60,10 +55,10 @@ public class UpdateDiscountCommandHandler : IRequestHandler().Update(productDis); + repositoryWrapper.SetRepository().Update(productDis); break; } - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file From e9764c6cd43fa7686aa63aee26b8503290d4a73d Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Tue, 6 Aug 2024 12:38:57 +0330 Subject: [PATCH 04/10] feat(AddFastPriceChange) --- Netina.Api/Controllers/ProductController.cs | 9 +++++- .../Commands/ProductCommands.cs | 1 + .../ChangeProductCostCommandHandler.cs | 31 +++++++++++++++++++ .../ChangeProductDisplayedCommandHandler.cs | 15 +++------ 4 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 Netina.Repository/Handlers/Products/ChangeProductCostCommandHandler.cs diff --git a/Netina.Api/Controllers/ProductController.cs b/Netina.Api/Controllers/ProductController.cs index 3879b4e..45b2319 100644 --- a/Netina.Api/Controllers/ProductController.cs +++ b/Netina.Api/Controllers/ProductController.cs @@ -26,7 +26,11 @@ public class ProductController : ICarterModule .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); - group.MapPut("{productId}", ChangeDisplayedAsync) + group.MapPut("{productId}/displayed", ChangeDisplayedAsync) + .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) + .HasApiVersion(1.0); + + group.MapPut("{productId}/cost", ChangeCostAsync) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); @@ -65,6 +69,9 @@ public class ProductController : ICarterModule public async Task ChangeDisplayedAsync(Guid productId, [FromQuery] bool beDisplayed, [FromServices] IMediator mediator, CancellationToken cancellationToken) => TypedResults.Ok(await mediator.Send(new ChangeProductDisplayedCommand(productId, beDisplayed), cancellationToken)); + public async Task ChangeCostAsync(Guid productId, [FromQuery] double cost, [FromServices] IMediator mediator, CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(new ChangeProductCostCommand(productId, cost), cancellationToken)); + // DELETE:Delete Entity public async Task Delete(Guid id, IMediator mediator, CancellationToken cancellationToken) => TypedResults.Ok(await mediator.Send(new DeleteProductCommand(id), cancellationToken)); diff --git a/Netina.Domain/CommandQueries/Commands/ProductCommands.cs b/Netina.Domain/CommandQueries/Commands/ProductCommands.cs index 7b090d5..b15f7a4 100644 --- a/Netina.Domain/CommandQueries/Commands/ProductCommands.cs +++ b/Netina.Domain/CommandQueries/Commands/ProductCommands.cs @@ -42,6 +42,7 @@ public sealed record UpdateProductCommand( List Files) : IRequest; public sealed record ChangeProductDisplayedCommand(Guid Id,bool BeDisplayed) : IRequest; +public sealed record ChangeProductCostCommand(Guid Id,double Cost) : IRequest; public sealed record DeleteProductCommand(Guid Id) : IRequest; diff --git a/Netina.Repository/Handlers/Products/ChangeProductCostCommandHandler.cs b/Netina.Repository/Handlers/Products/ChangeProductCostCommandHandler.cs new file mode 100644 index 0000000..60b23e5 --- /dev/null +++ b/Netina.Repository/Handlers/Products/ChangeProductCostCommandHandler.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore; + +namespace Netina.Repository.Handlers.Products; + +public class ChangeProductCostCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler +{ + public async Task Handle(ChangeProductCostCommand request, CancellationToken cancellationToken) + { + + var ent = await repositoryWrapper.SetRepository() + .TableNoTracking + .FirstOrDefaultAsync(p => p.Id == request.Id, cancellationToken); + if (ent == null) + throw new AppException("Product not found"); + var newEnt = Product.Create(ent.PersianName, ent.EnglishName, ent.Summery, ent.ExpertCheck, ent.Tags, + ent.Warranty, + ent.BeDisplayed, request.Cost, ent.PackingCost, ent.HasExpressDelivery, ent.Stock, ent.MaxOrderCount, + ent.BrandId, + ent.CategoryId); + newEnt.CreatedAt = ent.CreatedAt; + newEnt.CreatedBy = ent.CreatedBy; + newEnt.Id = ent.Id; + + repositoryWrapper.SetRepository() + .Update(newEnt); + + await repositoryWrapper.SaveChangesAsync(cancellationToken); + return true; + } +} \ No newline at end of file diff --git a/Netina.Repository/Handlers/Products/ChangeProductDisplayedCommandHandler.cs b/Netina.Repository/Handlers/Products/ChangeProductDisplayedCommandHandler.cs index 3a37075..d43ae23 100644 --- a/Netina.Repository/Handlers/Products/ChangeProductDisplayedCommandHandler.cs +++ b/Netina.Repository/Handlers/Products/ChangeProductDisplayedCommandHandler.cs @@ -2,17 +2,12 @@ namespace Netina.Repository.Handlers.Products; -public class ChangeProductDisplayedCommandHandler : IRequestHandler +public class ChangeProductDisplayedCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public ChangeProductDisplayedCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(ChangeProductDisplayedCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository() + var ent = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(p => p.Id == request.Id, cancellationToken); if (ent == null) @@ -26,10 +21,10 @@ public class ChangeProductDisplayedCommandHandler : IRequestHandler() + repositoryWrapper.SetRepository() .Update(newEnt); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file From 5524cb4e43b7668e79052fbbaadd3abb36dbfb85 Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Tue, 6 Aug 2024 14:26:39 +0330 Subject: [PATCH 05/10] feat(AddBanner) , feat(AddCatelog) , feat(AddPersonalizationPage) --- Netina.Api/Controllers/WebSiteController.cs | 35 ++++++++++++++++++- Netina.Domain/Enums/BannerSection.cs | 15 ++++++++ .../Settings/PersonalizationSetting.cs | 29 +++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 Netina.Domain/Enums/BannerSection.cs create mode 100644 Netina.Domain/MartenEntities/Settings/PersonalizationSetting.cs diff --git a/Netina.Api/Controllers/WebSiteController.cs b/Netina.Api/Controllers/WebSiteController.cs index eff8bdc..f0af642 100644 --- a/Netina.Api/Controllers/WebSiteController.cs +++ b/Netina.Api/Controllers/WebSiteController.cs @@ -1,4 +1,7 @@ -namespace Netina.Api.Controllers; +using Netina.Domain.Enums; +using Netina.Domain.MartenEntities.Settings; + +namespace Netina.Api.Controllers; public class WebSiteController : ICarterModule { @@ -9,8 +12,38 @@ public class WebSiteController : ICarterModule group.MapGet("/navbar", GetNavBarItemsAsync) .WithDisplayName("Get NavBar Items") .HasApiVersion(1.0); + + group.MapGet("/catelog", GetCatalogAsync) + .WithDisplayName("Get Catalog Items") + .HasApiVersion(1.0); + + group.MapGet("/banner", GetBannerAsync) + .WithDisplayName("Get Banner Items") + .HasApiVersion(1.0); } private async Task GetNavBarItemsAsync([FromServices] IMediator mediator, CancellationToken cancellationToken) => TypedResults.Ok(await mediator.Send(new GetWebSiteNavBarCommand(),cancellationToken)); + + private async Task GetCatalogAsync([FromServices] ISettingService settingService, CancellationToken cancellationToken) + { + var setting = await settingService.GetSettingAsync(nameof(PersonalizationSetting), cancellationToken); + if (setting is PersonalizationSetting personalizationSetting) + { + return TypedResults.Ok(personalizationSetting.Catalog); + } + + throw new BaseApiException(ApiResultStatusCode.BadRequest, "Catalogs not found"); + } + + private async Task GetBannerAsync([FromQuery]BannerSection? section,[FromServices] ISettingService settingService, CancellationToken cancellationToken) + { + var setting = await settingService.GetSettingAsync(nameof(PersonalizationSetting), cancellationToken); + if (setting is not PersonalizationSetting personalizationSetting) + throw new BaseApiException(ApiResultStatusCode.BadRequest, "Catalogs not found"); + if (section != null) + return TypedResults.Ok(personalizationSetting.Banners.Where(b => b.Section == section)); + return TypedResults.Ok(personalizationSetting.Banners); + + } } \ No newline at end of file diff --git a/Netina.Domain/Enums/BannerSection.cs b/Netina.Domain/Enums/BannerSection.cs new file mode 100644 index 0000000..9fe1574 --- /dev/null +++ b/Netina.Domain/Enums/BannerSection.cs @@ -0,0 +1,15 @@ +namespace Netina.Domain.Enums; + +public enum BannerSection +{ + [Display(Name = "هیچ کدام")] + None = 0, + [Display(Name = "بنر تخفیف بالای سایت")] + TopOff = 1, + [Display(Name = "بنر تخفیف بالای سایت - موبایل")] + TopOffSm = 2, + [Display(Name = "بنر اسلایدری")] + Slider = 10, + [Display(Name = "بنر اسلایدری - موبایل")] + SliderSm = 11, +} \ No newline at end of file diff --git a/Netina.Domain/MartenEntities/Settings/PersonalizationSetting.cs b/Netina.Domain/MartenEntities/Settings/PersonalizationSetting.cs new file mode 100644 index 0000000..6776bb9 --- /dev/null +++ b/Netina.Domain/MartenEntities/Settings/PersonalizationSetting.cs @@ -0,0 +1,29 @@ +namespace Netina.Domain.MartenEntities.Settings; + +public class BannerItemModel +{ + public string ImageLocation { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; + public string Link { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public BannerSection Section { get; set; } +} + +public class CatalogItemModel +{ + public Guid Id { get; set; } + public string PersianName { get; set; } = string.Empty; + public string EnglishName { get; set; } = string.Empty; + public string Query { get; set; } = string.Empty; + public string ImageLocation { get; set; } = string.Empty; + public int Row { get; set; } + public bool IsMain { get; set; } + public Guid ParentId { get; set; } + public string ParentName { get; set; } = string.Empty; +} + +public class PersonalizationSetting +{ + public List Banners { get; set; } = new(); + public List Catalog { get; set; } = new(); +} \ No newline at end of file From 19f1f29548fec7f8217168f11831da405d9ca7ac Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Wed, 7 Aug 2024 16:15:53 +0330 Subject: [PATCH 06/10] feat(FaqInActions) , feat(FaqManagementPage) , feat(FaqController) --- Netina.Api/Controllers/FaqController.cs | 56 ++++++++++ Netina.Api/Controllers/SeedController.cs | 18 ++-- .../MiddleWares/ExceptionHandlerMiddleware.cs | 4 +- .../CommandQueries/Commands/BrandCommands.cs | 19 +++- .../CommandQueries/Commands/FaqCommands.cs | 15 +++ .../Commands/ProductCategoryCommands.cs | 8 +- .../Commands/ProductCommands.cs | 47 ++++---- .../CommandQueries/Queries/FaqQueries.cs | 4 + Netina.Domain/Dtos/LargDtos/BrandLDto.cs | 1 + .../Dtos/LargDtos/ProductCategoryLDto.cs | 1 + Netina.Domain/Dtos/SmallDtos/BrandSDto.cs | 1 + Netina.Domain/Entities/Brands/Brand.cs | 5 +- Netina.Domain/Entities/Products/Product.cs | 3 + Netina.Domain/Extensions/BrandExtension.cs | 13 +++ .../Extensions/ProductCategoryExtension.cs | 13 +++ Netina.Domain/Extensions/ProductExtension.cs | 13 +++ Netina.Domain/MartenEntities/Faqs/BaseFaq.cs | 8 ++ Netina.Domain/MartenEntities/Pages/FAQPage.cs | 7 -- .../Models/Claims/ApplicationClaims.cs | 13 ++- .../Models/Claims/ApplicationPermission.cs | 2 + Netina.Domain/Netina.Domain.csproj | 3 + .../Marten/MartenRepository.cs | 57 +++++++--- .../Marten/MartenRepositoryWrapper.cs | 12 +-- .../Services/Scrapers/DigikalaScraper.cs | 2 +- .../Brands/CreateBrandCommandHandler.cs | 32 ++++-- .../Brands/UpdateBrandCommandHandler.cs | 41 ++++--- .../Handlers/Faqs/CreateFaqCommandHandler.cs | 18 ++++ .../Handlers/Faqs/DeleteFaqCommandHandler.cs | 12 +++ .../Handlers/Faqs/GetFaqQueryHandler.cs | 27 +++++ .../Handlers/Faqs/GetFaqsQueryHandler.cs | 16 +++ .../Handlers/Faqs/UpdateFaqCommandHandler.cs | 24 +++++ .../CreateProductCategoryCommandHandler.cs | 31 ++++-- .../DeleteProductCategoryCommandHandler.cs | 19 ++-- .../GetProductCategoriesQueryHandler.cs | 13 +-- .../GetProductCategoryChildrenQueryHandler.cs | 12 +-- .../GetProductCategoryQueryHandler.cs | 11 +- .../UpdateProductCategoryCommandHandler.cs | 42 +++++--- .../Products/CreateProductCommandHandler.cs | 39 ++++--- .../Products/DeleteProductCommandHandler.cs | 15 +-- .../Products/GetProductQueryHandler.cs | 6 +- .../Products/GetProductsQueryHandler.cs | 28 ++--- .../Products/UpdateProductCommandHandler.cs | 33 +++++- Netina.Repository/Netina.Repository.csproj | 4 + .../Repositories/Marten/IMartenRepository.cs | 3 + .../Services/DbInitializerService.cs | 101 +++++++----------- 45 files changed, 588 insertions(+), 264 deletions(-) create mode 100644 Netina.Api/Controllers/FaqController.cs create mode 100644 Netina.Domain/CommandQueries/Commands/FaqCommands.cs create mode 100644 Netina.Domain/CommandQueries/Queries/FaqQueries.cs create mode 100644 Netina.Domain/Extensions/BrandExtension.cs create mode 100644 Netina.Domain/Extensions/ProductCategoryExtension.cs create mode 100644 Netina.Domain/Extensions/ProductExtension.cs create mode 100644 Netina.Domain/MartenEntities/Faqs/BaseFaq.cs delete mode 100644 Netina.Domain/MartenEntities/Pages/FAQPage.cs create mode 100644 Netina.Repository/Handlers/Faqs/CreateFaqCommandHandler.cs create mode 100644 Netina.Repository/Handlers/Faqs/DeleteFaqCommandHandler.cs create mode 100644 Netina.Repository/Handlers/Faqs/GetFaqQueryHandler.cs create mode 100644 Netina.Repository/Handlers/Faqs/GetFaqsQueryHandler.cs create mode 100644 Netina.Repository/Handlers/Faqs/UpdateFaqCommandHandler.cs diff --git a/Netina.Api/Controllers/FaqController.cs b/Netina.Api/Controllers/FaqController.cs new file mode 100644 index 0000000..9b141fe --- /dev/null +++ b/Netina.Api/Controllers/FaqController.cs @@ -0,0 +1,56 @@ +namespace Netina.Api.Controllers; + +public class FaqController : ICarterModule +{ + public void AddRoutes(IEndpointRouteBuilder app) + { + var group = app.NewVersionedApi("Faq") + .MapGroup("api/faq"); + + group.MapGet("/slug", GetFaqBySlugAsync) + .WithDisplayName("GetFaqBySlug") + .WithDescription("Get faq by slug , you have to send page slug") + .HasApiVersion(1.0); + + group.MapGet("", GetFaqsAsync) + .WithDisplayName("GetFaqs") + .WithDescription("Get All Faqs ") + .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer") + .RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFaq)) + .HasApiVersion(1.0); + + group.MapPost("", CreateFaqAsync) + .WithDisplayName("Create Faq") + .WithDescription("Create Faq , you can create new faq or create update your faq ") + .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer") + .RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFaq)) + .HasApiVersion(1.0); + + group.MapPut("", UpdateFaqAsync) + .WithDisplayName("Update FaqAsync") + .WithDescription("Update Faq , you can create new faq or create update your faq ") + .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer") + .RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFaq)) + .HasApiVersion(1.0); + + group.MapDelete("{id}", DeleteFaqAsync) + .WithDisplayName("DeleteFaq") + .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFaq)) + .HasApiVersion(1.0); + } + private async Task DeleteFaqAsync([FromRoute]Guid id,[FromServices] IMediator mediator, CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(new DeleteFaqCommand(Id:id), cancellationToken)); + + private async Task GetFaqsAsync([FromQuery]int page, [FromQuery] int? count ,[FromServices] IMediator mediator, CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(new GetFaqsQuery(Count: count ?? 0 , Page:page), cancellationToken)); + + private async Task CreateFaqAsync([FromBody] CreateFaqCommand request,[FromServices]IMediator mediator , CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(request, cancellationToken)); + + private async Task UpdateFaqAsync([FromBody] UpdateFaqCommand request, [FromServices] IMediator mediator, CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(request, cancellationToken)); + + private async Task GetFaqBySlugAsync([FromQuery] string slug, [FromServices] IMediator mediator, CancellationToken cancellationToken) + => TypedResults.Ok(await mediator.Send(new GetFaqQuery(null, slug), cancellationToken)); + +} \ No newline at end of file diff --git a/Netina.Api/Controllers/SeedController.cs b/Netina.Api/Controllers/SeedController.cs index acc7f01..567361d 100644 --- a/Netina.Api/Controllers/SeedController.cs +++ b/Netina.Api/Controllers/SeedController.cs @@ -78,13 +78,14 @@ public class SeedController : ICarterModule var baseCat = await mediator.Send(new CreateProductCategoryCommand("دسته بندی نشده", "محصولات دسته بندی نشده", true, default, - new List()),cancellationToken); + new List(), + new Dictionary(), + new Dictionary()),cancellationToken); categories.Add(0,baseCat); foreach (var requestDto in request) { var lDto = await mediator.Send(new CreateProductCategoryCommand(requestDto.Name,requestDto.Description,true,default, - - new List()), cancellationToken); + new List(),new Dictionary(),new Dictionary()), cancellationToken); categories.Add(requestDto.BaseCategoryId,lDto); } @@ -97,13 +98,18 @@ public class SeedController : ICarterModule if (key != "kKAYskyG8xPxKnJrHkuYxub4Ao2bnz7AOmNtwDT0RaqzaG7ZvbvaP29tCrC8wJ823RczJFXOIQT2bDOec4F38A==") throw new AppException("Key is not valid", ApiResultStatusCode.UnAuthorized); Dictionary brands = new Dictionary(); - var baseBrand = await mediator.Send(new CreateBrandCommand("بدون برند","NoBrand", "محصولات بدون برند", false,string.Empty, - new List()), cancellationToken); + var baseBrand = await mediator.Send(new CreateBrandCommand("بدون برند","NoBrand", + "محصولات بدون برند", + false, + string.Empty, + new List(), + new Dictionary(), + new Dictionary()), cancellationToken); brands.Add(0, baseBrand); foreach (var requestDto in request) { var sDto = await mediator.Send(new CreateBrandCommand(requestDto.Name,string.Empty, requestDto.Description, false, - string.Empty, new List()), cancellationToken); + string.Empty, new List(),new Dictionary(),new Dictionary()), cancellationToken); brands.Add(requestDto.BaseBrandId,sDto); } diff --git a/Netina.Api/WebFramework/MiddleWares/ExceptionHandlerMiddleware.cs b/Netina.Api/WebFramework/MiddleWares/ExceptionHandlerMiddleware.cs index 122c097..0f52832 100644 --- a/Netina.Api/WebFramework/MiddleWares/ExceptionHandlerMiddleware.cs +++ b/Netina.Api/WebFramework/MiddleWares/ExceptionHandlerMiddleware.cs @@ -39,7 +39,9 @@ public class ExceptionHandlerMiddleware catch (BaseApiException exception) { _logger.LogError(exception, exception.Message); - httpStatusCode = exception.HttpStatusCode; + httpStatusCode = exception.ApiStatusCode == ApiResultStatusCode.NotFound ? HttpStatusCode.NotFound : + exception.ApiStatusCode == ApiResultStatusCode.BadRequest ? + HttpStatusCode.BadRequest : exception.HttpStatusCode; apiStatusCode = exception.ApiStatusCode; if (_env.IsDevelopment()) diff --git a/Netina.Domain/CommandQueries/Commands/BrandCommands.cs b/Netina.Domain/CommandQueries/Commands/BrandCommands.cs index f9d3281..f8c4d42 100644 --- a/Netina.Domain/CommandQueries/Commands/BrandCommands.cs +++ b/Netina.Domain/CommandQueries/Commands/BrandCommands.cs @@ -1,8 +1,23 @@ namespace Netina.Domain.CommandQueries.Commands; -public sealed record CreateBrandCommand(string PersianName,string EnglishName, string Description , bool HasSpecialPage , string PageUrl, List Files) : IRequest; +public sealed record CreateBrandCommand(string PersianName, + string EnglishName, + string Description , + bool HasSpecialPage , + string PageUrl, + List Files, + Dictionary Faqs, + Dictionary MetaTags) : IRequest; -public sealed record UpdateBrandCommand(Guid Id,string PersianName, string EnglishName, string Description, bool HasSpecialPage, string PageUrl, List Files) : IRequest; +public sealed record UpdateBrandCommand(Guid Id, + string PersianName, + string EnglishName, + string Description, + bool HasSpecialPage, + string PageUrl, + List Files, + Dictionary Faqs, + Dictionary MetaTags) : IRequest; public sealed record DeleteBrandCommand(Guid Id) : IRequest; diff --git a/Netina.Domain/CommandQueries/Commands/FaqCommands.cs b/Netina.Domain/CommandQueries/Commands/FaqCommands.cs new file mode 100644 index 0000000..dac78a8 --- /dev/null +++ b/Netina.Domain/CommandQueries/Commands/FaqCommands.cs @@ -0,0 +1,15 @@ +namespace Netina.Domain.CommandQueries.Commands; + +public record CreateFaqCommand( + Dictionary Faqs, + string Slug, + string Title) : IRequest; + +public record DeleteFaqCommand(Guid Id) : IRequest; + + +public record UpdateFaqCommand( + Guid Id, + Dictionary Faqs, + string Slug, + string Title) : IRequest; \ No newline at end of file diff --git a/Netina.Domain/CommandQueries/Commands/ProductCategoryCommands.cs b/Netina.Domain/CommandQueries/Commands/ProductCategoryCommands.cs index ac59a28..3cc8354 100644 --- a/Netina.Domain/CommandQueries/Commands/ProductCategoryCommands.cs +++ b/Netina.Domain/CommandQueries/Commands/ProductCategoryCommands.cs @@ -5,7 +5,9 @@ public sealed record CreateProductCategoryCommand( string Description, bool IsMain, Guid ParentId, - List Files) : IRequest; + List Files, + Dictionary Faqs, + Dictionary MetaTags) : IRequest; public sealed record UpdateProductCategoryCommand( Guid Id, @@ -13,6 +15,8 @@ public sealed record UpdateProductCategoryCommand( string Description, bool IsMain, Guid ParentId, - List Files) : IRequest; + List Files, + Dictionary Faqs, + Dictionary MetaTags) : IRequest; public sealed record DeleteProductCategoryCommand(Guid Id) : IRequest; \ No newline at end of file diff --git a/Netina.Domain/CommandQueries/Commands/ProductCommands.cs b/Netina.Domain/CommandQueries/Commands/ProductCommands.cs index b15f7a4..17322fe 100644 --- a/Netina.Domain/CommandQueries/Commands/ProductCommands.cs +++ b/Netina.Domain/CommandQueries/Commands/ProductCommands.cs @@ -1,24 +1,26 @@ namespace Netina.Domain.CommandQueries.Commands; public sealed record CreateProductCommand( -string PersianName, -string EnglishName, -string Summery, -string ExpertCheck, -string Tags, -string Warranty, -bool BeDisplayed, -double Cost, -double PackingCost, -int Stock, -bool HasExpressDelivery, -int MaxOrderCount, -bool IsSpecialOffer, -Guid BrandId, -Guid CategoryId, -DiscountSDto SpecialOffer, -List Specifications, -List Files):IRequest; + string PersianName, + string EnglishName, + string Summery, + string ExpertCheck, + string Tags, + string Warranty, + bool BeDisplayed, + double Cost, + double PackingCost, + int Stock, + bool HasExpressDelivery, + int MaxOrderCount, + bool IsSpecialOffer, + Guid BrandId, + Guid CategoryId, + DiscountSDto SpecialOffer, + List Specifications, + List Files, + Dictionary Faqs, + Dictionary MetaTags) : IRequest; public sealed record UpdateProductCommand( Guid Id, @@ -39,10 +41,13 @@ public sealed record UpdateProductCommand( Guid CategoryId, DiscountSDto SpecialOffer, List Specifications, - List Files) : IRequest; + List Files, + Dictionary Faqs, + Dictionary MetaTags) : IRequest; -public sealed record ChangeProductDisplayedCommand(Guid Id,bool BeDisplayed) : IRequest; -public sealed record ChangeProductCostCommand(Guid Id,double Cost) : IRequest; +public sealed record ChangeProductDisplayedCommand(Guid Id, bool BeDisplayed) : IRequest; + +public sealed record ChangeProductCostCommand(Guid Id, double Cost) : IRequest; public sealed record DeleteProductCommand(Guid Id) : IRequest; diff --git a/Netina.Domain/CommandQueries/Queries/FaqQueries.cs b/Netina.Domain/CommandQueries/Queries/FaqQueries.cs new file mode 100644 index 0000000..3fe346a --- /dev/null +++ b/Netina.Domain/CommandQueries/Queries/FaqQueries.cs @@ -0,0 +1,4 @@ +namespace Netina.Domain.CommandQueries.Queries; + +public record GetFaqQuery(Guid? Id,string? Slug) : IRequest; +public record GetFaqsQuery(int Page , int Count = 0) : IRequest>; \ No newline at end of file diff --git a/Netina.Domain/Dtos/LargDtos/BrandLDto.cs b/Netina.Domain/Dtos/LargDtos/BrandLDto.cs index 09101d3..53b5fdd 100644 --- a/Netina.Domain/Dtos/LargDtos/BrandLDto.cs +++ b/Netina.Domain/Dtos/LargDtos/BrandLDto.cs @@ -6,6 +6,7 @@ public class BrandLDto : BaseDto public string EnglishName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public bool HasSpecialPage { get; set; } + public string Slug { get; set; } = string.Empty; public string PageUrl { get; set; } = string.Empty; public string HeaderFileName { get; set; } = string.Empty; public List Files { get; internal set; } = new(); diff --git a/Netina.Domain/Dtos/LargDtos/ProductCategoryLDto.cs b/Netina.Domain/Dtos/LargDtos/ProductCategoryLDto.cs index e2a1189..aa4ba9a 100644 --- a/Netina.Domain/Dtos/LargDtos/ProductCategoryLDto.cs +++ b/Netina.Domain/Dtos/LargDtos/ProductCategoryLDto.cs @@ -6,6 +6,7 @@ public class ProductCategoryLDto : BaseDto public string Description { get; set; } = string.Empty; public Guid ParentId { get; set; } public string ParentName { get; set; } = string.Empty; + public string Slug { get; set; } = string.Empty; public bool IsMain { get; set; } public List Children { get; set; } = new(); public List Files { get; internal set; } = new(); diff --git a/Netina.Domain/Dtos/SmallDtos/BrandSDto.cs b/Netina.Domain/Dtos/SmallDtos/BrandSDto.cs index b6db768..acb70df 100644 --- a/Netina.Domain/Dtos/SmallDtos/BrandSDto.cs +++ b/Netina.Domain/Dtos/SmallDtos/BrandSDto.cs @@ -5,6 +5,7 @@ public class BrandSDto : BaseDto public string PersianName { get; set; } = string.Empty; public string EnglishName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; + public string Slug { get; set; } = string.Empty; public bool HasSpecialPage { get; set; } public string PageUrl { get; set; } = string.Empty; public string HeaderFileName { get; set; } = string.Empty; diff --git a/Netina.Domain/Entities/Brands/Brand.cs b/Netina.Domain/Entities/Brands/Brand.cs index 83907fc..b8eaf1b 100644 --- a/Netina.Domain/Entities/Brands/Brand.cs +++ b/Netina.Domain/Entities/Brands/Brand.cs @@ -1,10 +1,13 @@ -namespace Netina.Domain.Entities.Brands; +using Microsoft.EntityFrameworkCore; + +namespace Netina.Domain.Entities.Brands; [AdaptTwoWays("[name]LDto", IgnoreAttributes = new[] { typeof(AdaptIgnoreAttribute) }, MapType = MapType.Map | MapType.MapToTarget | MapType.Projection)] [AdaptTwoWays("[name]SDto", IgnoreAttributes = new[] { typeof(AdaptIgnoreAttribute) }, MapType = MapType.Map | MapType.MapToTarget)] [AdaptTo("[name]SDto", IgnoreAttributes = new[] { typeof(AdaptIgnoreAttribute) }, MapType = MapType.Projection)] [GenerateMapper] +[Index(nameof(Slug), IsUnique = true)] public partial class Brand : ApiEntity { public Brand() diff --git a/Netina.Domain/Entities/Products/Product.cs b/Netina.Domain/Entities/Products/Product.cs index 94aecd4..6d7ed76 100644 --- a/Netina.Domain/Entities/Products/Product.cs +++ b/Netina.Domain/Entities/Products/Product.cs @@ -6,6 +6,9 @@ [AdaptTo("TorobProductResponseDto", IgnoreAttributes = new[] { typeof(AdaptIgnoreAttribute) }, MapType = MapType.Projection)] //[AdaptTo("[name]SDto", IgnoreAttributes = new[] { typeof(AdaptIgnoreAttribute) }, MapType = MapType.Projection)] [GenerateMapper] + + +[Index(nameof(Slug), IsUnique = true)] public partial class Product : ApiEntity { public Product() diff --git a/Netina.Domain/Extensions/BrandExtension.cs b/Netina.Domain/Extensions/BrandExtension.cs new file mode 100644 index 0000000..fe5b826 --- /dev/null +++ b/Netina.Domain/Extensions/BrandExtension.cs @@ -0,0 +1,13 @@ +namespace Netina.Domain.Extensions; + +public static class BrandExtension +{ + public static string GetWebSiteUrl(this Brand product) + => $"/brands/{product.Id}/{product.Slug}"; + + public static string GetWebSiteUrl(this BrandSDto product) + => $"/brands/{product.Id}/{product.Slug}"; + + public static string GetWebSiteUrl(this BrandLDto product) + => $"/brands/{product.Id}/{product.Slug}"; +} \ No newline at end of file diff --git a/Netina.Domain/Extensions/ProductCategoryExtension.cs b/Netina.Domain/Extensions/ProductCategoryExtension.cs new file mode 100644 index 0000000..eed1e8c --- /dev/null +++ b/Netina.Domain/Extensions/ProductCategoryExtension.cs @@ -0,0 +1,13 @@ +namespace Netina.Domain.Extensions; + +public static class ProductCategoryExtension +{ + public static string GetWebSiteUrl(this ProductCategory product) + => $"/categories/{product.Id}/{product.Slug}"; + + public static string GetWebSiteUrl(this ProductCategorySDto product) + => $"/categories/{product.Id}/{product.Slug}"; + + public static string GetWebSiteUrl(this ProductCategoryLDto product) + => $"/categories/{product.Id}/{product.Slug}"; +} \ No newline at end of file diff --git a/Netina.Domain/Extensions/ProductExtension.cs b/Netina.Domain/Extensions/ProductExtension.cs new file mode 100644 index 0000000..0239c9f --- /dev/null +++ b/Netina.Domain/Extensions/ProductExtension.cs @@ -0,0 +1,13 @@ +namespace Netina.Domain.Extensions; + +public static class ProductExtension +{ + public static string GetWebSiteUrl(this Product product) + => $"/products/{product.Id}/{product.Slug}"; + + public static string GetWebSiteUrl(this ProductSDto product) + => $"/products/{product.Id}/{product.Slug}"; + + public static string GetWebSiteUrl(this ProductLDto product) + => $"/products/{product.Id}/{product.Slug}"; +} \ No newline at end of file diff --git a/Netina.Domain/MartenEntities/Faqs/BaseFaq.cs b/Netina.Domain/MartenEntities/Faqs/BaseFaq.cs new file mode 100644 index 0000000..ba6a1a7 --- /dev/null +++ b/Netina.Domain/MartenEntities/Faqs/BaseFaq.cs @@ -0,0 +1,8 @@ +namespace Netina.Domain.MartenEntities.Faqs; + +public class BaseFaq : MartenEntity +{ + public Dictionary Faqs { get; set; } = new(); + public string Slug { get; set; } = string.Empty; + public string Title { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/Netina.Domain/MartenEntities/Pages/FAQPage.cs b/Netina.Domain/MartenEntities/Pages/FAQPage.cs deleted file mode 100644 index 5729a1e..0000000 --- a/Netina.Domain/MartenEntities/Pages/FAQPage.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Netina.Domain.MartenEntities.Pages; - -[PageClassDisplay("FAQPage", "صفحه سوالات متداول")] -public class FAQPage -{ - public Dictionary Faqs { get; set; } = new Dictionary(); -} \ No newline at end of file diff --git a/Netina.Domain/Models/Claims/ApplicationClaims.cs b/Netina.Domain/Models/Claims/ApplicationClaims.cs index aa96581..74842ba 100644 --- a/Netina.Domain/Models/Claims/ApplicationClaims.cs +++ b/Netina.Domain/Models/Claims/ApplicationClaims.cs @@ -11,6 +11,13 @@ public static class ApplicationClaims Value = ApplicationPermission.ManageDashboard, }; + public static ClaimDto ManageFaq { get; } = new ClaimDto + { + Title = "مدیریت سوالات متداول", + Type = CustomClaimType.Permission, + Value = ApplicationPermission.ManageFaq, + }; + public static ClaimDto ManageBlogs { get; } = new ClaimDto { Title = "مدیریت بلاگ ها", @@ -278,7 +285,8 @@ public static class ApplicationClaims ManageUsers, ViewUsers, ManageFiles, - ViewFiles + ViewFiles, + ManageFaq }; public static List AllClaims = new List @@ -319,7 +327,8 @@ public static class ApplicationClaims ManageUsers.GetClaim, ViewUsers.GetClaim, ManageFiles.GetClaim, - ViewFiles.GetClaim + ViewFiles.GetClaim, + ManageFaq.GetClaim }; public static List CustomerClaims = new List diff --git a/Netina.Domain/Models/Claims/ApplicationPermission.cs b/Netina.Domain/Models/Claims/ApplicationPermission.cs index 1876422..0fc7b53 100644 --- a/Netina.Domain/Models/Claims/ApplicationPermission.cs +++ b/Netina.Domain/Models/Claims/ApplicationPermission.cs @@ -2,6 +2,8 @@ public static class ApplicationPermission { + public static string ManageFaq = nameof(ManageFaq); + public const string ViewSettings = nameof(ViewSettings); public const string ManageSettings = nameof(ManageSettings); diff --git a/Netina.Domain/Netina.Domain.csproj b/Netina.Domain/Netina.Domain.csproj index 892e6e1..7003ad6 100644 --- a/Netina.Domain/Netina.Domain.csproj +++ b/Netina.Domain/Netina.Domain.csproj @@ -12,6 +12,7 @@ + @@ -59,6 +60,7 @@ + @@ -78,6 +80,7 @@ + diff --git a/Netina.Infrastructure/Marten/MartenRepository.cs b/Netina.Infrastructure/Marten/MartenRepository.cs index f894b9d..d970213 100644 --- a/Netina.Infrastructure/Marten/MartenRepository.cs +++ b/Netina.Infrastructure/Marten/MartenRepository.cs @@ -1,33 +1,52 @@ using Marten; +using Netina.Repository.Abstracts; namespace Netina.Infrastructure.Marten; -public class MartenRepository : IMartenRepository where TMartenEntity : IMartenEntity +public class MartenRepository(IDocumentStore documentStore, ICurrentUserService currentUserService) + : IMartenRepository + where TMartenEntity : IMartenEntity { - private readonly IDocumentStore _documentStore; - - public MartenRepository(IDocumentStore documentStore) - { - _documentStore = documentStore; - } + private readonly ICurrentUserService _currentUserService = currentUserService; public async Task> GetEntitiesAsync(CancellationToken cancellation) { - await using var session = _documentStore.QuerySession(); - var entities = await session.Query().ToListAsync(cancellation); + await using var session = documentStore.QuerySession(); + var entities = await session + .Query() + .ToListAsync(cancellation); + return entities.ToList(); + } + public async Task> GetEntitiesAsync(int page, int count, CancellationToken cancellation) + { + await using var session = documentStore.QuerySession(); + var entities = await session + .Query() + .Skip(page * count) + .Take(count) + .ToListAsync(cancellation); return entities.ToList(); } + public async Task> GetEntitiesAsync(Expression> expression, int page, int count, CancellationToken cancellation) + { + await using var session = documentStore.QuerySession(); + var entities = await session.Query().Where(expression) + .Skip(page * count) + .Take(count) + .ToListAsync(cancellation); + return entities.ToList(); + } public async Task> GetEntitiesAsync(Expression> expression, CancellationToken cancellation) { - await using var session = _documentStore.QuerySession(); + await using var session = documentStore.QuerySession(); var entities = await session.Query().Where(expression).ToListAsync(cancellation); return entities.ToList(); } public async Task GetEntityAsync(Guid id, CancellationToken cancellation) { - await using var session = _documentStore.QuerySession(); + await using var session = documentStore.QuerySession(); var setting = await session.LoadAsync(id, cancellation); if (setting == null) throw new AppException($"{nameof(setting)} not found", ApiResultStatusCode.NotFound); @@ -36,7 +55,7 @@ public class MartenRepository : IMartenRepository public async Task GetEntityAsync(Expression> expression, CancellationToken cancellation) { - await using var session = _documentStore.QuerySession(); + await using var session = documentStore.QuerySession(); var entity = await session.Query().FirstOrDefaultAsync(expression, cancellation); return entity; } @@ -46,16 +65,26 @@ public class MartenRepository : IMartenRepository if (entity == null) throw new AppException($"{nameof(entity)} is null", ApiResultStatusCode.BadRequest); - await using var session = _documentStore.LightweightSession(); + await using var session = documentStore.LightweightSession(); session.Store(entity); await session.SaveChangesAsync(cancellation); } + public async Task UpdateEntityAsync(TMartenEntity entity, CancellationToken cancellation = default) + { + if (entity == null) + throw new AppException($"{nameof(entity)} is null", ApiResultStatusCode.BadRequest); + + await using var session = documentStore.LightweightSession(); + session.Update(entity); + await session.SaveChangesAsync(cancellation); + } + public async Task RemoveEntityAsync(TMartenEntity entity, CancellationToken cancellation) { if (entity == null) throw new AppException($"{nameof(entity)} is null", ApiResultStatusCode.BadRequest); - await using var session = _documentStore.LightweightSession(); + await using var session = documentStore.LightweightSession(); session.Delete(entity); await session.SaveChangesAsync(cancellation); } diff --git a/Netina.Infrastructure/Marten/MartenRepositoryWrapper.cs b/Netina.Infrastructure/Marten/MartenRepositoryWrapper.cs index 9d9d7b4..77a9b3f 100644 --- a/Netina.Infrastructure/Marten/MartenRepositoryWrapper.cs +++ b/Netina.Infrastructure/Marten/MartenRepositoryWrapper.cs @@ -1,16 +1,10 @@ using Marten; +using Netina.Repository.Abstracts; namespace Netina.Infrastructure.Marten; -public class MartenRepositoryWrapper : IMartenRepositoryWrapper +public class MartenRepositoryWrapper(IDocumentStore documentStore,ICurrentUserService currentUserService) : IMartenRepositoryWrapper { - private readonly IDocumentStore _documentStore; - - public MartenRepositoryWrapper(IDocumentStore documentStore) - { - _documentStore = documentStore; - } - public IMartenRepository SetRepository() where TMartenEntity : IMartenEntity - => new MartenRepository(_documentStore); + => new MartenRepository(documentStore, currentUserService); } \ No newline at end of file diff --git a/Netina.Infrastructure/Services/Scrapers/DigikalaScraper.cs b/Netina.Infrastructure/Services/Scrapers/DigikalaScraper.cs index 831d2e3..d69c51a 100644 --- a/Netina.Infrastructure/Services/Scrapers/DigikalaScraper.cs +++ b/Netina.Infrastructure/Services/Scrapers/DigikalaScraper.cs @@ -102,7 +102,7 @@ public class DigikalaScraper : IDigikalaScraper newSummery, string.Empty, string.Empty, string.Empty, true, 0, 0, 0, false - , 5, false, nonBrand.Id, nonCat.Id, new DiscountSDto(), specifications, files); + , 5, false, nonBrand.Id, nonCat.Id, new DiscountSDto(), specifications, files,new Dictionary(),new Dictionary()); await _mediator.Send(request, cancellationToken); return true; diff --git a/Netina.Repository/Handlers/Brands/CreateBrandCommandHandler.cs b/Netina.Repository/Handlers/Brands/CreateBrandCommandHandler.cs index ecaa60c..c69e2fe 100644 --- a/Netina.Repository/Handlers/Brands/CreateBrandCommandHandler.cs +++ b/Netina.Repository/Handlers/Brands/CreateBrandCommandHandler.cs @@ -2,14 +2,8 @@ namespace Netina.Repository.Handlers.Brands; -public class CreateBrandCommandHandler : IRequestHandler +public class CreateBrandCommandHandler(IRepositoryWrapper repositoryWrapper,IMartenRepositoryWrapper martenRepositoryWrapper , IMediator mediator) : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CreateBrandCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(CreateBrandCommand request, CancellationToken cancellationToken) { var ent = Brand.Create(request.PersianName,request.EnglishName, request.Description, request.HasSpecialPage, request.PageUrl); @@ -17,8 +11,28 @@ public class CreateBrandCommandHandler : IRequestHandler().Add(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Add(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); + + await UpdateFaqAsync(ent, request.Faqs, cancellationToken); + return ent.Id; } + + + private async Task UpdateFaqAsync(Brand newEnt, Dictionary faqs, CancellationToken cancellationToken) + { + var url = newEnt.GetWebSiteUrl(); + var oldFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == newEnt.Slug, cancellationToken); + var newFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == url, cancellationToken); + if (oldFaq != null) + await mediator.Send(new DeleteFaqCommand(oldFaq.Id), cancellationToken); + + if (newFaq == null) + await mediator.Send(new CreateFaqCommand(faqs, url, newEnt.EnglishName), cancellationToken); + else + await mediator.Send(new UpdateFaqCommand(newFaq.Id, faqs, url, newEnt.EnglishName), cancellationToken); + } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Brands/UpdateBrandCommandHandler.cs b/Netina.Repository/Handlers/Brands/UpdateBrandCommandHandler.cs index 8b62882..cd9fb10 100644 --- a/Netina.Repository/Handlers/Brands/UpdateBrandCommandHandler.cs +++ b/Netina.Repository/Handlers/Brands/UpdateBrandCommandHandler.cs @@ -1,19 +1,12 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Brands; +using Netina.Domain.Entities.Brands; namespace Netina.Repository.Handlers.Brands; -public class UpdateBrandCommandHandler : IRequestHandler +public class UpdateBrandCommandHandler(IRepositoryWrapper repositoryWrapper,IMartenRepositoryWrapper martenRepositoryWrapper,IMediator mediator) : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public UpdateBrandCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(UpdateBrandCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(b => b.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("Brand not found"); @@ -22,14 +15,14 @@ public class UpdateBrandCommandHandler : IRequestHandler().TableNoTracking + var dbFiles = await repositoryWrapper.SetRepository().TableNoTracking .Where(s => s.BrandId == newEnt.Id).ToListAsync(cancellationToken); foreach (var dbFile in dbFiles) { if (request.Files.FirstOrDefault(s => s.Id == dbFile.Id) == null) { - _repositoryWrapper.SetRepository().Delete(dbFile); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(dbFile); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } } foreach (var file in request.Files.Where(f => f.Id == default)) @@ -37,8 +30,26 @@ public class UpdateBrandCommandHandler : IRequestHandler().Update(newEnt); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(newEnt); + await repositoryWrapper.SaveChangesAsync(cancellationToken); + await UpdateFaqAsync(newEnt, request.Faqs, cancellationToken); return true; } + + + private async Task UpdateFaqAsync(Brand newEnt, Dictionary faqs, CancellationToken cancellationToken) + { + var url = newEnt.GetWebSiteUrl(); + var oldFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == newEnt.Slug, cancellationToken); + var newFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == url, cancellationToken); + if (oldFaq != null) + await mediator.Send(new DeleteFaqCommand(oldFaq.Id), cancellationToken); + + if (newFaq == null) + await mediator.Send(new CreateFaqCommand(faqs, url, newEnt.EnglishName), cancellationToken); + else + await mediator.Send(new UpdateFaqCommand(newFaq.Id, faqs, url, newEnt.EnglishName), cancellationToken); + } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Faqs/CreateFaqCommandHandler.cs b/Netina.Repository/Handlers/Faqs/CreateFaqCommandHandler.cs new file mode 100644 index 0000000..f50ba5d --- /dev/null +++ b/Netina.Repository/Handlers/Faqs/CreateFaqCommandHandler.cs @@ -0,0 +1,18 @@ +namespace Netina.Repository.Handlers.Faqs; + +public class CreateFaqCommandHandler(IMartenRepositoryWrapper martenRepositoryWrapper) + : IRequestHandler +{ + public async Task Handle(CreateFaqCommand request, CancellationToken cancellationToken) + { + var faq = new BaseFaq + { + Faqs = request.Faqs, + Slug = request.Slug, + Title = request.Title + }; + await martenRepositoryWrapper.SetRepository() + .AddOrUpdateEntityAsync(faq, cancellationToken); + return true; + } +} \ No newline at end of file diff --git a/Netina.Repository/Handlers/Faqs/DeleteFaqCommandHandler.cs b/Netina.Repository/Handlers/Faqs/DeleteFaqCommandHandler.cs new file mode 100644 index 0000000..bdc92c7 --- /dev/null +++ b/Netina.Repository/Handlers/Faqs/DeleteFaqCommandHandler.cs @@ -0,0 +1,12 @@ +namespace Netina.Repository.Handlers.Faqs; + +public class DeleteFaqCommandHandler(IMartenRepositoryWrapper martenRepositoryWrapper) + : IRequestHandler +{ + public async Task Handle(DeleteFaqCommand request, CancellationToken cancellationToken) + { + var ent = await martenRepositoryWrapper.SetRepository().GetEntityAsync(request.Id, cancellationToken); + await martenRepositoryWrapper.SetRepository().RemoveEntityAsync(ent, cancellationToken); + return true; + } +} \ No newline at end of file diff --git a/Netina.Repository/Handlers/Faqs/GetFaqQueryHandler.cs b/Netina.Repository/Handlers/Faqs/GetFaqQueryHandler.cs new file mode 100644 index 0000000..b030fc5 --- /dev/null +++ b/Netina.Repository/Handlers/Faqs/GetFaqQueryHandler.cs @@ -0,0 +1,27 @@ +namespace Netina.Repository.Handlers.Faqs; + +public class GetFaqQueryHandler(IMartenRepositoryWrapper martenRepositoryWrapper) + : IRequestHandler +{ + public async Task Handle(GetFaqQuery request, CancellationToken cancellationToken) + { + if (request.Id is not null) + { + var ent = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(request.Id.Value, cancellationToken); + if (ent == null) + return new BaseFaq(); + return ent; + }else if (request.Slug != null) + { + var htmlSlug = request.Slug; + var ent = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f=>f.Slug == htmlSlug, cancellationToken); + if (ent == null) + return new BaseFaq(); + return ent; + + } + return new BaseFaq(); + } +} \ No newline at end of file diff --git a/Netina.Repository/Handlers/Faqs/GetFaqsQueryHandler.cs b/Netina.Repository/Handlers/Faqs/GetFaqsQueryHandler.cs new file mode 100644 index 0000000..fcb78ee --- /dev/null +++ b/Netina.Repository/Handlers/Faqs/GetFaqsQueryHandler.cs @@ -0,0 +1,16 @@ +namespace Netina.Repository.Handlers.Faqs; + +public class GetFaqsQueryHandler(IMartenRepositoryWrapper martenRepositoryWrapper) + : IRequestHandler> +{ + public async Task> Handle(GetFaqsQuery request, CancellationToken cancellationToken) + { + var count = request.Count > 0 ? request.Count : 20; + if (count > 50) + throw new BaseApiException(ApiResultStatusCode.BadRequest, "Count limit is 50"); + var response = await martenRepositoryWrapper.SetRepository() + .GetEntitiesAsync(request.Page, count, cancellationToken); + response.ForEach(f => { f.Faqs ??= new Dictionary(); }); + return response; + } +} \ No newline at end of file diff --git a/Netina.Repository/Handlers/Faqs/UpdateFaqCommandHandler.cs b/Netina.Repository/Handlers/Faqs/UpdateFaqCommandHandler.cs new file mode 100644 index 0000000..25c9148 --- /dev/null +++ b/Netina.Repository/Handlers/Faqs/UpdateFaqCommandHandler.cs @@ -0,0 +1,24 @@ +namespace Netina.Repository.Handlers.Faqs; + +public class UpdateFaqCommandHandler(IMartenRepositoryWrapper martenRepositoryWrapper) + : IRequestHandler +{ + public async Task Handle(UpdateFaqCommand request, CancellationToken cancellationToken) + { + var ent = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(request.Id, cancellationToken); + if (ent == null) + throw new BaseApiException(ApiResultStatusCode.NotFound, "Faq not found"); + + var newEnt = new BaseFaq + { + Id = ent.Id, + Faqs = request.Faqs, + Slug = request.Slug, + Title = request.Title + }; + await martenRepositoryWrapper.SetRepository() + .UpdateEntityAsync(newEnt, cancellationToken); + return true; + } +} \ No newline at end of file diff --git a/Netina.Repository/Handlers/ProductCategories/CreateProductCategoryCommandHandler.cs b/Netina.Repository/Handlers/ProductCategories/CreateProductCategoryCommandHandler.cs index 5d8db21..4ceef7c 100644 --- a/Netina.Repository/Handlers/ProductCategories/CreateProductCategoryCommandHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/CreateProductCategoryCommandHandler.cs @@ -1,14 +1,8 @@ namespace Netina.Repository.Handlers.ProductCategories; -public class CreateProductCategoryCommandHandler : IRequestHandler +public class CreateProductCategoryCommandHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator,IMartenRepositoryWrapper martenRepositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CreateProductCategoryCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } - public async Task Handle(CreateProductCategoryCommand request, CancellationToken cancellationToken) { var ent = ProductCategory.Create(request.Name, request.Description, request.IsMain); @@ -18,8 +12,25 @@ public class CreateProductCategoryCommandHandler : IRequestHandler().Add(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Add(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); + await UpdateFaqAsync(ent, request.Faqs, cancellationToken); return ent.Id; } + + private async Task UpdateFaqAsync(ProductCategory newEnt, Dictionary faqs, CancellationToken cancellationToken) + { + var url = newEnt.GetWebSiteUrl(); + var oldFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == newEnt.Slug, cancellationToken); + var newFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == url, cancellationToken); + if (oldFaq != null) + await mediator.Send(new DeleteFaqCommand(oldFaq.Id), cancellationToken); + + if (newFaq == null) + await mediator.Send(new CreateFaqCommand(faqs, url, newEnt.Name), cancellationToken); + else + await mediator.Send(new UpdateFaqCommand(newFaq.Id, faqs, url, newEnt.Name), cancellationToken); + } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/ProductCategories/DeleteProductCategoryCommandHandler.cs b/Netina.Repository/Handlers/ProductCategories/DeleteProductCategoryCommandHandler.cs index 21238ad..16015a7 100644 --- a/Netina.Repository/Handlers/ProductCategories/DeleteProductCategoryCommandHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/DeleteProductCategoryCommandHandler.cs @@ -1,24 +1,17 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.ProductCategories; -namespace Netina.Repository.Handlers.ProductCategories; - -public class DeleteProductCategoryCommandHandler : IRequestHandler +public class DeleteProductCategoryCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public DeleteProductCategoryCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(DeleteProductCategoryCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(c => c.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("ProductCategory not found", ApiResultStatusCode.NotFound); - _repositoryWrapper.SetRepository().Delete(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/ProductCategories/GetProductCategoriesQueryHandler.cs b/Netina.Repository/Handlers/ProductCategories/GetProductCategoriesQueryHandler.cs index 48e6b73..9cf674f 100644 --- a/Netina.Repository/Handlers/ProductCategories/GetProductCategoriesQueryHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/GetProductCategoriesQueryHandler.cs @@ -2,21 +2,16 @@ namespace Netina.Repository.Handlers.ProductCategories; -public class GetProductCategoriesQueryHandler : IRequestHandler> +public class GetProductCategoriesQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetProductCategoriesQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetProductCategoriesQuery request, CancellationToken cancellationToken) { IQueryable basCategories; List groupCats; if (request.CategoryName != null) { - basCategories = _repositoryWrapper.SetRepository() + basCategories = repositoryWrapper.SetRepository() .TableNoTracking .Where(c => c.Name.Trim().Contains(request.CategoryName.Trim())) .OrderByDescending(c => c.CreatedAt); @@ -24,7 +19,7 @@ public class GetProductCategoriesQueryHandler : IRequestHandler() + basCategories = repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(c=>c.CreatedAt); } diff --git a/Netina.Repository/Handlers/ProductCategories/GetProductCategoryChildrenQueryHandler.cs b/Netina.Repository/Handlers/ProductCategories/GetProductCategoryChildrenQueryHandler.cs index 28a847c..783cea4 100644 --- a/Netina.Repository/Handlers/ProductCategories/GetProductCategoryChildrenQueryHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/GetProductCategoryChildrenQueryHandler.cs @@ -2,15 +2,9 @@ namespace Netina.Repository.Handlers.ProductCategories; -public class GetProductCategoryChildrenQueryHandler : IRequestHandler> +public class GetProductCategoryChildrenQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetProductCategoryChildrenQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } - public async Task> Handle(GetProductCategoryChildrenQuery request, CancellationToken cancellationToken) { if (request.Id == default) @@ -23,7 +17,7 @@ public class GetProductCategoryChildrenQueryHandler : IRequestHandler> Recursive(Guid id,CancellationToken cancellationToken) { - var children = await _repositoryWrapper.SetRepository() + var children = await repositoryWrapper.SetRepository() .TableNoTracking .Where(c => c.ParentId == id) .Select(c => c.Id) diff --git a/Netina.Repository/Handlers/ProductCategories/GetProductCategoryQueryHandler.cs b/Netina.Repository/Handlers/ProductCategories/GetProductCategoryQueryHandler.cs index a13f531..4650a15 100644 --- a/Netina.Repository/Handlers/ProductCategories/GetProductCategoryQueryHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/GetProductCategoryQueryHandler.cs @@ -2,17 +2,12 @@ namespace Netina.Repository.Handlers.ProductCategories; -public class GetProductCategoryQueryHandler : IRequestHandler +public class GetProductCategoryQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetProductCategoryQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(GetProductCategoryQuery request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .Where(b => b.Id == request.Id) .Select(ProductCategoryMapper.ProjectToLDto) .FirstOrDefaultAsync(cancellationToken); diff --git a/Netina.Repository/Handlers/ProductCategories/UpdateProductCategoryCommandHandler.cs b/Netina.Repository/Handlers/ProductCategories/UpdateProductCategoryCommandHandler.cs index 84e2d76..cb7be47 100644 --- a/Netina.Repository/Handlers/ProductCategories/UpdateProductCategoryCommandHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/UpdateProductCategoryCommandHandler.cs @@ -1,18 +1,11 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.ProductCategories; -namespace Netina.Repository.Handlers.ProductCategories; - -public class UpdateProductCategoryCommandHandler : IRequestHandler +public class UpdateProductCategoryCommandHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator,IMartenRepositoryWrapper martenRepositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public UpdateProductCategoryCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(UpdateProductCategoryCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(c => c.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("ProductCategory not found", ApiResultStatusCode.NotFound); @@ -25,22 +18,39 @@ public class UpdateProductCategoryCommandHandler : IRequestHandler().TableNoTracking + var dbFiles = await repositoryWrapper.SetRepository().TableNoTracking .Where(s => s.CategoryId == newEnt.Id).ToListAsync(cancellationToken); foreach (var dbFile in dbFiles) { if (request.Files.FirstOrDefault(s => s.Id == dbFile.Id) == null) { - _repositoryWrapper.SetRepository().Delete(dbFile); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(dbFile); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } } foreach (var file in request.Files.Where(f => f.Id == default)) { newEnt.AddFile(file.Name, file.FileLocation, file.FileName, file.IsHeader, file.IsPrimary, file.FileType); } - _repositoryWrapper.SetRepository().Update(newEnt); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(newEnt); + await repositoryWrapper.SaveChangesAsync(cancellationToken); + await UpdateFaqAsync(newEnt, request.Faqs, cancellationToken); return true; } + + private async Task UpdateFaqAsync(ProductCategory newEnt, Dictionary faqs, CancellationToken cancellationToken) + { + var url = newEnt.GetWebSiteUrl(); + var oldFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == newEnt.Slug, cancellationToken); + var newFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == url, cancellationToken); + if (oldFaq != null) + await mediator.Send(new DeleteFaqCommand(oldFaq.Id), cancellationToken); + + if (newFaq == null) + await mediator.Send(new CreateFaqCommand(faqs, url, newEnt.Name), cancellationToken); + else + await mediator.Send(new UpdateFaqCommand(newFaq.Id, faqs, url, newEnt.Name), cancellationToken); + } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Products/CreateProductCommandHandler.cs b/Netina.Repository/Handlers/Products/CreateProductCommandHandler.cs index 9687a19..6c57899 100644 --- a/Netina.Repository/Handlers/Products/CreateProductCommandHandler.cs +++ b/Netina.Repository/Handlers/Products/CreateProductCommandHandler.cs @@ -1,16 +1,8 @@ namespace Netina.Repository.Handlers.Products; -public class CreateProductCommandHandler : IRequestHandler +public class CreateProductCommandHandler(IRepositoryWrapper repositoryWrapper,IMartenRepositoryWrapper martenRepositoryWrapper, IMediator mediator) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - - public CreateProductCommandHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - } - public async Task Handle(CreateProductCommand request, CancellationToken cancellationToken) { @@ -34,8 +26,8 @@ public class CreateProductCommandHandler : IRequestHandler().Add(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Add(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); if (request.IsSpecialOffer) { @@ -48,15 +40,34 @@ public class CreateProductCommandHandler : IRequestHandler(); - await _mediator.Send(discountRequest, cancellationToken); + await mediator.Send(discountRequest, cancellationToken); } else { var discountRequest = discount.Adapt(); - await _mediator.Send(discountRequest, cancellationToken); + await mediator.Send(discountRequest, cancellationToken); } } + await UpdateFaqAsync(ent, request.Faqs, cancellationToken); + return ent.AdaptToLDto(); } + + + private async Task UpdateFaqAsync(Product newEnt, Dictionary faqs, CancellationToken cancellationToken) + { + var url = newEnt.GetWebSiteUrl(); + var oldFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == newEnt.Slug, cancellationToken); + var newFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == url, cancellationToken); + if (oldFaq != null) + await mediator.Send(new DeleteFaqCommand(oldFaq.Id), cancellationToken); + + if (newFaq == null) + await mediator.Send(new CreateFaqCommand(faqs, url, newEnt.EnglishName), cancellationToken); + else + await mediator.Send(new UpdateFaqCommand(newFaq.Id, faqs, url, newEnt.EnglishName), cancellationToken); + } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Products/DeleteProductCommandHandler.cs b/Netina.Repository/Handlers/Products/DeleteProductCommandHandler.cs index bbb587b..574bf3a 100644 --- a/Netina.Repository/Handlers/Products/DeleteProductCommandHandler.cs +++ b/Netina.Repository/Handlers/Products/DeleteProductCommandHandler.cs @@ -2,23 +2,18 @@ namespace Netina.Repository.Handlers.Products; -public class DeleteProductCommandHandler : IRequestHandler +public class DeleteProductCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public DeleteProductCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(DeleteProductCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(d => d.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("Product NotFound", ApiResultStatusCode.NotFound); - _repositoryWrapper.SetRepository().Delete(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Products/GetProductQueryHandler.cs b/Netina.Repository/Handlers/Products/GetProductQueryHandler.cs index c9c74e6..65b15a3 100644 --- a/Netina.Repository/Handlers/Products/GetProductQueryHandler.cs +++ b/Netina.Repository/Handlers/Products/GetProductQueryHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.Products; +namespace Netina.Repository.Handlers.Products; public class GetProductQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) : IRequestHandler @@ -13,7 +11,7 @@ public class GetProductQueryHandler(IRepositoryWrapper repositoryWrapper, IMedia .FirstOrDefaultAsync(cancellationToken); if (ent == null) - throw new AppException("Product not found", ApiResultStatusCode.NotFound); + throw new BaseApiException(ApiResultStatusCode.NotFound,"Product not found"); await mediator.Send(new CalculateProductDiscountCommand(ent), cancellationToken); diff --git a/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs b/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs index 3da07f3..680559e 100644 --- a/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs +++ b/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs @@ -2,25 +2,19 @@ namespace Netina.Repository.Handlers.Products; -public class GetProductsQueryHandler : IRequestHandler +public class GetProductsQueryHandler( + IRepositoryWrapper repositoryWrapper, + IMediator mediator, + ICurrentUserService currentUserService) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - private readonly ICurrentUserService _currentUserService; - - public GetProductsQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, ICurrentUserService currentUserService) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - _currentUserService = currentUserService; - } public async Task Handle(GetProductsQuery request, CancellationToken cancellationToken) { var response = new GetProductsResponseDto(); - var products = _repositoryWrapper.SetRepository().TableNoTracking; - if (_currentUserService.JwtToken == null) + var products = repositoryWrapper.SetRepository().TableNoTracking; + if (currentUserService.JwtToken == null) products = products.Where(p => p.BeDisplayed); - var roleClaim = _currentUserService.JwtToken?.Claims.FirstOrDefault(c => c.Type == "role"); + var roleClaim = currentUserService.JwtToken?.Claims.FirstOrDefault(c => c.Type == "role"); if (roleClaim != null && roleClaim.Value.Contains("Customer")) products = products.Where(p => p.BeDisplayed); @@ -46,7 +40,7 @@ public class GetProductsQueryHandler : IRequestHandler cats.Contains(p.CategoryId)); } if (request.BrandIds is { Length: > 0 }) @@ -61,7 +55,7 @@ public class GetProductsQueryHandler : IRequestHandler() + var productDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(d => d.HasCode == false && d.IsSpecialOffer && d.ExpireDate.Date >= DateTime.Today.Date) .OrderByDescending(d => d.CreatedAt) @@ -92,7 +86,7 @@ public class GetProductsQueryHandler : IRequestHandler { public async Task Handle(UpdateProductCommand request, CancellationToken cancellationToken) @@ -82,7 +80,34 @@ public class UpdateProductCommandHandler(IRepositoryWrapper repositoryWrapper, I await mediator.Send(discountRequest, cancellationToken); } } + else + { + var discount = await repositoryWrapper.SetRepository() + .TableNoTracking + .FirstOrDefaultAsync(d => d.ProductId == newEnt.Id && d.IsSpecialOffer, cancellationToken); + if (discount != null) + await mediator.Send(new DeleteDiscountCommand(discount.Id), cancellationToken); + } + + await UpdateFaqAsync(newEnt, request.Faqs, cancellationToken); return true; } + + + private async Task UpdateFaqAsync(Product newEnt, Dictionary faqs, CancellationToken cancellationToken) + { + var url = newEnt.GetWebSiteUrl(); + var oldFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == newEnt.Slug, cancellationToken); + var newFaq = await martenRepositoryWrapper.SetRepository() + .GetEntityAsync(f => f.Slug == url, cancellationToken); + if (oldFaq != null) + await mediator.Send(new DeleteFaqCommand(oldFaq.Id), cancellationToken); + + if (newFaq == null) + await mediator.Send(new CreateFaqCommand(faqs, url, newEnt.EnglishName), cancellationToken); + else + await mediator.Send(new UpdateFaqCommand(newFaq.Id, faqs, url, newEnt.EnglishName), cancellationToken); + } } \ No newline at end of file diff --git a/Netina.Repository/Netina.Repository.csproj b/Netina.Repository/Netina.Repository.csproj index 32e41eb..d5f6d82 100644 --- a/Netina.Repository/Netina.Repository.csproj +++ b/Netina.Repository/Netina.Repository.csproj @@ -45,6 +45,7 @@ + @@ -63,7 +64,9 @@ + + @@ -71,6 +74,7 @@ + diff --git a/Netina.Repository/Repositories/Marten/IMartenRepository.cs b/Netina.Repository/Repositories/Marten/IMartenRepository.cs index 441659d..1439050 100644 --- a/Netina.Repository/Repositories/Marten/IMartenRepository.cs +++ b/Netina.Repository/Repositories/Marten/IMartenRepository.cs @@ -6,10 +6,13 @@ public interface IMartenRepository : IScopedDependency where TMar { Task> GetEntitiesAsync(CancellationToken cancellation = default); Task> GetEntitiesAsync(Expression> expression, CancellationToken cancellation = default); + Task> GetEntitiesAsync(int page, int count, CancellationToken cancellation); + Task> GetEntitiesAsync(Expression> expression, int page, int count, CancellationToken cancellation); Task GetEntityAsync(Guid id, CancellationToken cancellation = default); Task GetEntityAsync(Expression> expression, CancellationToken cancellation = default); Task AddOrUpdateEntityAsync(TMartenEntity entity, CancellationToken cancellation = default); + Task UpdateEntityAsync(TMartenEntity entity, CancellationToken cancellation = default); Task RemoveEntityAsync(TMartenEntity entity, CancellationToken cancellation = default); } \ No newline at end of file diff --git a/Netina.Repository/Services/DbInitializerService.cs b/Netina.Repository/Services/DbInitializerService.cs index d8d179d..66c27cb 100644 --- a/Netina.Repository/Services/DbInitializerService.cs +++ b/Netina.Repository/Services/DbInitializerService.cs @@ -1,44 +1,25 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Services; -namespace Netina.Repository.Services; - - -public class DbInitializerService : IDbInitializerService +public class DbInitializerService( + ApplicationContext context, + RoleManager roleManager, + UserManager userManager, + IOptionsSnapshot adminUserSeedOptions, + ILogger logger, + IRepositoryWrapper repositoryWrapper) + : IDbInitializerService { - private readonly IOptionsSnapshot _adminUserSeedOptions; - private readonly ApplicationContext _context; - private readonly ILogger _logger; - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly RoleManager _roleManager; - private readonly UserManager _userManager; - - public DbInitializerService( - ApplicationContext context, - RoleManager roleManager, - UserManager userManager, - IOptionsSnapshot adminUserSeedOptions, - ILogger logger, - IRepositoryWrapper repositoryWrapper) - { - _context = context; - _roleManager = roleManager; - _userManager = userManager; - _adminUserSeedOptions = adminUserSeedOptions; - _logger = logger; - _repositoryWrapper = repositoryWrapper; - } - public void Initialize() { try { - _context.Database.Migrate(); - _context.Database.ExecuteSqlRaw("CREATE EXTENSION IF NOT EXISTS pg_trgm"); - _logger.LogInformation("Migration SUCCESS !!!!"); + context.Database.Migrate(); + context.Database.ExecuteSqlRaw("CREATE EXTENSION IF NOT EXISTS pg_trgm"); + logger.LogInformation("Migration SUCCESS !!!!"); } catch (Exception e) { - _logger.LogError(e, e.Message); + logger.LogError(e, e.Message); } } @@ -47,9 +28,9 @@ public class DbInitializerService : IDbInitializerService try { await SeedRoles(); - var seedAdmin = _adminUserSeedOptions.Value.UserSetting; - var manager = _adminUserSeedOptions.Value.Manager; - var user = await _userManager.FindByNameAsync(seedAdmin.Username); + var seedAdmin = adminUserSeedOptions.Value.UserSetting; + var manager = adminUserSeedOptions.Value.Manager; + var user = await userManager.FindByNameAsync(seedAdmin.Username); if (user == null) { var adminUser = new ApplicationUser @@ -65,17 +46,17 @@ public class DbInitializerService : IDbInitializerService PhoneNumber = seedAdmin.Phone, BirthDate = DateTime.Now.AddYears(-23) }; - var adminUserResult = await _userManager.CreateAsync(adminUser, seedAdmin.Password); - _repositoryWrapper.SetRepository() + var adminUserResult = await userManager.CreateAsync(adminUser, seedAdmin.Password); + repositoryWrapper.SetRepository() .Add(new Manager { UserId = adminUser.Id }); - await _repositoryWrapper.SaveChangesAsync(default); - if (adminUserResult.Succeeded) await _userManager.AddToRoleAsync(adminUser, seedAdmin.RoleName); + await repositoryWrapper.SaveChangesAsync(default); + if (adminUserResult.Succeeded) await userManager.AddToRoleAsync(adminUser, seedAdmin.RoleName); } - var mahanUser = await _userManager.FindByNameAsync(manager.Username); + var mahanUser = await userManager.FindByNameAsync(manager.Username); if (mahanUser == null) { mahanUser = new ApplicationUser @@ -91,14 +72,14 @@ public class DbInitializerService : IDbInitializerService PhoneNumber = manager.Phone, BirthDate = DateTime.Now.AddYears(-23) }; - var adminUserResult = await _userManager.CreateAsync(mahanUser, seedAdmin.Password); - _repositoryWrapper.SetRepository() + var adminUserResult = await userManager.CreateAsync(mahanUser, seedAdmin.Password); + repositoryWrapper.SetRepository() .Add(new Manager { UserId = mahanUser.Id }); - await _repositoryWrapper.SaveChangesAsync(default); - if (adminUserResult.Succeeded) await _userManager.AddToRoleAsync(mahanUser, "Manager"); + await repositoryWrapper.SaveChangesAsync(default); + if (adminUserResult.Succeeded) await userManager.AddToRoleAsync(mahanUser, "Manager"); } } catch (Exception e) @@ -110,8 +91,8 @@ public class DbInitializerService : IDbInitializerService public async Task SeedRoles() { - var seedAdmin = _adminUserSeedOptions.Value.UserSetting; - var rootRole = await _roleManager.FindByNameAsync(seedAdmin.RoleName); + var seedAdmin = adminUserSeedOptions.Value.UserSetting; + var rootRole = await roleManager.FindByNameAsync(seedAdmin.RoleName); if (rootRole == null) { rootRole = new ApplicationRole @@ -120,21 +101,21 @@ public class DbInitializerService : IDbInitializerService EnglishName = seedAdmin.RoleName, Description = "root admin role" }; - var adminRoleResult = await _roleManager.CreateAsync(rootRole); + var adminRoleResult = await roleManager.CreateAsync(rootRole); foreach (var claim in ApplicationClaims.AllClaims) - await _roleManager.AddClaimAsync(rootRole, claim); + await roleManager.AddClaimAsync(rootRole, claim); } else { foreach (var claim in ApplicationClaims.AllClaims) { - var claims = await _roleManager.GetClaimsAsync(rootRole); + var claims = await roleManager.GetClaimsAsync(rootRole); if (claims.FirstOrDefault(c => c.Value == claim.Value) == null) - await _roleManager.AddClaimAsync(rootRole, claim); + await roleManager.AddClaimAsync(rootRole, claim); } } - var managerRole = await _roleManager.FindByNameAsync("Manager"); + var managerRole = await roleManager.FindByNameAsync("Manager"); if (managerRole == null) { managerRole = new ApplicationRole @@ -144,21 +125,21 @@ public class DbInitializerService : IDbInitializerService PersianName = "مدیریتـــ", Description = "admin role" }; - var adminRoleResult = await _roleManager.CreateAsync(managerRole); + var adminRoleResult = await roleManager.CreateAsync(managerRole); foreach (var claim in ApplicationClaims.AllClaims) - await _roleManager.AddClaimAsync(managerRole, claim); + await roleManager.AddClaimAsync(managerRole, claim); } else { foreach (var claim in ApplicationClaims.AllClaims) { - var claims = await _roleManager.GetClaimsAsync(managerRole); + var claims = await roleManager.GetClaimsAsync(managerRole); if (claims.FirstOrDefault(c => c.Value == claim.Value) == null) - await _roleManager.AddClaimAsync(managerRole, claim); + await roleManager.AddClaimAsync(managerRole, claim); } } - var customerRole = await _roleManager.FindByNameAsync("Customer"); + var customerRole = await roleManager.FindByNameAsync("Customer"); if (customerRole == null) { customerRole = new ApplicationRole @@ -168,17 +149,17 @@ public class DbInitializerService : IDbInitializerService EnglishName = "Customer", }; - var customerRoleResult = await _roleManager.CreateAsync(customerRole); + var customerRoleResult = await roleManager.CreateAsync(customerRole); foreach (var claim in ApplicationClaims.CustomerClaims) - await _roleManager.AddClaimAsync(customerRole, claim); + await roleManager.AddClaimAsync(customerRole, claim); } else { foreach (var claim in ApplicationClaims.CustomerClaims) { - var claims = await _roleManager.GetClaimsAsync(customerRole); + var claims = await roleManager.GetClaimsAsync(customerRole); if (claims.FirstOrDefault(c => c.Value == claim.Value) == null) - await _roleManager.AddClaimAsync(customerRole, claim); + await roleManager.AddClaimAsync(customerRole, claim); } } } From ae9b65adbdb2a3e9dc159d125642702686ccd7c6 Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Fri, 9 Aug 2024 21:55:16 +0330 Subject: [PATCH 07/10] fix files --- .version | 2 +- Netina.Api/Controllers/BlogController.cs | 4 +- Netina.Api/Controllers/SeedController.cs | 10 +- Netina.Api/Netina.Api.csproj | 6 +- Netina.Api/Services/CurrentUserService.cs | 25 +-- .../Bases/ApiResultFilterAttribute.cs | 5 +- .../WebFramework/Bases/CrudController.cs | 38 +--- .../Configurations/LoggerConfig.cs | 4 +- .../MiddleWares/ExceptionHandlerMiddleware.cs | 37 ++-- .../MiddleWares/PerformanceMiddleware.cs | 21 +-- .../Swagger/SwaggerConfiguration.cs | 16 +- Netina.Common/Extensions/StringExtensions.cs | 1 - .../Models/Entity/PageClassDisplay.cs | 15 +- Netina.Core/BaseServices/AccountService.cs | 83 +++------ Netina.Core/BaseServices/DashboardService.cs | 31 ++- Netina.Core/BaseServices/JwtService.cs | 25 +-- Netina.Core/BaseServices/PageService.cs | 31 ++- Netina.Core/BaseServices/SettingService.cs | 15 +- Netina.Core/BaseServices/SiteMapService.cs | 52 +++--- .../GetEmallsProductsQueryHandler.cs | 22 +-- .../GetThumbSearchProductsQueryHandler.cs | 13 +- .../GetTorobProductsQueryHandler.cs | 20 +- .../GetWebSiteNavBarCommandHandler.cs | 23 +-- .../CalculateOrderDiscountCommandHandler.cs | 25 +-- .../CalculateProductDiscountCommandHandler.cs | 23 +-- ...CheckUserDiscountFirstUseCommandHandler.cs | 20 +- .../CreateMarketerDiscountCommandHandler.cs | 38 ++-- .../GetMarketerProfileQueryHandler.cs | 32 ++-- .../SignUpMarketerCommandHandler.cs | 39 ++-- .../AddToOrderBagCommandHandler.cs | 33 ++-- .../CheckOrderBagCommandHandler.cs | 15 +- .../GetUserOrderBagQueryHandler.cs | 32 ++-- .../RemoveFromOrderBagCommandHandler.cs | 30 ++- .../SubmitDiscountActionCommandHandler.cs | 23 +-- .../SubmitOrderBagCommandHandler.cs | 37 ++-- .../SubmitOrderDeliveryCommandHandler.cs | 23 +-- .../ConfirmReviewCommandHandler.cs | 15 +- Netina.Core/EntityServices/UserService.cs | 176 ++++++++---------- Netina.Core/Models/Api/ApiResult.cs | 26 +-- Netina.Core/QuartzServices/JobScheduler.cs | 17 +- .../QuartzServices/SiteMapScheduledJob.cs | 16 +- .../Dtos/SmallDtos/StorageFileSDto.cs | 4 +- .../Entities/Blogs/Blog.Aggregate.cs | 4 +- Netina.Domain/Entities/Brands/Brand.cs | 4 +- .../ProductCategory.Aggregate.cs | 4 +- .../Entities/Products/Product.Aggregate.cs | 5 +- .../MartenEntities/Settings/NavMenuSetting.cs | 6 +- .../RestServices/IKaveNegarRestApi.cs | 4 +- .../RestServices/IRestApiWrapper.cs | 3 +- .../Services/DistrictService.cs | 4 +- .../Services/ExternalFilesService.cs | 18 +- .../Services/Scrapers/DigikalaScraper.cs | 40 ++-- Netina.Infrastructure/Services/SmsService.cs | 44 ++--- .../Services/StorageService.cs | 20 +- .../Services/UploadFileService.cs | 27 +-- .../Services/ZarinpalService.cs | 41 ++-- .../Behaviors/ValidationBehavior.cs | 12 +- .../DbContextOptionCustomExtensionsInfo.cs | 10 +- .../Extensions/ModelBuilderExtensions.cs | 4 +- .../CreateOrUpdatePaymentCommandHandler.cs | 28 ++- .../Accounting/GetPaymentQueryHandler.cs | 16 +- .../Accounting/GetPaymentsQueryHandler.cs | 14 +- .../Addresses/CreateAddressCommandHandler.cs | 19 +- .../Addresses/DeleteAddressCommandHandler.cs | 19 +- .../Addresses/GetUserAddressesQueryHandler.cs | 21 +-- .../Handlers/Blogs/GetBlogsQueryHandler.cs | 14 +- .../Brands/DeleteBrandCommandHandler.cs | 17 +- .../Handlers/Brands/GetBrandsQueryHandler.cs | 22 +-- .../Discounts/CreateDiscountCommandHandler.cs | 4 +- .../Discounts/DeleteDiscountCommandHandler.cs | 19 +- .../Discounts/GetDiscountQueryHandler.cs | 15 +- .../Discounts/GetDiscountsQueryHandler.cs | 15 +- .../Discounts/UpdateDiscountCommandHandler.cs | 4 +- .../Marketers/GetMarketersQueryHandler.cs | 15 +- .../CreateNewsletterMemberCommandHandler.cs | 22 +-- .../GetNewsletterMembersQueryHandler.cs | 15 +- .../CreateNewsletterMemberCommandValidator.cs | 1 - .../Orders/CreateBaseOrderCommandHandler.cs | 22 +-- .../Orders/DeleteOrderCommandHandler.cs | 17 +- .../Orders/GetOrderLDtoQueryHandler.cs | 14 +- .../Handlers/Orders/GetOrderQueryHandler.cs | 17 +- .../Handlers/Orders/GetOrdersQueryHandler.cs | 14 +- .../Orders/GetUserOrdersQueryHandler.cs | 22 +-- .../GetProductCategoriesQueryHandler.cs | 4 +- .../GetProductCategoryChildrenQueryHandler.cs | 4 +- .../GetProductCategoryQueryHandler.cs | 4 +- .../ChangeProductCostCommandHandler.cs | 4 +- .../ChangeProductDisplayedCommandHandler.cs | 4 +- .../Products/DeleteProductCommandHandler.cs | 4 +- .../Products/GetProductsQueryHandler.cs | 4 +- .../Reviews/CreateReviewCommandHandler.cs | 22 +-- .../Reviews/DeleteReviewCommandHandler.cs | 19 +- .../Handlers/Reviews/GetReviewQueryHandler.cs | 14 +- .../Reviews/GetReviewsQueryHandler.cs | 15 +- .../CreateShippingCommandHandler.cs | 13 +- .../DeleteShippingCommandHandler.cs | 18 +- .../Warehouses/GetShippingQueryHandler.cs | 14 +- .../Warehouses/GetShippingsQueryHandler.cs | 14 +- .../UpdateShippingCommandHandler.cs | 18 +- .../Models/ApplicationContext.cs | 18 +- .../Repositories/Base/BaseRepository.cs | 23 +-- .../Base/Contracts/IReadRepository.cs | 4 +- .../Base/Contracts/IRepository.cs | 4 +- .../Repositories/Base/ReadRepository.cs | 13 +- .../Repositories/Base/Repository.cs | 4 +- .../Repositories/Base/RepositoryWrapper.cs | 27 +-- .../Repositories/Base/WriteRepository.cs | 21 +-- .../Repositories/UnitOfWork/UnitOfWork.cs | 16 +- .../Program.cs | 6 - 109 files changed, 716 insertions(+), 1354 deletions(-) diff --git a/.version b/.version index 99a3501..c8d091a 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.0.9.11 \ No newline at end of file +1.2.10.12 \ No newline at end of file diff --git a/Netina.Api/Controllers/BlogController.cs b/Netina.Api/Controllers/BlogController.cs index 2b7bfe9..810ee12 100644 --- a/Netina.Api/Controllers/BlogController.cs +++ b/Netina.Api/Controllers/BlogController.cs @@ -1,7 +1,5 @@ -using Marten.Events; -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Netina.Domain.Entities.Blogs; -using Netina.Domain.Entities.Products; using System.Web; namespace Netina.Api.Controllers; diff --git a/Netina.Api/Controllers/SeedController.cs b/Netina.Api/Controllers/SeedController.cs index 567361d..b614ab9 100644 --- a/Netina.Api/Controllers/SeedController.cs +++ b/Netina.Api/Controllers/SeedController.cs @@ -2,17 +2,11 @@ using Netina.Domain.Entities.Blogs; namespace Netina.Api.Controllers; -public class SeedController : ICarterModule +public class SeedController(IWebHostEnvironment environment) : ICarterModule { - private readonly IWebHostEnvironment _environment; - - public SeedController(IWebHostEnvironment environment) - { - _environment = environment; - } public void AddRoutes(IEndpointRouteBuilder app) { - if (_environment.IsDevelopment()) + if (environment.IsDevelopment()) { var group = app.NewVersionedApi("Seed") .MapGroup("api/seed"); diff --git a/Netina.Api/Netina.Api.csproj b/Netina.Api/Netina.Api.csproj index fcdf1e1..4b4f600 100644 --- a/Netina.Api/Netina.Api.csproj +++ b/Netina.Api/Netina.Api.csproj @@ -6,8 +6,8 @@ enable true Linux - 1.0.9.11 - 1.0.9.11 + 1.2.10.12 + 1.2.10.12 @@ -15,7 +15,7 @@ - + diff --git a/Netina.Api/Services/CurrentUserService.cs b/Netina.Api/Services/CurrentUserService.cs index 02033b6..36739cd 100644 --- a/Netina.Api/Services/CurrentUserService.cs +++ b/Netina.Api/Services/CurrentUserService.cs @@ -3,24 +3,17 @@ using Netina.Repository.Abstracts; namespace Netina.Api.Services; -public class CurrentUserService : ICurrentUserService +public class CurrentUserService(IHttpContextAccessor httpContextAccessor) : ICurrentUserService { - private readonly IHttpContextAccessor _httpContextAccessor; - - public CurrentUserService(IHttpContextAccessor httpContextAccessor) - { - _httpContextAccessor = httpContextAccessor; - } - - public string? UserId => _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier); - public string? RoleName => _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Role); - public string? UserName => _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Name); - public string? DeviceId => GetDeviceId(_httpContextAccessor.HttpContext); + public string? UserId => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier); + public string? RoleName => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Role); + public string? UserName => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Name); + public string? DeviceId => GetDeviceId(httpContextAccessor.HttpContext); public bool IsAuthorized => GetAuthorized(); public JwtSecurityToken? JwtToken => GetJwtToken(); private JwtSecurityToken? GetJwtToken() { - var stream = _httpContextAccessor.HttpContext?.Request.Headers.Authorization.FirstOrDefault(); + var stream = httpContextAccessor.HttpContext?.Request.Headers.Authorization.FirstOrDefault(); if (stream == null) return null; var handler = new JwtSecurityTokenHandler(); @@ -28,7 +21,7 @@ public class CurrentUserService : ICurrentUserService return jsonToken as JwtSecurityToken; } - public List? Permissions => _httpContextAccessor.HttpContext?.User?.FindAll("Permission")?.Select(c => c.Value)?.ToList(); + public List? Permissions => httpContextAccessor.HttpContext?.User?.FindAll("Permission")?.Select(c => c.Value)?.ToList(); private string? GetDeviceId(HttpContext? context) { @@ -52,9 +45,9 @@ public class CurrentUserService : ICurrentUserService private bool GetAuthorized() { - if (_httpContextAccessor.HttpContext?.User.Identity == null) + if (httpContextAccessor.HttpContext?.User.Identity == null) return false; - return _httpContextAccessor.HttpContext.User.Identity.IsAuthenticated; + return httpContextAccessor.HttpContext.User.Identity.IsAuthenticated; } diff --git a/Netina.Api/WebFramework/Bases/ApiResultFilterAttribute.cs b/Netina.Api/WebFramework/Bases/ApiResultFilterAttribute.cs index 740fb9f..4314c3d 100644 --- a/Netina.Api/WebFramework/Bases/ApiResultFilterAttribute.cs +++ b/Netina.Api/WebFramework/Bases/ApiResultFilterAttribute.cs @@ -1,7 +1,4 @@ -using Netina.Common.Models.Api; -using Netina.Core.Models.Api; - -namespace Netina.Api.WebFramework.Bases; +namespace Netina.Api.WebFramework.Bases; public class ApiResultFactory { diff --git a/Netina.Api/WebFramework/Bases/CrudController.cs b/Netina.Api/WebFramework/Bases/CrudController.cs index 5ee8f2a..83987c2 100644 --- a/Netina.Api/WebFramework/Bases/CrudController.cs +++ b/Netina.Api/WebFramework/Bases/CrudController.cs @@ -1,23 +1,13 @@ -using Netina.Common.Models.Entity; -using Netina.Common.Models.Exception; -using Netina.Common.Models.Mapper; -using Netina.Repository.Repositories.Base.Contracts; - -namespace Netina.Api.WebFramework.Bases; +namespace Netina.Api.WebFramework.Bases; -public class CrudEndpoint where TEntity : ApiEntity, new() +public class CrudEndpoint( + string endpointName) + where TEntity : ApiEntity, new() { - private readonly string _endpointName; - - public CrudEndpoint(string endpointName) - { - _endpointName = endpointName; - } - public virtual void AddRoutes(IEndpointRouteBuilder app) { - var group = app.NewVersionedApi(_endpointName).MapGroup($"api/{_endpointName}"); + var group = app.NewVersionedApi(endpointName).MapGroup($"api/{endpointName}"); group.MapGet("", GetAllAsync) .WithDisplayName("GetAll") @@ -83,16 +73,11 @@ public class BaseController : ControllerBase } [Authorize(AuthenticationSchemes = "Bearer")] -public class CrudController : BaseController +public class CrudController(IRepositoryWrapper repositoryWrapper) : BaseController where TDto : BaseDto, new() where TEntity : ApiEntity, new() { - protected readonly IRepositoryWrapper _repositoryWrapper; - - public CrudController(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } + protected readonly IRepositoryWrapper _repositoryWrapper = repositoryWrapper; // GET:Get All Entity [HttpGet] @@ -168,15 +153,10 @@ public class CrudController : BaseController } [Authorize(AuthenticationSchemes = "Bearer")] -public class CrudController : BaseController +public class CrudController(IRepositoryWrapper repositoryWrapper) : BaseController where TEntity : ApiEntity, new() { - protected readonly IRepositoryWrapper _repositoryWrapper; - - public CrudController(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } + protected readonly IRepositoryWrapper _repositoryWrapper = repositoryWrapper; // GET:Get All Entity [HttpGet] diff --git a/Netina.Api/WebFramework/Configurations/LoggerConfig.cs b/Netina.Api/WebFramework/Configurations/LoggerConfig.cs index 57ba7f6..9dcea5d 100644 --- a/Netina.Api/WebFramework/Configurations/LoggerConfig.cs +++ b/Netina.Api/WebFramework/Configurations/LoggerConfig.cs @@ -1,6 +1,4 @@ -using Netina.Infrastructure.Models; - -namespace Netina.Api.WebFramework.Configurations; +namespace Netina.Api.WebFramework.Configurations; public static class LoggerConfig { diff --git a/Netina.Api/WebFramework/MiddleWares/ExceptionHandlerMiddleware.cs b/Netina.Api/WebFramework/MiddleWares/ExceptionHandlerMiddleware.cs index 0f52832..9138cec 100644 --- a/Netina.Api/WebFramework/MiddleWares/ExceptionHandlerMiddleware.cs +++ b/Netina.Api/WebFramework/MiddleWares/ExceptionHandlerMiddleware.cs @@ -10,22 +10,11 @@ public static class ExceptionHandlerMiddlewareExtensions } } -public class ExceptionHandlerMiddleware +public class ExceptionHandlerMiddleware( + RequestDelegate next, + IWebHostEnvironment env, + ILogger logger) { - private readonly IWebHostEnvironment _env; - private readonly ILogger _logger; - private readonly RequestDelegate _next; - - public ExceptionHandlerMiddleware( - RequestDelegate next, - IWebHostEnvironment env, - ILogger logger) - { - _next = next; - _env = env; - _logger = logger; - } - public async Task Invoke(HttpContext context) { string message = null; @@ -34,17 +23,17 @@ public class ExceptionHandlerMiddleware try { - await _next(context); + await next(context); } catch (BaseApiException exception) { - _logger.LogError(exception, exception.Message); + logger.LogError(exception, exception.Message); httpStatusCode = exception.ApiStatusCode == ApiResultStatusCode.NotFound ? HttpStatusCode.NotFound : exception.ApiStatusCode == ApiResultStatusCode.BadRequest ? HttpStatusCode.BadRequest : exception.HttpStatusCode; apiStatusCode = exception.ApiStatusCode; - if (_env.IsDevelopment()) + if (env.IsDevelopment()) { var dic = new Dictionary { @@ -82,19 +71,19 @@ public class ExceptionHandlerMiddleware } catch (SecurityTokenExpiredException exception) { - _logger.LogError(exception, exception.Message); + logger.LogError(exception, exception.Message); SetUnAuthorizeResponse(exception); await WriteToResponseAsync(); } catch (UnauthorizedAccessException exception) { - _logger.LogError(exception, exception.Message); + logger.LogError(exception, exception.Message); SetUnAuthorizeResponse(exception); await WriteToResponseAsync(); } catch (ApiException apiException) { - _logger.LogError(apiException, apiException.Message); + logger.LogError(apiException, apiException.Message); httpStatusCode = HttpStatusCode.InternalServerError; apiStatusCode = ApiResultStatusCode.RefitError; @@ -105,9 +94,9 @@ public class ExceptionHandlerMiddleware } catch (Exception exception) { - _logger.LogError(exception, exception.Message); + logger.LogError(exception, exception.Message); - if (_env.IsDevelopment()) + if (env.IsDevelopment()) { if (exception?.InnerException?.Message != null) { @@ -185,7 +174,7 @@ public class ExceptionHandlerMiddleware httpStatusCode = HttpStatusCode.Unauthorized; apiStatusCode = ApiResultStatusCode.UnAuthorized; - if (_env.IsDevelopment()) + if (env.IsDevelopment()) { var dic = new Dictionary { diff --git a/Netina.Api/WebFramework/MiddleWares/PerformanceMiddleware.cs b/Netina.Api/WebFramework/MiddleWares/PerformanceMiddleware.cs index 1c60ee2..deba7c7 100644 --- a/Netina.Api/WebFramework/MiddleWares/PerformanceMiddleware.cs +++ b/Netina.Api/WebFramework/MiddleWares/PerformanceMiddleware.cs @@ -8,28 +8,19 @@ public static class PerformanceMiddlewareExtensions } } -public class PerformanceMiddleware +public class PerformanceMiddleware( + RequestDelegate next, + ILogger logger) { - private readonly ILogger _logger; - private readonly RequestDelegate _next; - private readonly Stopwatch _timer; - - public PerformanceMiddleware( - RequestDelegate next, - ILogger logger) - { - _next = next; - _logger = logger; - _timer = new Stopwatch(); - } + private readonly Stopwatch _timer = new(); public async System.Threading.Tasks.Task Invoke(HttpContext context) { _timer.Start(); - await _next(context); + await next(context); _timer.Stop(); var elapsedMilliseconds = _timer.ElapsedMilliseconds; - _logger.LogWarning($"REQUEST TIMER : {elapsedMilliseconds}"); + logger.LogWarning($"REQUEST TIMER : {elapsedMilliseconds}"); } } \ No newline at end of file diff --git a/Netina.Api/WebFramework/Swagger/SwaggerConfiguration.cs b/Netina.Api/WebFramework/Swagger/SwaggerConfiguration.cs index 564e0bc..fee719a 100644 --- a/Netina.Api/WebFramework/Swagger/SwaggerConfiguration.cs +++ b/Netina.Api/WebFramework/Swagger/SwaggerConfiguration.cs @@ -1,6 +1,5 @@ using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.OpenApi.Models; -using Netina.Common.Extensions; using Pluralize.NET; using Swashbuckle.AspNetCore.SwaggerGen; using Swashbuckle.AspNetCore.SwaggerUI; @@ -139,17 +138,12 @@ public class SetVersionInPaths : IDocumentFilter } } -public class UnauthorizedResponsesOperationFilter : IOperationFilter +public class UnauthorizedResponsesOperationFilter( + bool includeUnauthorizedAndForbiddenResponses, + string schemeName = "Bearer") + : IOperationFilter { - private readonly bool includeUnauthorizedAndForbiddenResponses; - private readonly string schemeName; - - public UnauthorizedResponsesOperationFilter(bool includeUnauthorizedAndForbiddenResponses, - string schemeName = "Bearer") - { - this.includeUnauthorizedAndForbiddenResponses = includeUnauthorizedAndForbiddenResponses; - this.schemeName = schemeName; - } + private readonly string schemeName = schemeName; public void Apply(OpenApiOperation operation, OperationFilterContext context) { diff --git a/Netina.Common/Extensions/StringExtensions.cs b/Netina.Common/Extensions/StringExtensions.cs index 95d59a7..a8f7577 100644 --- a/Netina.Common/Extensions/StringExtensions.cs +++ b/Netina.Common/Extensions/StringExtensions.cs @@ -1,5 +1,4 @@ using System.Web; -using System.Xml.Linq; namespace Netina.Common.Extensions { diff --git a/Netina.Common/Models/Entity/PageClassDisplay.cs b/Netina.Common/Models/Entity/PageClassDisplay.cs index ea80a2e..450ea17 100644 --- a/Netina.Common/Models/Entity/PageClassDisplay.cs +++ b/Netina.Common/Models/Entity/PageClassDisplay.cs @@ -1,25 +1,16 @@ namespace Netina.Common.Models.Entity { [AttributeUsage(AttributeTargets.Class)] - public class PageClassDisplay : Attribute + public class PageClassDisplay(string name, string description) : Attribute { - private readonly string _description; - private readonly string _name; - - public PageClassDisplay(string name, string description) - { - _name = name; - _description = description; - } - public string GetName() { - return _name; + return name; } public string GetDescription() { - return _description; + return description; } } } \ No newline at end of file diff --git a/Netina.Core/BaseServices/AccountService.cs b/Netina.Core/BaseServices/AccountService.cs index 3ac0f22..8be923e 100644 --- a/Netina.Core/BaseServices/AccountService.cs +++ b/Netina.Core/BaseServices/AccountService.cs @@ -1,53 +1,32 @@ namespace Netina.Core.BaseServices; -public class AccountService : IAccountService +public class AccountService( + UserManager userManager, + SignInManager userSignInManager, + IJwtService jwtService, + ICurrentUserService currentUserService, + IRepositoryWrapper repositoryWrapper, + ISmsService smsService, + IUserService managerUserService) + : IAccountService { - - private readonly UserManager _userManager; - private readonly SignInManager _userSignInManager; - private readonly IJwtService _jwtService; - private readonly ICurrentUserService _currentUserService; - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ISmsService _smsService; - private readonly IUserService _managerUserService; - - public AccountService( - UserManager userManager, - SignInManager userSignInManager, - IJwtService jwtService, - ICurrentUserService currentUserService, - IRepositoryWrapper repositoryWrapper, - ISmsService smsService, - IUserService managerUserService) - { - _userManager = userManager; - _userSignInManager = userSignInManager; - _jwtService = jwtService; - _currentUserService = currentUserService; - _repositoryWrapper = repositoryWrapper; - _smsService = smsService; - _managerUserService = managerUserService; - } - - - public async Task ForgetPasswordAsync(string phoneNumber) { - var user = await _userManager.FindByNameAsync(phoneNumber); + var user = await userManager.FindByNameAsync(phoneNumber); if (user != null) { var rand = new Random(DateTime.Now.Millisecond); var newPass = rand.Next(1000000, 9000000).ToString(); if (!user.PhoneNumberConfirmed) throw new AppException("شماره تلفن شما تایید نشده است و قابلیت استفاده از فراموشی رمز عبور را ندارید"); - var rp = await _userManager.RemovePasswordAsync(user); + var rp = await userManager.RemovePasswordAsync(user); if (!rp.Succeeded) throw new AppException(string.Join('-', rp.Errors.Select(e => e.Description))); - var ap = await _userManager.AddPasswordAsync(user, newPass); + var ap = await userManager.AddPasswordAsync(user, newPass); if (!ap.Succeeded) throw new AppException(string.Join('-', ap.Errors.Select(e => e.Description))); - await _smsService.SendForgerPasswordAsync(user.PhoneNumber, newPass); + await smsService.SendForgerPasswordAsync(user.PhoneNumber, newPass); return true; } @@ -56,7 +35,7 @@ public class AccountService : IAccountService public async Task CheckMemberShipAsync(string phoneNumber) { - var user = await _userManager.FindByNameAsync(phoneNumber); + var user = await userManager.FindByNameAsync(phoneNumber); if (user == null) return false; return true; @@ -67,23 +46,23 @@ public class AccountService : IAccountService var newPhoneNumber = StringExtensions.CheckPhoneNumber(phoneNumber); if (!PhoneNumberExtensions.CheckPhoneNumber(newPhoneNumber)) throw new AppException("شماره تلفن ارسالی اشتباه است"); - var user = await _userManager.FindByNameAsync(newPhoneNumber); + var user = await userManager.FindByNameAsync(newPhoneNumber); if (user == null) - user = await _managerUserService.CreateUserAsync(phoneNumber); + user = await managerUserService.CreateUserAsync(phoneNumber); - var token = await _userManager.GenerateTwoFactorTokenAsync(user, "Phone"); - await _smsService.SendVerifyCodeAsync(newPhoneNumber, token); + var token = await userManager.GenerateTwoFactorTokenAsync(user, "Phone"); + await smsService.SendVerifyCodeAsync(newPhoneNumber, token); return new VerifyCodeResponseDto { SignUpStatus = SignUpStatus.StartSignOn }; } public async Task> LoginWithPasswordAsync(string userName, string password, CancellationToken cancellationToken) { - var result = await _userSignInManager.PasswordSignInAsync(userName, password, false, false); + var result = await userSignInManager.PasswordSignInAsync(userName, password, false, false); if (!result.Succeeded) throw new AppException("رمز عبور یا نام کاربری اشتباه است"); - var admin = await _userManager.FindByNameAsync(userName); + var admin = await userManager.FindByNameAsync(userName); if (admin == null) throw new AppException("نام کاربری یا رمز عبور اشتباه است"); return await CompleteLogin(admin, cancellationToken); @@ -91,11 +70,11 @@ public class AccountService : IAccountService public async Task> LoginWithVerifyCodeAsync(string userName, string verifyCode, CancellationToken cancellationToken) { - var user = await _userManager.FindByNameAsync(userName); + var user = await userManager.FindByNameAsync(userName); if (user == null) throw new AppException("نام کاربری یا کد ارسالی اشتباه است", ApiResultStatusCode.NotFound); - var verfiyResult = await _userManager.VerifyTwoFactorTokenAsync(user, "Phone", verifyCode); + var verfiyResult = await userManager.VerifyTwoFactorTokenAsync(user, "Phone", verifyCode); if (verifyCode == "859585") verfiyResult = true; if (!verfiyResult) @@ -104,7 +83,7 @@ public class AccountService : IAccountService { user.PhoneNumberConfirmed = true; user.SignUpStatus = SignUpStatus.PhoneNumberVerified; - var result = await _userManager.UpdateAsync(user); + var result = await userManager.UpdateAsync(user); if (!result.Succeeded) throw new AppException(string.Join('|', result.Errors)); } @@ -113,9 +92,9 @@ public class AccountService : IAccountService public async Task> CompleteSignUpAsync(SignUpRequestDto requestDto, CancellationToken cancellationToken) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("User Id is null"); - var user = await _userManager.FindByIdAsync(_currentUserService.UserId); + var user = await userManager.FindByIdAsync(currentUserService.UserId); if (user == null) throw new AppException("User not found", ApiResultStatusCode.NotFound); if (user.SignUpStatus == SignUpStatus.SignUpCompleted) @@ -132,19 +111,19 @@ public class AccountService : IAccountService user.FirstName = requestDto.FirstName; user.LastName = requestDto.LastName; user.SignUpStatus = SignUpStatus.SignUpCompleted; - var result = await _userManager.UpdateAsync(user); + var result = await userManager.UpdateAsync(user); if (!result.Succeeded) throw new AppException(string.Join('|', result.Errors.Select(e => e.Description))); - var roleResult = await _userManager.AddToRoleAsync(user, "Customer"); + var roleResult = await userManager.AddToRoleAsync(user, "Customer"); if (!roleResult.Succeeded) throw new AppException(string.Join('|', roleResult.Errors.Select(e => e.Description))); - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Add(new Customer { UserId = user.Id, }); - await _repositoryWrapper.SaveChangesAsync(default); + await repositoryWrapper.SaveChangesAsync(default); return await CompleteLogin(user, cancellationToken); } @@ -153,8 +132,8 @@ public class AccountService : IAccountService private async Task> CompleteLogin(ApplicationUser user, CancellationToken cancellationToken) { AccessToken jwt; - var role = await _userManager.GetRolesAsync(user); - jwt = await _jwtService.Generate(user, role.ToList()); + var role = await userManager.GetRolesAsync(user); + jwt = await jwtService.Generate(user, role.ToList()); jwt.User.RoleName = jwt.RoleName; return jwt; } diff --git a/Netina.Core/BaseServices/DashboardService.cs b/Netina.Core/BaseServices/DashboardService.cs index 606b9a9..f259c66 100644 --- a/Netina.Core/BaseServices/DashboardService.cs +++ b/Netina.Core/BaseServices/DashboardService.cs @@ -2,38 +2,31 @@ namespace Netina.Core.BaseServices; -public class DashboardService : IDashboardService +public class DashboardService(IRepositoryWrapper repositoryWrapper, UserManager userManager) + : IDashboardService { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly UserManager _userManager; - - public DashboardService(IRepositoryWrapper repositoryWrapper,UserManager userManager) - { - _repositoryWrapper = repositoryWrapper; - _userManager = userManager; - } public async Task GetHomeDashboardAsyncTask(CancellationToken cancellationToken = default) { var response = new HomeDashboardDto { - BlogsCount = await _repositoryWrapper.SetRepository() + BlogsCount = await repositoryWrapper.SetRepository() .TableNoTracking .CountAsync(cancellationToken), - ProductsCount = await _repositoryWrapper.SetRepository() + ProductsCount = await repositoryWrapper.SetRepository() .TableNoTracking .CountAsync(cancellationToken), - TodayOrdersCount = await _repositoryWrapper.SetRepository() + TodayOrdersCount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.OrderAt.Date == DateTime.Today.Date) .CountAsync(cancellationToken), - UnSubmittedOrdersCount = await _repositoryWrapper.SetRepository() + UnSubmittedOrdersCount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.OrderStatus == OrderStatus.Paid || o.OrderStatus == OrderStatus.Submitted) .CountAsync(cancellationToken), - BrandsCount = await _repositoryWrapper.SetRepository() + BrandsCount = await repositoryWrapper.SetRepository() .TableNoTracking .CountAsync(cancellationToken), - SubscribersCount = await _userManager.Users.CountAsync(cancellationToken) + SubscribersCount = await userManager.Users.CountAsync(cancellationToken) }; return response; @@ -45,19 +38,19 @@ public class DashboardService : IDashboardService DateTime endOfThisMonth = startOfThisMonth.AddMonths(1); var response = new OrderDashboardDto { - PayedOrdersCount = await _repositoryWrapper.SetRepository() + PayedOrdersCount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(o=>o.IsPayed && o.OrderStatus==OrderStatus.Paid) .CountAsync(cancellationToken), - ThisMonthOrdersCount = await _repositoryWrapper.SetRepository() + ThisMonthOrdersCount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(s => s.OrderAt.Date >= startOfThisMonth.Date && s.OrderAt.Date < endOfThisMonth.Date) .CountAsync(cancellationToken), - TodayOrdersCount = await _repositoryWrapper.SetRepository() + TodayOrdersCount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.OrderAt.Date == DateTime.Now.Date) .CountAsync(cancellationToken), - UnSendOrdersCount = await _repositoryWrapper.SetRepository() + UnSendOrdersCount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.IsPayed && o.OrderStatus == OrderStatus.Processing) .CountAsync(cancellationToken) diff --git a/Netina.Core/BaseServices/JwtService.cs b/Netina.Core/BaseServices/JwtService.cs index 0ec4497..d8a28c5 100644 --- a/Netina.Core/BaseServices/JwtService.cs +++ b/Netina.Core/BaseServices/JwtService.cs @@ -1,21 +1,14 @@ namespace Netina.Core.BaseServices; -public class JwtService : IJwtService +public class JwtService( + IOptionsSnapshot siteSettings, + SignInManager userSignInManager, + RoleManager roleManager) + : IJwtService { - private readonly SignInManager _signInManager; - private readonly RoleManager _roleManager; - private readonly SiteSettings _siteSettings; + private readonly SiteSettings _siteSettings = siteSettings.Value; - public JwtService( - IOptionsSnapshot siteSettings, - SignInManager userSignInManager, - RoleManager roleManager) - { - _signInManager = userSignInManager; - _roleManager = roleManager; - _siteSettings = siteSettings.Value; - } public async Task> Generate(TUser user) where TUser : ApplicationUser { var tokenId = StringExtensions.GetId(8); @@ -89,7 +82,7 @@ public class JwtService : IJwtService private async Task> GetClaims(TUser baseUser, string jwtId) where TUser : ApplicationUser { - var clFac = (await _signInManager.ClaimsFactory.CreateAsync(baseUser)); + var clFac = (await userSignInManager.ClaimsFactory.CreateAsync(baseUser)); var claims = new List(); claims.Add(new Claim("JwtID", jwtId)); claims.Add(new Claim(ClaimTypes.Name, baseUser.UserName)); @@ -108,10 +101,10 @@ public class JwtService : IJwtService foreach (var roleName in roleNames) { - var applicationRole = await _roleManager.FindByNameAsync(roleName); + var applicationRole = await roleManager.FindByNameAsync(roleName); if(applicationRole==null) continue; - var roleClaims = await _roleManager.GetClaimsAsync(applicationRole); + var roleClaims = await roleManager.GetClaimsAsync(applicationRole); claims.AddRange(roleClaims); claims.Add(new Claim(ClaimTypes.Role, applicationRole.EnglishName)); claims.Add(new Claim("RoleId", applicationRole.Id.ToString())); diff --git a/Netina.Core/BaseServices/PageService.cs b/Netina.Core/BaseServices/PageService.cs index e221faf..7f2625d 100644 --- a/Netina.Core/BaseServices/PageService.cs +++ b/Netina.Core/BaseServices/PageService.cs @@ -2,27 +2,22 @@ namespace Netina.Core.BaseServices; -public class PageService : IPageService +public class PageService( + IMartenRepositoryWrapper martenRepositoryWrapperWrapper, + ICurrentUserService currentUserService) + : IPageService { - private readonly IMartenRepositoryWrapper _martenRepositoryWrapper; - private readonly ICurrentUserService _currentUserService; - - public PageService(IMartenRepositoryWrapper martenRepositoryWrapperWrapper, ICurrentUserService currentUserService) - { - _martenRepositoryWrapper = martenRepositoryWrapperWrapper; - _currentUserService = currentUserService; - } public async Task GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null, string? type = null, CancellationToken cancellationToken = default) { BasePage? page = null; if (id != null) - page = await _martenRepositoryWrapper.SetRepository().GetEntityAsync(id.Value, cancellationToken); + page = await martenRepositoryWrapperWrapper.SetRepository().GetEntityAsync(id.Value, cancellationToken); else if (pageSlug != null) - page = await _martenRepositoryWrapper.SetRepository().GetEntityAsync(entity => entity.Slug == pageSlug, cancellationToken); + page = await martenRepositoryWrapperWrapper.SetRepository().GetEntityAsync(entity => entity.Slug == pageSlug, cancellationToken); else if (pageName != null) - page = await _martenRepositoryWrapper.SetRepository().GetEntityAsync(entity => entity.Title == pageName, cancellationToken); + page = await martenRepositoryWrapperWrapper.SetRepository().GetEntityAsync(entity => entity.Title == pageName, cancellationToken); else if (type != null) - page = await _martenRepositoryWrapper.SetRepository().GetEntityAsync(entity => entity.Type == type, cancellationToken); + page = await martenRepositoryWrapperWrapper.SetRepository().GetEntityAsync(entity => entity.Type == type, cancellationToken); if (page == null) throw new AppException("Page not found", ApiResultStatusCode.NotFound); @@ -45,7 +40,7 @@ public class PageService : IPageService public async Task> GetPagesAsync(CancellationToken cancellationToken = default) { List sDtos = new List(); - var pages = await _martenRepositoryWrapper.SetRepository().GetEntitiesAsync(cancellationToken); + var pages = await martenRepositoryWrapperWrapper.SetRepository().GetEntitiesAsync(cancellationToken); foreach (var page in pages) { var dto = new BasePageSDto @@ -79,23 +74,23 @@ public class PageService : IPageService Type = entity.Type, Slug = entity.Slug, CreatedAt = DateTime.Now, - CreatedBy = _currentUserService.UserName ?? string.Empty + CreatedBy = currentUserService.UserName ?? string.Empty }; if (!basePage.Type.IsNullOrEmpty()) { var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType(entity.Type); basePage.Data = JsonConvert.SerializeObject(((JsonElement)entity.Data).Deserialize(type)); } - await _martenRepositoryWrapper.SetRepository().AddOrUpdateEntityAsync(basePage, cancellationToken); + await martenRepositoryWrapperWrapper.SetRepository().AddOrUpdateEntityAsync(basePage, cancellationToken); return true; } public async Task DeletePageAsync(Guid id, CancellationToken cancellationToken = default) { - var page = await _martenRepositoryWrapper.SetRepository().GetEntityAsync(p => p.Id == id, cancellationToken); + var page = await martenRepositoryWrapperWrapper.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 martenRepositoryWrapperWrapper.SetRepository().RemoveEntityAsync(page, cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Core/BaseServices/SettingService.cs b/Netina.Core/BaseServices/SettingService.cs index 4d11304..c31f0d0 100644 --- a/Netina.Core/BaseServices/SettingService.cs +++ b/Netina.Core/BaseServices/SettingService.cs @@ -1,21 +1,14 @@  -public class SettingService : ISettingService +public class SettingService(IMartenRepositoryWrapper martenRepositoryWrapper) : ISettingService { - private readonly IMartenRepositoryWrapper _martenRepositoryWrapper; - - public SettingService(IMartenRepositoryWrapper martenRepositoryWrapper) - { - _martenRepositoryWrapper = martenRepositoryWrapper; - } - public async Task GetSettingAsync(string settingName, CancellationToken cancellationToken = default) { var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"Netina.Domain.MartenEntities.Settings.{settingName}"); if (type == null) throw new AppException("Setting not found", ApiResultStatusCode.NotFound); - var baseSetting = await _martenRepositoryWrapper.SetRepository() + var baseSetting = await martenRepositoryWrapper.SetRepository() .GetEntityAsync(s => s.Name == settingName, cancellationToken); object? setting; if (baseSetting == null) @@ -34,7 +27,7 @@ public class SettingService : ISettingService if (type == null) throw new AppException("Setting not found", ApiResultStatusCode.NotFound); - var baseSetting = await _martenRepositoryWrapper.SetRepository() + var baseSetting = await martenRepositoryWrapper.SetRepository() .GetEntityAsync(s => s.Name == settingName, cancellationToken); if (baseSetting == null) @@ -51,7 +44,7 @@ public class SettingService : ISettingService baseSetting.JsonData = JsonConvert.SerializeObject(settingObj.Deserialize(type)); } - await _martenRepositoryWrapper.SetRepository() + await martenRepositoryWrapper.SetRepository() .AddOrUpdateEntityAsync(baseSetting, cancellationToken); } } \ No newline at end of file diff --git a/Netina.Core/BaseServices/SiteMapService.cs b/Netina.Core/BaseServices/SiteMapService.cs index ed1afa1..8989164 100644 --- a/Netina.Core/BaseServices/SiteMapService.cs +++ b/Netina.Core/BaseServices/SiteMapService.cs @@ -6,23 +6,15 @@ using Netina.Domain.Entities.ProductCategories; namespace Netina.Core.BaseServices; -public class SiteMapService : ISiteMapService +public class SiteMapService( + IOptionsSnapshot snapshot, + IUploadFileService uploadFileService, + IRepositoryWrapper repositoryWrapper, + IPageService pageService) + : ISiteMapService { - private readonly IUploadFileService _uploadFileService; - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IPageService _pageService; - private readonly SiteSettings _siteSetting; + private readonly SiteSettings _siteSetting = snapshot.Value; - public SiteMapService(IOptionsSnapshot snapshot, - IUploadFileService uploadFileService, - IRepositoryWrapper repositoryWrapper, - IPageService pageService) - { - _uploadFileService = uploadFileService; - _repositoryWrapper = repositoryWrapper; - _pageService = pageService; - _siteSetting = snapshot.Value; - } public async Task CreateSiteMapAsync() { XmlDocument doc = new XmlDocument(); @@ -38,11 +30,11 @@ public class SiteMapService : ISiteMapService doc.AppendChild(root); - var productCategories = await _repositoryWrapper.SetRepository() + var productCategories = await repositoryWrapper.SetRepository() .TableNoTracking .ToListAsync(); - var blogCategories= await _repositoryWrapper.SetRepository() + var blogCategories= await repositoryWrapper.SetRepository() .TableNoTracking .ToListAsync(); @@ -96,7 +88,7 @@ public class SiteMapService : ISiteMapService doc.WriteTo(writer); writer.Flush(); byte[] byteArray = stream.ToArray(); - await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + await uploadFileService.UploadFileByteAsync(new FileUploadRequest { FileBytes = byteArray, ContentType = "text/xml", @@ -118,7 +110,7 @@ public class SiteMapService : ISiteMapService { var siteMapsUId = SiteMapUIds.Pages; - var pages = await _pageService.GetPagesAsync(); + var pages = await pageService.GetPagesAsync(); XmlDocument doc = new XmlDocument(); XmlDeclaration documentType = doc.CreateXmlDeclaration("1.0", "utf-8", null); @@ -170,7 +162,7 @@ public class SiteMapService : ISiteMapService zipStream.Close(); var siteMapArray = compressedStream.ToArray(); - await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + await uploadFileService.UploadFileByteAsync(new FileUploadRequest { FileBytes = siteMapArray, ContentType = "text/plain", @@ -184,7 +176,7 @@ public class SiteMapService : ISiteMapService { var siteMapsUId = SiteMapUIds.Brands; - var brands = await _repositoryWrapper.SetRepository() + var brands = await repositoryWrapper.SetRepository() .TableNoTracking .ToListAsync(); @@ -238,7 +230,7 @@ public class SiteMapService : ISiteMapService zipStream.Close(); var siteMapArray = compressedStream.ToArray(); - await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + await uploadFileService.UploadFileByteAsync(new FileUploadRequest { FileBytes = siteMapArray, ContentType = "text/plain", @@ -253,7 +245,7 @@ public class SiteMapService : ISiteMapService { var siteMapsUId = SiteMapUIds.Categories; - var categories = await _repositoryWrapper.SetRepository() + var categories = await repositoryWrapper.SetRepository() .TableNoTracking .ToListAsync(); @@ -307,7 +299,7 @@ public class SiteMapService : ISiteMapService zipStream.Close(); var siteMapArray = compressedStream.ToArray(); - await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + await uploadFileService.UploadFileByteAsync(new FileUploadRequest { FileBytes = siteMapArray, ContentType = "text/plain", @@ -321,7 +313,7 @@ public class SiteMapService : ISiteMapService private async Task CreateProductsSiteMapsAsync() { - var products = await _repositoryWrapper.SetRepository() + var products = await repositoryWrapper.SetRepository() .TableNoTracking .Select(ProductMapper.ProjectToSDto) .ToListAsync(); @@ -400,7 +392,7 @@ public class SiteMapService : ISiteMapService zipStream.Close(); var siteMapArray = compressedStream.ToArray(); - await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + await uploadFileService.UploadFileByteAsync(new FileUploadRequest { FileBytes = siteMapArray, ContentType = "text/plain", @@ -417,7 +409,7 @@ public class SiteMapService : ISiteMapService private async Task CreateBlogsSiteMapsAsync() { - var blogs = await _repositoryWrapper.SetRepository() + var blogs = await repositoryWrapper.SetRepository() .TableNoTracking .Select(BlogMapper.ProjectToSDto) .ToListAsync(); @@ -530,7 +522,7 @@ public class SiteMapService : ISiteMapService zipStream.Close(); var siteMapArray = compressedStream.ToArray(); - await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + await uploadFileService.UploadFileByteAsync(new FileUploadRequest { FileBytes = siteMapArray, ContentType = "text/plain", @@ -548,7 +540,7 @@ public class SiteMapService : ISiteMapService { var siteMapsUId = SiteMapUIds.BlogCategories; - var blogCategories = await _repositoryWrapper.SetRepository() + var blogCategories = await repositoryWrapper.SetRepository() .TableNoTracking .ToListAsync(); @@ -602,7 +594,7 @@ public class SiteMapService : ISiteMapService zipStream.Close(); var siteMapArray = compressedStream.ToArray(); - await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + await uploadFileService.UploadFileByteAsync(new FileUploadRequest { FileBytes = siteMapArray, ContentType = "text/plain", diff --git a/Netina.Core/CoreServices/SearchServices/GetEmallsProductsQueryHandler.cs b/Netina.Core/CoreServices/SearchServices/GetEmallsProductsQueryHandler.cs index b7865f4..a6420d7 100644 --- a/Netina.Core/CoreServices/SearchServices/GetEmallsProductsQueryHandler.cs +++ b/Netina.Core/CoreServices/SearchServices/GetEmallsProductsQueryHandler.cs @@ -1,21 +1,17 @@ namespace Netina.Core.CoreServices.SearchServices; -public class GetEmallsProductsQueryHandler : IRequestHandler +public class GetEmallsProductsQueryHandler( + IRepositoryWrapper repositoryWrapper, + IMediator mediator, + IOptionsSnapshot optionsSnapshot) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - private readonly SiteSettings _siteSetting; - public GetEmallsProductsQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, IOptionsSnapshot optionsSnapshot) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - _siteSetting = optionsSnapshot.Value; - } + private readonly SiteSettings _siteSetting = optionsSnapshot.Value; public async Task Handle(GetEmallsProductsQuery request, CancellationToken cancellationToken) { var page = request.Page; - var productsSDto = await _repositoryWrapper.SetRepository() + var productsSDto = await repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(p => p.ModifiedAt == DateTime.MinValue ? p.CreatedAt : p.ModifiedAt) .Select(p => new ProductSDto @@ -37,7 +33,7 @@ public class GetEmallsProductsQueryHandler : IRequestHandler(); foreach (var product in productsSDto) { @@ -62,7 +58,7 @@ public class GetEmallsProductsQueryHandler : IRequestHandler().TableNoTracking.CountAsync(cancellationToken)); + response.total_items = (await repositoryWrapper.SetRepository().TableNoTracking.CountAsync(cancellationToken)); response.pages_count = response.total_items / request.Count; response.products = products; diff --git a/Netina.Core/CoreServices/SearchServices/GetThumbSearchProductsQueryHandler.cs b/Netina.Core/CoreServices/SearchServices/GetThumbSearchProductsQueryHandler.cs index ca12fde..b76da56 100644 --- a/Netina.Core/CoreServices/SearchServices/GetThumbSearchProductsQueryHandler.cs +++ b/Netina.Core/CoreServices/SearchServices/GetThumbSearchProductsQueryHandler.cs @@ -2,27 +2,22 @@ namespace Netina.Core.CoreServices.SearchServices; -public class GetThumbSearchProductsQueryHandler : IRequestHandler +public class GetThumbSearchProductsQueryHandler(IRepositoryWrapper repositoryWrapper) + : 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() + 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() + var categories = await repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.Name.ToLower().Trim(), searchQuery)) .Take(8) diff --git a/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs b/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs index 6da036c..479ef44 100644 --- a/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs +++ b/Netina.Core/CoreServices/SearchServices/GetTorobProductsQueryHandler.cs @@ -1,21 +1,17 @@ namespace Netina.Core.CoreServices.SearchServices; -public class GetTorobProductsQueryHandler : IRequestHandler> +public class GetTorobProductsQueryHandler( + IRepositoryWrapper repositoryWrapper, + IMediator mediator, + IOptionsSnapshot optionsSnapshot) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - private readonly SiteSettings _siteSetting; + private readonly SiteSettings _siteSetting = optionsSnapshot.Value; - public GetTorobProductsQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator, IOptionsSnapshot optionsSnapshot) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - _siteSetting = optionsSnapshot.Value; - } public async Task> Handle(GetTorobProductsQuery request, CancellationToken cancellationToken) { int page = request.Page == 0 ? 1 : request.Page; - var productsSDto = await _repositoryWrapper.SetRepository() + var productsSDto = await repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(p => p.ModifiedAt == DateTime.MinValue ? p.CreatedAt : p.ModifiedAt) .Select(p => new ProductSDto @@ -37,7 +33,7 @@ public class GetTorobProductsQueryHandler : IRequestHandler(); foreach (var product in productsSDto) { diff --git a/Netina.Core/CoreServices/WebSiteServices/GetWebSiteNavBarCommandHandler.cs b/Netina.Core/CoreServices/WebSiteServices/GetWebSiteNavBarCommandHandler.cs index 3ebae44..28bcac0 100644 --- a/Netina.Core/CoreServices/WebSiteServices/GetWebSiteNavBarCommandHandler.cs +++ b/Netina.Core/CoreServices/WebSiteServices/GetWebSiteNavBarCommandHandler.cs @@ -2,22 +2,17 @@ namespace Netina.Core.CoreServices.WebSiteServices; -public class GetWebSiteNavBarCommandHandler : IRequestHandler> +public class GetWebSiteNavBarCommandHandler( + IRepositoryWrapper repositoryWrapper, + ISettingService settingService, + IOptionsSnapshot optionsSnapshot) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ISettingService _settingService; - private readonly SiteSettings _siteSetting; - - public GetWebSiteNavBarCommandHandler(IRepositoryWrapper repositoryWrapper , ISettingService settingService,IOptionsSnapshot optionsSnapshot) - { - _repositoryWrapper = repositoryWrapper; - _settingService = settingService; - _siteSetting = optionsSnapshot.Value; - } + private readonly SiteSettings _siteSetting = optionsSnapshot.Value; public async Task> Handle(GetWebSiteNavBarCommand request, CancellationToken cancellationToken) { - var navBarSetting = await _settingService.GetSettingAsync(nameof(NavMenuSetting), cancellationToken) as NavMenuSetting; + var navBarSetting = await settingService.GetSettingAsync(nameof(NavMenuSetting), cancellationToken) as NavMenuSetting; var navBarItems = new List(); if (navBarSetting == null) return new List(); @@ -30,7 +25,7 @@ public class GetWebSiteNavBarCommandHandler : IRequestHandler() + var baseCategories = await repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(c => c.CreatedAt) .Select(BlogCategoryMapper.ProjectToSDto) @@ -54,7 +49,7 @@ public class GetWebSiteNavBarCommandHandler : IRequestHandler() + var baseCategories = await repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(c => c.CreatedAt) .Select(ProductCategoryMapper.ProjectToSDto) diff --git a/Netina.Core/EntityServices/DiscountHandlers/CalculateOrderDiscountCommandHandler.cs b/Netina.Core/EntityServices/DiscountHandlers/CalculateOrderDiscountCommandHandler.cs index 0890210..5693f37 100644 --- a/Netina.Core/EntityServices/DiscountHandlers/CalculateOrderDiscountCommandHandler.cs +++ b/Netina.Core/EntityServices/DiscountHandlers/CalculateOrderDiscountCommandHandler.cs @@ -1,21 +1,16 @@ namespace Netina.Core.EntityServices.DiscountHandlers; -public class CalculateOrderDiscountCommandHandler : IRequestHandler +public class CalculateOrderDiscountCommandHandler( + IRepositoryWrapper repositoryWrapper, + ICurrentUserService currentUserService) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - - public CalculateOrderDiscountCommandHandler(IRepositoryWrapper repositoryWrapper,ICurrentUserService currentUserService) - { - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - } public async Task Handle(CalculateOrderDiscountCommand request, CancellationToken cancellationToken) { if (request.Order == null) throw new AppException("Order is null", ApiResultStatusCode.BadRequest); - var discount = await _repositoryWrapper.SetRepository() + var discount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken); @@ -25,14 +20,14 @@ public class CalculateOrderDiscountCommandHandler : IRequestHandler() + var customer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(c => c.UserId == firstPurchaseUserId, cancellationToken); if (customer == null) throw new BaseApiException(ApiResultStatusCode.NotFound, "Customer not found"); - var userOrderCount = await _repositoryWrapper.SetRepository() + var userOrderCount = await repositoryWrapper.SetRepository() .TableNoTracking .CountAsync(f => f.CustomerId == customer.Id && f.DiscountCode == discount.Code, cancellationToken); if (userOrderCount > 0) @@ -51,7 +46,7 @@ public class CalculateOrderDiscountCommandHandler : IRequestHandler() + var categoryDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken); if ( categoryDiscount!=null && !categoryDiscount.IsExpired()) @@ -62,7 +57,7 @@ public class CalculateOrderDiscountCommandHandler : IRequestHandler() + var productDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken); diff --git a/Netina.Core/EntityServices/DiscountHandlers/CalculateProductDiscountCommandHandler.cs b/Netina.Core/EntityServices/DiscountHandlers/CalculateProductDiscountCommandHandler.cs index f1b6eef..7ede885 100644 --- a/Netina.Core/EntityServices/DiscountHandlers/CalculateProductDiscountCommandHandler.cs +++ b/Netina.Core/EntityServices/DiscountHandlers/CalculateProductDiscountCommandHandler.cs @@ -1,15 +1,8 @@ namespace Netina.Core.EntityServices.DiscountHandlers; -public class CalculateProductDiscountCommandHandler : IRequestHandler +public class CalculateProductDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CalculateProductDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } - - public async Task Handle(CalculateProductDiscountCommand request, CancellationToken cancellationToken) { if (request.Product is ProductSDto product) @@ -30,7 +23,7 @@ public class CalculateProductDiscountCommandHandler : IRequestHandler() + var allDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Type == DiscountType.All && d.HasCode == false && d.ExpireDate.Date >= DateTime.Today.Date, cancellationToken); @@ -42,7 +35,7 @@ public class CalculateProductDiscountCommandHandler : IRequestHandler() + var categoryDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.CategoryId == request.CategoryId && d.HasCode == false && d.ExpireDate.Date >= DateTime.Today.Date, cancellationToken); @@ -53,7 +46,7 @@ public class CalculateProductDiscountCommandHandler : IRequestHandler() + var productDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(d => d.HasCode == false && d.ProductId == request.Id && d.ExpireDate.Date >= DateTime.Today.Date) .OrderByDescending(d => d.CreatedAt) @@ -85,7 +78,7 @@ public class CalculateProductDiscountCommandHandler : IRequestHandler() + var allDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Type == DiscountType.All && d.HasCode == false && d.ExpireDate.Date >= DateTime.Today.Date, cancellationToken); @@ -97,7 +90,7 @@ public class CalculateProductDiscountCommandHandler : IRequestHandler() + var categoryDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.CategoryId == request.CategoryId && d.HasCode == false && d.ExpireDate.Date >= DateTime.Today.Date, cancellationToken); @@ -108,7 +101,7 @@ public class CalculateProductDiscountCommandHandler : IRequestHandler() + var productDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .Where(d => d.HasCode == false && d.ProductId == request.Id && d.ExpireDate.Date >= DateTime.Today.Date) .OrderByDescending(d => d.CreatedAt) diff --git a/Netina.Core/EntityServices/DiscountHandlers/CheckUserDiscountFirstUseCommandHandler.cs b/Netina.Core/EntityServices/DiscountHandlers/CheckUserDiscountFirstUseCommandHandler.cs index c87198b..56d6e7e 100644 --- a/Netina.Core/EntityServices/DiscountHandlers/CheckUserDiscountFirstUseCommandHandler.cs +++ b/Netina.Core/EntityServices/DiscountHandlers/CheckUserDiscountFirstUseCommandHandler.cs @@ -1,28 +1,22 @@ namespace Netina.Core.EntityServices.DiscountHandlers; -public class CheckUserDiscountFirstUseCommandHandler : IRequestHandler +public class CheckUserDiscountFirstUseCommandHandler( + IRepositoryWrapper repositoryWrapper, + ICurrentUserService currentUserService) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - - public CheckUserDiscountFirstUseCommandHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService) - { - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - } - public async Task Handle(CheckUserDiscountFirstUseCommand request, CancellationToken cancellationToken) { - if (_currentUserService.UserId != null && Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (currentUserService.UserId != null && Guid.TryParse(currentUserService.UserId, out Guid userId)) { - var customer = await _repositoryWrapper.SetRepository() + var customer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(c => c.UserId == userId, cancellationToken); if (customer == null) throw new BaseApiException(ApiResultStatusCode.NotFound, "Customer not found"); - var discountedUserOrder = await _repositoryWrapper.SetRepository() + var discountedUserOrder = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(f => f.CustomerId == customer.Id && f.DiscountCode == request.DiscountCode, cancellationToken); diff --git a/Netina.Core/EntityServices/MarketerHandlers/CreateMarketerDiscountCommandHandler.cs b/Netina.Core/EntityServices/MarketerHandlers/CreateMarketerDiscountCommandHandler.cs index da4239b..aafc619 100644 --- a/Netina.Core/EntityServices/MarketerHandlers/CreateMarketerDiscountCommandHandler.cs +++ b/Netina.Core/EntityServices/MarketerHandlers/CreateMarketerDiscountCommandHandler.cs @@ -1,48 +1,38 @@ namespace Netina.Core.EntityServices.MarketerHandlers; -public class CreateMarketerDiscountCommandHandler : IRequestHandler +public class CreateMarketerDiscountCommandHandler( + UserManager userManager, + IRepositoryWrapper repositoryWrapper, + ICurrentUserService currentUserService, + ISettingService settingService) + : IRequestHandler { - private readonly UserManager _userManager; - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - private readonly ISettingService _settingService; - - public CreateMarketerDiscountCommandHandler(UserManager userManager, - IRepositoryWrapper repositoryWrapper, - ICurrentUserService currentUserService, - ISettingService settingService) - { - _userManager = userManager; - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - _settingService = settingService; - } public async Task Handle(CreateMarketerDiscountCommand request, CancellationToken cancellationToken) { var userId = request.MarketerUserId; if (userId == default) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("User id is null"); - if (!Guid.TryParse(_currentUserService.UserId, out userId)) + if (!Guid.TryParse(currentUserService.UserId, out userId)) throw new AppException("User id is wrong"); } - var user = await _userManager.FindByIdAsync(userId.ToString()); + var user = await userManager.FindByIdAsync(userId.ToString()); if (user == null) throw new AppException("User not found", ApiResultStatusCode.NotFound); - var marketer = await _repositoryWrapper.SetRepository() + var marketer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(m => m.UserId == user.Id, cancellationToken); if (marketer == null) throw new AppException("Marketer not found", ApiResultStatusCode.NotFound); - var foundedDiscount = await _repositoryWrapper.SetRepository() + var foundedDiscount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.IsForSaleCooperation && d.MarketerId == marketer.Id, cancellationToken); if (foundedDiscount == null) { - var setting = await _settingService.GetSettingAsync(nameof(MarketerSetting), cancellationToken); + var setting = await settingService.GetSettingAsync(nameof(MarketerSetting), cancellationToken); int discountPercent = 10; if (setting is MarketerSetting marketerSetting) discountPercent = marketerSetting.DiscountPercent; @@ -53,8 +43,8 @@ public class CreateMarketerDiscountCommandHandler : IRequestHandler().Add(foundedDiscount); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Add(foundedDiscount); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return foundedDiscount.Code; } diff --git a/Netina.Core/EntityServices/MarketerHandlers/GetMarketerProfileQueryHandler.cs b/Netina.Core/EntityServices/MarketerHandlers/GetMarketerProfileQueryHandler.cs index 2da31bc..69438d4 100644 --- a/Netina.Core/EntityServices/MarketerHandlers/GetMarketerProfileQueryHandler.cs +++ b/Netina.Core/EntityServices/MarketerHandlers/GetMarketerProfileQueryHandler.cs @@ -2,18 +2,12 @@ namespace Netina.Core.EntityServices.MarketerHandlers; -public class GetMarketerProfileQueryHandler : IRequestHandler +public class GetMarketerProfileQueryHandler( + IRepositoryWrapper repositoryWrapper, + ICurrentUserService currentUserService, + ISettingService settingService) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - private readonly ISettingService _settingService; - - public GetMarketerProfileQueryHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService,ISettingService settingService) - { - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - _settingService = settingService; - } public async Task Handle(GetMarketerProfileQuery request, CancellationToken cancellationToken) { Guid marketerId; @@ -21,17 +15,17 @@ public class GetMarketerProfileQueryHandler : IRequestHandler() + marketer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(m => m.Id == marketerId, cancellationToken); } else { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new BaseApiException("User id is null"); - if (!Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (!Guid.TryParse(currentUserService.UserId, out Guid userId)) throw new BaseApiException("User id is wrong"); - marketer = await _repositoryWrapper.SetRepository() + marketer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(m => m.UserId == userId, cancellationToken); @@ -40,26 +34,26 @@ public class GetMarketerProfileQueryHandler : IRequestHandler() + var discount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.MarketerId == marketer.Id, cancellationToken); if (discount == null) throw new BaseApiException("Marketer has no discount"); - var setting = (await _settingService.GetSettingAsync(nameof(MarketerSetting), cancellationToken)) as MarketerSetting; + var setting = (await settingService.GetSettingAsync(nameof(MarketerSetting), cancellationToken)) as MarketerSetting; if (setting == null) throw new BaseApiException("MarketerSetting is null"); var response = new MarketerProfileResponseDto(); - var orderCount = await _repositoryWrapper.SetRepository() + var orderCount = await repositoryWrapper.SetRepository() .TableNoTracking .CountAsync(o => o.DiscountCode == discount.Code, cancellationToken); response.OrderCount = orderCount; - var newTotalProductPrice = await _repositoryWrapper.SetRepository() + var newTotalProductPrice = await repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.DiscountCode == discount.Code && o.OrderAt.Date > marketer.LastSettlement.Date) .SumAsync(o => o.TotalProductsPrice, cancellationToken); diff --git a/Netina.Core/EntityServices/MarketerHandlers/SignUpMarketerCommandHandler.cs b/Netina.Core/EntityServices/MarketerHandlers/SignUpMarketerCommandHandler.cs index 4fa674b..41ce8d1 100644 --- a/Netina.Core/EntityServices/MarketerHandlers/SignUpMarketerCommandHandler.cs +++ b/Netina.Core/EntityServices/MarketerHandlers/SignUpMarketerCommandHandler.cs @@ -1,36 +1,29 @@ namespace Netina.Core.EntityServices.MarketerHandlers; -public class SignUpMarketerCommandHandler : IRequestHandler +public class SignUpMarketerCommandHandler( + UserManager userManager, + IMediator mediator, + ICurrentUserService currentUserService, + IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly UserManager _userManager; - private readonly IMediator _mediator; - private readonly ICurrentUserService _currentUserService; - private readonly IRepositoryWrapper _repositoryWrapper; - - public SignUpMarketerCommandHandler(UserManager userManager,IMediator mediator,ICurrentUserService currentUserService,IRepositoryWrapper repositoryWrapper) - { - _userManager = userManager; - _mediator = mediator; - _currentUserService = currentUserService; - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(SignUpMarketerCommand request, CancellationToken cancellationToken) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("User id is null"); - if (!Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (!Guid.TryParse(currentUserService.UserId, out Guid userId)) throw new AppException("User id is wrong"); - var user = await _userManager.FindByIdAsync(_currentUserService.UserId); + var user = await userManager.FindByIdAsync(currentUserService.UserId); if (user == null) throw new AppException("User not found"); - var marketer = await _repositoryWrapper.SetRepository() + var marketer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(m => m.UserId == userId, cancellationToken); if (marketer != null) - return await _mediator.Send(new GetMarketerProfileQuery(MarketerId: marketer.Id), cancellationToken); + return await mediator.Send(new GetMarketerProfileQuery(MarketerId: marketer.Id), cancellationToken); marketer = new Marketer { @@ -38,16 +31,16 @@ public class SignUpMarketerCommandHandler : IRequestHandler() + repositoryWrapper.SetRepository() .Add(marketer); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); user.BirthDate = DateTimeExtensions.UnixTimeStampToDateTime(request.BirthDate); user.NationalId = request.NationalId; - await _userManager.UpdateAsync(user); + await userManager.UpdateAsync(user); - await _mediator.Send(new CreateMarketerDiscountCommand(userId), cancellationToken); + await mediator.Send(new CreateMarketerDiscountCommand(userId), cancellationToken); - return await _mediator.Send(new GetMarketerProfileQuery(marketer.Id), cancellationToken); + return await mediator.Send(new GetMarketerProfileQuery(marketer.Id), cancellationToken); } } \ No newline at end of file diff --git a/Netina.Core/EntityServices/OrderBagHandlers/AddToOrderBagCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/AddToOrderBagCommandHandler.cs index 4d9585b..0479c74 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/AddToOrderBagCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/AddToOrderBagCommandHandler.cs @@ -1,31 +1,24 @@ namespace Netina.Core.EntityServices.OrderBagHandlers; -public class AddToOrderBagCommandHandler : IRequestHandler +public class AddToOrderBagCommandHandler( + IMediator mediator, + IRepositoryWrapper repositoryWrapper, + ICurrentUserService currentUserService) + : IRequestHandler { - private readonly IMediator _mediator; - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - - public AddToOrderBagCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper,ICurrentUserService currentUserService) - { - _mediator = mediator; - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - } - public async Task Handle(AddToOrderBagCommand request, CancellationToken cancellationToken) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("Customer id notfound", ApiResultStatusCode.BadRequest); - if (!Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (!Guid.TryParse(currentUserService.UserId, out Guid userId)) throw new AppException("Customer id wrong", ApiResultStatusCode.BadRequest); - var orderBag = await _mediator.Send(new GetUserOrderBagQuery(), cancellationToken); + var orderBag = await mediator.Send(new GetUserOrderBagQuery(), cancellationToken); foreach (var requestDto in request.RequestDtos) { - var product = await _repositoryWrapper.SetRepository() + var product = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(p => p.Id == requestDto.ProductId, cancellationToken); @@ -35,16 +28,16 @@ public class AddToOrderBagCommandHandler : IRequestHandler().Update(orderBag); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(orderBag); + await repositoryWrapper.SaveChangesAsync(cancellationToken); - var order = await _mediator.Send(new CalculateOrderCommand(orderBag.Id), cancellationToken); + var order = await mediator.Send(new CalculateOrderCommand(orderBag.Id), cancellationToken); return order.AdaptToSDto(); } diff --git a/Netina.Core/EntityServices/OrderBagHandlers/CheckOrderBagCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/CheckOrderBagCommandHandler.cs index 60d3509..e4f57fe 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/CheckOrderBagCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/CheckOrderBagCommandHandler.cs @@ -1,22 +1,15 @@ namespace Netina.Core.EntityServices.OrderBagHandlers; -public class CheckOrderBagCommandHandler : IRequestHandler> +public class CheckOrderBagCommandHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - - public CheckOrderBagCommandHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - } public async Task> Handle(CheckOrderBagCommand request, CancellationToken cancellationToken) { List response = new List(); foreach (var item in request.OrderBag) { - var product = await _repositoryWrapper.SetRepository() + var product = await repositoryWrapper.SetRepository() .TableNoTracking .Where(p => p.Id == item.ProductId) .Select(ProductMapper.ProjectToSDto) @@ -35,7 +28,7 @@ public class CheckOrderBagCommandHandler : IRequestHandler +public class GetUserOrderBagQueryHandler( + IRepositoryWrapper repositoryWrapper, + ICurrentUserService currentUserService, + IMediator mediator) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - private readonly IMediator _mediator; - - public GetUserOrderBagQueryHandler(IRepositoryWrapper repositoryWrapper,ICurrentUserService currentUserService,IMediator mediator) - { - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - _mediator = mediator; - } public async Task Handle(GetUserOrderBagQuery request, CancellationToken cancellationToken) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("Customer id notfound", ApiResultStatusCode.BadRequest); - if (!Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (!Guid.TryParse(currentUserService.UserId, out Guid userId)) throw new AppException("Customer id wrong",ApiResultStatusCode.BadRequest); - var customer = await _repositoryWrapper.SetRepository() + var customer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(c => c.UserId == userId, cancellationToken); if (customer == null) @@ -28,20 +22,20 @@ public class GetUserOrderBagQueryHandler : IRequestHandler() + repositoryWrapper.SetRepository() .Add(customer); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } - var order = await _repositoryWrapper.SetRepository() + var order = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(o => o.CustomerId == customer.Id && o.OrderStatus == OrderStatus.OrderBag,cancellationToken); if (order == null) - order = await _mediator.Send(new CreateBaseOrderCommand(userId),cancellationToken); + order = await mediator.Send(new CreateBaseOrderCommand(userId),cancellationToken); else { - var orderProducts = await _repositoryWrapper.SetRepository() + var orderProducts = await repositoryWrapper.SetRepository() .TableNoTracking .Where(op=>op.OrderId==order.Id) .ToListAsync(cancellationToken); diff --git a/Netina.Core/EntityServices/OrderBagHandlers/RemoveFromOrderBagCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/RemoveFromOrderBagCommandHandler.cs index 882b9ea..6059456 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/RemoveFromOrderBagCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/RemoveFromOrderBagCommandHandler.cs @@ -1,29 +1,23 @@ namespace Netina.Core.EntityServices.OrderBagHandlers; -public class RemoveFromOrderBagCommandHandler : IRequestHandler +public class RemoveFromOrderBagCommandHandler( + ICurrentUserService currentUserService, + IRepositoryWrapper repositoryWrapper, + IMediator mediator) + : IRequestHandler { - private readonly ICurrentUserService _currentUserService; - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - - public RemoveFromOrderBagCommandHandler(ICurrentUserService currentUserService, IRepositoryWrapper repositoryWrapper,IMediator mediator) - { - _currentUserService = currentUserService; - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - } public async Task Handle(RemoveFromOrderBagCommand request, CancellationToken cancellationToken) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("Customer id notfound", ApiResultStatusCode.BadRequest); - if (!Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (!Guid.TryParse(currentUserService.UserId, out Guid userId)) throw new AppException("Customer id wrong", ApiResultStatusCode.BadRequest); - var orderBag = await _mediator.Send(new GetUserOrderBagQuery(), cancellationToken); + var orderBag = await mediator.Send(new GetUserOrderBagQuery(), cancellationToken); foreach (var requestDto in request.RequestDtos) { - var product = await _repositoryWrapper.SetRepository() + var product = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(p => p.Id == requestDto.ProductId, cancellationToken); @@ -37,9 +31,9 @@ public class RemoveFromOrderBagCommandHandler : IRequestHandler().Update(orderBag); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); - var order = await _mediator.Send(new CalculateOrderCommand(orderBag.Id), cancellationToken); + repositoryWrapper.SetRepository().Update(orderBag); + await repositoryWrapper.SaveChangesAsync(cancellationToken); + var order = await mediator.Send(new CalculateOrderCommand(orderBag.Id), cancellationToken); return order.AdaptToSDto(); } diff --git a/Netina.Core/EntityServices/OrderBagHandlers/SubmitDiscountActionCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/SubmitDiscountActionCommandHandler.cs index ae6ec3c..dbe31b2 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/SubmitDiscountActionCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/SubmitDiscountActionCommandHandler.cs @@ -1,18 +1,11 @@ namespace Netina.Core.EntityServices.OrderBagHandlers; -public class SubmitDiscountActionCommandHandler : IRequestHandler +public class SubmitDiscountActionCommandHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - - public SubmitDiscountActionCommandHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - } public async Task Handle(SubmitDiscountActionCommand request, CancellationToken cancellationToken) { - var order = await _repositoryWrapper.SetRepository() + var order = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken); if (order == null) @@ -20,13 +13,13 @@ public class SubmitDiscountActionCommandHandler : IRequestHandler() + var discount = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken); if (discount == null || discount.IsExpired()) throw new AppException("تخفیف منقضی شده است یا وجود ندارد", ApiResultStatusCode.NotFound); - var isFirstUserOfDiscount = await _mediator.Send(new CheckUserDiscountFirstUseCommand(request.DiscountCode), cancellationToken); + var isFirstUserOfDiscount = await mediator.Send(new CheckUserDiscountFirstUseCommand(request.DiscountCode), cancellationToken); if (!isFirstUserOfDiscount) throw new BaseApiException(ApiResultStatusCode.BadRequest, "شما یک بار از این کد تخفیف استفاده نموده اید و قابلیت استفاده مجدد ندارید"); @@ -36,9 +29,9 @@ public class SubmitDiscountActionCommandHandler : IRequestHandler().Update(order); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); - var calculateOrder = await _mediator.Send(new CalculateOrderCommand(order.Id), cancellationToken); + repositoryWrapper.SetRepository().Update(order); + await repositoryWrapper.SaveChangesAsync(cancellationToken); + var calculateOrder = await mediator.Send(new CalculateOrderCommand(order.Id), cancellationToken); return calculateOrder.AdaptToSDto(); } diff --git a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderBagCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderBagCommandHandler.cs index 7622a62..8386ca8 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderBagCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderBagCommandHandler.cs @@ -1,31 +1,24 @@ namespace Netina.Core.EntityServices.OrderBagHandlers; -public class SubmitOrderBagCommandHandler : IRequestHandler +public class SubmitOrderBagCommandHandler( + IMediator mediator, + IRepositoryWrapper repositoryWrapper, + ICurrentUserService currentUserService) + : IRequestHandler { - private readonly IMediator _mediator; - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - - public SubmitOrderBagCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService) - { - _mediator = mediator; - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - } - public async Task Handle(SubmitOrderBagCommand request, CancellationToken cancellationToken) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("Customer id notfound", ApiResultStatusCode.BadRequest); - if (!Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (!Guid.TryParse(currentUserService.UserId, out Guid userId)) throw new AppException("Customer id wrong", ApiResultStatusCode.BadRequest); - var orderBag = await _mediator.Send(new GetUserOrderBagQuery(), cancellationToken); + var orderBag = await mediator.Send(new GetUserOrderBagQuery(), cancellationToken); foreach (var requestDto in request.RequestDtos) { - var product = await _repositoryWrapper.SetRepository() + var product = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(p => p.Id == requestDto.ProductId, cancellationToken); @@ -35,7 +28,7 @@ public class SubmitOrderBagCommandHandler : IRequestHandlerop.ProductId==orderProduct.ProductId)==null) { orderBag.OrderProducts.Remove(orderProduct); - _repositoryWrapper.SetRepository().Delete(orderProduct); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(orderProduct); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } } - _repositoryWrapper.SetRepository().Update(orderBag); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(orderBag); + await repositoryWrapper.SaveChangesAsync(cancellationToken); - var order = await _mediator.Send(new CalculateOrderCommand(orderBag.Id), cancellationToken); + var order = await mediator.Send(new CalculateOrderCommand(orderBag.Id), cancellationToken); return order.AdaptToSDto(); } diff --git a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderDeliveryCommandHandler.cs b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderDeliveryCommandHandler.cs index 15b3616..abff301 100644 --- a/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderDeliveryCommandHandler.cs +++ b/Netina.Core/EntityServices/OrderBagHandlers/SubmitOrderDeliveryCommandHandler.cs @@ -2,26 +2,19 @@ namespace Netina.Core.EntityServices.OrderBagHandlers; -public class SubmitOrderDeliveryCommandHandler : IRequestHandler +public class SubmitOrderDeliveryCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IMediator _mediator; - private readonly IRepositoryWrapper _repositoryWrapper; - - public SubmitOrderDeliveryCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper) - { - _mediator = mediator; - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(SubmitOrderDeliveryCommand request, CancellationToken cancellationToken) { - var order = await _repositoryWrapper.SetRepository() + var order = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken); if (order == null) throw new AppException("Order not found", ApiResultStatusCode.NotFound); - var orderDelivery = await _repositoryWrapper.SetRepository() + var orderDelivery = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(od => od.OrderId == request.OrderId, cancellationToken); if (orderDelivery != null) @@ -29,7 +22,7 @@ public class SubmitOrderDeliveryCommandHandler : IRequestHandler() + var shipping = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(s => s.Id == request.ShippingId, cancellationToken); if (shipping == null) @@ -37,10 +30,10 @@ public class SubmitOrderDeliveryCommandHandler : IRequestHandler().Update(order); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(order); + await repositoryWrapper.SaveChangesAsync(cancellationToken); - var calculatedOrder = await _mediator.Send(new CalculateOrderCommand(order.Id), cancellationToken); + var calculatedOrder = await mediator.Send(new CalculateOrderCommand(order.Id), cancellationToken); return calculatedOrder.AdaptToSDto(); } } \ No newline at end of file diff --git a/Netina.Core/EntityServices/ReviewHandlers/ConfirmReviewCommandHandler.cs b/Netina.Core/EntityServices/ReviewHandlers/ConfirmReviewCommandHandler.cs index 7b47f4f..5930633 100644 --- a/Netina.Core/EntityServices/ReviewHandlers/ConfirmReviewCommandHandler.cs +++ b/Netina.Core/EntityServices/ReviewHandlers/ConfirmReviewCommandHandler.cs @@ -1,23 +1,18 @@ namespace Netina.Core.EntityServices.ReviewHandlers; -public class ConfirmReviewCommandHandler : IRequestHandler +public class ConfirmReviewCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public ConfirmReviewCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(ConfirmReviewCommand request, CancellationToken cancellationToken) { - var review = await _repositoryWrapper.SetRepository().TableNoTracking + var review = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(r => r.Id == request.Id, cancellationToken); if (review == null) throw new AppException("Review not found", ApiResultStatusCode.NotFound); review.ConfirmReview(); - _repositoryWrapper.SetRepository().Update(review); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(review); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Core/EntityServices/UserService.cs b/Netina.Core/EntityServices/UserService.cs index 5657c59..7986557 100644 --- a/Netina.Core/EntityServices/UserService.cs +++ b/Netina.Core/EntityServices/UserService.cs @@ -1,33 +1,19 @@ namespace Netina.Core.EntityServices; -public class UserService : IUserService +public class UserService( + ICurrentUserService currentUserService, + UserManager userManager, + RoleManager roleManager, + IExternalFilesService externalFilesService, + IRepositoryWrapper repositoryWrapper) + : IUserService { - private readonly ICurrentUserService _currentUserService; - private readonly UserManager _userManager; - private readonly RoleManager _roleManager; - private readonly IExternalFilesService _externalFilesService; - private readonly IRepositoryWrapper _repositoryWrapper; - - public UserService(ICurrentUserService currentUserService, - UserManager userManager, - RoleManager roleManager, - IExternalFilesService externalFilesService, - IRepositoryWrapper repositoryWrapper) - { - _currentUserService = currentUserService; - _userManager = userManager; - _roleManager = roleManager; - _externalFilesService = externalFilesService; - _repositoryWrapper = repositoryWrapper; - } - - public async Task GetUserProfileAsync(CancellationToken cancellationToken) { - if (!Guid.TryParse(_currentUserService.UserId, out var userId)) + if (!Guid.TryParse(currentUserService.UserId, out var userId)) throw new AppException("Wrong Token", ApiResultStatusCode.UnAuthorized); - var user = await _userManager.FindByIdAsync(userId.ToString()); + var user = await userManager.FindByIdAsync(userId.ToString()); if (user == null) throw new AppException("User NotFound", ApiResultStatusCode.NotFound); @@ -36,14 +22,14 @@ public class UserService : IUserService //var userSDto = user.AdaptToSDto(); response.User = new ApplicationUserSDto(); - var userRoles = await _userManager.GetRolesAsync(user); + var userRoles = await userManager.GetRolesAsync(user); foreach (var role in userRoles) { - var dbRole = await _roleManager.FindByNameAsync(role); + var dbRole = await roleManager.FindByNameAsync(role); if (dbRole != null) { - var roleClaims = await _roleManager.GetClaimsAsync(dbRole); + var roleClaims = await roleManager.GetClaimsAsync(dbRole); response.Permissions.AddRange(roleClaims.Where(c => c.Type == "Permission").Select(c => c.Value).ToList()); } } @@ -57,23 +43,23 @@ public class UserService : IUserService List users; if (phoneNumber == null || phoneNumber.IsNullOrEmpty()) - users = await _userManager.Users + users = await userManager.Users .Where(u => u.UserName != "09214802813") .Skip(page * 15).Take(15) .Select(ApplicationUserMapper.ProjectToSDto) .ToListAsync(cancellationToken); else - users = await _userManager.Users + users = await userManager.Users .Where(a => a.PhoneNumber == phoneNumber && a.UserName != "09214802813") .Skip(page * 15).Take(15) .Select(ApplicationUserMapper.ProjectToSDto) .ToListAsync(cancellationToken); foreach (var user in users) { - var roles = await _userManager.GetRolesAsync(user.AdaptToApplicationUser()); + var roles = await userManager.GetRolesAsync(user.AdaptToApplicationUser()); foreach (var roleName in roles) { - var role = await _roleManager.FindByNameAsync(roleName); + var role = await roleManager.FindByNameAsync(roleName); if (role != null) user.RoleName += role.PersianName + " "; } @@ -85,20 +71,20 @@ public class UserService : IUserService public async Task GetUserAsync(Guid userId, CancellationToken cancellationToken = default) { - var user = await _userManager.FindByIdAsync(userId.ToString()); + var user = await userManager.FindByIdAsync(userId.ToString()); if (user == null) throw new AppException("User not found", ApiResultStatusCode.NotFound); var dto = user.AdaptToSDto(); - dto.IsMarketer = await _repositoryWrapper.SetRepository() + dto.IsMarketer = await repositoryWrapper.SetRepository() .TableNoTracking .AnyAsync(m => m.UserId == userId, cancellationToken); - dto.IsManager = await _repositoryWrapper.SetRepository() + dto.IsManager = await repositoryWrapper.SetRepository() .TableNoTracking .AnyAsync(m => m.UserId == userId, cancellationToken); - var roles = await _userManager.GetRolesAsync(user); + var roles = await userManager.GetRolesAsync(user); foreach (var roleName in roles) { - var role = await _roleManager.FindByNameAsync(roleName); + var role = await roleManager.FindByNameAsync(roleName); if (role != null) dto.RoleIds.Add(role.Id); } @@ -113,7 +99,7 @@ public class UserService : IUserService PhoneNumber = phoneNumber, SignUpStatus = SignUpStatus.StartSignOn }; - var result = await _userManager.CreateAsync(user); + var result = await userManager.CreateAsync(user); if (!result.Succeeded) throw new AppException(string.Join('|', result.Errors)); return user; @@ -122,7 +108,7 @@ public class UserService : IUserService public async Task CreateUserAsync(UserActionRequestDto request, CancellationToken cancellationToken) { - var user = await _userManager.FindByNameAsync(request.PhoneNumber); + var user = await userManager.FindByNameAsync(request.PhoneNumber); if (user == null) { user = new ApplicationUser @@ -140,13 +126,13 @@ public class UserService : IUserService if (!request.Password.IsNullOrEmpty()) { - var result = await _userManager.CreateAsync(user, request.Password); + var result = await userManager.CreateAsync(user, request.Password); if (!result.Succeeded) throw new AppException(string.Join('|', result.Errors.Select(e => e.Description))); } else { - var result = await _userManager.CreateAsync(user); + var result = await userManager.CreateAsync(user); if (!result.Succeeded) throw new AppException(string.Join('|', result.Errors.Select(e => e.Description))); } @@ -155,31 +141,31 @@ public class UserService : IUserService { foreach (var roleId in request.RoleIds) { - var role = await _roleManager.FindByIdAsync(roleId.ToString()); + var role = await roleManager.FindByIdAsync(roleId.ToString()); if (role is { Name: not null }) - await _userManager.AddToRoleAsync(user, role.Name); + await userManager.AddToRoleAsync(user, role.Name); } } - var customer = await _repositoryWrapper.SetRepository() + var customer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(c => c.UserId == user.Id, cancellationToken); if (customer != null) { - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Add(new Customer { UserId = user.Id }); - await _repositoryWrapper.SaveChangesAsync(default); + await repositoryWrapper.SaveChangesAsync(default); } - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Add(new Manager { UserId = user.Id }); - await _repositoryWrapper.SaveChangesAsync(default); + await repositoryWrapper.SaveChangesAsync(default); } return user; } @@ -189,7 +175,7 @@ public class UserService : IUserService if (request.UserId == Guid.Empty) throw new AppException("Wrong authorize token , UserId needed"); - var user = await _userManager.FindByIdAsync(request.UserId.ToString()); + var user = await userManager.FindByIdAsync(request.UserId.ToString()); if (user == null) throw new AppException("User not found", ApiResultStatusCode.NotFound); user.LastName = request.LastName; @@ -202,29 +188,29 @@ public class UserService : IUserService user.BirthDate = DateTimeExtensions.UnixTimeStampToDateTime(request.BirthDateTimeStamp); user.Gender = request.Gender; - var result = await _userManager.UpdateAsync(user); + var result = await userManager.UpdateAsync(user); if (!result.Succeeded) throw new AppException(string.Join('|', result.Errors.Select(e => e.Description))); if (!request.Password.IsNullOrEmpty()) { - if (await _userManager.HasPasswordAsync(user)) - await _userManager.RemovePasswordAsync(user); + if (await userManager.HasPasswordAsync(user)) + await userManager.RemovePasswordAsync(user); - var addPassResult = await _userManager.AddPasswordAsync(user, request.Password); + var addPassResult = await userManager.AddPasswordAsync(user, request.Password); if (!addPassResult.Succeeded) throw new AppException(string.Join('|', addPassResult.Errors.Select(e => e.Description))); } if (request.RoleIds.Count > 0) { - var userRoles = await _userManager.GetRolesAsync(user); - await _userManager.RemoveFromRolesAsync(user, userRoles); + var userRoles = await userManager.GetRolesAsync(user); + await userManager.RemoveFromRolesAsync(user, userRoles); foreach (var roleId in request.RoleIds) { - var role = await _roleManager.FindByIdAsync(roleId.ToString()); + var role = await roleManager.FindByIdAsync(roleId.ToString()); if (role is { Name: not null }) { - await _userManager.AddToRoleAsync(user, role.Name); + await userManager.AddToRoleAsync(user, role.Name); } } } @@ -234,10 +220,10 @@ public class UserService : IUserService public async Task EditUserProfileAsync(UserActionRequestDto request, CancellationToken cancellationToken) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("Wrong authorize token , UserId needed"); - var user = await _userManager.FindByIdAsync(_currentUserService.UserId); + var user = await userManager.FindByIdAsync(currentUserService.UserId); if (user == null) throw new AppException("User not found", ApiResultStatusCode.NotFound); user.LastName = request.LastName; @@ -250,15 +236,15 @@ public class UserService : IUserService user.BirthDate = DateTimeExtensions.UnixTimeStampToDateTime(request.BirthDateTimeStamp); user.Gender = request.Gender; - var result = await _userManager.UpdateAsync(user); + var result = await userManager.UpdateAsync(user); if (!result.Succeeded) throw new AppException(string.Join('|', result.Errors.Select(e => e.Description))); if (!request.Password.IsNullOrEmpty()) { - if (await _userManager.HasPasswordAsync(user)) - await _userManager.RemovePasswordAsync(user); + if (await userManager.HasPasswordAsync(user)) + await userManager.RemovePasswordAsync(user); - var addPassResult = await _userManager.AddPasswordAsync(user, request.Password); + var addPassResult = await userManager.AddPasswordAsync(user, request.Password); if (!addPassResult.Succeeded) throw new AppException(string.Join('|', addPassResult.Errors.Select(e => e.Description))); } @@ -268,34 +254,34 @@ public class UserService : IUserService public async Task RemoveUserAsync(Guid userId, CancellationToken cancellationToken) { - var user = await _userManager.FindByIdAsync(userId.ToString()); + var user = await userManager.FindByIdAsync(userId.ToString()); if (user == null) throw new AppException("User not found", ApiResultStatusCode.NotFound); - var roles = await _userManager.GetRolesAsync(user); - await _userManager.RemoveFromRolesAsync(user, roles); - var removeResult = await _userManager.DeleteAsync(user); + var roles = await userManager.GetRolesAsync(user); + await userManager.RemoveFromRolesAsync(user, roles); + var removeResult = await userManager.DeleteAsync(user); if (!removeResult.Succeeded) throw new AppException(string.Join('|', removeResult.Errors.Select(e => e.Description))); - var customer = await _repositoryWrapper.SetRepository() + var customer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(c => c.UserId == userId, cancellationToken); if (customer != null) { - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Delete(customer); - await _repositoryWrapper.SaveChangesAsync(default); + await repositoryWrapper.SaveChangesAsync(default); } - var manager = await _repositoryWrapper.SetRepository() + var manager = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(c => c.UserId == userId, cancellationToken); if (manager != null) { - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Delete(manager); - await _repositoryWrapper.SaveChangesAsync(default); + await repositoryWrapper.SaveChangesAsync(default); } return true; @@ -303,26 +289,26 @@ public class UserService : IUserService public async Task GetAdminChangeLogAsync(CancellationToken cancellationToken = default) { - if (!Guid.TryParse(_currentUserService.UserId, out var userId)) + if (!Guid.TryParse(currentUserService.UserId, out var userId)) throw new AppException("Wrong Token", ApiResultStatusCode.UnAuthorized); - var user = await _userManager.FindByIdAsync(userId.ToString()); + var user = await userManager.FindByIdAsync(userId.ToString()); if (user == null) throw new AppException("User NotFound", ApiResultStatusCode.NotFound); - var manager = await _repositoryWrapper.SetRepository() + var manager = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(m => m.UserId == userId, cancellationToken); - var currentVersion = await _externalFilesService.GetAdminChangeLogAsync(cancellationToken); + var currentVersion = await externalFilesService.GetAdminChangeLogAsync(cancellationToken); if (manager != null) { if (!(manager.LatestVersionUsed < currentVersion.VersionNumber)) return currentVersion; currentVersion.IsNewVersion = true; manager.LatestVersionUsed = currentVersion.VersionNumber; - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Update(manager); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } return currentVersion; @@ -331,7 +317,7 @@ public class UserService : IUserService public async Task> GetRolesAsync(int page = 0, CancellationToken cancellationToken = default) { - var roles = await _roleManager.Roles + var roles = await roleManager.Roles .Where(r => r.Name != "RootAdmin") .Skip(page * 15) .Take(15) @@ -343,9 +329,9 @@ public class UserService : IUserService { IQueryable roles; if (roleName != null) - roles = _roleManager.Roles.Where(r => r.Name != "RootAdmin" && r.Name != "Customer" && r.PersianName.Trim().ToLower().Contains(roleName)); + roles = roleManager.Roles.Where(r => r.Name != "RootAdmin" && r.Name != "Customer" && r.PersianName.Trim().ToLower().Contains(roleName)); else - roles = _roleManager.Roles.Where(r => r.Name != "RootAdmin" && r.Name != "Customer"); + roles = roleManager.Roles.Where(r => r.Name != "RootAdmin" && r.Name != "Customer"); if (page != null) roles = roles.Skip(page.Value * 15).Take(15); else @@ -355,13 +341,13 @@ public class UserService : IUserService public async Task GetRoleAsync(Guid roleId, CancellationToken cancellationToken = default) { - var role = (await _roleManager.FindByIdAsync(roleId.ToString())); + var role = (await roleManager.FindByIdAsync(roleId.ToString())); if (role == null) throw new AppException("نقش پیدا نشد", ApiResultStatusCode.NotFound); var roleDto = role.Adapt(); roleDto.RoleId = roleId; - roleDto.Permissions = (await _roleManager.GetClaimsAsync(role)) + roleDto.Permissions = (await roleManager.GetClaimsAsync(role)) .Where(c => c.Type == CustomClaimType.Permission) .Select(c => c.Value) .ToList(); @@ -380,12 +366,12 @@ public class UserService : IUserService Description = request.Description, Name = $"{request.EnglishName}" }; - var createRoleResult = await _roleManager.CreateAsync(applicationRole); + var createRoleResult = await roleManager.CreateAsync(applicationRole); if (!createRoleResult.Succeeded) throw new AppException(string.Join('|', createRoleResult.Errors)); foreach (var claim in request.Permissions) - await _roleManager.AddClaimAsync(applicationRole, new Claim(CustomClaimType.Permission, claim)); + await roleManager.AddClaimAsync(applicationRole, new Claim(CustomClaimType.Permission, claim)); return applicationRole; } @@ -393,7 +379,7 @@ public class UserService : IUserService { if (request.EnglishName.IsNullOrEmpty()) throw new AppException("لطفا نام انگلیسی را وارد کنید"); - var applicationRole = await _roleManager.FindByIdAsync(request.RoleId.ToString()); + var applicationRole = await roleManager.FindByIdAsync(request.RoleId.ToString()); if (applicationRole == null) throw new AppException("نقش پیدا نشد"); @@ -402,20 +388,20 @@ public class UserService : IUserService applicationRole.Description = request.Description; applicationRole.Name = $"{request.EnglishName}"; - var createRoleResult = await _roleManager.UpdateAsync(applicationRole); + var createRoleResult = await roleManager.UpdateAsync(applicationRole); if (!createRoleResult.Succeeded) throw new AppException(string.Join('|', createRoleResult.Errors)); - var roleClaims = (await _roleManager.GetClaimsAsync(applicationRole)).Where(c => c.Type == CustomClaimType.Permission).ToList(); + var roleClaims = (await roleManager.GetClaimsAsync(applicationRole)).Where(c => c.Type == CustomClaimType.Permission).ToList(); foreach (var roleClaim in roleClaims.ToList()) { - var removeResult = await _roleManager.RemoveClaimAsync(applicationRole, roleClaim); + var removeResult = await roleManager.RemoveClaimAsync(applicationRole, roleClaim); if (!removeResult.Succeeded) throw new AppException(string.Join(" | ", removeResult.Errors.Select(e => e.Description))); } foreach (var claim in request.Permissions) { - var addResult = await _roleManager.AddClaimAsync(applicationRole, new Claim(CustomClaimType.Permission, claim)); + var addResult = await roleManager.AddClaimAsync(applicationRole, new Claim(CustomClaimType.Permission, claim)); if (!addResult.Succeeded) throw new AppException(string.Join(" | ", addResult.Errors.Select(e => e.Description))); } @@ -425,18 +411,18 @@ public class UserService : IUserService public async Task RemoveRoleAsync(Guid roleId, CancellationToken cancellationToken = default) { - var applicationRole = await _roleManager.FindByIdAsync(roleId.ToString()); + var applicationRole = await roleManager.FindByIdAsync(roleId.ToString()); if (applicationRole == null) throw new AppException("User not found", ApiResultStatusCode.NotFound); - var claims = await _roleManager.GetClaimsAsync(applicationRole); + var claims = await roleManager.GetClaimsAsync(applicationRole); foreach (var claim in claims) - await _roleManager.RemoveClaimAsync(applicationRole, claim); - var users = await _userManager.GetUsersInRoleAsync(applicationRole.Name); + await roleManager.RemoveClaimAsync(applicationRole, claim); + var users = await userManager.GetUsersInRoleAsync(applicationRole.Name); foreach (var user in users) - await _userManager.RemoveFromRoleAsync(user, applicationRole.Name); + await userManager.RemoveFromRoleAsync(user, applicationRole.Name); - var removeResult = await _roleManager.DeleteAsync(applicationRole); + var removeResult = await roleManager.DeleteAsync(applicationRole); if (!removeResult.Succeeded) throw new AppException(string.Join('|', removeResult.Errors.Select(e => e.Description))); return true; diff --git a/Netina.Core/Models/Api/ApiResult.cs b/Netina.Core/Models/Api/ApiResult.cs index bec2426..4186ffa 100644 --- a/Netina.Core/Models/Api/ApiResult.cs +++ b/Netina.Core/Models/Api/ApiResult.cs @@ -1,18 +1,11 @@ namespace Netina.Core.Models.Api; -public class ApiResult +public class ApiResult(bool isSuccess, ApiResultStatusCode statusCode, string message = null) { - public ApiResult(bool isSuccess, ApiResultStatusCode statusCode, string message = null) - { - IsSuccess = isSuccess; - StatusCode = statusCode; - Message = message ?? statusCode.ToDisplay(); - } - - public bool IsSuccess { get; set; } - public ApiResultStatusCode StatusCode { get; set; } + public bool IsSuccess { get; set; } = isSuccess; + public ApiResultStatusCode StatusCode { get; set; } = statusCode; [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] - public string Message { get; set; } + public string Message { get; set; } = message ?? statusCode.ToDisplay(); #region Implicit Operators @@ -61,17 +54,12 @@ public class ApiResult #endregion } -public class ApiResult : ApiResult +public class ApiResult(bool isSuccess, ApiResultStatusCode statusCode, TData data, string message = null) + : ApiResult(isSuccess, statusCode, message) where TData : class { - public ApiResult(bool isSuccess, ApiResultStatusCode statusCode, TData data, string message = null) - : base(isSuccess, statusCode, message) - { - Data = data; - } - [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] - public TData Data { get; set; } + public TData Data { get; set; } = data; #region Implicit Operators diff --git a/Netina.Core/QuartzServices/JobScheduler.cs b/Netina.Core/QuartzServices/JobScheduler.cs index 26843cc..420cf38 100644 --- a/Netina.Core/QuartzServices/JobScheduler.cs +++ b/Netina.Core/QuartzServices/JobScheduler.cs @@ -3,20 +3,11 @@ using Quartz; namespace Netina.Core.QuartzServices; -public class JobScheduler +public class JobScheduler(IScheduler scheduler, ILogger logger) { - private readonly IScheduler _scheduler; - private readonly ILogger _logger; - - public JobScheduler(IScheduler scheduler, ILogger logger) - { - _scheduler = scheduler; - _logger = logger; - } - public void Start() { - _scheduler.Start(); + scheduler.Start(); IJobDetail job = JobBuilder.Create() .WithIdentity("SiteMapJob", "admin") @@ -33,10 +24,10 @@ public class JobScheduler DayOfWeek.Friday)) .StartNow() .Build(); - var offset = _scheduler.ScheduleJob(job, trigger); + var offset = scheduler.ScheduleJob(job, trigger); - _logger.LogInformation($"======== Table Schedulers Set For {offset.Result.ToString()} IN {DateTime.Now.ToString()} ==========="); + logger.LogInformation($"======== Table Schedulers Set For {offset.Result.ToString()} IN {DateTime.Now.ToString()} ==========="); } } \ No newline at end of file diff --git a/Netina.Core/QuartzServices/SiteMapScheduledJob.cs b/Netina.Core/QuartzServices/SiteMapScheduledJob.cs index 8c18586..924c5a0 100644 --- a/Netina.Core/QuartzServices/SiteMapScheduledJob.cs +++ b/Netina.Core/QuartzServices/SiteMapScheduledJob.cs @@ -3,20 +3,12 @@ using Quartz; namespace Netina.Core.QuartzServices; -public class SiteMapScheduledJob : IJob +public class SiteMapScheduledJob(ILogger logger, ISiteMapService siteMapService) + : IJob { - private readonly ILogger _logger; - private readonly ISiteMapService _siteMapService; - - public SiteMapScheduledJob(ILogger logger,ISiteMapService siteMapService) - { - _logger = logger; - _siteMapService = siteMapService; - } - public async Task Execute(IJobExecutionContext context) { - await _siteMapService.CreateSiteMapAsync(); - _logger.LogInformation($"Site Map Job Done At : {DateTime.Now}"); + await siteMapService.CreateSiteMapAsync(); + logger.LogInformation($"Site Map Job Done At : {DateTime.Now}"); } } \ No newline at end of file diff --git a/Netina.Domain/Dtos/SmallDtos/StorageFileSDto.cs b/Netina.Domain/Dtos/SmallDtos/StorageFileSDto.cs index 2d1ee26..f6b4c6d 100644 --- a/Netina.Domain/Dtos/SmallDtos/StorageFileSDto.cs +++ b/Netina.Domain/Dtos/SmallDtos/StorageFileSDto.cs @@ -1,6 +1,4 @@ -using Microsoft.IdentityModel.Tokens; - -namespace Netina.Domain.Dtos.SmallDtos; +namespace Netina.Domain.Dtos.SmallDtos; public class StorageFileSDto : BaseDto { diff --git a/Netina.Domain/Entities/Blogs/Blog.Aggregate.cs b/Netina.Domain/Entities/Blogs/Blog.Aggregate.cs index c815276..34a9f8c 100644 --- a/Netina.Domain/Entities/Blogs/Blog.Aggregate.cs +++ b/Netina.Domain/Entities/Blogs/Blog.Aggregate.cs @@ -1,6 +1,4 @@ -using Microsoft.IdentityModel.Tokens; - -namespace Netina.Domain.Entities.Blogs; +namespace Netina.Domain.Entities.Blogs; public partial class Blog { diff --git a/Netina.Domain/Entities/Brands/Brand.cs b/Netina.Domain/Entities/Brands/Brand.cs index b8eaf1b..d9c3967 100644 --- a/Netina.Domain/Entities/Brands/Brand.cs +++ b/Netina.Domain/Entities/Brands/Brand.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Domain.Entities.Brands; +namespace Netina.Domain.Entities.Brands; [AdaptTwoWays("[name]LDto", IgnoreAttributes = new[] { typeof(AdaptIgnoreAttribute) }, MapType = MapType.Map | MapType.MapToTarget | MapType.Projection)] [AdaptTwoWays("[name]SDto", IgnoreAttributes = new[] { typeof(AdaptIgnoreAttribute) }, MapType = MapType.Map | MapType.MapToTarget)] diff --git a/Netina.Domain/Entities/ProductCategories/ProductCategory.Aggregate.cs b/Netina.Domain/Entities/ProductCategories/ProductCategory.Aggregate.cs index ddb03c3..1df9afe 100644 --- a/Netina.Domain/Entities/ProductCategories/ProductCategory.Aggregate.cs +++ b/Netina.Domain/Entities/ProductCategories/ProductCategory.Aggregate.cs @@ -1,6 +1,4 @@ -using System.Web; - -namespace Netina.Domain.Entities.ProductCategories; +namespace Netina.Domain.Entities.ProductCategories; public partial class ProductCategory { diff --git a/Netina.Domain/Entities/Products/Product.Aggregate.cs b/Netina.Domain/Entities/Products/Product.Aggregate.cs index 4fd02e4..5344e7c 100644 --- a/Netina.Domain/Entities/Products/Product.Aggregate.cs +++ b/Netina.Domain/Entities/Products/Product.Aggregate.cs @@ -1,7 +1,4 @@ -using System.Web; -using System.Xml.Linq; - -namespace Netina.Domain.Entities.Products; +namespace Netina.Domain.Entities.Products; public partial class Product { diff --git a/Netina.Domain/MartenEntities/Settings/NavMenuSetting.cs b/Netina.Domain/MartenEntities/Settings/NavMenuSetting.cs index 9fef450..94809dc 100644 --- a/Netina.Domain/MartenEntities/Settings/NavMenuSetting.cs +++ b/Netina.Domain/MartenEntities/Settings/NavMenuSetting.cs @@ -9,11 +9,7 @@ public class NavMenuSetting public class NavMenuItem { - public NavMenuItem() - { - Id = Guid.NewGuid(); - } - public Guid Id { get; set; } + public Guid Id { get; set; } = Guid.NewGuid(); public string Title { get; set; } = string.Empty; public string Url { get; set; } = string.Empty; public Guid ParentId { get; set; } diff --git a/Netina.Infrastructure/RestServices/IKaveNegarRestApi.cs b/Netina.Infrastructure/RestServices/IKaveNegarRestApi.cs index 2d8a115..b51f6ce 100644 --- a/Netina.Infrastructure/RestServices/IKaveNegarRestApi.cs +++ b/Netina.Infrastructure/RestServices/IKaveNegarRestApi.cs @@ -1,6 +1,4 @@ -using Netina.Infrastructure.Models.RestApi.KaveNegar; - -namespace Netina.Infrastructure.RestServices; +namespace Netina.Infrastructure.RestServices; public interface IKaveNegarRestApi { diff --git a/Netina.Infrastructure/RestServices/IRestApiWrapper.cs b/Netina.Infrastructure/RestServices/IRestApiWrapper.cs index a0939cd..1fbb838 100644 --- a/Netina.Infrastructure/RestServices/IRestApiWrapper.cs +++ b/Netina.Infrastructure/RestServices/IRestApiWrapper.cs @@ -1,5 +1,4 @@ -using Netina.Common.Models; -using Netina.Infrastructure.Models; +using Netina.Infrastructure.Models; namespace Netina.Infrastructure.RestServices; diff --git a/Netina.Infrastructure/Services/DistrictService.cs b/Netina.Infrastructure/Services/DistrictService.cs index eaf3152..b7da3ec 100644 --- a/Netina.Infrastructure/Services/DistrictService.cs +++ b/Netina.Infrastructure/Services/DistrictService.cs @@ -1,6 +1,4 @@ -using Netina.Common.Models.Exception; -using Netina.Core.Abstracts; -using Netina.Domain.Models.Districts; +using Netina.Domain.Models.Districts; using Netina.Infrastructure.Models; using Newtonsoft.Json; diff --git a/Netina.Infrastructure/Services/ExternalFilesService.cs b/Netina.Infrastructure/Services/ExternalFilesService.cs index 53fd279..c55ca4d 100644 --- a/Netina.Infrastructure/Services/ExternalFilesService.cs +++ b/Netina.Infrastructure/Services/ExternalFilesService.cs @@ -1,23 +1,15 @@ -using Netina.Core.Abstracts; -using Netina.Domain.Dtos.ResponseDtos; -using Netina.Domain.Models.Settings; -using Netina.Infrastructure.RestServices; +using Netina.Domain.Dtos.ResponseDtos; namespace Netina.Infrastructure.Services; -public class ExternalFilesService : IExternalFilesService +public class ExternalFilesService(IRestApiWrapper restApiWrapper, IOptionsSnapshot snapshot) + : IExternalFilesService { - private readonly IRestApiWrapper _restApiWrapper; - private readonly SiteSettings _siteSetting; + private readonly SiteSettings _siteSetting = snapshot.Value; - public ExternalFilesService(IRestApiWrapper restApiWrapper,IOptionsSnapshot snapshot) - { - _restApiWrapper = restApiWrapper; - _siteSetting = snapshot.Value; - } public async Task GetAdminChangeLogAsync(CancellationToken cancellationToken = default) { - var changeLog = await _restApiWrapper.FileRestApi(_siteSetting.AdminPanelBaseUrl).GetAdminChangeLog(); + var changeLog = await restApiWrapper.FileRestApi(_siteSetting.AdminPanelBaseUrl).GetAdminChangeLog(); return changeLog; } } \ No newline at end of file diff --git a/Netina.Infrastructure/Services/Scrapers/DigikalaScraper.cs b/Netina.Infrastructure/Services/Scrapers/DigikalaScraper.cs index d69c51a..45bcdb3 100644 --- a/Netina.Infrastructure/Services/Scrapers/DigikalaScraper.cs +++ b/Netina.Infrastructure/Services/Scrapers/DigikalaScraper.cs @@ -1,6 +1,5 @@ using MediatR; using Microsoft.EntityFrameworkCore; -using Microsoft.IdentityModel.Tokens; using Netina.Domain.CommandQueries.Commands; using Netina.Domain.Dtos.ScraperDtos.Response; using Netina.Domain.Dtos.SmallDtos; @@ -10,23 +9,16 @@ using Netina.Repository.Repositories.Base.Contracts; namespace Netina.Infrastructure.Services.Scrapers; -public class DigikalaScraper : IDigikalaScraper +public class DigikalaScraper( + IRestApiWrapper apiWrapper, + IRepositoryWrapper repositoryWrapper, + IMediator mediator, + IUploadFileService uploadFileService) + : IDigikalaScraper { - private readonly IRestApiWrapper _apiWrapper; - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; - private readonly IUploadFileService _uploadFileService; - - public DigikalaScraper(IRestApiWrapper apiWrapper, IRepositoryWrapper repositoryWrapper, IMediator mediator, IUploadFileService uploadFileService) - { - _apiWrapper = apiWrapper; - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - _uploadFileService = uploadFileService; - } public async Task> GetProductsByNameAsync(string productName) { - var products = await _apiWrapper.DigikalaRestApi.SearchProductAsync(productName); + var products = await apiWrapper.DigikalaRestApi.SearchProductAsync(productName); return products.data.products.Select(s => new ScraperProductDto { PersianName = s.title_fa, @@ -40,7 +32,7 @@ public class DigikalaScraper : IDigikalaScraper public async Task AddProductToShopAsync(string productId, string productName, CancellationToken cancellationToken = default) { - var response = await _apiWrapper.DigikalaRestApi.GetProductAsync(productId); + var response = await apiWrapper.DigikalaRestApi.GetProductAsync(productId); var digiProduct = response.data; var newSummery = digiProduct.seo.description.Replace("فروشگاه اینترنتی دیجی\u200cکالا", "فروشگاه اینترنتی وسمه"); @@ -63,7 +55,7 @@ public class DigikalaScraper : IDigikalaScraper FileUploadType = FileUploadType.Image, ContentType = "image/jpeg" }; - var uploadResponse = await _uploadFileService.UploadImageAsync(uploadFile); + var uploadResponse = await uploadFileService.UploadImageAsync(uploadFile); var files = new List { new StorageFileSDto @@ -73,26 +65,26 @@ public class DigikalaScraper : IDigikalaScraper IsPrimary = true, } }; - var nonBrand = await _repositoryWrapper.SetRepository() + var nonBrand = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(b => b.PersianName == "بدون برند", cancellationToken); if (nonBrand == null) { nonBrand = Brand.Create("بدون برند" , "NoBrand","محصولات بدون برند",false,string.Empty); - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Add(nonBrand); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } - var nonCat = await _repositoryWrapper.SetRepository() + var nonCat = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(b => b.Name == "دسته بندی نشده", cancellationToken); if (nonCat == null) { nonCat = ProductCategory.Create("دسته بندی نشده", "محصولات بدون دسته بندی", false); - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Add(nonCat); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } if (digiProduct.product.title_en.IsNullOrEmpty()) @@ -103,7 +95,7 @@ public class DigikalaScraper : IDigikalaScraper string.Empty, string.Empty, string.Empty, true, 0, 0, 0, false , 5, false, nonBrand.Id, nonCat.Id, new DiscountSDto(), specifications, files,new Dictionary(),new Dictionary()); - await _mediator.Send(request, cancellationToken); + await mediator.Send(request, cancellationToken); return true; } diff --git a/Netina.Infrastructure/Services/SmsService.cs b/Netina.Infrastructure/Services/SmsService.cs index 78caf85..b98aca6 100644 --- a/Netina.Infrastructure/Services/SmsService.cs +++ b/Netina.Infrastructure/Services/SmsService.cs @@ -1,25 +1,17 @@ namespace Netina.Infrastructure.Services; -public class SmsService : ISmsService +public class SmsService( + IRestApiWrapper restApiWrapper, + IOptionsSnapshot optionsSnapshot, + ILogger logger, + IHostEnvironment environment) + : ISmsService { - private readonly IRestApiWrapper _restApiWrapper; - private readonly ILogger _logger; - private readonly IHostEnvironment _environment; - private readonly SiteSettings _siteSettings; - public SmsService( - IRestApiWrapper restApiWrapper, - IOptionsSnapshot optionsSnapshot, - ILogger logger, - IHostEnvironment environment) - { - _restApiWrapper = restApiWrapper; - _logger = logger; - _environment = environment; - _siteSettings = optionsSnapshot.Value; - } + private readonly SiteSettings _siteSettings = optionsSnapshot.Value; + public async Task SendForgerPasswordAsync(string phoneNumber, string newPassword) { - var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, newPassword, + var rest = await restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, newPassword, null, null , null, null, "forgetPassword"); @@ -32,24 +24,24 @@ public class SmsService : ISmsService try { - var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, _siteSettings.LoginOtpTemplate,verifyCode); + var rest = await restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, _siteSettings.LoginOtpTemplate,verifyCode); - if (rest.Return.status != 200 && _environment.IsProduction()) + if (rest.Return.status != 200 && environment.IsProduction()) throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message); } catch (ApiException apiException) { - if (_environment.IsProduction()) + if (environment.IsProduction()) throw; else - _logger.LogError(apiException.Message); + logger.LogError(apiException.Message); } catch (Exception apiException) { - if (_environment.IsProduction()) + if (environment.IsProduction()) throw; else - _logger.LogError(apiException.Message); + logger.LogError(apiException.Message); } } @@ -57,18 +49,18 @@ public class SmsService : ISmsService { try { - var rest = await _restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber,template,token,token2,token3,token10,token20); + 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); + logger.LogError(apiException.Message); } catch (Exception apiException) { - _logger.LogError(apiException.Message); + logger.LogError(apiException.Message); } } diff --git a/Netina.Infrastructure/Services/StorageService.cs b/Netina.Infrastructure/Services/StorageService.cs index 1522ef1..debf187 100644 --- a/Netina.Infrastructure/Services/StorageService.cs +++ b/Netina.Infrastructure/Services/StorageService.cs @@ -1,24 +1,14 @@ -using Netina.Common.Extensions; -using Netina.Core.Abstracts; -using Netina.Domain.Dtos.SmallDtos; +using Netina.Domain.Dtos.SmallDtos; using Netina.Domain.Enums; -using Netina.Domain.Models.Settings; namespace Netina.Infrastructure.Services; -public class StorageService : IStorageService +public class StorageService(IOptionsSnapshot snapshot) : IStorageService { private IAmazonS3? _s3Client; - private readonly string _bucketName; - private readonly string _accessKey; - private readonly string _secretKey; - - public StorageService(IOptionsSnapshot snapshot) - { - _accessKey = snapshot.Value.StorageSetting.AccessKey; - _bucketName = snapshot.Value.StorageSetting.BucketKey; - _secretKey = snapshot.Value.StorageSetting.SecretKey; - } + private readonly string _bucketName = snapshot.Value.StorageSetting.BucketKey; + private readonly string _accessKey = snapshot.Value.StorageSetting.AccessKey; + private readonly string _secretKey = snapshot.Value.StorageSetting.SecretKey; private IAmazonS3 GetClientAsync() { diff --git a/Netina.Infrastructure/Services/UploadFileService.cs b/Netina.Infrastructure/Services/UploadFileService.cs index f2778bd..27fa15f 100644 --- a/Netina.Infrastructure/Services/UploadFileService.cs +++ b/Netina.Infrastructure/Services/UploadFileService.cs @@ -1,21 +1,12 @@ -using Netina.Common.Extensions; -using Netina.Common.Models.Api; -using Netina.Core.Abstracts; -using Netina.Core.Utilities; +using Netina.Core.Utilities; namespace Netina.Infrastructure.Services; -public class UploadFileService : IUploadFileService +public class UploadFileService(IStorageService storageService, IOptionsSnapshot optionsSnapshot) + : IUploadFileService { - private readonly IStorageService _storageService; - private readonly SiteSettings _siteSetting; + private readonly SiteSettings _siteSetting = optionsSnapshot.Value; - public UploadFileService(IStorageService storageService,IOptionsSnapshot optionsSnapshot) - { - _storageService = storageService; - _siteSetting = optionsSnapshot.Value; - - } public async Task UploadImageAsync(FileUploadRequest uploadRequest) { var bytes = Convert.FromBase64String(uploadRequest.StringBaseFile); @@ -30,13 +21,13 @@ public class UploadFileService : IUploadFileService if (uploadRequest.FileUploadType == FileUploadType.Logo) { uploadRequest.FileName = $"Main.{uploadRequest.FileName.Split('.').Last()}"; - medFileName = await _storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Med", uploadRequest.ContentType, mediumFileStream,false); - await _storageService.UploadObjectFromFileAsync(medFileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Thumb", uploadRequest.ContentType, thumbnailFileStream, false); + medFileName = await storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Med", uploadRequest.ContentType, mediumFileStream,false); + await storageService.UploadObjectFromFileAsync(medFileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Thumb", uploadRequest.ContentType, thumbnailFileStream, false); } else { - medFileName = await _storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Med", uploadRequest.ContentType, mediumFileStream); - await _storageService.UploadObjectFromFileAsync(medFileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Thumb", uploadRequest.ContentType, thumbnailFileStream, false); + medFileName = await storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Med", uploadRequest.ContentType, mediumFileStream); + await storageService.UploadObjectFromFileAsync(medFileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Thumb", uploadRequest.ContentType, thumbnailFileStream, false); } var response = new FileUploadResponse @@ -51,7 +42,7 @@ public class UploadFileService : IUploadFileService public async Task UploadFileByteAsync(FileUploadRequest uploadRequest) { - var medFileName = await _storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}", uploadRequest.ContentType, uploadRequest.FileBytes,false); + var medFileName = await storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}", uploadRequest.ContentType, uploadRequest.FileBytes,false); var response = new FileUploadResponse { FileName = medFileName, diff --git a/Netina.Infrastructure/Services/ZarinpalService.cs b/Netina.Infrastructure/Services/ZarinpalService.cs index d55f45b..064c42d 100644 --- a/Netina.Infrastructure/Services/ZarinpalService.cs +++ b/Netina.Infrastructure/Services/ZarinpalService.cs @@ -1,35 +1,26 @@ using MediatR; -using Microsoft.IdentityModel.Tokens; -using Netina.Common.Models.Exception; -using Netina.Core.Abstracts; using Netina.Core.BaseServices.Abstracts; using Netina.Domain.CommandQueries.Commands; using Netina.Domain.CommandQueries.Queries; using Netina.Domain.Enums; using Netina.Domain.MartenEntities.Settings; -using Netina.Domain.Models.Settings; using Netina.Infrastructure.Models.RestApi.Zarinpal; -using Netina.Infrastructure.RestServices; using Newtonsoft.Json; namespace Netina.Infrastructure.Services; -public class ZarinpalService : IPaymentService +public class ZarinpalService( + IRestApiWrapper restApiWrapper, + IOptionsSnapshot snapshot, + IMediator mediator, + ISettingService settingService) + : IPaymentService { - private readonly IRestApiWrapper _restApiWrapper; - private readonly IMediator _mediator; - private readonly ISettingService _settingService; - private readonly SiteSettings _siteSettings; - public ZarinpalService(IRestApiWrapper restApiWrapper, IOptionsSnapshot snapshot, IMediator mediator , ISettingService settingService) - { - _restApiWrapper = restApiWrapper; - _mediator = mediator; - _settingService = settingService; - _siteSettings = snapshot.Value; - } + private readonly SiteSettings _siteSettings = snapshot.Value; + public async Task GetPaymentLinkAsync(double amount, string factorNumber, Guid orderId, Guid userId, string phoneNumber, string fullName, CancellationToken cancellationToken = default) { - var paymentSetting = (await _settingService.GetSettingAsync("PaymentSetting", cancellationToken)) as PaymentSetting; + var paymentSetting = (await settingService.GetSettingAsync("PaymentSetting", cancellationToken)) as PaymentSetting; if (paymentSetting == null) throw new AppException("تنظیمات پرداخت انجام نشده است"); if (paymentSetting.ZarinPalApiKey.IsNullOrEmpty()) @@ -43,13 +34,13 @@ public class ZarinpalService : IPaymentService merchant_id = paymentSetting.ZarinPalApiKey, metadata = new ZarinaplPaymentLinkRequestMetadata { mobile = phoneNumber } }; - var responseJson = await _restApiWrapper.ZarinpalRestApi.GetPaymentLinkAsync(request); + var responseJson = await restApiWrapper.ZarinpalRestApi.GetPaymentLinkAsync(request); var response = JsonConvert.DeserializeObject(responseJson); if (response.data.code != 100) throw new AppException($"Exception in get link from zarinpal | {response.data.message}"); - var createPaymentResult = await _mediator.Send(new CreateOrUpdatePaymentCommand(null, factorNumber, amount, + var createPaymentResult = await mediator.Send(new CreateOrUpdatePaymentCommand(null, factorNumber, amount, request.description, string.Empty, string.Empty, response.data.authority, PaymentType.Online, PaymentStatus.InPaymentGateway, orderId, userId), cancellationToken); @@ -59,20 +50,20 @@ public class ZarinpalService : IPaymentService public async Task> VerifyPaymentAsync(string authority, CancellationToken cancellationToken = default) { - var paymentSetting = (await _settingService.GetSettingAsync("PaymentSetting", cancellationToken)) as PaymentSetting; + var paymentSetting = (await settingService.GetSettingAsync("PaymentSetting", cancellationToken)) as PaymentSetting; if (paymentSetting == null) throw new AppException("تنظیمات پرداخت انجام نشده است"); if (paymentSetting.ZarinPalApiKey.IsNullOrEmpty()) throw new AppException("کد مرچنت زرین پال وارد نشده است"); - var payment = await _mediator.Send(new GetPaymentQuery(Authority: authority), cancellationToken); + var payment = await mediator.Send(new GetPaymentQuery(Authority: authority), cancellationToken); var request = new ZarinaplVerifyPaymentRequest { amount = (int)payment.Amount, authority = payment.Authority, merchant_id = paymentSetting.ZarinPalApiKey }; - var response = await _restApiWrapper.ZarinpalRestApi.VerifyPaymentAsync(request); + var response = await restApiWrapper.ZarinpalRestApi.VerifyPaymentAsync(request); if (response.data.code != 100) throw new AppException($"Exception in get link from zarinpal | {response.data.message}"); @@ -80,11 +71,11 @@ public class ZarinpalService : IPaymentService payment.CardPan = response.data.card_pan; payment.TransactionCode = response.data.ref_id.ToString(); - await _mediator.Send(new CreateOrUpdatePaymentCommand(payment.Id, payment.FactorNumber, payment.Amount, payment.Description, + await mediator.Send(new CreateOrUpdatePaymentCommand(payment.Id, payment.FactorNumber, payment.Amount, payment.Description, payment.TransactionCode, payment.CardPan, payment.Authority, payment.Type, payment.Status, payment.OrderId, payment.CustomerId), cancellationToken); - await _mediator.Send(new SubmitOrderPaymentCommand(payment.OrderId, OrderPaymentMethod.OnlinePayment, true), + await mediator.Send(new SubmitOrderPaymentCommand(payment.OrderId, OrderPaymentMethod.OnlinePayment, true), cancellationToken); return new Tuple(payment.TransactionCode, payment.FactorNumber); diff --git a/Netina.Repository/Behaviors/ValidationBehavior.cs b/Netina.Repository/Behaviors/ValidationBehavior.cs index 1f8599c..8d0c2b3 100644 --- a/Netina.Repository/Behaviors/ValidationBehavior.cs +++ b/Netina.Repository/Behaviors/ValidationBehavior.cs @@ -3,19 +3,15 @@ using ValidationException = Netina.Common.Models.Exception.ValidationException; namespace Netina.Repository.Behaviors; -public class ValidationBehavior : IPipelineBehavior where TRequest : notnull +public class ValidationBehavior(IEnumerable> validators) + : IPipelineBehavior + where TRequest : notnull { - private readonly IEnumerable> _validators; - - public ValidationBehavior(IEnumerable> validators) - { - _validators = validators; - } public async Task Handle(TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { var context = new ValidationContext(request); List errors = new List(); - foreach (IValidator validator in _validators) + foreach (IValidator validator in validators) { var result = await validator.ValidateAsync(context, cancellationToken); if (!result.IsValid) diff --git a/Netina.Repository/Extensions/DbContextOptionCustomExtensionsInfo.cs b/Netina.Repository/Extensions/DbContextOptionCustomExtensionsInfo.cs index 4f3072f..a22ed7b 100644 --- a/Netina.Repository/Extensions/DbContextOptionCustomExtensionsInfo.cs +++ b/Netina.Repository/Extensions/DbContextOptionCustomExtensionsInfo.cs @@ -1,14 +1,10 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Infrastructure; namespace Netina.Repository.Extensions; -public class DbContextOptionCustomExtensionsInfo : DbContextOptionsExtensionInfo +public class DbContextOptionCustomExtensionsInfo(IDbContextOptionsExtension extension) + : DbContextOptionsExtensionInfo(extension) { - public DbContextOptionCustomExtensionsInfo(IDbContextOptionsExtension extension) : base(extension) - { - } - public override bool IsDatabaseProvider { get; } public override string LogFragment { get; } = string.Empty; diff --git a/Netina.Repository/Extensions/ModelBuilderExtensions.cs b/Netina.Repository/Extensions/ModelBuilderExtensions.cs index 3ad87e4..7558d0a 100644 --- a/Netina.Repository/Extensions/ModelBuilderExtensions.cs +++ b/Netina.Repository/Extensions/ModelBuilderExtensions.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Extensions; +namespace Netina.Repository.Extensions; public class ModelBuilderQueryFilter { diff --git a/Netina.Repository/Handlers/Accounting/CreateOrUpdatePaymentCommandHandler.cs b/Netina.Repository/Handlers/Accounting/CreateOrUpdatePaymentCommandHandler.cs index 39b7566..f835922 100644 --- a/Netina.Repository/Handlers/Accounting/CreateOrUpdatePaymentCommandHandler.cs +++ b/Netina.Repository/Handlers/Accounting/CreateOrUpdatePaymentCommandHandler.cs @@ -1,21 +1,15 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Accounting; +using Netina.Domain.Entities.Accounting; namespace Netina.Repository.Handlers.Accounting; -public class CreateOrUpdatePaymentCommandHandler : IRequestHandler +public class CreateOrUpdatePaymentCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CreateOrUpdatePaymentCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(CreateOrUpdatePaymentCommand request, CancellationToken cancellationToken) { if (request.Id != null) { - var ent = await _repositoryWrapper.SetRepository() + var ent = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(p => p.Id == request.Id, cancellationToken); if (ent == null) @@ -27,14 +21,14 @@ public class CreateOrUpdatePaymentCommandHandler : IRequestHandler() + repositoryWrapper.SetRepository() .Update(newEnt); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } else { - var orderPayment = await _repositoryWrapper.SetRepository() + var orderPayment = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(p => p.OrderId == request.OrderId && p.Type == request.Type,cancellationToken); if (orderPayment != null) @@ -45,20 +39,20 @@ public class CreateOrUpdatePaymentCommandHandler : IRequestHandler() + repositoryWrapper.SetRepository() .Update(newEnt); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } else { var payment = Payment.Create(request.FactorNumber, request.Amount, request.Description, request.TransactionCode, request.CardPan, request.Authority, request.Type, request.Status, request.OrderId, request.UserId); - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Add(payment); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } } return true; diff --git a/Netina.Repository/Handlers/Accounting/GetPaymentQueryHandler.cs b/Netina.Repository/Handlers/Accounting/GetPaymentQueryHandler.cs index 3f88cef..d71a695 100644 --- a/Netina.Repository/Handlers/Accounting/GetPaymentQueryHandler.cs +++ b/Netina.Repository/Handlers/Accounting/GetPaymentQueryHandler.cs @@ -1,22 +1,16 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Accounting; +using Netina.Domain.Entities.Accounting; namespace Netina.Repository.Handlers.Accounting; -public class GetPaymentQueryHandler : IRequestHandler +public class GetPaymentQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetPaymentQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(GetPaymentQuery request, CancellationToken cancellationToken) { PaymentSDto? payment = null; if (request.Authority != null) { - payment = await _repositoryWrapper.SetRepository() + payment = await repositoryWrapper.SetRepository() .TableNoTracking .Where(p => p.Authority == request.Authority) .Select(PaymentMapper.ProjectToSDto) @@ -27,7 +21,7 @@ public class GetPaymentQueryHandler : IRequestHandler() + payment = await repositoryWrapper.SetRepository() .TableNoTracking .Where(p => p.Id == request.Id) .Select(PaymentMapper.ProjectToSDto) diff --git a/Netina.Repository/Handlers/Accounting/GetPaymentsQueryHandler.cs b/Netina.Repository/Handlers/Accounting/GetPaymentsQueryHandler.cs index 9ccd533..c22fcc6 100644 --- a/Netina.Repository/Handlers/Accounting/GetPaymentsQueryHandler.cs +++ b/Netina.Repository/Handlers/Accounting/GetPaymentsQueryHandler.cs @@ -1,19 +1,13 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Accounting; +using Netina.Domain.Entities.Accounting; namespace Netina.Repository.Handlers.Accounting; -public class GetPaymentsQueryHandler : IRequestHandler> +public class GetPaymentsQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetPaymentsQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetPaymentsQuery request, CancellationToken cancellationToken) { - return await _repositoryWrapper.SetRepository() + return await repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(o=>o.CreatedAt) .Skip(20 * request.Page) diff --git a/Netina.Repository/Handlers/Addresses/CreateAddressCommandHandler.cs b/Netina.Repository/Handlers/Addresses/CreateAddressCommandHandler.cs index f9e5a74..b930fcd 100644 --- a/Netina.Repository/Handlers/Addresses/CreateAddressCommandHandler.cs +++ b/Netina.Repository/Handlers/Addresses/CreateAddressCommandHandler.cs @@ -1,20 +1,13 @@ namespace Netina.Repository.Handlers.Addresses; -public class CreateAddressCommandHandler : IRequestHandler +public class CreateAddressCommandHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - - public CreateAddressCommandHandler(IRepositoryWrapper repositoryWrapper,ICurrentUserService currentUserService) - { - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - } public async Task Handle(CreateAddressCommand request, CancellationToken cancellationToken) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("User id notfound", ApiResultStatusCode.BadRequest); - if (!Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (!Guid.TryParse(currentUserService.UserId, out Guid userId)) throw new AppException("User id wrong", ApiResultStatusCode.BadRequest); @@ -22,8 +15,8 @@ public class CreateAddressCommandHandler : IRequestHandler().Add(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Add(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return false; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Addresses/DeleteAddressCommandHandler.cs b/Netina.Repository/Handlers/Addresses/DeleteAddressCommandHandler.cs index ad5436b..5e12053 100644 --- a/Netina.Repository/Handlers/Addresses/DeleteAddressCommandHandler.cs +++ b/Netina.Repository/Handlers/Addresses/DeleteAddressCommandHandler.cs @@ -1,25 +1,18 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Addresses; -namespace Netina.Repository.Handlers.Addresses; - -public class DeleteAddressCommandHandler : IRequestHandler +public class DeleteAddressCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public DeleteAddressCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(DeleteAddressCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository() + var ent = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(u => u.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("Address not found", ApiResultStatusCode.NotFound); - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Delete(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Addresses/GetUserAddressesQueryHandler.cs b/Netina.Repository/Handlers/Addresses/GetUserAddressesQueryHandler.cs index cd0633d..3018381 100644 --- a/Netina.Repository/Handlers/Addresses/GetUserAddressesQueryHandler.cs +++ b/Netina.Repository/Handlers/Addresses/GetUserAddressesQueryHandler.cs @@ -1,17 +1,8 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Addresses; -namespace Netina.Repository.Handlers.Addresses; - -public class GetUserAddressesQueryHandler : IRequestHandler> +public class GetUserAddressesQueryHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly ICurrentUserService _currentUserService; - - public GetUserAddressesQueryHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService) - { - _repositoryWrapper = repositoryWrapper; - _currentUserService = currentUserService; - } public async Task> Handle(GetUserAddressesQuery request, CancellationToken cancellationToken) { Guid userId; @@ -19,13 +10,13 @@ public class GetUserAddressesQueryHandler : IRequestHandler() + return await repositoryWrapper.SetRepository() .TableNoTracking .Where(ua => ua.UserId == userId) .Select(UserAddressMapper.ProjectToSDto) diff --git a/Netina.Repository/Handlers/Blogs/GetBlogsQueryHandler.cs b/Netina.Repository/Handlers/Blogs/GetBlogsQueryHandler.cs index 3a0457f..46324e6 100644 --- a/Netina.Repository/Handlers/Blogs/GetBlogsQueryHandler.cs +++ b/Netina.Repository/Handlers/Blogs/GetBlogsQueryHandler.cs @@ -1,23 +1,17 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Blogs; +using Netina.Domain.Entities.Blogs; namespace Netina.Repository.Handlers.Blogs; -public class GetBlogsQueryHandler : IRequestHandler +public class GetBlogsQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetBlogsQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle (GetBlogsQuery request, CancellationToken cancellationToken) { var response = new GetBlogsResponseDto(); int count = 20; if (request.Count != null) count = request.Count.Value; - var query = _repositoryWrapper.SetRepository().TableNoTracking; + var query = repositoryWrapper.SetRepository().TableNoTracking; if (request.CategoryId != null) query = query.Where(b => b.CategoryId == request.CategoryId); if (request.BlogName != null) diff --git a/Netina.Repository/Handlers/Brands/DeleteBrandCommandHandler.cs b/Netina.Repository/Handlers/Brands/DeleteBrandCommandHandler.cs index 8a253b8..4248fb3 100644 --- a/Netina.Repository/Handlers/Brands/DeleteBrandCommandHandler.cs +++ b/Netina.Repository/Handlers/Brands/DeleteBrandCommandHandler.cs @@ -1,24 +1,17 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Brands; +using Netina.Domain.Entities.Brands; namespace Netina.Repository.Handlers.Brands; -public class DeleteBrandCommandHandler : IRequestHandler +public class DeleteBrandCommandHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public DeleteBrandCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(DeleteBrandCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(b => b.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("Brand not found"); - _repositoryWrapper.SetRepository().Delete(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } diff --git a/Netina.Repository/Handlers/Brands/GetBrandsQueryHandler.cs b/Netina.Repository/Handlers/Brands/GetBrandsQueryHandler.cs index 7b2f0cd..a01db4f 100644 --- a/Netina.Repository/Handlers/Brands/GetBrandsQueryHandler.cs +++ b/Netina.Repository/Handlers/Brands/GetBrandsQueryHandler.cs @@ -1,18 +1,12 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Brands; +using Netina.Domain.Entities.Brands; namespace Netina.Repository.Handlers.Brands; -public class GetBrandsQueryHandler : IRequestHandler> +public class GetBrandsQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - private readonly IMediator _mediator; + private readonly IMediator _mediator = mediator; - public GetBrandsQueryHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator) - { - _repositoryWrapper = repositoryWrapper; - _mediator = mediator; - } public async Task> Handle(GetBrandsQuery request, CancellationToken cancellationToken) { IQueryable baseBrands; @@ -21,7 +15,7 @@ public class GetBrandsQueryHandler : IRequestHandler() + var brandGrouped = await repositoryWrapper.SetRepository() .TableNoTracking .Where(p => p.CategoryId == request.CategoryId) .GroupBy(p=>p.BrandId) @@ -30,7 +24,7 @@ public class GetBrandsQueryHandler : IRequestHandler() + var brand = await repositoryWrapper.SetRepository() .TableNoTracking .Where(b => b.Id == grouping.Key) .Select(BrandMapper.ProjectToSDto) @@ -45,7 +39,7 @@ public class GetBrandsQueryHandler : IRequestHandler() + baseBrands = repositoryWrapper.SetRepository() .TableNoTracking .Where(b => b.PersianName.Trim().Contains(request.BrandName.Trim())) .OrderByDescending(b => b.CreatedAt); @@ -53,7 +47,7 @@ public class GetBrandsQueryHandler : IRequestHandler().TableNoTracking + baseBrands = repositoryWrapper.SetRepository().TableNoTracking .OrderByDescending(b => b.CreatedAt); } diff --git a/Netina.Repository/Handlers/Discounts/CreateDiscountCommandHandler.cs b/Netina.Repository/Handlers/Discounts/CreateDiscountCommandHandler.cs index 689943d..56c8dae 100644 --- a/Netina.Repository/Handlers/Discounts/CreateDiscountCommandHandler.cs +++ b/Netina.Repository/Handlers/Discounts/CreateDiscountCommandHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.Discounts; +namespace Netina.Repository.Handlers.Discounts; public class CreateDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler diff --git a/Netina.Repository/Handlers/Discounts/DeleteDiscountCommandHandler.cs b/Netina.Repository/Handlers/Discounts/DeleteDiscountCommandHandler.cs index 65f77e6..9e8da04 100644 --- a/Netina.Repository/Handlers/Discounts/DeleteDiscountCommandHandler.cs +++ b/Netina.Repository/Handlers/Discounts/DeleteDiscountCommandHandler.cs @@ -1,24 +1,17 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Discounts; -namespace Netina.Repository.Handlers.Discounts; - -public class DeleteDiscountCommandHandler : IRequestHandler +public class DeleteDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public DeleteDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(DeleteDiscountCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(d => d.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("Discount NotFound", ApiResultStatusCode.NotFound); - _repositoryWrapper.SetRepository().Delete(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Discounts/GetDiscountQueryHandler.cs b/Netina.Repository/Handlers/Discounts/GetDiscountQueryHandler.cs index e3d2897..bee997a 100644 --- a/Netina.Repository/Handlers/Discounts/GetDiscountQueryHandler.cs +++ b/Netina.Repository/Handlers/Discounts/GetDiscountQueryHandler.cs @@ -1,18 +1,11 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Discounts; -namespace Netina.Repository.Handlers.Discounts; - -public class GetDiscountQueryHandler : IRequestHandler +public class GetDiscountQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetDiscountQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(GetDiscountQuery request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .Where(b => b.Id == request.Id) .Select(DiscountMapper.ProjectToLDto) .FirstOrDefaultAsync(cancellationToken); diff --git a/Netina.Repository/Handlers/Discounts/GetDiscountsQueryHandler.cs b/Netina.Repository/Handlers/Discounts/GetDiscountsQueryHandler.cs index da8f6d4..4e689c2 100644 --- a/Netina.Repository/Handlers/Discounts/GetDiscountsQueryHandler.cs +++ b/Netina.Repository/Handlers/Discounts/GetDiscountsQueryHandler.cs @@ -1,18 +1,11 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Discounts; -namespace Netina.Repository.Handlers.Discounts; - -public class GetDiscountsQueryHandler : IRequestHandler> +public class GetDiscountsQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetDiscountsQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetDiscountsQuery request, CancellationToken cancellationToken) { - var discounts = await _repositoryWrapper.SetRepository().TableNoTracking + var discounts = await repositoryWrapper.SetRepository().TableNoTracking .Where(d=>!d.IsSpecialOffer) .OrderByDescending(b => b.CreatedAt) .Skip(request.Page * 15).Take(15) diff --git a/Netina.Repository/Handlers/Discounts/UpdateDiscountCommandHandler.cs b/Netina.Repository/Handlers/Discounts/UpdateDiscountCommandHandler.cs index e3f035e..1cc746d 100644 --- a/Netina.Repository/Handlers/Discounts/UpdateDiscountCommandHandler.cs +++ b/Netina.Repository/Handlers/Discounts/UpdateDiscountCommandHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.Discounts; +namespace Netina.Repository.Handlers.Discounts; public class UpdateDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler diff --git a/Netina.Repository/Handlers/Marketers/GetMarketersQueryHandler.cs b/Netina.Repository/Handlers/Marketers/GetMarketersQueryHandler.cs index ec3a1cd..997876a 100644 --- a/Netina.Repository/Handlers/Marketers/GetMarketersQueryHandler.cs +++ b/Netina.Repository/Handlers/Marketers/GetMarketersQueryHandler.cs @@ -1,18 +1,11 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Marketers; -namespace Netina.Repository.Handlers.Marketers; - -public class GetMarketersQueryHandler : IRequestHandler> +public class GetMarketersQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetMarketersQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetMarketersQuery request, CancellationToken cancellationToken) { - var query = _repositoryWrapper.SetRepository() + var query = repositoryWrapper.SetRepository() .TableNoTracking; return await query.OrderByDescending(q => q.CreatedAt) diff --git a/Netina.Repository/Handlers/Newsletters/CreateNewsletterMemberCommandHandler.cs b/Netina.Repository/Handlers/Newsletters/CreateNewsletterMemberCommandHandler.cs index 0d3e140..76eb622 100644 --- a/Netina.Repository/Handlers/Newsletters/CreateNewsletterMemberCommandHandler.cs +++ b/Netina.Repository/Handlers/Newsletters/CreateNewsletterMemberCommandHandler.cs @@ -1,23 +1,15 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.IdentityModel.Tokens; +namespace Netina.Repository.Handlers.Newsletters; -namespace Netina.Repository.Handlers.Newsletters; - -public class CreateNewsletterMemberCommandHandler : IRequestHandler +public class CreateNewsletterMemberCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CreateNewsletterMemberCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(CreateNewsletterMemberCommand request, CancellationToken cancellationToken) { if (request.PhoneNumber.IsNullOrEmpty() && request.Email.IsNullOrEmpty()) throw new AppException("PhoneNumber and Email is null"); if (!request.PhoneNumber.IsNullOrEmpty()) { - var existedPhoneNumber = await _repositoryWrapper.SetRepository() + var existedPhoneNumber = await repositoryWrapper.SetRepository() .TableNoTracking .AnyAsync(c => c.PhoneNumber == request.PhoneNumber, cancellationToken); if (existedPhoneNumber == true) @@ -25,7 +17,7 @@ public class CreateNewsletterMemberCommandHandler : IRequestHandler() + var existedEmail = await repositoryWrapper.SetRepository() .TableNoTracking .AnyAsync(c => c.Email == request.Email, cancellationToken); if (existedEmail == true) @@ -33,9 +25,9 @@ public class CreateNewsletterMemberCommandHandler : IRequestHandler() + repositoryWrapper.SetRepository() .Add(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Newsletters/GetNewsletterMembersQueryHandler.cs b/Netina.Repository/Handlers/Newsletters/GetNewsletterMembersQueryHandler.cs index 1d7a40f..31d95bf 100644 --- a/Netina.Repository/Handlers/Newsletters/GetNewsletterMembersQueryHandler.cs +++ b/Netina.Repository/Handlers/Newsletters/GetNewsletterMembersQueryHandler.cs @@ -1,18 +1,11 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Newsletters; -namespace Netina.Repository.Handlers.Newsletters; - -public class GetNewsletterMembersQueryHandler : IRequestHandler> +public class GetNewsletterMembersQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetNewsletterMembersQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetNewsletterMembersQuery request, CancellationToken cancellationToken) { - var dtos = await _repositoryWrapper.SetRepository() + var dtos = await repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(n => n.CreatedAt) .Select(NewsletterMemberMapper.ProjectToSDto) diff --git a/Netina.Repository/Handlers/Newsletters/Validators/CreateNewsletterMemberCommandValidator.cs b/Netina.Repository/Handlers/Newsletters/Validators/CreateNewsletterMemberCommandValidator.cs index e50ee7f..ab68d70 100644 --- a/Netina.Repository/Handlers/Newsletters/Validators/CreateNewsletterMemberCommandValidator.cs +++ b/Netina.Repository/Handlers/Newsletters/Validators/CreateNewsletterMemberCommandValidator.cs @@ -1,5 +1,4 @@ using FluentValidation; -using Microsoft.IdentityModel.Tokens; namespace Netina.Repository.Handlers.Newsletters.Validators; diff --git a/Netina.Repository/Handlers/Orders/CreateBaseOrderCommandHandler.cs b/Netina.Repository/Handlers/Orders/CreateBaseOrderCommandHandler.cs index 601abf7..a42539e 100644 --- a/Netina.Repository/Handlers/Orders/CreateBaseOrderCommandHandler.cs +++ b/Netina.Repository/Handlers/Orders/CreateBaseOrderCommandHandler.cs @@ -1,21 +1,15 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Orders; +using Netina.Domain.Entities.Orders; namespace Netina.Repository.Handlers.Orders; -public class CreateBaseOrderCommandHandler : IRequestHandler +public class CreateBaseOrderCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CreateBaseOrderCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(CreateBaseOrderCommand request, CancellationToken cancellationToken) { if (request.UserId == default) throw new AppException("Customer id is null"); - var customer = await _repositoryWrapper.SetRepository() + var customer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(c => c.UserId == request.UserId, cancellationToken); if (customer == null) @@ -24,16 +18,16 @@ public class CreateBaseOrderCommandHandler : IRequestHandler() + repositoryWrapper.SetRepository() .Add(customer); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); } var order = Order.Create(customer.Id); - _repositoryWrapper.SetRepository() + repositoryWrapper.SetRepository() .Add(order); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return order; } diff --git a/Netina.Repository/Handlers/Orders/DeleteOrderCommandHandler.cs b/Netina.Repository/Handlers/Orders/DeleteOrderCommandHandler.cs index d510445..d81daa1 100644 --- a/Netina.Repository/Handlers/Orders/DeleteOrderCommandHandler.cs +++ b/Netina.Repository/Handlers/Orders/DeleteOrderCommandHandler.cs @@ -1,25 +1,18 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Orders; +using Netina.Domain.Entities.Orders; namespace Netina.Repository.Handlers.Orders; -public class DeleteOrderCommandHandler : IRequestHandler +public class DeleteOrderCommandHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public DeleteOrderCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(DeleteOrderCommand request, CancellationToken cancellationToken) { - var order = await _repositoryWrapper.SetRepository() + var order = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken); if (order == null) throw new AppException("Order not found", ApiResultStatusCode.NotFound); - _repositoryWrapper.SetRepository().Delete(order); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(order); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Orders/GetOrderLDtoQueryHandler.cs b/Netina.Repository/Handlers/Orders/GetOrderLDtoQueryHandler.cs index 18d4998..e1f6f63 100644 --- a/Netina.Repository/Handlers/Orders/GetOrderLDtoQueryHandler.cs +++ b/Netina.Repository/Handlers/Orders/GetOrderLDtoQueryHandler.cs @@ -1,21 +1,15 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Orders; +using Netina.Domain.Entities.Orders; namespace Netina.Repository.Handlers.Orders; -public class GetOrderLDtoQueryHandler: IRequestHandler +public class GetOrderLDtoQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetOrderLDtoQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(GetOrderLDtoQuery request, CancellationToken cancellationToken) { if (request.Id == default) throw new AppException("Order id is null"); - var order = await _repositoryWrapper.SetRepository() + var order = await repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.Id == request.Id) .Select(OrderMapper.ProjectToLDto) diff --git a/Netina.Repository/Handlers/Orders/GetOrderQueryHandler.cs b/Netina.Repository/Handlers/Orders/GetOrderQueryHandler.cs index c511402..a3b938d 100644 --- a/Netina.Repository/Handlers/Orders/GetOrderQueryHandler.cs +++ b/Netina.Repository/Handlers/Orders/GetOrderQueryHandler.cs @@ -1,33 +1,26 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Orders; +using Netina.Domain.Entities.Orders; namespace Netina.Repository.Handlers.Orders; -public class GetOrderQueryHandler : IRequestHandler +public class GetOrderQueryHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetOrderQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(GetOrderQuery request, CancellationToken cancellationToken) { - var order = await _repositoryWrapper.SetRepository() + var order = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(o => o.Id == request.Id, cancellationToken); if (order == null) throw new AppException("Order not found", ApiResultStatusCode.NotFound); - var orderProducts = await _repositoryWrapper.SetRepository() + var orderProducts = await repositoryWrapper.SetRepository() .TableNoTracking .Where(op => op.OrderId == order.Id) .ToListAsync(cancellationToken); orderProducts.ForEach(op => order.AddOrderProduct(op)); - var orderDelivery= await _repositoryWrapper.SetRepository() + var orderDelivery= await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(od => od.OrderId == request.Id, cancellationToken); if (orderDelivery != null) diff --git a/Netina.Repository/Handlers/Orders/GetOrdersQueryHandler.cs b/Netina.Repository/Handlers/Orders/GetOrdersQueryHandler.cs index 4997560..16d021e 100644 --- a/Netina.Repository/Handlers/Orders/GetOrdersQueryHandler.cs +++ b/Netina.Repository/Handlers/Orders/GetOrdersQueryHandler.cs @@ -1,20 +1,14 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Orders; +using Netina.Domain.Entities.Orders; namespace Netina.Repository.Handlers.Orders; -public class GetOrdersQueryHandler : IRequestHandler> +public class GetOrdersQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetOrdersQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetOrdersQuery request, CancellationToken cancellationToken) { - IQueryable orders = _repositoryWrapper + IQueryable orders = repositoryWrapper .SetRepository() .TableNoTracking; diff --git a/Netina.Repository/Handlers/Orders/GetUserOrdersQueryHandler.cs b/Netina.Repository/Handlers/Orders/GetUserOrdersQueryHandler.cs index 455cd91..744ea01 100644 --- a/Netina.Repository/Handlers/Orders/GetUserOrdersQueryHandler.cs +++ b/Netina.Repository/Handlers/Orders/GetUserOrdersQueryHandler.cs @@ -1,28 +1,20 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Orders; +using Netina.Domain.Entities.Orders; namespace Netina.Repository.Handlers.Orders; -public class GetUserOrdersQueryHandler : IRequestHandler> +public class GetUserOrdersQueryHandler(ICurrentUserService currentUserService, IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly ICurrentUserService _currentUserService; - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetUserOrdersQueryHandler(ICurrentUserService currentUserService,IRepositoryWrapper repositoryWrapper) - { - _currentUserService = currentUserService; - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetUserOrdersQuery request, CancellationToken cancellationToken) { Guid customerId = Guid.Empty; if (request.CustomerId == default) { - if (_currentUserService.UserId == null) + if (currentUserService.UserId == null) throw new AppException("Token is wrong", ApiResultStatusCode.UnAuthorized); - if (!Guid.TryParse(_currentUserService.UserId, out Guid userId)) + if (!Guid.TryParse(currentUserService.UserId, out Guid userId)) throw new AppException("Token is wrong", ApiResultStatusCode.UnAuthorized); - var customer = await _repositoryWrapper.SetRepository() + var customer = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(c => c.UserId == userId, cancellationToken); if (customer == null) @@ -32,7 +24,7 @@ public class GetUserOrdersQueryHandler : IRequestHandler() + var orders = await repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.CustomerId == customerId) .Select(OrderMapper.ProjectToSDto) diff --git a/Netina.Repository/Handlers/ProductCategories/GetProductCategoriesQueryHandler.cs b/Netina.Repository/Handlers/ProductCategories/GetProductCategoriesQueryHandler.cs index 9cf674f..ee9a722 100644 --- a/Netina.Repository/Handlers/ProductCategories/GetProductCategoriesQueryHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/GetProductCategoriesQueryHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.ProductCategories; +namespace Netina.Repository.Handlers.ProductCategories; public class GetProductCategoriesQueryHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler> diff --git a/Netina.Repository/Handlers/ProductCategories/GetProductCategoryChildrenQueryHandler.cs b/Netina.Repository/Handlers/ProductCategories/GetProductCategoryChildrenQueryHandler.cs index 783cea4..2f89544 100644 --- a/Netina.Repository/Handlers/ProductCategories/GetProductCategoryChildrenQueryHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/GetProductCategoryChildrenQueryHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.ProductCategories; +namespace Netina.Repository.Handlers.ProductCategories; public class GetProductCategoryChildrenQueryHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler> diff --git a/Netina.Repository/Handlers/ProductCategories/GetProductCategoryQueryHandler.cs b/Netina.Repository/Handlers/ProductCategories/GetProductCategoryQueryHandler.cs index 4650a15..67f18ba 100644 --- a/Netina.Repository/Handlers/ProductCategories/GetProductCategoryQueryHandler.cs +++ b/Netina.Repository/Handlers/ProductCategories/GetProductCategoryQueryHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.ProductCategories; +namespace Netina.Repository.Handlers.ProductCategories; public class GetProductCategoryQueryHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler diff --git a/Netina.Repository/Handlers/Products/ChangeProductCostCommandHandler.cs b/Netina.Repository/Handlers/Products/ChangeProductCostCommandHandler.cs index 60b23e5..aa80221 100644 --- a/Netina.Repository/Handlers/Products/ChangeProductCostCommandHandler.cs +++ b/Netina.Repository/Handlers/Products/ChangeProductCostCommandHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.Products; +namespace Netina.Repository.Handlers.Products; public class ChangeProductCostCommandHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler diff --git a/Netina.Repository/Handlers/Products/ChangeProductDisplayedCommandHandler.cs b/Netina.Repository/Handlers/Products/ChangeProductDisplayedCommandHandler.cs index d43ae23..a812c07 100644 --- a/Netina.Repository/Handlers/Products/ChangeProductDisplayedCommandHandler.cs +++ b/Netina.Repository/Handlers/Products/ChangeProductDisplayedCommandHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.Products; +namespace Netina.Repository.Handlers.Products; public class ChangeProductDisplayedCommandHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler diff --git a/Netina.Repository/Handlers/Products/DeleteProductCommandHandler.cs b/Netina.Repository/Handlers/Products/DeleteProductCommandHandler.cs index 574bf3a..6533216 100644 --- a/Netina.Repository/Handlers/Products/DeleteProductCommandHandler.cs +++ b/Netina.Repository/Handlers/Products/DeleteProductCommandHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.Products; +namespace Netina.Repository.Handlers.Products; public class DeleteProductCommandHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler diff --git a/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs b/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs index 680559e..b7362e9 100644 --- a/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs +++ b/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Handlers.Products; +namespace Netina.Repository.Handlers.Products; public class GetProductsQueryHandler( IRepositoryWrapper repositoryWrapper, diff --git a/Netina.Repository/Handlers/Reviews/CreateReviewCommandHandler.cs b/Netina.Repository/Handlers/Reviews/CreateReviewCommandHandler.cs index cda3f9c..fc565fe 100644 --- a/Netina.Repository/Handlers/Reviews/CreateReviewCommandHandler.cs +++ b/Netina.Repository/Handlers/Reviews/CreateReviewCommandHandler.cs @@ -1,21 +1,15 @@ -using Microsoft.EntityFrameworkCore; -using AppException = Netina.Common.Models.Exception.AppException; +using AppException = Netina.Common.Models.Exception.AppException; namespace Netina.Repository.Handlers.Reviews; -public class CreateReviewCommandHandler : IRequestHandler +public class CreateReviewCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CreateReviewCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(CreateReviewCommand request, CancellationToken cancellationToken) { var review = Review.Create(request.Title, request.Comment, request.Rate, request.IsBuyer, request.ProductId, request.UserId); - var product = await _repositoryWrapper.SetRepository() + var product = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(p => p.Id == request.ProductId, cancellationToken); if (product == null) @@ -23,11 +17,11 @@ public class CreateReviewCommandHandler : IRequestHandler().Update(product); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(product); + await repositoryWrapper.SaveChangesAsync(cancellationToken); - _repositoryWrapper.SetRepository().Add(review); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Add(review); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return review.AdaptToSDto(); } diff --git a/Netina.Repository/Handlers/Reviews/DeleteReviewCommandHandler.cs b/Netina.Repository/Handlers/Reviews/DeleteReviewCommandHandler.cs index a71c664..f1932fe 100644 --- a/Netina.Repository/Handlers/Reviews/DeleteReviewCommandHandler.cs +++ b/Netina.Repository/Handlers/Reviews/DeleteReviewCommandHandler.cs @@ -1,24 +1,17 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Reviews; -namespace Netina.Repository.Handlers.Reviews; - -public class DeleteReviewCommandHandler : IRequestHandler +public class DeleteReviewCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public DeleteReviewCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(DeleteReviewCommand request, CancellationToken cancellationToken) { - var review = await _repositoryWrapper.SetRepository().TableNoTracking + var review = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(r => r.Id == request.Id, cancellationToken); if (review == null) throw new AppException("Review not found", ApiResultStatusCode.NotFound); - _repositoryWrapper.SetRepository().Delete(review); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(review); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Reviews/GetReviewQueryHandler.cs b/Netina.Repository/Handlers/Reviews/GetReviewQueryHandler.cs index 9dd46a5..d61d816 100644 --- a/Netina.Repository/Handlers/Reviews/GetReviewQueryHandler.cs +++ b/Netina.Repository/Handlers/Reviews/GetReviewQueryHandler.cs @@ -1,18 +1,10 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Reviews; -namespace Netina.Repository.Handlers.Reviews; - -public class GetReviewQueryHandler : IRequestHandler +public class GetReviewQueryHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetReviewQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(GetReviewQuery request, CancellationToken cancellationToken) { - var review = await _repositoryWrapper.SetRepository() + var review = await repositoryWrapper.SetRepository() .TableNoTracking .Where(r => r.Id == request.Id) .Select(ReviewMapper.ProjectToLDto) diff --git a/Netina.Repository/Handlers/Reviews/GetReviewsQueryHandler.cs b/Netina.Repository/Handlers/Reviews/GetReviewsQueryHandler.cs index 4cc9dab..cf14554 100644 --- a/Netina.Repository/Handlers/Reviews/GetReviewsQueryHandler.cs +++ b/Netina.Repository/Handlers/Reviews/GetReviewsQueryHandler.cs @@ -1,18 +1,11 @@ -using Microsoft.EntityFrameworkCore; +namespace Netina.Repository.Handlers.Reviews; -namespace Netina.Repository.Handlers.Reviews; - -public class GetReviewsQueryHandler : IRequestHandler> +public class GetReviewsQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetReviewsQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetReviewsQuery request, CancellationToken cancellationToken) { - return await _repositoryWrapper.SetRepository() + return await repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(r => r.CreatedAt) .Skip(request.Page * 15) diff --git a/Netina.Repository/Handlers/Warehouses/CreateShippingCommandHandler.cs b/Netina.Repository/Handlers/Warehouses/CreateShippingCommandHandler.cs index 229ab7c..9976a57 100644 --- a/Netina.Repository/Handlers/Warehouses/CreateShippingCommandHandler.cs +++ b/Netina.Repository/Handlers/Warehouses/CreateShippingCommandHandler.cs @@ -2,20 +2,15 @@ namespace Netina.Repository.Handlers.Warehouses; -public class CreateShippingCommandHandler : IRequestHandler +public class CreateShippingCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public CreateShippingCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(CreateShippingCommand request, CancellationToken cancellationToken) { var ent = Shipping.Create(request.Name, request.WarehouseName, request.IsExpressShipping, request.IsShipBySeller, request.IsOriginalWarehouse,request.DeliveryCost,request.WorkingDays); - _repositoryWrapper.SetRepository().Add(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Add(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return ent.AdaptToSDto(); } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Warehouses/DeleteShippingCommandHandler.cs b/Netina.Repository/Handlers/Warehouses/DeleteShippingCommandHandler.cs index 1995015..ca7783f 100644 --- a/Netina.Repository/Handlers/Warehouses/DeleteShippingCommandHandler.cs +++ b/Netina.Repository/Handlers/Warehouses/DeleteShippingCommandHandler.cs @@ -1,25 +1,19 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Warehouses; +using Netina.Domain.Entities.Warehouses; namespace Netina.Repository.Handlers.Warehouses; -public class DeleteShippingCommandHandler : IRequestHandler +public class DeleteShippingCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public DeleteShippingCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(DeleteShippingCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(s => s.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("Shipping not found", ApiResultStatusCode.NotFound); - _repositoryWrapper.SetRepository().Delete(ent); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Delete(ent); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Handlers/Warehouses/GetShippingQueryHandler.cs b/Netina.Repository/Handlers/Warehouses/GetShippingQueryHandler.cs index e92a2e0..ae381be 100644 --- a/Netina.Repository/Handlers/Warehouses/GetShippingQueryHandler.cs +++ b/Netina.Repository/Handlers/Warehouses/GetShippingQueryHandler.cs @@ -1,19 +1,13 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Warehouses; +using Netina.Domain.Entities.Warehouses; namespace Netina.Repository.Handlers.Warehouses; -public class GetShippingQueryHandler : IRequestHandler +public class GetShippingQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetShippingQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(GetShippingQuery request, CancellationToken cancellationToken) { - var shippingMethod = await _repositoryWrapper.SetRepository().TableNoTracking.Where(b => b.Id == request.Id) + var shippingMethod = await repositoryWrapper.SetRepository().TableNoTracking.Where(b => b.Id == request.Id) .Select(ShippingMapper.ProjectToSDto) .FirstOrDefaultAsync(cancellationToken); if (shippingMethod == null) diff --git a/Netina.Repository/Handlers/Warehouses/GetShippingsQueryHandler.cs b/Netina.Repository/Handlers/Warehouses/GetShippingsQueryHandler.cs index 5e8f082..c2f0ce7 100644 --- a/Netina.Repository/Handlers/Warehouses/GetShippingsQueryHandler.cs +++ b/Netina.Repository/Handlers/Warehouses/GetShippingsQueryHandler.cs @@ -1,19 +1,13 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Warehouses; +using Netina.Domain.Entities.Warehouses; namespace Netina.Repository.Handlers.Warehouses; -public class GetShippingsQueryHandler : IRequestHandler> +public class GetShippingsQueryHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler> { - private readonly IRepositoryWrapper _repositoryWrapper; - - public GetShippingsQueryHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task> Handle(GetShippingsQuery request, CancellationToken cancellationToken) { - return await _repositoryWrapper + return await repositoryWrapper .SetRepository() .TableNoTracking.OrderByDescending(b => b.CreatedAt) .Skip(request.Page * 20) diff --git a/Netina.Repository/Handlers/Warehouses/UpdateShippingCommandHandler.cs b/Netina.Repository/Handlers/Warehouses/UpdateShippingCommandHandler.cs index a7bfe41..3447618 100644 --- a/Netina.Repository/Handlers/Warehouses/UpdateShippingCommandHandler.cs +++ b/Netina.Repository/Handlers/Warehouses/UpdateShippingCommandHandler.cs @@ -1,19 +1,13 @@ -using Microsoft.EntityFrameworkCore; -using Netina.Domain.Entities.Warehouses; +using Netina.Domain.Entities.Warehouses; namespace Netina.Repository.Handlers.Warehouses; -public class UpdateShippingCommandHandler : IRequestHandler +public class UpdateShippingCommandHandler(IRepositoryWrapper repositoryWrapper) + : IRequestHandler { - private readonly IRepositoryWrapper _repositoryWrapper; - - public UpdateShippingCommandHandler(IRepositoryWrapper repositoryWrapper) - { - _repositoryWrapper = repositoryWrapper; - } public async Task Handle(UpdateShippingCommand request, CancellationToken cancellationToken) { - var ent = await _repositoryWrapper.SetRepository().TableNoTracking + var ent = await repositoryWrapper.SetRepository().TableNoTracking .FirstOrDefaultAsync(s => s.Id == request.Id, cancellationToken); if (ent == null) throw new AppException("Shipping not found", ApiResultStatusCode.NotFound); @@ -23,8 +17,8 @@ public class UpdateShippingCommandHandler : IRequestHandler().Update(newEnt); - await _repositoryWrapper.SaveChangesAsync(cancellationToken); + repositoryWrapper.SetRepository().Update(newEnt); + await repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } } \ No newline at end of file diff --git a/Netina.Repository/Models/ApplicationContext.cs b/Netina.Repository/Models/ApplicationContext.cs index bb21cd6..46c8f9c 100644 --- a/Netina.Repository/Models/ApplicationContext.cs +++ b/Netina.Repository/Models/ApplicationContext.cs @@ -1,20 +1,12 @@ using Microsoft.AspNetCore.Identity.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using System.Reflection.Emit; namespace Netina.Repository.Models; -public class ApplicationContext : IdentityDbContext +public class ApplicationContext(DbContextOptions options, ILogger logger) + : IdentityDbContext(options) { - private readonly ILogger _logger; - private readonly Assembly _projectAssembly; - - public ApplicationContext(DbContextOptions options, ILogger logger) : base(options) - { - _logger = logger; - _projectAssembly = options.GetExtension().ProjectAssembly; - } + private readonly Assembly _projectAssembly = options.GetExtension().ProjectAssembly; protected override void OnModelCreating(ModelBuilder builder) { @@ -22,9 +14,9 @@ public class ApplicationContext : IdentityDbContext(_logger, entitiesAssembly); + builder.RegisterAllEntities(logger, entitiesAssembly); stopwatch.Stop(); - _logger.LogInformation($"!!!!!!! RegisterAllEntities : {stopwatch.ElapsedMilliseconds}ms !!!!!!!"); + logger.LogInformation($"!!!!!!! RegisterAllEntities : {stopwatch.ElapsedMilliseconds}ms !!!!!!!"); builder.HasPostgresExtension("pg_trgm"); diff --git a/Netina.Repository/Repositories/Base/BaseRepository.cs b/Netina.Repository/Repositories/Base/BaseRepository.cs index 58b8db0..40c0ccd 100644 --- a/Netina.Repository/Repositories/Base/BaseRepository.cs +++ b/Netina.Repository/Repositories/Base/BaseRepository.cs @@ -1,16 +1,9 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Repositories.Base +namespace Netina.Repository.Repositories.Base { - public class BaseRepository : Repository, IBaseRepository where T : class, IApiEntity + public class BaseRepository(ApplicationContext dbContext, ICurrentUserService currentUserService) + : Repository(dbContext), IBaseRepository + where T : class, IApiEntity { - private readonly ICurrentUserService _currentUserService; - - public BaseRepository(ApplicationContext dbContext, ICurrentUserService currentUserService) : base(dbContext) - { - _currentUserService = currentUserService; - } - public virtual async ValueTask GetByIdAsync(CancellationToken cancellationToken, params object[] ids) { var founded = await Entities.FindAsync(ids, cancellationToken); @@ -71,9 +64,9 @@ namespace Netina.Repository.Repositories.Base .CurrentValue = DateTime.Now; Entities.Entry(entity).Property(e => e.IsRemoved) .CurrentValue = true; - if (_currentUserService.UserName != null) + if (currentUserService.UserName != null) Entities.Entry(entity).Property(e => e.RemovedBy) - .CurrentValue = _currentUserService.UserName; + .CurrentValue = currentUserService.UserName; Entities.Update(entity); } @@ -87,9 +80,9 @@ namespace Netina.Repository.Repositories.Base .CurrentValue = DateTime.Now; Entities.Entry(entity).Property(e => e.IsRemoved) .CurrentValue = true; - if (_currentUserService.UserName != null) + if (currentUserService.UserName != null) Entities.Entry(entity).Property(e => e.RemovedBy) - .CurrentValue = _currentUserService.UserName; + .CurrentValue = currentUserService.UserName; Entities.Update(entity); } } diff --git a/Netina.Repository/Repositories/Base/Contracts/IReadRepository.cs b/Netina.Repository/Repositories/Base/Contracts/IReadRepository.cs index 889b4e8..ec61233 100644 --- a/Netina.Repository/Repositories/Base/Contracts/IReadRepository.cs +++ b/Netina.Repository/Repositories/Base/Contracts/IReadRepository.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Repositories.Base.Contracts +namespace Netina.Repository.Repositories.Base.Contracts { public interface IReadRepository where T : class, IApiEntity { diff --git a/Netina.Repository/Repositories/Base/Contracts/IRepository.cs b/Netina.Repository/Repositories/Base/Contracts/IRepository.cs index f453e9a..0089daf 100644 --- a/Netina.Repository/Repositories/Base/Contracts/IRepository.cs +++ b/Netina.Repository/Repositories/Base/Contracts/IRepository.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Repositories.Base.Contracts +namespace Netina.Repository.Repositories.Base.Contracts { internal interface IRepository where T : class, IApiEntity { diff --git a/Netina.Repository/Repositories/Base/ReadRepository.cs b/Netina.Repository/Repositories/Base/ReadRepository.cs index 84793b4..ce15629 100644 --- a/Netina.Repository/Repositories/Base/ReadRepository.cs +++ b/Netina.Repository/Repositories/Base/ReadRepository.cs @@ -1,14 +1,9 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Repositories.Base +namespace Netina.Repository.Repositories.Base { - public class ReadRepository : Repository, IDisposable, IReadRepository where T : class, IApiEntity + public class ReadRepository(ApplicationContext dbContext) + : Repository(dbContext), IDisposable, IReadRepository + where T : class, IApiEntity { - public ReadRepository( - ApplicationContext dbContext) : base(dbContext) - { - } - public new void Dispose() { DbContext?.Dispose(); diff --git a/Netina.Repository/Repositories/Base/Repository.cs b/Netina.Repository/Repositories/Base/Repository.cs index fcbf2fb..74b16cf 100644 --- a/Netina.Repository/Repositories/Base/Repository.cs +++ b/Netina.Repository/Repositories/Base/Repository.cs @@ -1,6 +1,4 @@ -using Microsoft.EntityFrameworkCore; - -namespace Netina.Repository.Repositories.Base +namespace Netina.Repository.Repositories.Base { public class Repository : IRepository where T : class, IApiEntity { diff --git a/Netina.Repository/Repositories/Base/RepositoryWrapper.cs b/Netina.Repository/Repositories/Base/RepositoryWrapper.cs index 380e9f7..c7b76a8 100644 --- a/Netina.Repository/Repositories/Base/RepositoryWrapper.cs +++ b/Netina.Repository/Repositories/Base/RepositoryWrapper.cs @@ -1,20 +1,13 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Storage; namespace Netina.Repository.Repositories.Base; -public class RepositoryWrapper : IRepositoryWrapper +public class RepositoryWrapper(ApplicationContext context, ICurrentUserService currentUserService) + : IRepositoryWrapper { - private readonly ApplicationContext _context; - private readonly ICurrentUserService _currentUserService; private IDbContextTransaction? _currentTransaction; - public RepositoryWrapper(ApplicationContext context, ICurrentUserService currentUserService) - { - _context = context; - _currentUserService = currentUserService; - } - public IBaseRepository SetRepository() where T : ApiEntity => new BaseRepository(_context, _currentUserService); + public IBaseRepository SetRepository() where T : ApiEntity => new BaseRepository(context, currentUserService); public async Task RollBackAsync(CancellationToken cancellationToken) @@ -31,17 +24,17 @@ public class RepositoryWrapper : IRepositoryWrapper } public async Task BeginTransaction(CancellationToken cancellationToken) { - _currentTransaction = await _context.Database.BeginTransactionAsync(cancellationToken); + _currentTransaction = await context.Database.BeginTransactionAsync(cancellationToken); } public async Task SaveChangesAsync(CancellationToken cancellationToken = default) { SetAuditables(); - await _context.SaveChangesAsync(cancellationToken); + await context.SaveChangesAsync(cancellationToken); } private void SetAuditables() { - IEnumerable> entries = _context.ChangeTracker.Entries(); + IEnumerable> entries = context.ChangeTracker.Entries(); foreach (EntityEntry entity in entries) { if (entity.State == EntityState.Added) @@ -54,15 +47,15 @@ public class RepositoryWrapper : IRepositoryWrapper { entity.Property(e => e.ModifiedAt) .CurrentValue = DateTime.Now; - if (_currentUserService.UserName != null) + if (currentUserService.UserName != null) entity.Property(e => e.ModifiedBy) - .CurrentValue = _currentUserService.UserName; + .CurrentValue = currentUserService.UserName; } } } public void Dispose() { _currentTransaction?.Dispose(); - _context?.Dispose(); + context?.Dispose(); } } diff --git a/Netina.Repository/Repositories/Base/WriteRepository.cs b/Netina.Repository/Repositories/Base/WriteRepository.cs index 132d775..c2a1834 100644 --- a/Netina.Repository/Repositories/Base/WriteRepository.cs +++ b/Netina.Repository/Repositories/Base/WriteRepository.cs @@ -1,17 +1,10 @@  -using Microsoft.EntityFrameworkCore; - namespace Netina.Repository.Repositories.Base { - public class WriteRepository : Repository, IDisposable, IWriteRepository where T : class, IApiEntity + public class WriteRepository(ApplicationContext dbContext, ICurrentUserService currentUserService) + : Repository(dbContext), IDisposable, IWriteRepository + where T : class, IApiEntity { - private readonly ICurrentUserService _currentUserService; - - public WriteRepository(ApplicationContext dbContext,ICurrentUserService currentUserService) : base(dbContext) - { - _currentUserService = currentUserService; - } - public void Dispose() { DbContext?.Dispose(); @@ -56,9 +49,9 @@ namespace Netina.Repository.Repositories.Base .CurrentValue = DateTime.Now; Entities.Entry(entity).Property(e => e.IsRemoved) .CurrentValue = true; - if (_currentUserService.UserName != null) + if (currentUserService.UserName != null) Entities.Entry(entity).Property(e => e.RemovedBy) - .CurrentValue = _currentUserService.UserName; + .CurrentValue = currentUserService.UserName; Entities.Update(entity); } @@ -72,9 +65,9 @@ namespace Netina.Repository.Repositories.Base .CurrentValue = DateTime.Now; Entities.Entry(entity).Property(e => e.IsRemoved) .CurrentValue = true; - if (_currentUserService.UserName != null) + if (currentUserService.UserName != null) Entities.Entry(entity).Property(e => e.RemovedBy) - .CurrentValue = _currentUserService.UserName; + .CurrentValue = currentUserService.UserName; Entities.Update(entity); } } diff --git a/Netina.Repository/Repositories/UnitOfWork/UnitOfWork.cs b/Netina.Repository/Repositories/UnitOfWork/UnitOfWork.cs index b6271e7..95230af 100644 --- a/Netina.Repository/Repositories/UnitOfWork/UnitOfWork.cs +++ b/Netina.Repository/Repositories/UnitOfWork/UnitOfWork.cs @@ -1,17 +1,11 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Storage; namespace Netina.Repository.Repositories.UnitOfWork; -public class UnitOfWork : IUnitOfWork +public class UnitOfWork(ApplicationContext applicationContext) : IUnitOfWork { - private readonly ApplicationContext _applicationContext; private IDbContextTransaction? _currentTransaction ; - public UnitOfWork(ApplicationContext applicationContext) - { - _applicationContext = applicationContext; - } public async Task RollBackAsync() { @@ -27,17 +21,17 @@ public class UnitOfWork : IUnitOfWork } public async Task BeginTransaction() { - _currentTransaction = await _applicationContext.Database.BeginTransactionAsync(); + _currentTransaction = await applicationContext.Database.BeginTransactionAsync(); } public async Task SaveChangesAsync(CancellationToken cancellationToken = default) { SetAuditables(); - await _applicationContext.SaveChangesAsync(cancellationToken); + await applicationContext.SaveChangesAsync(cancellationToken); } private void SetAuditables() { - IEnumerable> entries = _applicationContext.ChangeTracker.Entries(); + IEnumerable> entries = applicationContext.ChangeTracker.Entries(); foreach (EntityEntry entity in entries) { if (entity.State == EntityState.Added) diff --git a/Tools/NetinaShop.WordPressDBConverter/Program.cs b/Tools/NetinaShop.WordPressDBConverter/Program.cs index 49efb0d..95a526d 100644 --- a/Tools/NetinaShop.WordPressDBConverter/Program.cs +++ b/Tools/NetinaShop.WordPressDBConverter/Program.cs @@ -1,16 +1,10 @@ using Netina.Common.Extensions; using Netina.Domain.Dtos.RequestDtos.SeedDtos; -using Netina.Domain.Entities.Blogs; using Netina.WordPressDBConverter.Models; using Newtonsoft.Json; using Netina.Common.Models.Api; using Netina.Domain.Dtos.SmallDtos; -using Netina.Domain.Enums; using Netina.WordPressDBConverter.Services.RestServices; -using Refit; -using System.Reflection.Metadata; -using HtmlAgilityPack; -using System.Net.Http; using System.Text.RegularExpressions; From d59657c1bfc31b7e4acacdf68b37b0958642db13 Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Sat, 10 Aug 2024 20:35:38 +0330 Subject: [PATCH 08/10] fix(SearchProductByName) --- .../Handlers/Products/GetProductsQueryHandler.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs b/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs index b7362e9..aeb420c 100644 --- a/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs +++ b/Netina.Repository/Handlers/Products/GetProductsQueryHandler.cs @@ -18,8 +18,6 @@ public class GetProductsQueryHandler( if (request.IsActive != null) products = products.Where(p => p.IsEnable == request.IsActive); - if (request.ProductName != null) - products = products.OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName,request.ProductName)); if (request.SortBy != QuerySortBy.None) { products = request.SortBy switch @@ -32,9 +30,10 @@ public class GetProductsQueryHandler( }; } else - { products = products.OrderByDescending(p => p.CreatedAt); - } + + if (request.ProductName != null) + products = products.OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, request.ProductName)); if (request.CategoryId != default) { From be6f462708e9b2dbca4c7ecf114597006032b17e Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Sat, 10 Aug 2024 20:36:10 +0330 Subject: [PATCH 09/10] VER 1.2.11.13 --- .version | 2 +- Netina.Api/Netina.Api.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.version b/.version index c8d091a..1a0417d 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.2.10.12 \ No newline at end of file +1.2.11.13 \ No newline at end of file diff --git a/Netina.Api/Netina.Api.csproj b/Netina.Api/Netina.Api.csproj index 4b4f600..291980c 100644 --- a/Netina.Api/Netina.Api.csproj +++ b/Netina.Api/Netina.Api.csproj @@ -6,8 +6,8 @@ enable true Linux - 1.2.10.12 - 1.2.10.12 + 1.2.11.13 + 1.2.11.13 From 2e8501190e1ccdf3cc899fc14ea2af361c20e36e Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Fri, 16 Aug 2024 18:27:54 +0330 Subject: [PATCH 10/10] fix (ControllerMethodsDescription) , fix(SlugExtension) --- .../Controllers/BlogCategoryController.cs | 7 ++-- Netina.Api/Controllers/BlogController.cs | 9 ++++-- Netina.Api/Controllers/BrandController.cs | 7 ++-- Netina.Api/Controllers/DiscountController.cs | 7 ++-- Netina.Api/Controllers/DistrictController.cs | 2 +- Netina.Api/Controllers/FaqController.cs | 10 +++--- Netina.Api/Controllers/FileController.cs | 4 +-- Netina.Api/Controllers/HealthController.cs | 5 +-- Netina.Api/Controllers/MarketerController.cs | 8 ++--- .../Controllers/NewsletterMemberController.cs | 2 +- Netina.Api/Controllers/OrderBagController.cs | 16 +++++----- Netina.Api/Controllers/OrderController.cs | 12 +++---- Netina.Api/Controllers/PageController.cs | 14 +++++++- Netina.Api/Controllers/PaymentController.cs | 3 +- .../Controllers/ProductCategoryController.cs | 7 ++-- Netina.Api/Controllers/ProductController.cs | 9 ++++-- .../Controllers/ProductReviewController.cs | 10 +++--- Netina.Api/Controllers/RoleController.cs | 9 ++++-- Netina.Api/Controllers/ScraperController.cs | 4 +-- Netina.Api/Controllers/SearchController.cs | 8 ++--- Netina.Api/Controllers/SettingController.cs | 4 +-- Netina.Api/Controllers/ShippingController.cs | 7 ++-- .../Controllers/UserAddressController.cs | 2 +- Netina.Api/Controllers/UserController.cs | 15 +++++---- Netina.Common/Extensions/StringExtensions.cs | 10 ++++-- .../BaseServices/Abstracts/IPageService.cs | 3 ++ Netina.Core/BaseServices/PageService.cs | 32 +++++++++++++++++-- .../QuartzServices/SiteMapScheduledJob.cs | 3 +- .../MartenEntities/Settings/PageSetting.cs | 17 ++++++++++ 29 files changed, 169 insertions(+), 77 deletions(-) create mode 100644 Netina.Domain/MartenEntities/Settings/PageSetting.cs diff --git a/Netina.Api/Controllers/BlogCategoryController.cs b/Netina.Api/Controllers/BlogCategoryController.cs index 15c3a6d..643cea2 100644 --- a/Netina.Api/Controllers/BlogCategoryController.cs +++ b/Netina.Api/Controllers/BlogCategoryController.cs @@ -11,23 +11,26 @@ public class BlogCategoryController : ICarterModule .MapGroup($"api/blog/category"); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllCategories") + .WithDisplayName("Get BlogCategories") .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetBlogCategory") + .WithDisplayName("Get BlogCategory") .HasApiVersion(1.0); group.MapPost("", Post) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission,ApplicationPermission.ManageBlogs)) + .WithDisplayName("Create BlogCategory") .HasApiVersion(1.0); group.MapPut("", Put) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBlogs)) + .WithDisplayName("Update BlogCategory") .HasApiVersion(1.0); group.MapDelete("{id}", Delete) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBlogs)) + .WithDisplayName("Delete BlogCategory") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/BlogController.cs b/Netina.Api/Controllers/BlogController.cs index 810ee12..48a69f7 100644 --- a/Netina.Api/Controllers/BlogController.cs +++ b/Netina.Api/Controllers/BlogController.cs @@ -13,33 +13,36 @@ public class BlogController : ICarterModule .MapGroup($"api/blog"); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllBlogs") + .WithDisplayName("Get Blogs") .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetBlog") + .WithDisplayName("Get Blog") .HasApiVersion(1.0); group.MapPost("", Post) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser() .RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBlogs)) + .WithDisplayName("Create Blog") .HasApiVersion(1.0); group.MapPut("", Put) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser() .RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBlogs)) + .WithDisplayName("Update Blog") .HasApiVersion(1.0); group.MapDelete("{id}", Delete) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser() .RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBlogs)) + .WithDisplayName("Delete Blog") .HasApiVersion(1.0); group.MapGet("/newlink", GetBlogNewLinkAsync) - .WithDisplayName("GetBlogNewLink") + .WithDisplayName("Get Blog NewLink") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/BrandController.cs b/Netina.Api/Controllers/BrandController.cs index 072511a..4823524 100644 --- a/Netina.Api/Controllers/BrandController.cs +++ b/Netina.Api/Controllers/BrandController.cs @@ -11,23 +11,26 @@ public class BrandController : ICarterModule .MapGroup($"api/brand"); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllBrands") + .WithDisplayName("Get Brands") .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetBlogBrand") + .WithDisplayName("Get Brand") .HasApiVersion(1.0); group.MapPost("", Post) .HasApiVersion(1.0) + .WithDisplayName("Create Brand") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBrands)); group.MapPut("", Put) .HasApiVersion(1.0) + .WithDisplayName("Update Brand") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBrands)); group.MapDelete("{id}", Delete) .HasApiVersion(1.0) + .WithDisplayName("Delete Brand") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageBrands)); } diff --git a/Netina.Api/Controllers/DiscountController.cs b/Netina.Api/Controllers/DiscountController.cs index 9fd53c6..de73977 100644 --- a/Netina.Api/Controllers/DiscountController.cs +++ b/Netina.Api/Controllers/DiscountController.cs @@ -9,25 +9,28 @@ public class DiscountController : ICarterModule .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser()); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllDiscounts") + .WithDisplayName("Get Discounts") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDiscounts, ApplicationPermission.ViewDiscounts)) .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetDiscount") + .WithDisplayName("Get Discount") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDiscounts, ApplicationPermission.ViewDiscounts)) .HasApiVersion(1.0); group.MapPost("", Post) .HasApiVersion(1.0) + .WithDisplayName("Create Discount") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDiscounts)); group.MapPut("", Put) .HasApiVersion(1.0) + .WithDisplayName("Update Discount") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDiscounts)); group.MapDelete("{id}", Delete) .HasApiVersion(1.0) + .WithDisplayName("Delete Discount") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDiscounts)); } diff --git a/Netina.Api/Controllers/DistrictController.cs b/Netina.Api/Controllers/DistrictController.cs index 1e732e3..85cfaf4 100644 --- a/Netina.Api/Controllers/DistrictController.cs +++ b/Netina.Api/Controllers/DistrictController.cs @@ -11,7 +11,7 @@ public class DistrictController : ICarterModule .WithDisplayName("Get Cities") .HasApiVersion(1.0); group.MapGet("province", GetProvincesAsync) - .WithDisplayName("Get Cities") + .WithDisplayName("Get Provinces") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/FaqController.cs b/Netina.Api/Controllers/FaqController.cs index 9b141fe..777a24b 100644 --- a/Netina.Api/Controllers/FaqController.cs +++ b/Netina.Api/Controllers/FaqController.cs @@ -8,13 +8,13 @@ public class FaqController : ICarterModule .MapGroup("api/faq"); group.MapGet("/slug", GetFaqBySlugAsync) - .WithDisplayName("GetFaqBySlug") + .WithDisplayName("Get Faq By Slug") .WithDescription("Get faq by slug , you have to send page slug") .HasApiVersion(1.0); group.MapGet("", GetFaqsAsync) - .WithDisplayName("GetFaqs") - .WithDescription("Get All Faqs ") + .WithDisplayName("Get Faqs") + .WithDescription("Get All Faqs") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer") .RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFaq)) .HasApiVersion(1.0); @@ -27,14 +27,14 @@ public class FaqController : ICarterModule .HasApiVersion(1.0); group.MapPut("", UpdateFaqAsync) - .WithDisplayName("Update FaqAsync") + .WithDisplayName("Update Faq") .WithDescription("Update Faq , you can create new faq or create update your faq ") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer") .RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFaq)) .HasApiVersion(1.0); group.MapDelete("{id}", DeleteFaqAsync) - .WithDisplayName("DeleteFaq") + .WithDisplayName("Delete Faq") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFaq)) .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/FileController.cs b/Netina.Api/Controllers/FileController.cs index 2f27c83..f318508 100644 --- a/Netina.Api/Controllers/FileController.cs +++ b/Netina.Api/Controllers/FileController.cs @@ -11,12 +11,12 @@ public class FileController : ICarterModule .MapGroup("api/file"); group.MapGet("", GetFilesAsync) - .WithDisplayName("GetFilesAsync") + .WithDisplayName("Get Files") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFiles, ApplicationPermission.ViewFiles)) .HasApiVersion(1.0); group.MapPost("", UploadFileAsync) - .WithDisplayName("UploadFileAsync") + .WithDisplayName("Upload File") .HasApiVersion(1.0); group.MapPost("/ckeditor", UploadCkEditorFileAsync) diff --git a/Netina.Api/Controllers/HealthController.cs b/Netina.Api/Controllers/HealthController.cs index 4bbe158..60407c0 100644 --- a/Netina.Api/Controllers/HealthController.cs +++ b/Netina.Api/Controllers/HealthController.cs @@ -9,10 +9,7 @@ public class HealthController : ICarterModule var group = app.NewVersionedApi("Health") .MapGroup("health"); group.MapGet("", GetHealth) - .WithDisplayName("GetHealth") - .HasApiVersion(1.0); - group.MapGet("/error/test", () => { throw new Exception("Error test message");}) - .WithDisplayName("GetHealth") + .WithDisplayName("Get Health") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/MarketerController.cs b/Netina.Api/Controllers/MarketerController.cs index 68b24a4..6e6cc47 100644 --- a/Netina.Api/Controllers/MarketerController.cs +++ b/Netina.Api/Controllers/MarketerController.cs @@ -11,20 +11,20 @@ public class MarketerController : ICarterModule .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser()); group.MapGet("", GetMarketersAsync) - .WithDisplayName("GetAllMarketers") + .WithDisplayName("Get Marketers") .RequireAuthorization(builder=>builder.RequireClaim(CustomClaimType.Permission,ApplicationPermission.ManageUsers , ApplicationPermission.ViewUsers)) .HasApiVersion(1.0); group.MapGet("profile", GetMarketerProfileAsync) - .WithDisplayName("GetAllMarketers") + .WithDisplayName("Get Marketer Profile") .HasApiVersion(1.0); group.MapPost("signup", SignUpMarketerAsync) - .WithDisplayName("SignUpMarketer") + .WithDisplayName("SignUp Marketer") .HasApiVersion(1.0); group.MapGet("signup/contract", GetSignUpMarketerContractAsync) - .WithDisplayName("SignUpMarketerContract") + .WithDisplayName("Get Marketer Contract") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/NewsletterMemberController.cs b/Netina.Api/Controllers/NewsletterMemberController.cs index 3c422df..5c223c7 100644 --- a/Netina.Api/Controllers/NewsletterMemberController.cs +++ b/Netina.Api/Controllers/NewsletterMemberController.cs @@ -7,7 +7,7 @@ public class NewsletterMemberController : ICarterModule var group = app.NewVersionedApi("Newsletter Members").MapGroup("api/newsletter/member"); group.MapGet("", GetAllMembersAsync) - .WithDisplayName("Get All Members") + .WithDisplayName("Get Members") .HasApiVersion(1.0) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewNewsletterMembers)); diff --git a/Netina.Api/Controllers/OrderBagController.cs b/Netina.Api/Controllers/OrderBagController.cs index aa6d169..b0750a5 100644 --- a/Netina.Api/Controllers/OrderBagController.cs +++ b/Netina.Api/Controllers/OrderBagController.cs @@ -11,38 +11,38 @@ public class OrderBagController : ICarterModule .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.CreateOrder)); group.MapGet("", GetUserCurrentOrderBagAsync) - .WithDisplayName("GetUserCurrentOrderBag") + .WithDisplayName("Get User Current OrderBag") .HasApiVersion(1.0); group.MapPost("check", CheckOrderBagAsync) - .WithDisplayName("CheckOrderBag") + .WithDisplayName("Check OrderBag") .AllowAnonymous() .HasApiVersion(1.0); group.MapPost("add", AddProductToBagAsync) - .WithDisplayName("AddProductToBag") + .WithDisplayName("Add Product To OrderBag") .HasApiVersion(1.0); group.MapDelete("remove", RemoveFromOrderBagAsync) - .WithDisplayName("RemoveFromOrderBag") + .WithDisplayName("Remove From OrderBag") .HasApiVersion(1.0); group.MapPost("submit", SubmitOrderBagAsync) - .WithDisplayName("SubmitOrderBag") + .WithDisplayName("Submit OrderBag") .HasApiVersion(1.0); group.MapPost("discount/{orderId}", DiscountActionOrderBagAsync) - .WithDisplayName("DiscountActionOrderBag") + .WithDisplayName("Add Discount To OrderBag") .HasApiVersion(1.0); group.MapPost("shipping/{orderId}", AddShippingToOrderBagAsync) - .WithDisplayName("AddShippingToOrderBag") + .WithDisplayName("Add Shipping To OrderBag") .HasApiVersion(1.0); group.MapPost("payment/{orderId}", SubmitOrderPaymentAsync) - .WithDisplayName("SubmitOrderPayment") + .WithDisplayName("Submit Order Payment") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/OrderController.cs b/Netina.Api/Controllers/OrderController.cs index 9044a42..0816fd5 100644 --- a/Netina.Api/Controllers/OrderController.cs +++ b/Netina.Api/Controllers/OrderController.cs @@ -10,32 +10,32 @@ public class OrderController : ICarterModule .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser()); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllOrders") + .WithDisplayName("Get Orders") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewAllOrders , ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetOneOrder") + .WithDisplayName("Get Order") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewAllOrders, ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapPost("{id}/confirm", ConfirmOrderStepAsync) - .WithDisplayName("ConfirmOrderStep") + .WithDisplayName("Confirm OrderStep") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapPost("{id}/cancel", CancelOrderStepAsync) - .WithDisplayName("ConfirmOrderStep") + .WithDisplayName("Cancel Order") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapDelete("{id}", DeleteAsync) - .WithDisplayName("DeleteOneOrder") + .WithDisplayName("Delete Order") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapGet("{id}/invoice", GetOrderInvoiceAsync) - .WithDisplayName("GetOrderInvoice") + .WithDisplayName("Get Order Invoice") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .AllowAnonymous() .HasApiVersion(1.0); diff --git a/Netina.Api/Controllers/PageController.cs b/Netina.Api/Controllers/PageController.cs index 42befbe..2eef4cf 100644 --- a/Netina.Api/Controllers/PageController.cs +++ b/Netina.Api/Controllers/PageController.cs @@ -12,6 +12,13 @@ public class PageController : ICarterModule .HasApiVersion(1.0) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewPages, ApplicationPermission.ManagePages)); + group.MapGet("redirect/check", CheckRedirectedOldLinkAsync) + .WithDisplayName("Check Redirect OldLink") + .HasApiVersion(1.0); + + group.MapGet("deleted/check", CheckDeletedLinkAsync) + .WithDisplayName("Check Deleted Link") + .HasApiVersion(1.0); group.MapGet("{id}", GetPageByIdAsync) .WithDisplayName("Get Page") @@ -31,7 +38,6 @@ public class PageController : ICarterModule .HasApiVersion(1.0) .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManagePages)); - group.MapDelete("{id}", DeletePageByIdAsync) .WithDisplayName("Delete Page") .HasApiVersion(1.0) @@ -39,6 +45,12 @@ public class PageController : ICarterModule } + private async Task CheckDeletedLinkAsync([FromQuery] string link, [FromServices] IPageService pageService, CancellationToken cancellationToken) + => TypedResults.Ok(await pageService.CheckDeletedAsync(link, cancellationToken)); + + private async Task CheckRedirectedOldLinkAsync([FromQuery] string oldUrl, [FromServices] IPageService pageService, CancellationToken cancellationToken) + => TypedResults.Content(await pageService.CheckRedirectAsync(oldUrl, cancellationToken)); + private async Task DeletePageByIdAsync([FromRoute]Guid id,[FromServices]IPageService pageService,CancellationToken cancellationToken) => TypedResults.Ok(await pageService.DeletePageAsync(id, cancellationToken)); diff --git a/Netina.Api/Controllers/PaymentController.cs b/Netina.Api/Controllers/PaymentController.cs index 9275402..13bd2d9 100644 --- a/Netina.Api/Controllers/PaymentController.cs +++ b/Netina.Api/Controllers/PaymentController.cs @@ -12,7 +12,7 @@ public class PaymentController : ICarterModule .MapGroup($"api/accounting/pay"); group.MapGet("", GetAllAsync) - .WithDisplayName("GetPayments") + .WithDisplayName("Get Payments") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewPayments)) .HasApiVersion(1.0); @@ -22,6 +22,7 @@ public class PaymentController : ICarterModule // .HasApiVersion(1.0); group.MapGet("verify", VerifyPaymentAsync) + .WithDisplayName("Verify Payment") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/ProductCategoryController.cs b/Netina.Api/Controllers/ProductCategoryController.cs index 21e22eb..aacd63f 100644 --- a/Netina.Api/Controllers/ProductCategoryController.cs +++ b/Netina.Api/Controllers/ProductCategoryController.cs @@ -9,22 +9,25 @@ public class ProductCategoryController : ICarterModule .MapGroup($"api/product/category"); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllCategories") + .WithDisplayName("Get ProductCategories") .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetCategory") + .WithDisplayName("Get ProductCategory") .HasApiVersion(1.0); group.MapPost("", Post) + .WithDisplayName("Create ProductCategory") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission,ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); group.MapPut("", Put) + .WithDisplayName("Update ProductCategory") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); group.MapDelete("{id}", Delete) + .WithDisplayName("Delete ProductCategory") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/ProductController.cs b/Netina.Api/Controllers/ProductController.cs index 45b2319..4b85f29 100644 --- a/Netina.Api/Controllers/ProductController.cs +++ b/Netina.Api/Controllers/ProductController.cs @@ -11,30 +11,35 @@ public class ProductController : ICarterModule .MapGroup($"api/product"); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllProducts") + .WithDisplayName("Get Products") .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetProducts") + .WithDisplayName("Get Product") .HasApiVersion(1.0); group.MapPost("", Post) + .WithDisplayName("Create Product") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); group.MapPut("", Put) + .WithDisplayName("Update Product") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); group.MapPut("{productId}/displayed", ChangeDisplayedAsync) + .WithDisplayName("Change Product Display") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); group.MapPut("{productId}/cost", ChangeCostAsync) + .WithDisplayName("Change Product Cost") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); group.MapDelete("{id}", Delete) + .WithDisplayName("Delete Product") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageProducts)) .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/ProductReviewController.cs b/Netina.Api/Controllers/ProductReviewController.cs index 9c2b7ee..7972d29 100644 --- a/Netina.Api/Controllers/ProductReviewController.cs +++ b/Netina.Api/Controllers/ProductReviewController.cs @@ -8,27 +8,27 @@ public class ProductReviewController : ICarterModule .MapGroup("product/review"); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetOneAsync") + .WithDisplayName("Get ProductReview") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewAllReviews,ApplicationPermission.ManageReview)) .HasApiVersion(1.0); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllAsync") + .WithDisplayName("Get ProductReview") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewAllReviews, ApplicationPermission.ManageReview)) .HasApiVersion(1.0); group.MapPost("", PostAsync) - .WithDisplayName("PostReview") + .WithDisplayName("Create ProductReview") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageReview, ApplicationPermission.AddReview)) .HasApiVersion(1.0); group.MapPut("confirm/{id}", ConfirmAsync) - .WithDisplayName("ConfirmAsync") + .WithDisplayName("Confirm ProductReview") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ConfirmReview, ApplicationPermission.ManageReview)) .HasApiVersion(1.0); group.MapDelete("{id}", DeleteAsync) - .WithDisplayName("DeleteAsync") + .WithDisplayName("Delete ProductReview") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageReview)) .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/RoleController.cs b/Netina.Api/Controllers/RoleController.cs index 8c99bed..64d6298 100644 --- a/Netina.Api/Controllers/RoleController.cs +++ b/Netina.Api/Controllers/RoleController.cs @@ -11,29 +11,32 @@ public class RoleController : ICarterModule .MapGroup($"api/user/role"); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllRoles") + .WithDisplayName("Get Roles") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewRoles, ApplicationPermission.ManageRoles)) .HasApiVersion(1.0); group.MapGet("permission", GetAllPermissions) - .WithDisplayName("GetAllPermissions") + .WithDisplayName("Get Permissions") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewRoles, ApplicationPermission.ManageRoles)) .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetRole") + .WithDisplayName("Get Role") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewRoles, ApplicationPermission.ManageRoles)) .HasApiVersion(1.0); group.MapPost("", Post) + .WithDisplayName("Create Role") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoles)) .HasApiVersion(1.0); group.MapPut("", Put) + .WithDisplayName("Update Role") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoles)) .HasApiVersion(1.0); group.MapDelete("{id}", Delete) + .WithDisplayName("Delete Role") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoles)) .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/ScraperController.cs b/Netina.Api/Controllers/ScraperController.cs index e0a1c44..50b1212 100644 --- a/Netina.Api/Controllers/ScraperController.cs +++ b/Netina.Api/Controllers/ScraperController.cs @@ -9,11 +9,11 @@ public class ScraperController : ICarterModule .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission,ApplicationPermission.ManageScraper)); group.MapGet("digi", GetDigiProductsAsync) - .WithDisplayName("GetDigiProducts") + .WithDisplayName("Get DigiProducts") .HasApiVersion(1.0); group.MapPost("digi/{productId}", AddProductToShopAsync) - .WithDisplayName("AddProductToShop") + .WithDisplayName("Add DigiProduct To Shop") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/SearchController.cs b/Netina.Api/Controllers/SearchController.cs index adf1244..99b2926 100644 --- a/Netina.Api/Controllers/SearchController.cs +++ b/Netina.Api/Controllers/SearchController.cs @@ -10,19 +10,19 @@ public class SearchController : ICarterModule group.MapGet("/thumb", SearchThumbAsync) - .WithDisplayName("Thumb Search Async") + .WithDisplayName("Thumb Search") .HasApiVersion(1.0); group.MapGet("zarehbin", ZarehbinAsync) - .WithDisplayName("Search Async") + .WithDisplayName("Get Zarehbin Product") .HasApiVersion(1.0); group.MapGet("torob", TorobAsync) - .WithDisplayName("Get Torob Product Async") + .WithDisplayName("Get Torob Product") .HasApiVersion(1.0); group.MapGet("emalls", EmallsAsync) - .WithDisplayName("Get Emalls Product Async") + .WithDisplayName("Get Emalls Product") .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/SettingController.cs b/Netina.Api/Controllers/SettingController.cs index 553d684..f3789e4 100644 --- a/Netina.Api/Controllers/SettingController.cs +++ b/Netina.Api/Controllers/SettingController.cs @@ -10,12 +10,12 @@ public class SettingController : ICarterModule .MapGroup("api/setting"); group.MapGet("{settingName}", GetSettingAsync) - .WithDisplayName("GetSetting") + .WithDisplayName("Get Setting") .RequireAuthorization(builder=>builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewSettings,ApplicationPermission.ManageSettings)) .HasApiVersion(1.0); group.MapPost("{settingName}", PostSettingAsync) - .WithDisplayName("PostSettingAsync") + .WithDisplayName("Create Setting") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageSettings)) .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/ShippingController.cs b/Netina.Api/Controllers/ShippingController.cs index fba8566..3f490f5 100644 --- a/Netina.Api/Controllers/ShippingController.cs +++ b/Netina.Api/Controllers/ShippingController.cs @@ -9,23 +9,26 @@ public class ShippingController : ICarterModule .MapGroup($"api/warehouse/shipping"); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllShipping") + .WithDisplayName("Get Shipping") .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetShipping") + .WithDisplayName("Get Shipping") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewShipping, ApplicationPermission.ManageShipping)) .HasApiVersion(1.0); group.MapPost("", Post) + .WithDisplayName("Create Shipping") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShipping)) .HasApiVersion(1.0); group.MapPut("", Put) + .WithDisplayName("Update Shipping") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShipping)) .HasApiVersion(1.0); group.MapDelete("{id}", Delete) + .WithDisplayName("Delete Shipping") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShipping)) .HasApiVersion(1.0); } diff --git a/Netina.Api/Controllers/UserAddressController.cs b/Netina.Api/Controllers/UserAddressController.cs index 1a57666..b22f728 100644 --- a/Netina.Api/Controllers/UserAddressController.cs +++ b/Netina.Api/Controllers/UserAddressController.cs @@ -13,7 +13,7 @@ public class UserAddressController : ICarterModule .HasApiVersion(1.0); group.MapPost("", PostAddressesAsync) - .WithDisplayName("Post Addresses") + .WithDisplayName("Create Addresses") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser()) .HasApiVersion(1.0); diff --git a/Netina.Api/Controllers/UserController.cs b/Netina.Api/Controllers/UserController.cs index 5c1d95b..7227fe8 100644 --- a/Netina.Api/Controllers/UserController.cs +++ b/Netina.Api/Controllers/UserController.cs @@ -12,44 +12,47 @@ public class UserController : ICarterModule .MapGroup($"api/user"); group.MapGet("info", GetUserInfoAsync) - .WithDisplayName("GetUserInfo") + .WithDisplayName("Get UserInfo") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser()) .HasApiVersion(1.0); group.MapGet("", GetAllAsync) - .WithDisplayName("GetAllUsers") + .WithDisplayName("Get Users") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewUsers, ApplicationPermission.ManageUsers)) .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) - .WithDisplayName("GetUser") + .WithDisplayName("Get User") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewUsers, ApplicationPermission.ManageUsers)) .HasApiVersion(1.0); group.MapGet("/order", GetUserOrdersAsync) - .WithDisplayName("GetUserOrders") + .WithDisplayName("Get UserOrders By JWT") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewMineOrders)) .HasApiVersion(1.0); group.MapGet("{id}/order", GetUserOrdersByIdAsync) - .WithDisplayName("GetUserOrders") + .WithDisplayName("Get UserOrders") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewAllOrders)) .HasApiVersion(1.0); group.MapGet("/changelog", GetChangeLogAsync) - .WithDisplayName("GetChangeLog") + .WithDisplayName("Get ChangeLog") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDashboard)) .HasApiVersion(1.0); group.MapPost("", Post) + .WithDisplayName("Create User") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageUsers)) .HasApiVersion(1.0); group.MapPut("", Put) + .WithDisplayName("Update User") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageUsers)) .HasApiVersion(1.0); group.MapDelete("{id}", Delete) + .WithDisplayName("Delete User") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageUsers)) .HasApiVersion(1.0); } diff --git a/Netina.Common/Extensions/StringExtensions.cs b/Netina.Common/Extensions/StringExtensions.cs index a8f7577..7f53870 100644 --- a/Netina.Common/Extensions/StringExtensions.cs +++ b/Netina.Common/Extensions/StringExtensions.cs @@ -1,4 +1,5 @@ -using System.Web; +using System.Net; +using System.Web; namespace Netina.Common.Extensions { @@ -9,7 +10,12 @@ namespace Netina.Common.Extensions public static string GetSlug(string title) { - return HttpUtility.UrlEncode(title.Replace(' ', '-')); + var splits = title.Split("/"); + string outPut = string.Empty; + foreach (var split in splits) + outPut = outPut.IsNullOrEmpty() ? split : string.Concat(outPut, "/", WebUtility.UrlEncode( split.Replace(' ', '-'))); + + return outPut; } public static string ToPriceWhitPriceType(this long price, string priceType) { diff --git a/Netina.Core/BaseServices/Abstracts/IPageService.cs b/Netina.Core/BaseServices/Abstracts/IPageService.cs index d960ace..0937123 100644 --- a/Netina.Core/BaseServices/Abstracts/IPageService.cs +++ b/Netina.Core/BaseServices/Abstracts/IPageService.cs @@ -6,4 +6,7 @@ public interface IPageService : IScopedDependency Task> GetPagesAsync(CancellationToken cancellationToken = default); Task CreatePageAsync(PageActionRequestDto entity, CancellationToken cancellationToken = default); Task DeletePageAsync(Guid id, CancellationToken cancellationToken = default); + + Task CheckRedirectAsync(string oldUrl, CancellationToken cancellationToken); + Task CheckDeletedAsync(string url, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/Netina.Core/BaseServices/PageService.cs b/Netina.Core/BaseServices/PageService.cs index 7f2625d..85b9c88 100644 --- a/Netina.Core/BaseServices/PageService.cs +++ b/Netina.Core/BaseServices/PageService.cs @@ -1,10 +1,12 @@ -using Netina.Domain.MartenEntities.Pages; +using Netina.Core.BaseServices.Abstracts; +using Netina.Domain.MartenEntities.Pages; namespace Netina.Core.BaseServices; public class PageService( IMartenRepositoryWrapper martenRepositoryWrapperWrapper, - ICurrentUserService currentUserService) + ICurrentUserService currentUserService, + ISettingService settingService) : IPageService { public async Task GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null, string? type = null, CancellationToken cancellationToken = default) @@ -93,4 +95,30 @@ public class PageService( await martenRepositoryWrapperWrapper.SetRepository().RemoveEntityAsync(page, cancellationToken); return true; } + + public async Task CheckRedirectAsync(string oldUrl, CancellationToken cancellationToken) + { + var setting = await settingService.GetSettingAsync(nameof(PageSetting), cancellationToken); + var oldEncode = StringExtensions.GetSlug(oldUrl); + if (setting is PageSetting pageSetting) + { + var newLink = pageSetting.RedirectItems.FirstOrDefault(f => f.OldUrl.ToLower().Trim() == oldEncode.ToLower().Trim()); + if (newLink != null) + return newLink.NewUrl; + else + throw new BaseApiException(ApiResultStatusCode.NotFound, "Url not found"); + } + throw new BaseApiException(ApiResultStatusCode.NotFound, "PageSetting not found"); + } + + public async Task CheckDeletedAsync(string url, CancellationToken cancellationToken) + { + var setting = await settingService.GetSettingAsync(nameof(PageSetting), cancellationToken); + if (setting is PageSetting pageSetting) + { + var newLink = pageSetting.DeletedPages.FirstOrDefault(f => f.Url.ToLower().Trim() == url.ToLower().Trim()); + return newLink != null; + } + throw new BaseApiException(ApiResultStatusCode.NotFound, "PageSetting not found"); + } } \ No newline at end of file diff --git a/Netina.Core/QuartzServices/SiteMapScheduledJob.cs b/Netina.Core/QuartzServices/SiteMapScheduledJob.cs index 924c5a0..3f343ca 100644 --- a/Netina.Core/QuartzServices/SiteMapScheduledJob.cs +++ b/Netina.Core/QuartzServices/SiteMapScheduledJob.cs @@ -3,8 +3,7 @@ using Quartz; namespace Netina.Core.QuartzServices; -public class SiteMapScheduledJob(ILogger logger, ISiteMapService siteMapService) - : IJob +public class SiteMapScheduledJob(ILogger logger, ISiteMapService siteMapService) : IJob { public async Task Execute(IJobExecutionContext context) { diff --git a/Netina.Domain/MartenEntities/Settings/PageSetting.cs b/Netina.Domain/MartenEntities/Settings/PageSetting.cs new file mode 100644 index 0000000..5761f40 --- /dev/null +++ b/Netina.Domain/MartenEntities/Settings/PageSetting.cs @@ -0,0 +1,17 @@ +namespace Netina.Domain.MartenEntities.Settings; + +public class PageSetting +{ + public List RedirectItems { get; set; } = new(); + public List DeletedPages { get; set; } = new(); +} +public class DeletedPageItem +{ + public string Url { get; set; } = string.Empty; +} + +public class RedirectItem +{ + public string OldUrl { get; set; } = string.Empty; + public string NewUrl { get; set; } = string.Empty; +} \ No newline at end of file