diff --git a/QtCNETAPI/Enums/StoreItemType.cs b/QtCNETAPI/Enums/StoreItemType.cs new file mode 100644 index 0000000..f5ee7b7 --- /dev/null +++ b/QtCNETAPI/Enums/StoreItemType.cs @@ -0,0 +1,8 @@ +namespace QtCNETAPI.Enums +{ + public enum StoreItemType + { + ProfileCosmetic = 1, + ClientCosmetic = 2 + } +} diff --git a/QtCNETAPI/Models/OwnedStoreItem.cs b/QtCNETAPI/Models/OwnedStoreItem.cs new file mode 100644 index 0000000..f328563 --- /dev/null +++ b/QtCNETAPI/Models/OwnedStoreItem.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace QtCNETAPI.Models +{ + public class OwnedStoreItem + { + [Key] + public int Id { get; set; } + public string UserId { get; set; } = string.Empty; + public int StoreItemId { get; set; } + + public virtual User? User { get; } + } +} diff --git a/QtCNETAPI/Models/User.cs b/QtCNETAPI/Models/User.cs index 506b90b..864dd00 100644 --- a/QtCNETAPI/Models/User.cs +++ b/QtCNETAPI/Models/User.cs @@ -15,9 +15,11 @@ public int CurrencyAmount { get; set; } = 0; public int StockAmount { get; set; } = 0; public DateTime LastCurrencySpin { get; set; } + public int ActiveProfileCosmetic { get; set; } = 0; public virtual IEnumerable? RefreshTokens { get; } public virtual IEnumerable? ContactsMade { get; } public virtual IEnumerable? ContactsList { get; } + public virtual IEnumerable? OwnedStoreItems { get; } } } diff --git a/QtCNETAPI/Schema/StoreItem.cs b/QtCNETAPI/Schema/StoreItem.cs new file mode 100644 index 0000000..e6d837e --- /dev/null +++ b/QtCNETAPI/Schema/StoreItem.cs @@ -0,0 +1,23 @@ +using QtCNETAPI.Enums; +using System.Text.Json.Serialization; + +namespace QtCNETAPI.Schema +{ + public class StoreItem + { + [JsonPropertyName("Id")] + public int Id { get; set; } + [JsonPropertyName("Type")] + public StoreItemType Type { get; set; } + [JsonPropertyName("Price")] + public int Price { get; set; } + [JsonPropertyName("Name")] + public string Name { get; set; } = string.Empty; + [JsonPropertyName("Description")] + public string Description { get; set; } = string.Empty; + [JsonPropertyName("AssetUrl")] + public string AssetUrl { get; set; } = string.Empty; + [JsonPropertyName("ThumbnailUrl")] + public string ThumbnailUrl { get; set; } = string.Empty; + } +} diff --git a/QtCNETAPI/Services/ApiService/ApiService.cs b/QtCNETAPI/Services/ApiService/ApiService.cs index e284e3e..016423e 100644 --- a/QtCNETAPI/Services/ApiService/ApiService.cs +++ b/QtCNETAPI/Services/ApiService/ApiService.cs @@ -2,6 +2,7 @@ using QtCNETAPI.Dtos.User; using QtCNETAPI.Enums; using QtCNETAPI.Models; +using QtCNETAPI.Schema; using RestSharp; using System.IdentityModel.Tokens.Jwt; using System.Resources; @@ -151,10 +152,8 @@ namespace QtCNETAPI.Services.ApiService serviceResponse.Success = true; serviceResponse.Data = response.Data; - // update currentuser model - CurrentUser!.Username = response.Data!.Username; - CurrentUser.Bio = response.Data.Bio; - CurrentUser.DateOfBirth = response.Data.DateOfBirth; + // anything that changes the user should tell the api service to set it again + await SetCurrentUser(); } else { serviceResponse.Success = false; @@ -180,6 +179,9 @@ namespace QtCNETAPI.Services.ApiService { serviceResponse.Success = true; serviceResponse.Data = response.Data; + + // anything that changes the user should tell the api service to set it again + await SetCurrentUser(); } else { @@ -273,16 +275,16 @@ namespace QtCNETAPI.Services.ApiService return serviceResponse; } - private async Task SetCurrentUser() + public async Task SetCurrentUser() { var userRequest = new RestRequest("users/user-authorized") .AddHeader("Authorization", $"Bearer {SessionToken}"); var userResponse = await _client.GetAsync>(userRequest); - if (userResponse != null || userResponse!.Data != null) + if (userResponse != null && userResponse.Success && userResponse.Data != null) { user = userResponse.Data; - return userResponse.Data!; + return userResponse.Data; } else { throw new NullReferenceException("Current User could not be set."); @@ -565,6 +567,9 @@ namespace QtCNETAPI.Services.ApiService { serviceResponse.Success = true; serviceResponse.Data = response.Data; + + // anything that changes the user should tell the api service to set it again + await SetCurrentUser(); } return serviceResponse; @@ -590,6 +595,9 @@ namespace QtCNETAPI.Services.ApiService { serviceResponse.Success = true; serviceResponse.Data = response.Data; + + // anything that changes the user should tell the api service to set it again + await SetCurrentUser(); } return serviceResponse; @@ -713,5 +721,123 @@ namespace QtCNETAPI.Services.ApiService return serviceResponse; } + + public async Task>> GetStoreItems() + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse>(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var restRequest = new RestRequest("store/all-items") + .AddHeader("Authorization", $"Bearer {SessionToken}"); + var response = await _client.GetAsync>>(restRequest); + + if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; } + + if (response.Success) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + + return serviceResponse; + } + + public async Task> GetStoreItem(int id) + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var restRequest = new RestRequest("store/item") + .AddHeader("Authorization", $"Bearer {SessionToken}") + .AddQueryParameter("id", id); + var response = await _client.GetAsync>(restRequest); + + if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; } + + if (response.Success) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + + return serviceResponse; + } + + public async Task> BuyStoreItem(int id) + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var restRequest = new RestRequest("store/buy-item") + .AddHeader("Authorization", $"Bearer {SessionToken}") + .AddQueryParameter("id", id); + var response = await _client.GetAsync>(restRequest); + + if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; } + + if (response.Success) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + + return serviceResponse; + } + + public async Task>> GetOwnedStoreItems() + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse>(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var restRequest = new RestRequest("store/bought-items") + .AddHeader("Authorization", $"Bearer {SessionToken}"); + var response = await _client.GetAsync>>(restRequest); + + if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; } + + if (response.Success) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + + return serviceResponse; + } + + public async Task> GetOwnedStoreItem(int id) + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var restRequest = new RestRequest("store/bought-item") + .AddHeader("Authorization", $"Bearer {SessionToken}") + .AddQueryParameter("id", id); + var response = await _client.GetAsync>(restRequest); + + if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; } + + if (response.Success) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + + return serviceResponse; + } } } diff --git a/QtCNETAPI/Services/ApiService/IApiService.cs b/QtCNETAPI/Services/ApiService/IApiService.cs index 2cc860f..59378d9 100644 --- a/QtCNETAPI/Services/ApiService/IApiService.cs +++ b/QtCNETAPI/Services/ApiService/IApiService.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using QtCNETAPI.Enums; +using QtCNETAPI.Schema; namespace QtCNETAPI.Services.ApiService { @@ -22,6 +23,7 @@ namespace QtCNETAPI.Services.ApiService public Task> LoginAsync(UserLoginDto userLoginDto); public Task> RefreshLogin(string refreshToken); public Task> RefreshSessionIfInvalid(); + public Task SetCurrentUser(); public Task> RegisterAsync(UserDto userDto); public Task> GetUserInformationAsync(string id); public Task> UpdateUserInformationAsync(UserUpdateInformationDto request); @@ -40,5 +42,10 @@ namespace QtCNETAPI.Services.ApiService public Task> SellStock(int amount); public Task> GetRandomNumber(); public Task> GuessRandomNumber(int original, int guess); + public Task>> GetStoreItems(); + public Task> GetStoreItem(int id); + public Task> BuyStoreItem(int id); + public Task>> GetOwnedStoreItems(); + public Task> GetOwnedStoreItem(int id); } } diff --git a/QtCNETAPI/Services/GatewayService/GatewayService.cs b/QtCNETAPI/Services/GatewayService/GatewayService.cs index 4929fdb..865fff0 100644 --- a/QtCNETAPI/Services/GatewayService/GatewayService.cs +++ b/QtCNETAPI/Services/GatewayService/GatewayService.cs @@ -173,6 +173,9 @@ namespace QtCNETAPI.Services.GatewayService if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); await HubConnection.SendAsync("UpdateStatus", _apiService.CurrentUser, status); + + // anything that changes the user should tell the api service to set it again + await _apiService.SetCurrentUser(); }