using System.Net.Http.Json; using System.Text; using AyCode.Interfaces.StorageHandlers; using Newtonsoft.Json; 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.Utility; namespace TIAMMobileApp.Services { public class UserDataServiceMobile : IUserDataService { private readonly HttpClient _http; private readonly ISecureStorageHandler _secureStorageHandler; private readonly IServiceProviderDataService _serviceProviderDataService; public Dictionary userRoleTypes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public UserDataServiceMobile(HttpClient http, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService) { this._http = http; this._secureStorageHandler = secureStorageHandler; _serviceProviderDataService = serviceProviderDataService; } 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) { var userModelDto = await GetUserDetailByIdAsync(id); if (userModelDto != null) { var hasProperties = await _serviceProviderDataService.GetPropertiesByOwnerIdAsync(userModelDto.Id); var user = new UserSessionModel(userModelDto.Id, UserType.User, userModelDto, hasProperties, 1); return user; } else { return null; } } public async Task TestUserApi(int param) { var url = APIUrls.UserTest; var response = await _http.PostAsJsonAsync(url, param); var result = await response.Content.ReadAsStringAsync(); return result; } public async Task AuthenticateUser(LoginModel loginModel) { var result = string.Empty; var url = APIUrls.AuthenticateUser; var response = await _http.PostAsJsonAsync(url, loginModel); if (response.IsSuccessStatusCode) { result = await response.Content.ReadAsStringAsync(); } else { 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); result = await response.Content.ReadAsStringAsync(); /*if (response.IsSuccessStatusCode) { isSuccess = true; result = await response.Content.ReadAsStringAsync(); } else { isSuccess = false; result = await response.Content.ReadAsStringAsync(); }*/ return (isSuccess, result); } public async Task<(bool isSuccess, UserModelDto? user)> CreateGuestUser(RegistrationModel regModel) { var isSuccess = false; var result = string.Empty; UserModelDto? user; var url = $"{Setting.ApiBaseUrl}/{APIUrls.CreateGuestUser}"; var response = await _http.PostAsJsonAsync(url, regModel); if (response.IsSuccessStatusCode) { isSuccess = true; result = await response.Content.ReadAsStringAsync(); user = JsonConvert.DeserializeObject(result); } else { isSuccess = false; result = await response.Content.ReadAsStringAsync(); user = null; } return (isSuccess, user); } public async Task?> GetUsersAsync() { return await _http.GetFromJsonAsync>(APIUrls.GetUsers); } public async Task?> GetUsersWithDetailsAsync() { return await _http.GetFromJsonAsync>(APIUrls.GetUsersWithDetails); } public async Task GetUserByEmailAsync(string email) { var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserByEmail}"; 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()); 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}"; var response = await _http.PostAsJsonAsync(url, id); var result = await response.Content.ReadAsStringAsync(); var user = JsonConvert.DeserializeObject(result); return user; } } }