From 89c5f76797e13ac4fa27b99c2440a056722d20b3 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 18 May 2024 22:57:12 +0200 Subject: [PATCH] =?UTF-8?q?err=C3=B6randling=20updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TIAMMobileApp/MauiProgram.cs | 2 +- .../Services/UserDataServiceMobile.cs | 277 ++++++++++-------- TIAMSharedUI/Pages/TransferPage.razor | 8 +- TIAMSharedUI/Shared/Components/Navbar.razor | 7 + .../Shared/Components/Navbar.razor.cs | 5 + .../TiamErrorBoundaryComponent.razor | 35 +++ TIAMSharedUI/Shared/MainLayout.razor | 72 +++-- TIAMSharedUI/Shared/Users/AdminNavMenu.razor | 2 +- .../Client/Services/UserDataServiceWeb.cs | 10 +- .../Controllers/PaymentAPIController.cs | 51 ++++ TIAMWebApp/Shared/Models/APIUrls.cs | 5 + TourIAmProject.sln | 2 +- 12 files changed, 319 insertions(+), 157 deletions(-) create mode 100644 TIAMSharedUI/Shared/Components/TiamErrorBoundaryComponent.razor create mode 100644 TIAMWebApp/Server/Controllers/PaymentAPIController.cs diff --git a/TIAMMobileApp/MauiProgram.cs b/TIAMMobileApp/MauiProgram.cs index a371fa65..4decdc1d 100644 --- a/TIAMMobileApp/MauiProgram.cs +++ b/TIAMMobileApp/MauiProgram.cs @@ -49,7 +49,7 @@ namespace TIAMMobileApp builder.Services.AddScoped(); builder.Services.AddScoped(); //builder.Services.AddScoped(); - builder.Services.AddSingleton(); + //builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/TIAMMobileApp/Services/UserDataServiceMobile.cs b/TIAMMobileApp/Services/UserDataServiceMobile.cs index d2870530..3e3b98b1 100644 --- a/TIAMMobileApp/Services/UserDataServiceMobile.cs +++ b/TIAMMobileApp/Services/UserDataServiceMobile.cs @@ -1,84 +1,90 @@ using System.Net.Http.Json; using System.Text; using AyCode.Interfaces.StorageHandlers; +using AyCode.Services.Loggers; using Newtonsoft.Json; +using TIAM.Core.Loggers; using TIAM.Entities.Users; using TIAM.Models.Dtos.Users; using TIAMWebApp.Shared.Application.Interfaces; using TIAMWebApp.Shared.Application.Models; using TIAMWebApp.Shared.Application.Models.ClientSide; using TIAMWebApp.Shared.Application.Models.PageModels; +using TIAMWebApp.Shared.Application.Services; using TIAMWebApp.Shared.Application.Utility; namespace TIAMMobileApp.Services { public class UserDataServiceMobile : IUserDataService { - private readonly HttpClient _http; - private readonly ISecureStorageHandler _secureStorageHandler; - private readonly IServiceProviderDataService _serviceProviderDataService; + private readonly HttpClient http; + private readonly ISecureStorageHandler secureStorageHandler; + private readonly IServiceProviderDataService serviceProviderDataService; + private readonly ILogger _logger; public Dictionary userRoleTypes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public UserDataServiceMobile(HttpClient http, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService) + public UserDataServiceMobile(HttpClient http, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService, IEnumerable logWriters) { - this._http = http; - this._secureStorageHandler = secureStorageHandler; - _serviceProviderDataService = serviceProviderDataService; + this.http = http; + this.secureStorageHandler = secureStorageHandler; + + //this._browserConsoleLogWriter = new BrowserConsoleLogWriter(jsRuntime); + this.serviceProviderDataService = serviceProviderDataService; + _logger = new LoggerClient(logWriters.ToArray()); + //_logger = new TIAM.Core.Loggers.Logger(AppType.Web, LogLevel.Info, logWriters.ToArray()); + //_logger = new TIAM.Core.Loggers.Logger(AppType.Web, LogLevel.Info, logWriter); } - - public List roleTypes = new List - { - new RoleType { Id = 1, RoleName = "Login" }, - new RoleType { Id = 2, RoleName = "Member" }, - new RoleType { Id = 4, RoleName = "Vip" }, - new RoleType { Id = 8, RoleName = "Uvip" }, - new RoleType { Id = 16, RoleName = "Volunteer" }, - new RoleType { Id = 32, RoleName = "Guide" }, - new RoleType { Id = 64, RoleName = "Protector" }, - new RoleType { Id = 128, RoleName = "Admin" }, - new RoleType { Id = 256, RoleName = "SuperAdmin" }, - new RoleType { Id = 512, RoleName = "God" } - }; - - public async Task IsLoggedInAsync(Guid id) { + //api call to get user var userModelDto = await GetUserDetailByIdAsync(id); - if (userModelDto != null) - { + if (userModelDto != null) + { + //get user's properties + var hasProperties = await serviceProviderDataService.GetPropertiesByOwnerIdAsync(userModelDto.Id); - var hasProperties = await _serviceProviderDataService.GetPropertiesByOwnerIdAsync(userModelDto.Id); - var user = new UserSessionModel(userModelDto.Id, UserType.User, userModelDto, hasProperties, 1); + if (hasProperties != null) + _logger.Info($"{hasProperties.Count} properties found"); - return user; - } - else - { - - return null; - } + //create user session model + var user = new UserSessionModel(userModelDto.Id, UserType.User, userModelDto, hasProperties, 1); + return user; + } + else + { + + return null; + } } - public async Task TestUserApi(int param) + public async Task TestUserApi(int Param) { - var url = APIUrls.UserTest; - var response = await _http.PostAsJsonAsync(url, param); + var url = $"{Setting.ApiBaseUrl}/{APIUrls.UserTest}"; + + + var response = await http.PostAsJsonAsync(url, Param); var result = await response.Content.ReadAsStringAsync(); return result; } public async Task AuthenticateUser(LoginModel loginModel) { + string result = string.Empty; + var url = $"{Setting.ApiBaseUrl}/{APIUrls.AuthenticateUser}"; + var response = await http.PostAsJsonAsync(url, loginModel); - - var result = string.Empty; - var url = APIUrls.AuthenticateUser; - - var response = await _http.PostAsJsonAsync(url, loginModel); + //try + //{ + // Logger.Detail("Login started: " + "Email: " + loginModel.Email + ", Password: " + loginModel.Password); + //} + //catch (Exception ex) + //{ + // _logger.Error(ex.Message, ex); + //} if (response.IsSuccessStatusCode) { @@ -89,20 +95,19 @@ namespace TIAMMobileApp.Services result = await response.Content.ReadAsStringAsync(); } - //result = await response.Content.ReadAsStringAsync(); + //result = await response.Content.ReadAsStringAsync(); return result; - } public async Task<(bool isSuccess, string ErrorMessage)> CreateUser(RegistrationModel regModel) { - var isSuccess = true; - var result = string.Empty; - var url = APIUrls.CreateUser; - - var response = await _http.PostAsJsonAsync(url, regModel); + bool isSuccess = true; + string result = string.Empty; + var url = $"{Setting.ApiBaseUrl}/{APIUrls.CreateUser}"; + _logger.Info("CreateUser url: " + url); + var response = await http.PostAsJsonAsync(url, regModel); result = await response.Content.ReadAsStringAsync(); /*if (response.IsSuccessStatusCode) { @@ -122,18 +127,19 @@ namespace TIAMMobileApp.Services public async Task<(bool isSuccess, UserModelDto? user)> CreateGuestUser(RegistrationModel regModel) { - var isSuccess = false; - var result = string.Empty; - UserModelDto? user; + bool isSuccess = false; + string result = string.Empty; + UserModelDto? user = new UserModelDto(); var url = $"{Setting.ApiBaseUrl}/{APIUrls.CreateGuestUser}"; - - var response = await _http.PostAsJsonAsync(url, regModel); + _logger.Info("CreateGuestUser url: " + url); + var response = await http.PostAsJsonAsync(url, regModel); if (response.IsSuccessStatusCode) { isSuccess = true; result = await response.Content.ReadAsStringAsync(); + _logger.Info("CreateGuestUser result: " + result); user = JsonConvert.DeserializeObject(result); } else @@ -149,108 +155,127 @@ namespace TIAMMobileApp.Services public async Task?> GetUsersAsync() { - return await _http.GetFromJsonAsync>(APIUrls.GetUsers); + return await http.GetFromJsonAsync>(APIUrls.GetUsers); } public async Task?> GetUsersWithDetailsAsync() { - return await _http.GetFromJsonAsync>(APIUrls.GetUsersWithDetails); + + + var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUsersWithDetails}"; + _logger.Info("GetUserByEmailAsync url: " + url + "!"); + var response = await http.GetFromJsonAsync>(APIUrls.GetUsersWithDetails); + //var result = await response.Content.ReadAsStringAsync(); + //var user = JsonConvert.DeserializeObject(result); + return response; + } public async Task GetUserByEmailAsync(string email) { - var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserByEmail}"; - var response = await _http.PostAsJsonAsync(url, email); + var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserByEmail}"; + + _logger.Info("GetUserByEmailAsync url: " + url + ", " + email); + //GlobalLogger.Info("GetUserByEmailAsync url: " + url + ", " + email, "GLOBAL_LOGGER"); + + + var response = await http.PostAsJsonAsync(url, email); var result = await response.Content.ReadAsStringAsync(); var user = JsonConvert.DeserializeObject(result); return user; } + public async Task GetUserByIdAsync(Guid id) { var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserById}"; - //logToBrowserConsole.LogToBC("GetUserByIdAsync url: " + url + ", " + id.ToString()); + _logger.Info("GetUserByIdAsync url: " + url + ", " + id.ToString()); - var response = await _http.PostAsJsonAsync(url, id); + var response = await http.PostAsJsonAsync(url, id); var result = await response.Content.ReadAsStringAsync(); var user = JsonConvert.DeserializeObject(result); return user; } - public async Task RefreshToken() - { - var isTokenRefreshed = false; - using (var client = new HttpClient()) - { - var url = APIUrls.RefreshToken; - - var serializedStr = JsonConvert.SerializeObject(new AuthenticateRequestAndResponse - { - RefreshToken = Setting.UserBasicDetails.RefreshToken, - AccessToken = Setting.UserBasicDetails.AccessToken - }); - - try - { - var response = await client.PostAsync(url, new StringContent(serializedStr, Encoding.UTF8, "application/json")); - if (response.IsSuccessStatusCode) - { - var contentStr = await response.Content.ReadAsStringAsync(); - var mainResponse = JsonConvert.DeserializeObject(contentStr); - if (mainResponse.IsSuccess) - { - var tokenDetails = JsonConvert.DeserializeObject(mainResponse.Content.ToString()); - Setting.UserBasicDetails.AccessToken = tokenDetails.AccessToken; - Setting.UserBasicDetails.RefreshToken = tokenDetails.RefreshToken; - - var userDetailsStr = JsonConvert.SerializeObject(Setting.UserBasicDetails); - await _secureStorageHandler.SaveToSecureStorageAsync(nameof(Setting.UserBasicDetails), userDetailsStr); - isTokenRefreshed = true; - } - } - } - catch (Exception ex) - { - var msg = ex.Message; - } - - - } - return isTokenRefreshed; - } - - - public Task> GetUserRolesAsync(UserModel userModel) - { - //TODO Finish this - //get the userModel's roles - var role = userModel.UserRoles; - - foreach (var roleType in roleTypes) - { - if ((role & roleType.Id) == roleType.Id) - { - - //add the role to the dictionary - userRoleTypes.Add(roleType.Id, roleType.RoleName); - - } - } - return Task.FromResult(userRoleTypes); - - } - public async Task GetUserDetailByIdAsync(Guid id) { - var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserDetailById}"; - + _logger.Info("GetUserDetailByIdAsync", "GLOBAL_LOGGER"); - var response = await _http.PostAsJsonAsync(url, id); + var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserDetailById}"; + _logger.Info("GetUserDetailByIdAsync url: " + url + ", " + id.ToString()); + + var response = await http.PostAsJsonAsync(url, id); var result = await response.Content.ReadAsStringAsync(); var user = JsonConvert.DeserializeObject(result); return user; } + + public async Task RefreshToken() + { + _logger.Info("RefreshToken() called"); + bool isTokenRefreshed = false; + + var url = $"{Setting.ApiBaseUrl}/{APIUrls.RefreshToken}"; + //var url = APIUrls.RefreshToken; + + var serializedStr = JsonConvert.SerializeObject(new AuthenticateRequestAndResponse + { + RefreshToken = Setting.UserBasicDetails.RefreshToken, + AccessToken = Setting.UserBasicDetails.AccessToken + }); + + try + { + _logger.Info("Refreshtoken url: " + url); + var response = await http.PostAsync(url, new StringContent(serializedStr, Encoding.UTF8, "application/json")); + if (response.IsSuccessStatusCode) + { + string contentStr = await response.Content.ReadAsStringAsync(); + var mainResponse = JsonConvert.DeserializeObject(contentStr); + if (mainResponse.IsSuccess) + { + var tokenDetails = JsonConvert.DeserializeObject(mainResponse.Content.ToString()); + Setting.UserBasicDetails.AccessToken = tokenDetails.AccessToken; + Setting.UserBasicDetails.RefreshToken = tokenDetails.RefreshToken; + + string userDetailsStr = JsonConvert.SerializeObject(Setting.UserBasicDetails); + await secureStorageHandler.SaveToSecureStorageAsync(nameof(Setting.UserBasicDetails), userDetailsStr); + isTokenRefreshed = true; + } + } + } + catch (Exception ex) + { + string msg = ex.Message; + _logger.Error("Refreshtoken exception: " + ex.Message, ex); + } + + + return isTokenRefreshed; + } + + + //public Task> GetUserRolesAsync(UserModel userModel) + //{ + // //TODO Finish this + // //get the userModel's roles + // var role = userModel.UserRoles; + + // foreach (var roleType in roleTypes) + // { + // if ((role & roleType.Id) == roleType.Id) + // { + + // //add the role to the dictionary + // userRoleTypes.Add(roleType.Id, roleType.RoleName); + + // } + // } + // return Task.FromResult(userRoleTypes); + + //} + } } diff --git a/TIAMSharedUI/Pages/TransferPage.razor b/TIAMSharedUI/Pages/TransferPage.razor index cb4ada72..72e04509 100644 --- a/TIAMSharedUI/Pages/TransferPage.razor +++ b/TIAMSharedUI/Pages/TransferPage.razor @@ -35,7 +35,7 @@
-
+

Book an Airport Transfer

Welcome to Tour I Am! Book your airport transfer with us for a smooth and stress-free experience. Our professional drivers are ready to take you to and from the airport in comfort and style. We offer competitive rates and reliable service, ensuring you get to your destination on time.

@@ -49,13 +49,13 @@
-
+
-
+
-
+

How to Book

Booking your airport transfer is easy! Simply visit our booking page, enter your details, and confirm your reservation. You can also contact us at info@touriam.com or call us at (123) 456-7890 for assistance.

diff --git a/TIAMSharedUI/Shared/Components/Navbar.razor b/TIAMSharedUI/Shared/Components/Navbar.razor index 14895694..338d0486 100644 --- a/TIAMSharedUI/Shared/Components/Navbar.razor +++ b/TIAMSharedUI/Shared/Components/Navbar.razor @@ -120,6 +120,13 @@
+ } } diff --git a/TIAMSharedUI/Shared/Components/Navbar.razor.cs b/TIAMSharedUI/Shared/Components/Navbar.razor.cs index a5517b88..97f9def9 100644 --- a/TIAMSharedUI/Shared/Components/Navbar.razor.cs +++ b/TIAMSharedUI/Shared/Components/Navbar.razor.cs @@ -85,6 +85,11 @@ namespace TIAMSharedUI.Shared.Components sessionService.IsAuthenticated = false; } + private void ThrowSomeError() + { + throw new Exception(); + } + protected override void OnInitialized() { base.OnInitialized(); diff --git a/TIAMSharedUI/Shared/Components/TiamErrorBoundaryComponent.razor b/TIAMSharedUI/Shared/Components/TiamErrorBoundaryComponent.razor new file mode 100644 index 00000000..19971c0f --- /dev/null +++ b/TIAMSharedUI/Shared/Components/TiamErrorBoundaryComponent.razor @@ -0,0 +1,35 @@ +@inherits ErrorBoundary + + +@if (_currentError != null) +{ +
+

An error has occurred: @_currentError.Message

+
+} +else +{ + @ChildContent +} + +@code { + private Exception _currentError; + + [Parameter] + public EventCallback OnError { get; set; } + + protected override Task OnErrorAsync(Exception exception) + { + _currentError = exception; + if (OnError.HasDelegate) + { + return OnError.InvokeAsync(exception); + } + return base.OnErrorAsync(exception); + } + + protected override void OnParametersSet() + { + _currentError = null; + } +} \ No newline at end of file diff --git a/TIAMSharedUI/Shared/MainLayout.razor b/TIAMSharedUI/Shared/MainLayout.razor index 0447443d..76eb1ce5 100644 --- a/TIAMSharedUI/Shared/MainLayout.razor +++ b/TIAMSharedUI/Shared/MainLayout.razor @@ -1,5 +1,6 @@ @inherits LayoutComponentBase @using AyCode.Interfaces.StorageHandlers; +@using AyCode.Services.Loggers @using Newtonsoft.Json; @using TIAMSharedUI.Pages @using TIAMSharedUI.Shared.Components @@ -9,33 +10,40 @@ @using TIAMWebApp.Shared.Application.Models; @using TIAMWebApp.Shared.Application.Utility; @using System.IdentityModel.Tokens.Jwt; +@using TIAM.Core.Loggers; @inject NavigationManager NavManager -@inject IJSRuntime jsRuntime; +@inject IJSRuntime jsRuntime @inject ISecureStorageHandler SecureStorageHandler -@inject ISessionService sessionService; +@inject ISessionService sessionService +@inject IEnumerable LogWriters
- + + + + + + + +
+
+ + @Body + +
+
+ @* *@ + + +
+ - - - -
-
- - @Body - -
-
- @* *@ - -
@@ -43,4 +51,30 @@ @code { public PopupMessageBox PopupMessageBox { get; private set; } = default!; + ILogger _logger; + + + private void HandleError(Exception exception) + { + // Log the error to server + LogErrorToServer(exception); + + // Show a notification on UI + ShowErrorNotification("An unexpected error occurred. Please try again later."); + + jsRuntime.InvokeVoidAsync("console.error", $"An error occurred: {exception.Message}"); + jsRuntime.InvokeVoidAsync("console.warn", $"Error details: {exception.StackTrace}"); + _logger.Info($"An error occurred: {exception.Message}"); + } + + private void LogErrorToServer(Exception exception) + { + //_logger.Error($"An error occurred: {exception.Message}"); + } + + private void ShowErrorNotification(string message) + { + jsRuntime.InvokeVoidAsync("alert", message); + } + } diff --git a/TIAMSharedUI/Shared/Users/AdminNavMenu.razor b/TIAMSharedUI/Shared/Users/AdminNavMenu.razor index a214d2e5..c90cef75 100644 --- a/TIAMSharedUI/Shared/Users/AdminNavMenu.razor +++ b/TIAMSharedUI/Shared/Users/AdminNavMenu.razor @@ -25,7 +25,7 @@