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