diff --git a/.version b/.version index 99a3501..1a0417d 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.0.9.11 \ No newline at end of file +1.2.11.13 \ No newline at end of file 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/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 2b7bfe9..48a69f7 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; @@ -15,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 new file mode 100644 index 0000000..777a24b --- /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("Get Faq By Slug") + .WithDescription("Get faq by slug , you have to send page slug") + .HasApiVersion(1.0); + + group.MapGet("", GetFaqsAsync) + .WithDisplayName("Get Faqs") + .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 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("Delete Faq") + .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/FileController.cs b/Netina.Api/Controllers/FileController.cs index 7747d37..f318508 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; @@ -10,14 +11,57 @@ 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) + .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.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 4a06093..0816fd5 100644 --- a/Netina.Api/Controllers/OrderController.cs +++ b/Netina.Api/Controllers/OrderController.cs @@ -10,27 +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("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); @@ -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.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 3879b4e..4b85f29 100644 --- a/Netina.Api/Controllers/ProductController.cs +++ b/Netina.Api/Controllers/ProductController.cs @@ -11,26 +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}", ChangeDisplayedAsync) + 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); } @@ -65,6 +74,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.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/SeedController.cs b/Netina.Api/Controllers/SeedController.cs index acc7f01..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"); @@ -78,13 +72,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 +92,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/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.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.Api/Netina.Api.csproj b/Netina.Api/Netina.Api.csproj index d84a3e8..291980c 100644 --- a/Netina.Api/Netina.Api.csproj +++ b/Netina.Api/Netina.Api.csproj @@ -6,40 +6,40 @@ enable true Linux - 1.0.9.11 - 1.0.9.11 + 1.2.11.13 + 1.2.11.13 - + - + - - - + + + 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.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 122c097..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,15 +23,17 @@ public class ExceptionHandlerMiddleware try { - await _next(context); + await next(context); } catch (BaseApiException exception) { - _logger.LogError(exception, exception.Message); - httpStatusCode = exception.HttpStatusCode; + 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 { @@ -80,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; @@ -103,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) { @@ -183,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 e6cce82..66087b1 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 88f2fa1..7f53870 100644 --- a/Netina.Common/Extensions/StringExtensions.cs +++ b/Netina.Common/Extensions/StringExtensions.cs @@ -1,13 +1,21 @@ -using System.Web; -using System.Xml.Linq; +using System.Net; +using System.Web; 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(' ', '-')); + 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.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.Common/Netina.Common.csproj b/Netina.Common/Netina.Common.csproj index b49a057..86c51c9 100644 --- a/Netina.Common/Netina.Common.csproj +++ b/Netina.Common/Netina.Common.csproj @@ -11,7 +11,7 @@ - +