diff --git a/qtc-net-server/Controllers/UsersController.cs b/qtc-net-server/Controllers/UsersController.cs index 3a40064..42bdbb5 100644 --- a/qtc-net-server/Controllers/UsersController.cs +++ b/qtc-net-server/Controllers/UsersController.cs @@ -152,5 +152,22 @@ namespace qtc_api.Controllers var result = await _userService.DeleteUser(id); return Ok(result); } + + [HttpPost("update-user-currency")] + [Authorize] + public async Task>> UpdateUserCurrency(int amount, bool isSpinClaim) + { + var identity = HttpContext.User.Identity as ClaimsIdentity; + + if (identity != null) + { + IEnumerable claims = identity.Claims; + var id = claims.First().Value; + + if (id != null) return Ok(await _userService.AddCurrencyToUser(id, amount, isSpinClaim)); + else return Ok(new ServiceResponse { Success = false, Message = "Identity Has No User ID" }); + } + else return Ok(new ServiceResponse { Success = false, Message = "No Identity" }); + } } } diff --git a/qtc-net-server/Dtos/User/UserInformationDto.cs b/qtc-net-server/Dtos/User/UserInformationDto.cs index 0793483..eafac9a 100644 --- a/qtc-net-server/Dtos/User/UserInformationDto.cs +++ b/qtc-net-server/Dtos/User/UserInformationDto.cs @@ -10,5 +10,6 @@ public DateTime DateOfBirth { get; set; } = new DateTime(); public DateTime CreatedAt { get; set; } = new DateTime(); public int Status { get; set; } = 0; + public int CurrencyAmount { get; set; } = 0; } } diff --git a/qtc-net-server/Program.cs b/qtc-net-server/Program.cs index 5cbadf4..deaa41a 100644 --- a/qtc-net-server/Program.cs +++ b/qtc-net-server/Program.cs @@ -19,6 +19,7 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddDbContext(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSignalR(); @@ -34,9 +35,10 @@ builder.Services.AddAuthentication().AddJwtBearer(options => ValidAudience = builder.Configuration["Jwt:Audience"] }; - if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("JWT_KEY"))) - options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Environment.GetEnvironmentVariable("JWT_KEY")!)); - else options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]!)); + var jwtKey = Environment.GetEnvironmentVariable("JWT_KEY"); + if (jwtKey != null) + options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey)); + else throw new Exception("Cannot Find Environment Variables 'JWT_KEY'. Please Check Environment."); }); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/qtc-net-server/Properties/launchSettings.json b/qtc-net-server/Properties/launchSettings.json index 41bdace..59fdfe8 100644 --- a/qtc-net-server/Properties/launchSettings.json +++ b/qtc-net-server/Properties/launchSettings.json @@ -2,10 +2,11 @@ "profiles": { "http": { "commandName": "Project", - "launchBrowser": true, - "launchUrl": "swagger", "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" + "ASPNETCORE_ENVIRONMENT": "Development", + "DB_PROVIDER": "SQLite", + "DB_CONNECTION_STRING": "Data Source=qtcdev.db", + "JWT_KEY": "iPBR1ZO9GHsP04SUf*jE4ILh5jwz$3$A" }, "dotnetRunMessages": true, "applicationUrl": "http://localhost:5268" diff --git a/qtc-net-server/Services/UserService/IUserService.cs b/qtc-net-server/Services/UserService/IUserService.cs index d65e2f6..bff847e 100644 --- a/qtc-net-server/Services/UserService/IUserService.cs +++ b/qtc-net-server/Services/UserService/IUserService.cs @@ -15,5 +15,7 @@ namespace qtc_api.Services.UserService public Task> GetUserPic(string userId); public Task> UpdateStatus(UserStatusDto request); public Task> DeleteUser(string id); + public Task> AddCurrencyToUser(string id, int amount, bool isSpinClaim); + public Task> RemoveCurrencyFromUser(string id, int amount); } } diff --git a/qtc-net-server/Services/UserService/UserService.cs b/qtc-net-server/Services/UserService/UserService.cs index 7954e9a..a03d784 100644 --- a/qtc-net-server/Services/UserService/UserService.cs +++ b/qtc-net-server/Services/UserService/UserService.cs @@ -106,6 +106,7 @@ x.Role = user.Role; x.Bio = user.Bio; x.DateOfBirth = user.DateOfBirth; + x.CurrencyAmount = user.CurrencyAmount; userInfoList.Add(x); } @@ -134,6 +135,7 @@ x.Status = user.Status; x.DateOfBirth = user.DateOfBirth; x.CreatedAt = user.CreatedAt; + x.CurrencyAmount = user.CurrencyAmount; onlineUsers.Add(x); } @@ -170,6 +172,7 @@ dto.DateOfBirth = user.DateOfBirth; dto.CreatedAt = user.CreatedAt; dto.Status = user.Status; + dto.CurrencyAmount = user.CurrencyAmount; serviceResponse.Success = true; serviceResponse.Data = dto; @@ -214,6 +217,7 @@ infoDto.DateOfBirth = request.DateOfBirth; infoDto.CreatedAt = dbUser.CreatedAt; infoDto.Status = dbUser.Status; + infoDto.CurrencyAmount = dbUser.CurrencyAmount; serviceResponse.Success = true; serviceResponse.Data = infoDto; @@ -329,6 +333,51 @@ return serviceResponse; } + public async Task> AddCurrencyToUser(string id, int amount, bool isSpinClaim) + { + var response = new ServiceResponse(); + var user = _dataContext.Users.FirstOrDefault(e => e.Id == id); + + if (user != null) + { + user.CurrencyAmount += amount; + if (isSpinClaim) user.LastCurrencySpin = DateTime.UtcNow; + await _dataContext.SaveChangesAsync(); + + response.Success = true; + response.Data = user.CurrencyAmount; + return response; + } + else + { + response.Success = false; + response.Message = "User Not Found"; + return response; + } + } + + public async Task> RemoveCurrencyFromUser(string id, int amount) + { + var response = new ServiceResponse(); + var user = _dataContext.Users.FirstOrDefault(e => e.Id == id); + + if (user != null) + { + user.CurrencyAmount -= amount; + await _dataContext.SaveChangesAsync(); + + response.Success = true; + response.Data = user.CurrencyAmount; + return response; + } + else + { + response.Success = false; + response.Message = "User Not Found"; + return response; + } + } + private long LongRandom(long min, long max, Random rnd) { long result = rnd.Next((int)(min >> 32), (int)(max >> 32));