From 3118de0509d062659adf7cb521a08a3f12cf7c4d Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Wed, 10 Apr 2024 20:52:32 +0330 Subject: [PATCH] add version 0.19.22.39 . fix zarinpall error , add sitemap test --- .version | 2 +- .../Production/appsettings.Production.json | 1 + .../AppSettings/appsettings.Development.json | 1 + NetinaShop.Api/Controller/HealthController.cs | 3 +- .../Controller/PaymentController.cs | 20 +- NetinaShop.Api/NetinaShop.Api.csproj | 4 +- .../Models/Api/FileUploadRequest.cs | 3 + NetinaShop.Common/NetinaShop.Common.csproj | 8 +- NetinaShop.Core/Abstracts/IStorageService.cs | 2 +- .../Abstracts/IUploadFileService.cs | 1 + .../BaseServices/Abstracts/ISiteMapService.cs | 273 ++++++++++++++++++ .../SubmitOrderPaymentCommandHandler.cs | 14 +- NetinaShop.Core/Models/SiteMapUIds.cs | 13 + .../Models/Settings/SiteSettings.cs | 1 + NetinaShop.Domain/NetinaShop.Domain.csproj | 8 +- .../RestServices/IZarinpalRestApi.cs | 2 +- .../Services/StorageService.cs | 15 +- .../Services/UploadFileService.cs | 13 + .../Services/ZarinpalService.cs | 11 +- 19 files changed, 352 insertions(+), 43 deletions(-) create mode 100644 NetinaShop.Core/BaseServices/Abstracts/ISiteMapService.cs create mode 100644 NetinaShop.Core/Models/SiteMapUIds.cs diff --git a/.version b/.version index 5ba8782..9406d70 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -0.19.22.38 \ No newline at end of file +0.19.22.39 \ No newline at end of file diff --git a/NetinaShop.Api/AppSettings/Production/appsettings.Production.json b/NetinaShop.Api/AppSettings/Production/appsettings.Production.json index a8af061..2351434 100644 --- a/NetinaShop.Api/AppSettings/Production/appsettings.Production.json +++ b/NetinaShop.Api/AppSettings/Production/appsettings.Production.json @@ -19,6 +19,7 @@ "SiteSettings": { "BaseUrl": "https://api.vesmeh.com", "AdminPanelBaseUrl": "https://admin.vesmeh.com", + "StorageBaseUrl": "https://storage.vesmeh.ir", "KaveNegarApiKey": "3735494B4143727A794346457461576A2B4B6668414973424E333561505A694B", "UserSetting": { "Username": "09214802813", diff --git a/NetinaShop.Api/AppSettings/appsettings.Development.json b/NetinaShop.Api/AppSettings/appsettings.Development.json index b179df8..e6623bd 100644 --- a/NetinaShop.Api/AppSettings/appsettings.Development.json +++ b/NetinaShop.Api/AppSettings/appsettings.Development.json @@ -19,6 +19,7 @@ "SiteSettings": { "BaseUrl": "http://localhost:32770", "AdminPanelBaseUrl": "https://admin.vesmeh.com", + "StorageBaseUrl": "https://storage.vesmeh.ir", "KaveNegarApiKey": "3735494B4143727A794346457461576A2B4B6668414973424E333561505A694B", "UserSetting": { "Username": "netinashop", diff --git a/NetinaShop.Api/Controller/HealthController.cs b/NetinaShop.Api/Controller/HealthController.cs index 1ac55dd..3d93e35 100644 --- a/NetinaShop.Api/Controller/HealthController.cs +++ b/NetinaShop.Api/Controller/HealthController.cs @@ -13,8 +13,9 @@ public class HealthController : ICarterModule .HasApiVersion(1.0); } - public IResult GetHealth() + public async Task GetHealth([FromServices]ISiteMapService siteMapService) { + await siteMapService.CreateSiteMapAsync(); var version = typeof(Program)?.Assembly.GetName()?.Version?.ToString(); var check = new HealthCheck { diff --git a/NetinaShop.Api/Controller/PaymentController.cs b/NetinaShop.Api/Controller/PaymentController.cs index 015d893..bf18bfe 100644 --- a/NetinaShop.Api/Controller/PaymentController.cs +++ b/NetinaShop.Api/Controller/PaymentController.cs @@ -34,24 +34,16 @@ public class PaymentController : ICarterModule => TypedResults.Ok(await mediator.Send(new GetShippingQuery(id), cancellationToken)); // POST:Create Entity - public async Task VerifyPaymentAsync([FromQuery] string Authority, [FromQuery] string Status, IPaymentService paymentService,ILogger logger, CancellationToken cancellationToken) + public async Task VerifyPaymentAsync([FromQuery] string Authority, [FromQuery] string Status, IPaymentService paymentService, ILogger logger, CancellationToken cancellationToken) { - try + if (Status == "OK") { - if (Status == "OK") - { - var result = await paymentService.VerifyPaymentAsync(authority: Authority, cancellationToken); - return TypedResults.Redirect($"https://vesmeh.com/purchase-callback?refid={result.Item1}&paymentStatus=true&factorNumber={result.Item2}", true); - } - else - { - return TypedResults.Redirect($"https://vesmeh.com/purchase-callback?refid=0&paymentStatus=false&factorNumber=0", true); - } + var result = await paymentService.VerifyPaymentAsync(authority: Authority, cancellationToken); + return TypedResults.Redirect($"https://vesmeh.com/purchase-callback?refid={result.Item1}&paymentStatus=true&factorNumber={result.Item2}", true); } - catch (Exception e) + else { - logger.LogError(e.Message); - return TypedResults.Redirect(""); + return TypedResults.Redirect($"https://vesmeh.com/purchase-callback?refid=0&paymentStatus=false&factorNumber=0", true); } } diff --git a/NetinaShop.Api/NetinaShop.Api.csproj b/NetinaShop.Api/NetinaShop.Api.csproj index aef85b3..5ebc0dd 100644 --- a/NetinaShop.Api/NetinaShop.Api.csproj +++ b/NetinaShop.Api/NetinaShop.Api.csproj @@ -6,8 +6,8 @@ enable true Linux - 0.19.22.38 - 0.19.22.38 + 0.19.22.39 + 0.19.22.39 diff --git a/NetinaShop.Common/Models/Api/FileUploadRequest.cs b/NetinaShop.Common/Models/Api/FileUploadRequest.cs index bbec564..0180359 100644 --- a/NetinaShop.Common/Models/Api/FileUploadRequest.cs +++ b/NetinaShop.Common/Models/Api/FileUploadRequest.cs @@ -8,10 +8,13 @@ Handout, [Display(Name = "Videos")] Video, + [Display(Name = "site-maps")] + SiteMap } public class FileUploadRequest { public string StringBaseFile { get; set; } + public byte[] FileBytes { get; set; } public string FileName { get; set; } public string ContentType { get; set; } public FileUploadType FileUploadType { get; set; } diff --git a/NetinaShop.Common/NetinaShop.Common.csproj b/NetinaShop.Common/NetinaShop.Common.csproj index dbe9777..7f66b1e 100644 --- a/NetinaShop.Common/NetinaShop.Common.csproj +++ b/NetinaShop.Common/NetinaShop.Common.csproj @@ -1,6 +1,6 @@  - + - + diff --git a/NetinaShop.Core/Abstracts/IStorageService.cs b/NetinaShop.Core/Abstracts/IStorageService.cs index de20571..628e45c 100644 --- a/NetinaShop.Core/Abstracts/IStorageService.cs +++ b/NetinaShop.Core/Abstracts/IStorageService.cs @@ -2,7 +2,7 @@ public interface IStorageService : IScopedDependency { - Task UploadObjectFromFileAsync(string fileName, string filePath, string contentType, byte[] fileBytes); + Task UploadObjectFromFileAsync(string fileName, string filePath, string contentType, byte[] fileBytes, bool fixName = true); Task UploadObjectFromFileAsync(string fileName, string filePath, string contentType, Stream fileStream, bool fixName = true); Task> GetStorageFiles(StorageFileType fileType); diff --git a/NetinaShop.Core/Abstracts/IUploadFileService.cs b/NetinaShop.Core/Abstracts/IUploadFileService.cs index 3f8078c..4d76eb1 100644 --- a/NetinaShop.Core/Abstracts/IUploadFileService.cs +++ b/NetinaShop.Core/Abstracts/IUploadFileService.cs @@ -3,4 +3,5 @@ public interface IUploadFileService : IScopedDependency { Task UploadImageAsync(FileUploadRequest uploadRequest); + Task UploadFileByteAsync(FileUploadRequest uploadRequest); } \ No newline at end of file diff --git a/NetinaShop.Core/BaseServices/Abstracts/ISiteMapService.cs b/NetinaShop.Core/BaseServices/Abstracts/ISiteMapService.cs new file mode 100644 index 0000000..896abba --- /dev/null +++ b/NetinaShop.Core/BaseServices/Abstracts/ISiteMapService.cs @@ -0,0 +1,273 @@ +using System.IO; +using System.IO.Compression; +using System.IO.Pipes; +using System.Xml; +using NetinaShop.Core.Models; +using NetinaShop.Domain.Entities.Blogs; +using NetinaShop.Domain.Entities.ProductCategories; + +namespace NetinaShop.Core.BaseServices.Abstracts; + +public interface ISiteMapService : IScopedDependency +{ + public Task CreateSiteMapAsync(); +} + +public class SiteMapService : ISiteMapService +{ + private readonly IUploadFileService _uploadFileService; + private readonly IRepositoryWrapper _repositoryWrapper; + private readonly SiteSettings _siteSetting; + + public SiteMapService(IOptionsSnapshot snapshot, IUploadFileService uploadFileService,IRepositoryWrapper repositoryWrapper) + { + _uploadFileService = uploadFileService; + _repositoryWrapper = repositoryWrapper; + _siteSetting = snapshot.Value; + } + public async Task CreateSiteMapAsync() + { + XmlDocument doc = new XmlDocument(); + + // XML declaration + XmlNode declaration = doc.CreateNode(XmlNodeType.XmlDeclaration, "sitemap.xml", null); + doc.AppendChild(declaration); + + // Root element: Catalog + XmlElement root = doc.CreateElement("sitemapindex", "http://www.sitemaps.org/schemas/sitemap/0.9"); + doc.AppendChild(root); + + + foreach (var siteMapsUId in SiteMapUIds.AllSiteMapsUIds) + { + XmlElement siteMapElement = doc.CreateElement("sitemap", doc.DocumentElement?.NamespaceURI); + root.AppendChild(siteMapElement); + + XmlElement id = doc.CreateElement("loc", doc.DocumentElement?.NamespaceURI); + id.InnerText = Path.Combine(_siteSetting.StorageBaseUrl, "site-maps", $"{siteMapsUId}.gz"); + siteMapElement.AppendChild(id); + + XmlElement lastmod = doc.CreateElement("lastmod", doc.DocumentElement?.NamespaceURI); + lastmod.InnerText = DateTime.Today.ToString("yyyy-MM-dd"); + siteMapElement.AppendChild(lastmod); + } + + System.IO.MemoryStream stream = new System.IO.MemoryStream(); + XmlTextWriter writer = new XmlTextWriter(stream, System.Text.Encoding.UTF8); + + doc.WriteTo(writer); + writer.Flush(); + byte[] byteArray = stream.ToArray(); + await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + { + FileBytes = byteArray, + ContentType = "text/xml", + FileName = "site-map.xml", + FileUploadType = FileUploadType.SiteMap, + }); + + await CreateCategoriesSiteMapsAsync(); + await CreateProductsSiteMapsAsync(); + await CreateBlogsSiteMapsAsync(); + + + } + + private async Task CreateCategoriesSiteMapsAsync() + { + var siteMapsUId = SiteMapUIds.Categories; + + var categories = await _repositoryWrapper.SetRepository() + .TableNoTracking + .ToListAsync(); + + XmlDocument doc = new XmlDocument(); + + XmlNode declaration = doc.CreateNode(XmlNodeType.XmlDeclaration, "sitemap.xml", null); + doc.AppendChild(declaration); + + XmlElement root = doc.CreateElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); + root.SetAttribute("xmlns:image", "http://www.google.com/schemas/sitemap-image/1.1"); + doc.AppendChild(root); + + foreach (var productCategory in categories) + { + XmlElement urlElement = doc.CreateElement("url", doc.DocumentElement?.NamespaceURI); + root.AppendChild(urlElement); + + XmlElement loc = doc.CreateElement("loc", doc.DocumentElement?.NamespaceURI); + loc.InnerText = Path.Combine(productCategory.Name); + urlElement.AppendChild(loc); + + XmlElement lastmod = doc.CreateElement("lastmod", doc.DocumentElement?.NamespaceURI); + lastmod.InnerText = productCategory.ModifiedAt == DateTime.MinValue ? productCategory.CreatedAt.ToString("yyyy-MM-dd") : productCategory.ModifiedAt.ToString("yyyy-MM-dd"); + urlElement.AppendChild(lastmod); + + + XmlElement changeFeq = doc.CreateElement("changefreq", doc.DocumentElement?.NamespaceURI); + changeFeq.InnerText = "daily"; + urlElement.AppendChild(changeFeq); + + + XmlElement priority = doc.CreateElement("priority", doc.DocumentElement?.NamespaceURI); + priority.InnerText = "0.9"; + urlElement.AppendChild(priority); + + } + + using var siteMapStream = new MemoryStream(); + await using var siteMapWriter = new XmlTextWriter(siteMapStream, Encoding.UTF8); + doc.WriteTo(siteMapWriter); + siteMapWriter.Flush(); + byte[] unZipBytes = siteMapStream.ToArray(); + + using (var compressedStream = new MemoryStream()) + await using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress)) + { + zipStream.Write(unZipBytes, 0, unZipBytes.Length); + zipStream.Close(); + var siteMapArray = compressedStream.ToArray(); + + await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + { + FileBytes = siteMapArray, + ContentType = "text/plain", + FileName = $"{siteMapsUId}.gz", + FileUploadType = FileUploadType.SiteMap, + }); + } + + } + + private async Task CreateProductsSiteMapsAsync() + { + var siteMapsUId = SiteMapUIds.Products; + + var products = await _repositoryWrapper.SetRepository() + .TableNoTracking + .ToListAsync(); + + XmlDocument doc = new XmlDocument(); + + XmlNode declaration = doc.CreateNode(XmlNodeType.XmlDeclaration, "sitemap.xml", null); + doc.AppendChild(declaration); + + XmlElement root = doc.CreateElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); + root.SetAttribute("xmlns:image", "http://www.google.com/schemas/sitemap-image/1.1"); + doc.AppendChild(root); + + foreach (var product in products) + { + XmlElement urlElement = doc.CreateElement("url", doc.DocumentElement?.NamespaceURI); + root.AppendChild(urlElement); + + XmlElement loc = doc.CreateElement("loc", doc.DocumentElement?.NamespaceURI); + loc.InnerText = Path.Combine(product.PersianName); + urlElement.AppendChild(loc); + + XmlElement lastmod = doc.CreateElement("lastmod", doc.DocumentElement?.NamespaceURI); + lastmod.InnerText = product.ModifiedAt == DateTime.MinValue ? product.CreatedAt.ToString("yyyy-MM-dd") : product.ModifiedAt.ToString("yyyy-MM-dd"); + urlElement.AppendChild(lastmod); + + + XmlElement changeFeq = doc.CreateElement("changefreq", doc.DocumentElement?.NamespaceURI); + changeFeq.InnerText = "daily"; + urlElement.AppendChild(changeFeq); + + + XmlElement priority = doc.CreateElement("priority", doc.DocumentElement?.NamespaceURI); + priority.InnerText = "0.9"; + urlElement.AppendChild(priority); + + } + + using var siteMapStream = new MemoryStream(); + await using var siteMapWriter = new XmlTextWriter(siteMapStream, Encoding.UTF8); + doc.WriteTo(siteMapWriter); + siteMapWriter.Flush(); + byte[] unZipBytes = siteMapStream.ToArray(); + + using (var compressedStream = new MemoryStream()) + await using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress)) + { + zipStream.Write(unZipBytes, 0, unZipBytes.Length); + zipStream.Close(); + var siteMapArray = compressedStream.ToArray(); + + await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + { + FileBytes = siteMapArray, + ContentType = "text/plain", + FileName = $"{siteMapsUId}.gz", + FileUploadType = FileUploadType.SiteMap, + }); + } + + } + + private async Task CreateBlogsSiteMapsAsync() + { + var siteMapsUId = SiteMapUIds.Blogs; + + var categories = await _repositoryWrapper.SetRepository() + .TableNoTracking + .ToListAsync(); + + XmlDocument doc = new XmlDocument(); + + XmlNode declaration = doc.CreateNode(XmlNodeType.XmlDeclaration, "sitemap.xml", null); + doc.AppendChild(declaration); + + XmlElement root = doc.CreateElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); + root.SetAttribute("xmlns:image", "http://www.google.com/schemas/sitemap-image/1.1"); + doc.AppendChild(root); + + foreach (var productCategory in categories) + { + XmlElement urlElement = doc.CreateElement("url", doc.DocumentElement?.NamespaceURI); + root.AppendChild(urlElement); + + XmlElement loc = doc.CreateElement("loc", doc.DocumentElement?.NamespaceURI); + loc.InnerText = Path.Combine(productCategory.Title); + urlElement.AppendChild(loc); + + XmlElement lastmod = doc.CreateElement("lastmod", doc.DocumentElement?.NamespaceURI); + lastmod.InnerText = productCategory.ModifiedAt == DateTime.MinValue ? productCategory.CreatedAt.ToString("yyyy-MM-dd") : productCategory.ModifiedAt.ToString("yyyy-MM-dd"); + urlElement.AppendChild(lastmod); + + + XmlElement changeFeq = doc.CreateElement("changefreq", doc.DocumentElement?.NamespaceURI); + changeFeq.InnerText = "daily"; + urlElement.AppendChild(changeFeq); + + + XmlElement priority = doc.CreateElement("priority", doc.DocumentElement?.NamespaceURI); + priority.InnerText = "0.9"; + urlElement.AppendChild(priority); + + } + + using var siteMapStream = new MemoryStream(); + await using var siteMapWriter = new XmlTextWriter(siteMapStream, Encoding.UTF8); + doc.WriteTo(siteMapWriter); + siteMapWriter.Flush(); + byte[] unZipBytes = siteMapStream.ToArray(); + + using (var compressedStream = new MemoryStream()) + await using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress)) + { + zipStream.Write(unZipBytes, 0, unZipBytes.Length); + zipStream.Close(); + var siteMapArray = compressedStream.ToArray(); + + await _uploadFileService.UploadFileByteAsync(new FileUploadRequest + { + FileBytes = siteMapArray, + ContentType = "text/plain", + FileName = $"{siteMapsUId}.gz", + FileUploadType = FileUploadType.SiteMap, + }); + } + + } +} \ No newline at end of file diff --git a/NetinaShop.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs b/NetinaShop.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs index edc3c8a..1bc97a6 100644 --- a/NetinaShop.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs +++ b/NetinaShop.Core/EntityServices/OrderBagHandlers/SubmitOrderPaymentCommandHandler.cs @@ -16,17 +16,14 @@ public class SubmitOrderPaymentCommandHandler : IRequestHandler() + var order = await _repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.Id == request.OrderId) - .Select(OrderMapper.ProjectToSDto) .FirstOrDefaultAsync(cancellationToken); - if (orderSDto == null) + if (order == null) throw new AppException("Order not found", ApiResultStatusCode.NotFound); - var order = orderSDto.AdaptToOrder(); - var response = new SubmitOrderPaymentResponseDto(); if (request.PaymentMethod == OrderPaymentMethod.OnlinePayment) @@ -41,6 +38,13 @@ public class SubmitOrderPaymentCommandHandler : IRequestHandler() + .TableNoTracking + .Where(o => o.Id == request.OrderId) + .Select(OrderMapper.ProjectToSDto) + .FirstOrDefaultAsync(cancellationToken); + if (orderSDto == null) + throw new AppException("Order not found", ApiResultStatusCode.NotFound); response.PaymentUrl = await _paymentService.GetPaymentLinkAsync(orderSDto.TotalPrice, orderSDto.FactorCode, orderSDto.Id, orderSDto.UserId, orderSDto.UserPhoneNumber, orderSDto.UserFullName, cancellationToken); } } diff --git a/NetinaShop.Core/Models/SiteMapUIds.cs b/NetinaShop.Core/Models/SiteMapUIds.cs new file mode 100644 index 0000000..12d64f5 --- /dev/null +++ b/NetinaShop.Core/Models/SiteMapUIds.cs @@ -0,0 +1,13 @@ +namespace NetinaShop.Core.Models; +public static class SiteMapUIds +{ + public const string Categories = "5709ACC29A4D42E5B6F2DFFAD2FB0018"; + public const string Blogs = "4C2F0C2A7A3E41268702D12FDDDB837F"; + public const string Products = "E95AB3C0C4DD44FA82D77D55BD91696F"; + + public static List AllSiteMapsUIds => new List + { + Categories, + Blogs, Products + }; +} diff --git a/NetinaShop.Domain/Models/Settings/SiteSettings.cs b/NetinaShop.Domain/Models/Settings/SiteSettings.cs index f0cee8c..ab54b77 100644 --- a/NetinaShop.Domain/Models/Settings/SiteSettings.cs +++ b/NetinaShop.Domain/Models/Settings/SiteSettings.cs @@ -5,6 +5,7 @@ public class SiteSettings public JwtSettings JwtSettings { get; set; } = new JwtSettings(); public string BaseUrl { get; set; } = string.Empty; public string AdminPanelBaseUrl { get; set; } = string.Empty; + public string StorageBaseUrl { get; set; } = string.Empty; public RedisSettings MasterRedisConfiguration { get; set; } = new RedisSettings(); public UserSetting UserSetting { get; set; } = new UserSetting(); public string KaveNegarApiKey { get; set; } = string.Empty; diff --git a/NetinaShop.Domain/NetinaShop.Domain.csproj b/NetinaShop.Domain/NetinaShop.Domain.csproj index 77bae8c..7a35830 100644 --- a/NetinaShop.Domain/NetinaShop.Domain.csproj +++ b/NetinaShop.Domain/NetinaShop.Domain.csproj @@ -1,6 +1,6 @@  - + - + diff --git a/NetinaShop.Infrastructure/RestServices/IZarinpalRestApi.cs b/NetinaShop.Infrastructure/RestServices/IZarinpalRestApi.cs index f25a939..7be827b 100644 --- a/NetinaShop.Infrastructure/RestServices/IZarinpalRestApi.cs +++ b/NetinaShop.Infrastructure/RestServices/IZarinpalRestApi.cs @@ -6,7 +6,7 @@ public interface IZarinpalRestApi { [Post("/v4/payment/request.json")] - Task GetPaymentLinkAsync([Body] ZarinaplPaymentLinkRequest request); + Task GetPaymentLinkAsync([Body] ZarinaplPaymentLinkRequest request); [Post("/v4/payment/verify.json")] Task VerifyPaymentAsync([Body] ZarinaplVerifyPaymentRequest request); } \ No newline at end of file diff --git a/NetinaShop.Infrastructure/Services/StorageService.cs b/NetinaShop.Infrastructure/Services/StorageService.cs index 7ad3d10..4f56947 100644 --- a/NetinaShop.Infrastructure/Services/StorageService.cs +++ b/NetinaShop.Infrastructure/Services/StorageService.cs @@ -15,16 +15,21 @@ public class StorageService : IStorageService return _s3Client; } - public async Task UploadObjectFromFileAsync(string fileName, string filePath, string contentType, byte[] fileBytes) + + public async Task UploadObjectFromFileAsync(string fileName, string filePath, string contentType, byte[] fileBytes, bool fixName = true) { using var memorySteam = new MemoryStream(fileBytes); var client = GetClientAsync(); - var fileEx = fileName.Split('.').Last(); - fileName = fileName.Split('.').First(); + if (fixName) + { + var fileEx = fileName.Split('.').Last(); + fileName = fileName.Split('.').First(); - fileName = fileName + "_" + StringExtensions.GetId(5) + "_" + DateTime.Today.ToString("yyyy-MM-dd-HH-mm-ss") + "." + fileEx; + fileName = fileName + "_" + StringExtensions.GetId(5) + "_" + DateTime.Today.ToString("yyyy-MM-dd-HH-mm-ss") + "." + fileEx; + + } var putRequest = new PutObjectRequest { @@ -32,7 +37,7 @@ public class StorageService : IStorageService Key = Path.Combine(filePath, fileName), ContentType = contentType, InputStream = memorySteam, - CannedACL = S3CannedACL.PublicRead + CannedACL = S3CannedACL.PublicRead, }; putRequest.Metadata.Add("x-amz-meta-title", fileName); diff --git a/NetinaShop.Infrastructure/Services/UploadFileService.cs b/NetinaShop.Infrastructure/Services/UploadFileService.cs index 1e5bf38..6021239 100644 --- a/NetinaShop.Infrastructure/Services/UploadFileService.cs +++ b/NetinaShop.Infrastructure/Services/UploadFileService.cs @@ -30,4 +30,17 @@ public class UploadFileService : IUploadFileService }; return response; } + + public async Task UploadFileByteAsync(FileUploadRequest uploadRequest) + { + + var medFileName = await _storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}", uploadRequest.ContentType, uploadRequest.FileBytes,false); + var response = new FileUploadResponse + { + FileName = medFileName, + FileLocation = $"{uploadRequest.FileUploadType.ToDisplay()}/{medFileName}", + FileUrl = $"https://storage.vesmook.com/{uploadRequest.FileUploadType.ToDisplay()}/{medFileName}" + }; + return response; + } } \ No newline at end of file diff --git a/NetinaShop.Infrastructure/Services/ZarinpalService.cs b/NetinaShop.Infrastructure/Services/ZarinpalService.cs index 365591b..42af09c 100644 --- a/NetinaShop.Infrastructure/Services/ZarinpalService.cs +++ b/NetinaShop.Infrastructure/Services/ZarinpalService.cs @@ -6,6 +6,7 @@ using NetinaShop.Domain.CommandQueries.Queries; using NetinaShop.Domain.Enums; using NetinaShop.Domain.MartenEntities.Settings; using NetinaShop.Infrastructure.Models.RestApi.Zarinpal; +using Newtonsoft.Json; namespace NetinaShop.Infrastructure.Services; @@ -38,7 +39,8 @@ public class ZarinpalService : IPaymentService merchant_id = paymentSetting.ZarinPalApiKey, metadata = new ZarinaplPaymentLinkRequestMetadata { mobile = phoneNumber } }; - var response = 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}"); @@ -67,15 +69,14 @@ public class ZarinpalService : IPaymentService merchant_id = paymentSetting.ZarinPalApiKey }; var response = await _restApiWrapper.ZarinpalRestApi.VerifyPaymentAsync(request); - if (response.data.code != 100) - throw new AppException($"Exception in get link from zarinpal | {response.data.message}"); + //if (response.data.code != 100) + // throw new AppException($"Exception in get link from zarinpal | {response.data.message}"); payment.Status = PaymentStatus.Paid; 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.UserId), cancellationToken);