From 6e345430cbe0eda403cd3f0d29965337d4daa3d1 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 27 Jul 2024 18:19:56 +0200 Subject: [PATCH] ExchangeRateService and api --- TIAMMobileApp/MauiProgram.cs | 1 + .../CardComponents/UserCardComponent.razor | 4 +- .../User/SysAdmins/ManageTransfers.razor | 2 +- TIAMSharedUI/Pages/Utility/ChatPage.razor | 9 ++- .../Pages/Utility/ExchangeRateTest.razor | 32 +++++++++++ TIAMWebApp/Client/Program.cs | 1 + .../Controllers/ExchangeRateAPIController.cs | 56 +++++++++++++++++++ .../Controllers/TransferDataAPIController.cs | 34 +++++++++-- TIAMWebApp/Server/Program.cs | 1 + .../Server/Services/ExchangeRateService.cs | 34 +++++++++++ TIAMWebApp/Server/wwwroot/ExchangeRate.xml | 4 ++ TIAMWebApp/Shared/Models/APIUrls.cs | 8 ++- TIAMWebApp/Shared/Models/ExchangeRate.cs | 13 +++++ .../Shared/Services/ExchangeRateService.cs | 35 ++++++++++++ 14 files changed, 223 insertions(+), 11 deletions(-) create mode 100644 TIAMSharedUI/Pages/Utility/ExchangeRateTest.razor create mode 100644 TIAMWebApp/Server/Controllers/ExchangeRateAPIController.cs create mode 100644 TIAMWebApp/Server/Services/ExchangeRateService.cs create mode 100644 TIAMWebApp/Server/wwwroot/ExchangeRate.xml create mode 100644 TIAMWebApp/Shared/Models/ExchangeRate.cs create mode 100644 TIAMWebApp/Shared/Services/ExchangeRateService.cs diff --git a/TIAMMobileApp/MauiProgram.cs b/TIAMMobileApp/MauiProgram.cs index c09818db..685946ea 100644 --- a/TIAMMobileApp/MauiProgram.cs +++ b/TIAMMobileApp/MauiProgram.cs @@ -69,6 +69,7 @@ namespace TIAMMobileApp builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddAuthorizationCore(); builder.Services.Configure(Guid.NewGuid().ToString(), c => { }); return builder.Build(); diff --git a/TIAMSharedUI/Pages/User/CardComponents/UserCardComponent.razor b/TIAMSharedUI/Pages/User/CardComponents/UserCardComponent.razor index 8a8ddcc6..c665bc81 100644 --- a/TIAMSharedUI/Pages/User/CardComponents/UserCardComponent.razor +++ b/TIAMSharedUI/Pages/User/CardComponents/UserCardComponent.razor @@ -38,7 +38,7 @@ NullText="New password" BindValueMode="BindValueMode.OnDelayedInput" InputDelay="300" - + Password="true" CssClass="form-field" />
diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor index 945505da..a4a43cfa 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor @@ -68,7 +68,7 @@
- +- +
diff --git a/TIAMSharedUI/Pages/Utility/ChatPage.razor b/TIAMSharedUI/Pages/Utility/ChatPage.razor index 287eb197..3f977dfe 100644 --- a/TIAMSharedUI/Pages/Utility/ChatPage.razor +++ b/TIAMSharedUI/Pages/Utility/ChatPage.razor @@ -58,7 +58,14 @@ - My trasnfers + My transfers + + +
  • + + + + Exchange Rate
  • diff --git a/TIAMSharedUI/Pages/Utility/ExchangeRateTest.razor b/TIAMSharedUI/Pages/Utility/ExchangeRateTest.razor new file mode 100644 index 00000000..75c6828d --- /dev/null +++ b/TIAMSharedUI/Pages/Utility/ExchangeRateTest.razor @@ -0,0 +1,32 @@ + +@page "/exchange-rate" +@using TIAMWebApp.Shared.Application.Models +@using TIAMWebApp.Shared.Application.Services +@inject ExchangeRateService ExchangeRateService + +

    Exchange Rate

    + +@if (exchangeRate == null) +{ +

    Loading...

    +} +else +{ +

    Current EUR to HUF exchange rate: @exchangeRate.EURtoHUF

    + + +} + +@code { + private ExchangeRate exchangeRate; + + protected override async Task OnInitializedAsync() + { + exchangeRate = await ExchangeRateService.GetExchangeRateAsync(); + } + + private async Task SaveExchangeRate() + { + await ExchangeRateService.SetExchangeRateAsync(exchangeRate); + } +} \ No newline at end of file diff --git a/TIAMWebApp/Client/Program.cs b/TIAMWebApp/Client/Program.cs index c7bbf93d..490d4b60 100644 --- a/TIAMWebApp/Client/Program.cs +++ b/TIAMWebApp/Client/Program.cs @@ -46,6 +46,7 @@ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddAuthorizationCore(); +builder.Services.AddScoped(); //builder.Services.AddScoped(); //WebSpecific end diff --git a/TIAMWebApp/Server/Controllers/ExchangeRateAPIController.cs b/TIAMWebApp/Server/Controllers/ExchangeRateAPIController.cs new file mode 100644 index 00000000..6f16ba8f --- /dev/null +++ b/TIAMWebApp/Server/Controllers/ExchangeRateAPIController.cs @@ -0,0 +1,56 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using QRCoder; +using System.Drawing; +using System.Drawing.Imaging; +using AyCode.Core.Enums; +using AyCode.Core.Extensions; +using TIAM.Database.DataLayers.Admins; +using TIAM.Entities.ServiceProviders; +using TIAM.Entities.Users; +using TIAMWebApp.Shared.Application.Models; +using Product = TIAM.Entities.Products.Product; +using TIAM.Entities.Addresses; +using TIAM.Entities.Profiles; +using AyCode.Core.Loggers; +using AyCode.Entities; +using AyCode.Services.SignalRs; +using AyCode.Utils.Extensions; +using TIAM.Entities.Drivers; +using TIAM.Services; +using TIAMWebApp.Server.Services; +using GoogleApi.Entities.Search.Video.Common; + +namespace TIAMWebApp.Server.Controllers +{ + [ApiController] + [Route("api/v1/[controller]")] + public class ExchangeRateAPIController(ExchangeRateService _service,IEnumerable logWriters) : ControllerBase + { + + private readonly TIAM.Core.Loggers.Logger _logger = new(logWriters.ToArray()); + + [AllowAnonymous] + [HttpGet] + [Route(APIUrls.GetExchangeRateRouteName)] + //[SignalR(SignalRTags.GetProfileById)] + public async Task GetExchangeRate() + { + _logger.Info($@"GetExchangeRate called"); + var rate = await _service.GetExchangeRateAsync(); + return Ok(rate); + } + + [AllowAnonymous] + [HttpPost] + [Route(APIUrls.UpdateExchangeRateRouteName)] + //[SignalR(SignalRTags.GetProfileById)] + public async Task Set([FromBody] ExchangeRate rate) + { + _logger.Info($@"GetServiceProviderById called with rate: {rate.EURtoHUF}"); + await _service.SetExchangeRateAsync(rate); + return Ok(); + } + } + +} \ No newline at end of file diff --git a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs index a015fe1b..974576ee 100644 --- a/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs +++ b/TIAMWebApp/Server/Controllers/TransferDataAPIController.cs @@ -68,6 +68,7 @@ namespace TIAMWebApp.Server.Controllers //[Authorize] //[HttpGet] //[Route(APIUrls.GetTransferDriversByTransferIdRouteName)] + [NonAction] [SignalR(SignalRTags.GetTransferDestinationById)] public async Task GetTransferDestinationById(Guid transferDestinationId) { @@ -139,6 +140,7 @@ namespace TIAMWebApp.Server.Controllers //[Authorize] //[HttpGet] //[Route(APIUrls.GetTransferDriversByTransferIdRouteName)] + [NonAction] [SignalR(SignalRTags.RemoveTransferDestination)] public async Task RemoveTransferDestination([FromBody] TransferDestination transferDestination) { @@ -396,17 +398,36 @@ namespace TIAMWebApp.Server.Controllers var from = destList.FirstOrDefault(x => x.AddressString == transfer.FromAddress); var to = destList.FirstOrDefault(x => x.AddressString == transfer.ToAddress); - //TODO - if (!transfer.ProductId.IsNullOrEmpty()) - transfer.Price = _transferBackendService.GetTransferPrice(transfer.ProductId.Value, from, to, transfer.PassengerCount); + ////TODO + //if (!transfer.ProductId.IsNullOrEmpty()) + // transfer.Price = _transferBackendService.GetTransferPrice(transfer.ProductId.Value, from, to, transfer.PassengerCount); - transfer.TransferStatusType = TransferStatusType.OrderSubmitted; + Product? product = null; + //TODO + if (!transfer.ProductId.IsNullOrEmpty()) + { + product = await _adminDal.GetProductByIdAsync((Guid)transfer.ProductId); + transfer.Price = _transferBackendService.GetTransferPrice(transfer.ProductId.Value, from, to, transfer.PassengerCount); + } - await _adminDal.AddTransferAsync(transfer); + transfer.TransferStatusType = TransferStatusType.OrderSubmitted; + if (transfer.Price != null && transfer.Price > 0 && product != null) + { + if (product.ServiceProvider.CommissionPercent != null) + { + transfer.Revenue = transfer.Price * product.ServiceProvider.CommissionPercent / 100; + } + else + { + transfer.Revenue = 0; + } + } + await _adminDal.AddTransferAsync(transfer); _logger.Info($"Created transfer, send emailMessage!!!"); var message = new MessageSenderModel(); + message.Message = new EmailMessage(); message.Message.Id = Guid.NewGuid(); message.Message.Subject = "[Tour I Am] New transfer in Budapest"; message.Message.ContextId = transfer.Id; @@ -498,7 +519,7 @@ namespace TIAMWebApp.Server.Controllers { if(product.ServiceProvider.CommissionPercent!=null) { - transfer.Revenue = transfer.Price * product.ServiceProvider.CommissionPercent; + transfer.Revenue = transfer.Price * product.ServiceProvider.CommissionPercent / 100; } else { @@ -750,6 +771,7 @@ namespace TIAMWebApp.Server.Controllers return result; } + [NonAction] //[Authorize] //[HttpGet] //[Route(APIUrls.GetTransferDriverRouteName)] diff --git a/TIAMWebApp/Server/Program.cs b/TIAMWebApp/Server/Program.cs index 6623dbd0..c9fa98c8 100644 --- a/TIAMWebApp/Server/Program.cs +++ b/TIAMWebApp/Server/Program.cs @@ -47,6 +47,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddSingleton(); builder.Services.AddSignalR(options => options.MaximumReceiveMessageSize = 102400 * 1024);//.AddMessagePackProtocol(options => options.SerializerOptions = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData)); diff --git a/TIAMWebApp/Server/Services/ExchangeRateService.cs b/TIAMWebApp/Server/Services/ExchangeRateService.cs new file mode 100644 index 00000000..02dd6859 --- /dev/null +++ b/TIAMWebApp/Server/Services/ExchangeRateService.cs @@ -0,0 +1,34 @@ +using System.IO; +using System.Threading.Tasks; +using System.Xml.Serialization; +using Microsoft.AspNetCore.Hosting; +using TIAMWebApp.Shared.Application.Models; + +namespace TIAMWebApp.Server.Services +{ + public class ExchangeRateService + { + private readonly IWebHostEnvironment _env; + private readonly string _filePath; + + public ExchangeRateService(IWebHostEnvironment env) + { + _env = env; + _filePath = Path.Combine(_env.WebRootPath, "ExchangeRate.xml"); + } + + public async Task GetExchangeRateAsync() + { + using var stream = new FileStream(_filePath, FileMode.Open); + var serializer = new XmlSerializer(typeof(ExchangeRate)); + return (ExchangeRate)serializer.Deserialize(stream); + } + + public async Task SetExchangeRateAsync(ExchangeRate rate) + { + using var stream = new FileStream(_filePath, FileMode.Create); + var serializer = new XmlSerializer(typeof(ExchangeRate)); + serializer.Serialize(stream, rate); + } + } +} diff --git a/TIAMWebApp/Server/wwwroot/ExchangeRate.xml b/TIAMWebApp/Server/wwwroot/ExchangeRate.xml new file mode 100644 index 00000000..a9deb64a --- /dev/null +++ b/TIAMWebApp/Server/wwwroot/ExchangeRate.xml @@ -0,0 +1,4 @@ + + + 380 + \ No newline at end of file diff --git a/TIAMWebApp/Shared/Models/APIUrls.cs b/TIAMWebApp/Shared/Models/APIUrls.cs index 77c420f6..0c18917d 100644 --- a/TIAMWebApp/Shared/Models/APIUrls.cs +++ b/TIAMWebApp/Shared/Models/APIUrls.cs @@ -19,6 +19,7 @@ namespace TIAMWebApp.Shared.Application.Models public const string FileAPI = BaseUrlWithSlashAndVersion + "FileAPI/"; public const string MessageAPI = BaseUrlWithSlashAndVersion + "MessageAPI/"; public const string PaymentAPI = BaseUrlWithSlashAndVersion + "PaymentAPI/"; + public const string ExchangeRateAPI = BaseUrlWithSlashAndVersion + "ExchangeRateAPI/"; public const string AddLogItemRouteName = "AddLogItem"; public const string AddLogItem = LoggerApi + AddLogItemRouteName; @@ -132,7 +133,7 @@ namespace TIAMWebApp.Shared.Application.Models public const string GetTransferDriverRouteName = "GetTransfersByDriverId"; public const string GetTransferDriver = TransferDataAPI + GetTransferDriverRouteName; - public const string GetTransferDriversByTransferIdRouteName = "GetTransfersByDriverId"; + public const string GetTransferDriversByTransferIdRouteName = "GetTransferDriversByTransferId"; public const string GetTransferDriversByTransferId = TransferDataAPI + GetTransferDriversByTransferIdRouteName; //serviceprovider @@ -268,5 +269,10 @@ namespace TIAMWebApp.Shared.Application.Models public const string GetPaymentRouteName = "GetPaymentById"; public const string GetPaymentById = PaymentAPI + GetPaymentRouteName; + public const string UpdateExchangeRateRouteName = "UpdateExchangeRate"; + public const string UpdateExchangeRate = ExchangeRateAPI + UpdateExchangeRateRouteName; + public const string GetExchangeRateRouteName = "GetExchangeRate"; + public const string GetExchangeRate = ExchangeRateAPI + GetExchangeRateRouteName; + } } diff --git a/TIAMWebApp/Shared/Models/ExchangeRate.cs b/TIAMWebApp/Shared/Models/ExchangeRate.cs new file mode 100644 index 00000000..788dbd8c --- /dev/null +++ b/TIAMWebApp/Shared/Models/ExchangeRate.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TIAMWebApp.Shared.Application.Models +{ + public class ExchangeRate + { + public decimal EURtoHUF { get; set; } + } +} diff --git a/TIAMWebApp/Shared/Services/ExchangeRateService.cs b/TIAMWebApp/Shared/Services/ExchangeRateService.cs new file mode 100644 index 00000000..48e34581 --- /dev/null +++ b/TIAMWebApp/Shared/Services/ExchangeRateService.cs @@ -0,0 +1,35 @@ +using System.Net.Http; +using System.Net.Http.Json; +using System.Threading.Tasks; + +using TIAMWebApp.Shared.Application.Models; +using TIAMWebApp.Shared.Application.Models.ClientSide; + +namespace TIAMWebApp.Shared.Application.Services +{ + public class ExchangeRateService + { + private readonly HttpClient _httpClient; + + public ExchangeRateService(HttpClient httpClient) + { + _httpClient = httpClient; + } + + public async Task GetExchangeRateAsync() + { + + var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetExchangeRate}"; + return await _httpClient.GetFromJsonAsync(url); + } + + public async Task SetExchangeRateAsync(ExchangeRate rate) + { + var url = $"{Setting.ApiBaseUrl}/{APIUrls.UpdateExchangeRate}"; + await _httpClient.PostAsJsonAsync(url, rate); + } + } +} + + +